加快滚动窗口的时间总和?

时间:2017-10-12 14:22:44

标签: python performance pandas processing-efficiency

我使用以下代码计算7天求和窗口(展望未来):

def for_window(g, win=7):
    g = g.set_index('date').resample('D')['value'].sum()
    g['roll'] = g.sort_index(ascending=False).rolling(window=win, center=False, min_periods=1).sum().dropna()
    return g

df = df.groupby(['id1','id2']).apply(for_window,win=7)

这很有效,但是对于lare数据集来说速度非常慢。我的groupby中有500,000个唯一群组,每个群组有5到100个日期。

我的数据的示例:

id1 id2     date        value
3   14      2017-06-14  5
3   14      2017-06-15  20
3   45      2017-06-15  18
3   46      2017-06-14  6
3   46      2017-06-15  21
3   46      2017-06-16  6
3   47      2017-06-15  5
13  26      2017-06-16  4
13  35      2017-06-14  4
13  39      2017-06-14  3

有更快的方法吗?

1 个答案:

答案 0 :(得分:0)

此处一种可能的加速方式是在您的“父”DataFrame上调用set_indexsort_index一次,而不是在.groupby创建的所有子框架上调用:< / p>

print(df)
   id1  id2       date  value
0    3   14 2017-06-14      5
1    3   14 2017-06-15     20
2    3   45 2017-06-15     18
3    3   46 2017-06-14      6
4    3   46 2017-06-15     21
5    3   46 2017-06-16      6
6    3   47 2017-06-15      5
7   13   26 2017-06-16      4
8   13   35 2017-06-14      4
9   13   39 2017-06-14      3

df = df.set_index('date').sort_index(ascending=False)
df = df.groupby(['id1','id2']).apply(lambda df: df.resample('D')['value']\
                                     .sum().rolling(window=7, min_periods=1).sum())
print(df)
id1  id2  date      
3    14   2017-06-14     5.0
          2017-06-15    25.0
     45   2017-06-15    18.0
     46   2017-06-14     6.0
          2017-06-15    27.0
          2017-06-16    33.0
     47   2017-06-15     5.0
13   26   2017-06-16     4.0
     35   2017-06-14     4.0
     39   2017-06-14     3.0
Name: value, dtype: float64