我需要在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个小时)。如何加快它?
可能只有两个问题: 1.我是否可以仅使用Pandas调整此代码来提高性能? 2.是否可以在Dask中计算相同的聚合(我读过它是Pandas的多核包装器)?我已经尝试在joblib的帮助下并行化工作。类似的东西(我还将cont_columns添加到f的原型中):
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中获得了无限的递归错误。
熊猫专家,请指教!
谢谢!
塞吉。