2017-10-12 25 views
0

我使用下面的代碼計算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

@BradSolomon!感謝您的建議。數據沒有設定頻率;其中大部分是每日數據,但數據中有一些漏洞。 – user1566200

回答

0

一個可能的加速是調用​​和sort_index只有一次,你的「父」數據幀,而不是所有得到由.groupby創建的子幀:添加

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