2017-10-12 8 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には50万のユニークなグループがあり、それぞれに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

一つの可能​​な高速化が.groupbyによって作成されますサブフレームの全てではなく、あなたの「親」DATAFRAMEに、一度だけ​​とsort_indexを呼び出すことです:

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 
関連する問題