如何加快大数据集中的两个嵌套 for 循环

Posted

技术标签:

【中文标题】如何加快大数据集中的两个嵌套 for 循环【英文标题】:How to speed up two nested for loops in big dataset 【发布时间】:2019-02-21 02:58:36 【问题描述】:

我正在处理一个 600.000 x 128 的数据集,按以下形式排列,并带有层次索引(见左图):

                    Var1     Var2     ...                                     Var1_mean  Var2_mean     ...          
    ID     Date                                               ID     Date          
    1      2017-12  1        0.1                              1      2017-12  2          0.3
    1      2018-01  2        0.3                              1      2018-01  2          0.3
    1      2018-02  3        0.5            -->               1      2018-02  2          0.3
    2      2018-01  2        0.2                              2      2018-01  3          0.15
    2      2018-02  4        0.1                              2      2018-02  3          0.15

现在对于所有 55.000 名客户(= 唯一 ID),我想用每个客户的平均值替换所选变量中每个客户的值,并存储在新变量中(变量名称 + '_mean',见右图)。

我为此编写了一个函数,但它需要 4 个多小时,即使在尝试并行化任务之后也是如此。我试过了:

    identifiers = set(df_raw_sort.index.get_level_values(0)) # unique IDs

    def avg_per_customer(column): 
       df_raw_sort.loc[:, column + '_mean'] = 0 # Create new col
       for unique in identifiers: 
          meanvalue = np.mean(df_raw_sort[column].loc[(unique)])
          df_raw_sort.loc[(unique), column + '_mean'] = meanvalue

    Parallel(n_jobs=2, verbose=10)(delayed(avg_per_customer)(col) for col in transform)
    # transforms selected columns (= transform)

我能做些什么来加快这件事的速度?

非常感谢。

【问题讨论】:

【参考方案1】:

你可以试试这个

df_raw_sort[variable_name_mean] = df_raw_sort[variable_name].groupby(df_raw_sort[‘ID’]).transform(‘mean’)

Referred answer from here

【讨论】:

非常感谢!摆脱分层索引后,它在几秒钟内就起作用了!是否有任何同样简单的方法来计算线性回归的斜率(如 scipy.stats.linregress)而不是平均值?所以在上面的情况下: ID1:1 ID2:-1 谢谢你,Avinash 不客气。我从来没有计算过线性回归,但看看这个:***.com/a/46754476/2196290

以上是关于如何加快大数据集中的两个嵌套 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

2022年最新Python大数据之Python基础

如何改进大数据的矢量化滑动窗口?

加快R中大数据的for循环处理时间

R提高嵌套for()循环的效率,以在大型数据集中进行简单的距离计算

加快嵌套循环比较

从嵌套for循环中的指针集中删除项目