groupby rolling の遅さを解消する方法
解決したいこと
pyhon pandas で競馬予想のコードを作成しています。
データの前処理において、競走馬毎に 前 n走前の各種レースデータの平均値を取得したと思っております。
希望通りの処理は可能なのですが、とにかく遅です。
良い修正方法を教えて下さい。
データの形式
イメージとしては下表
ID列に、馬の識別コード
order列に時系列を表す数値
他は各種データ
実際は 100万データ✕30カラムくらいあります
目的とする処理
下表に基づくと ID毎に、過去 n[3,5,9]個前(order順)の平均値を選択したカラムで取得し、
IDとorder のあるデータフレームにまとめて新規データフレームを作成したい
最初作成したコード
最初に作成したコード
これで 100万行データの 12カラムを [3,5,9]でローリングすると私のPCで 1時間超え
私のPCのスペックは
df_r = df.sort_values('order', ascending = True).reset_index(drop = True)
df_ave = df_r[['ID','order']].copy()
columns = ['DATA1','DATA2','DATA3']
for column in columns:
for i in [3, 5, 9]:
df_ave[column + '_ave' + str(i)] = df_r.groupby('ID')[column].rolling(i).mean().reset_index(0, drop=True)0.6
修正したコード
あまりに遅いので、下記のコードに修正
かなり改善したが、まだ10分ほどの処理時間
df_r = df.sort_values('order', ascending = True).reset_index(drop = True)
df_ave = df_r[['ID','order']].copy()
columns = ['DATA1','DATA2','DATA3']
list_ave = []
list_ave.append(df_ave)
for i in [3,5,9]:
df_mean = df_r.groupby('ID')[columns].rolling(i).mean().reset_index(0, drop=True).rename(columns=lambda s: s + '_ave' + str(i))
list_ave.append(df_mean)
df_ave = pd.concat(list_ave, axis=1)
さいごに
どうも groupby について、理解が出来てないので力業のコードになっております。
もっと処理が早く方法をあれば、ご教授お願いします。