0

我需要在 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 中出现无限递归错误。

熊猫高手,请指教!

谢谢!

谢尔盖。

4

0 回答 0