pandasで簡単な条件でフラグを作る方法などは下記の記事で紹介しました。
pandasに新しいカラムを追加する5つの方法
ヒノマルク今回はDataFrameに新しいカラムを追加する方法をまとめました。例えば全て1という値のカラムを追加したり、特定のルールにしたがって区分値を付与し直す時などに新規カラムを追加することになります。ボストンの住宅価格データセットを読...
今回はより複雑な条件で、データを上から順に処理をすることで汎用的に使えそうな方法を試してみました。
この方法を使うことによって例えば、日売データから「商品ごとに累積金額を計算するときに3回目の祝日でリセットする」であったり、「累積売上金額が50万円になったらフラグを立てる」などの複雑な処理が可能になります。
下記で本記事のコードをテンプレートとして、ナップサック問題を解くために使っています。
【ナップサック問題】単元未満株と楽天銀行の株式配当金受取プログラムでお得な組み合わせは何かシュミレーションしてみる その2
本記事の内容を利用する場合は自己責任でお願いいたします。投資を勧めている訳ではありません。前回、単元未満株と楽天銀行の配当金受取プログラムでお得な組み合わせは何かシュミレーションの方向性を考えました。今回は実際に2022/11/25の株価情...
あくまで様々な方法論のうち一つの手段になるので、データ加工のやり方に悩んだときに参考として参照してみてください。
サンプルデータの作成
サンプルとして、KEYとFLGのみを持つpandasのデータを作成します。
import pandas as pd
from datetime import datetime
df = pd.DataFrame([ 'apple' ,'apple' ,'apple' ,'apple' ,'apple'
,'banana','banana','banana','banana','banana'
,'orange','orange','orange','orange','orange'],columns=['KEY'])
df["FLG"] = 0
df
Out[0]
KEY FLG 0 apple 0 1 apple 0 2 apple 0 3 apple 0 4 apple 0 5 banana 0 6 banana 0 7 banana 0 8 banana 0 9 banana 0 10 orange 0 11 orange 0 12 orange 0 13 orange 0 14 orange 0
出来ました。フラグの値は全て0にしています。
テンプレートのつもりでpandasのデータを上から順にキーごとに処理をするコードを書きました。
キーごとの先頭行のFLGは0、それ以外は1にする処理を例として記載しています。
応用すれば色々な加工データを作れるはずです。
pandasのデータを上から順に1行ずつ処理する
数十万件のデータを日次で処理しても大丈夫なはず。(性能試験はやった方がいい)
row_list=[] # 加工済みレコード格納用
prev_row = None # 1つ前のレコードの情報を格納
prev_adict = None # 1つ前の加工済みレコード格納用
# 一番最初のKEYのFLGのみ0にして、それ以外は1にする処理を書いてみる
for row in df.itertuples():
# キーの先頭行の場合
if (prev_row == None) or (prev_row.KEY != row.KEY):
FLG_NEW=0 #KEYごとにflgリセット
# キーの先頭行以外の場合
else:
# 何かの処理
FLG_NEW=1
# 加工した変数をdictにまとめる
adict = dict(
KEY = row.KEY #元のKEYの値をそのまま格納
, FLG = FLG_NEW #新しいFLGの値を格納
)
# listにdictを格納
row_list.append(adict)
# 現在の情報を格納し次に引き継ぐ
prev_row = row
prev_adict = prev_adict
# 処理が終わった後はdataframeに格納して基礎統計を見たりできる。
result_df = pd.DataFrame(row_list)
result_df["CURRENT_DT"] = datetime.now().strftime("%Y/%m/%d")
加工後のデータを確認
result_dfを確認
result_df
Out[0]
KEY FLG CURRENT_DT 0 apple 0 2022/11/30 1 apple 1 2022/11/30 2 apple 1 2022/11/30 3 apple 1 2022/11/30 4 apple 1 2022/11/30 5 banana 0 2022/11/30 6 banana 1 2022/11/30 7 banana 1 2022/11/30 8 banana 1 2022/11/30 9 banana 1 2022/11/30 10 orange 0 2022/11/30 11 orange 1 2022/11/30 12 orange 1 2022/11/30 13 orange 1 2022/11/30 14 orange 1 2022/11/30
使用ライブラリのバージョン
import pandas as pd
import numpy as np
print('pandas',pd.__version__)
print('numpy',np.__version__)
Out[0]
pandas 1.5.2 numpy 1.23.5
まとめ
簡単な例ですが、テンプレートとして使えればいいなと思い記事にまとめてみました。
ここで加工したデータをデータベースにインサートするなどしてシステム側で参照するなども出来るかと思います。