我使用以下代码计算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
有更快的方法吗?
答案 0 :(得分:0)
此处一种可能的加速方式是在您的“父”DataFrame上调用set_index
和sort_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