我需要在 Pandas 中按 Dataframe 索引计算很多聚合,并考虑按时间(月列)开窗。就像是:
# 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 的帮助下并行工作。类似的东西(我还在 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 中出现无限递归错误。
熊猫高手,请指教!
谢谢!
谢尔盖。