Pandas で、Dataframe インデックスごとに多くの集計を計算する必要があり、時間ごとのウィンドウ処理 (MONTH 列) を念頭に置いています。何かのようなもの:
# t is my DataFrame
grouped=t.groupby(t.index)
def f(g):
g1=g[g.MONTH<=1]
g2=g[g.MONTH<=5]
agrs=[]
index=[]
for c in cat_columns:
index.append(c+'_EOP')
agrs.append(g.iloc[0][c])
for c in cont_columns:
index.append(c+'_MEAN_2')
mean2=g1[c].mean()
agrs.append(mean2)
index.append(c+'_MEAN_6')
mean6=g2[c].mean()
agrs.append(mean6)
index.append(c+'_MEDIAN_2')
agrs.append(g1[c].median())
index.append(c+'_MEDIAN_6')
agrs.append(g2[c].median())
index.append(c+'_MIN_2')
agrs.append(g1[c].min())
index.append(c+'_MIN_6')
agrs.append(g2[c].min())
index.append(c+'_MAX_2')
agrs.append(g1[c].max())
index.append(c+'_MAX_6')
agrs.append(g2[c].max())
index.append(c+'_MEAN_CHNG')
agrs.append((mean2-mean6)/mean6)
return pd.Series(agrs, index=index)
aggrs=grouped.apply(f)
各リストには 100 ~ 120 個の属性があります。cat_columns と cont_columns、および約 150 万行です。パフォーマンスは非常に遅いです (すでに 15 時間待っています)。それをスピードアップする方法は?
おそらく 2 つの質問があります: 1. Pandas のみを使用してこのコードを調整することで、パフォーマンスを高速化できますか? 2. Daskで同じ集計を計算することは可能ですか (Pandas のマルチコア ラッパーであると読みました)? 私はすでにjoblibの助けを借りて作業を並列化しようとしました. 次のようなもの (f のプロトタイプに cont_columns も追加しました):
def tt(grouped, cont_columns):
return grouped.apply(f, cont_columns)
r = Parallel(n_jobs=4, verbose=True)([delayed(tt)(grouped, cont_columns[:16]),
delayed(tt)(grouped, cont_columns[16:32]),
delayed(tt)(grouped, cont_columns[32:48]),
delayed(tt)(grouped, cont_columns[48:])]
)
しかし、Pandas groupby で無制限の再帰エラーが発生しました。
パンダの専門家、アドバイスしてください!
ありがとう!
セルゲイ。