在Pandas中使用窗口进行多次聚合的性能不佳

时间:2016-04-24 10:35:43

标签: multithreading performance pandas aggregation windowing

我需要在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中获得了无限的递归错误。

熊猫专家,请指教!

谢谢!

塞吉。

0 个答案:

没有答案