2014-01-21 13 views
2

我想用滑動窗口計算總數或其他計算。 例如,我想計算當前位置的最後10個數據點的總和,其中A爲真。 有沒有辦法做到這一點? 有了它,它沒有返回我期望的值。如何使用帶滑動窗口的pandas rolling_sum

我把期望值和計算放在一邊。

謝謝

In [63]: dt['As'] = pd.rolling_sum(dt.Val[ dt.A == True ], window=10, min_periods=1) 

In [64]: dt 
Out[64]: 
    Val  A  B As 
0  1 NaN NaN NaN 
1  1 NaN NaN NaN 
2  1 NaN NaN NaN 
3  1 NaN NaN NaN 
4  6 NaN True NaN 
5  1 NaN NaN NaN 
6  2 True NaN 1 pos 6 = 2 
7  1 NaN NaN NaN 
8  3 NaN NaN NaN 
9  9 True NaN 2 pos 9 + pos 6 = 11 
10 1 NaN NaN NaN 
11 9 NaN NaN NaN 
12 1 NaN NaN NaN 
13 1 NaN True NaN 
14 1 NaN NaN NaN 
15 2 True NaN 3 pos 15 + pos 9 + pos 6 = 13 
16 1 NaN NaN NaN 
17 8 NaN NaN NaN 
18 1 NaN NaN NaN 
19 5 True NaN 4 pos 19 + pos 15 = 7 
20 1 NaN NaN NaN 
21 1 NaN NaN NaN 
22 2 NaN NaN NaN 
23 1 NaN NaN NaN 
24 7 NaN True NaN 
25 1 NaN NaN NaN 
26 1 NaN NaN NaN 
27 1 NaN NaN NaN 
28 3 True NaN 5 pos 28 + pos 19 = 8 

這幾乎做

import numpy as np 
import pandas as pd 
dt = pd.read_csv('test2.csv') 

dt['AVal'] = dt.Val[dt.A == True] 
dt['ASum'] = pd.rolling_sum(dt.AVal, window=10, min_periods=1) 
dt['ACnt'] = pd.rolling_count(dt.AVal, window=10) 

In [4]: dt 
Out[4]: 
    Val  A  B AVal ASum ACnt 
0  1 NaN NaN NaN NaN  0 
1  1 NaN NaN NaN NaN  0 
2  1 NaN NaN NaN NaN  0 
3  1 NaN NaN NaN NaN  0 
4  6 NaN True NaN NaN  0 
5  1 NaN NaN NaN NaN  0 
6  2 True NaN  2  2  1 
7  1 NaN NaN NaN  2  1 
8  3 NaN NaN NaN  2  1 
9  9 True NaN  9 11  2 
10 1 NaN NaN NaN 11  2 
11 9 NaN NaN NaN 11  2 
12 1 NaN NaN NaN 11  2 
13 1 NaN True NaN 11  2 
14 1 NaN NaN NaN 11  2 
15 2 True NaN  2 13  3 
16 1 NaN NaN NaN 11  2 
17 8 NaN NaN NaN 11  2 
18 1 NaN NaN NaN 11  2 
19 5 True NaN  5  7  2 
20 1 NaN NaN NaN  7  2 
21 1 NaN NaN NaN  7  2 
22 2 NaN NaN NaN  7  2 
23 1 NaN NaN NaN  7  2 
24 7 NaN True NaN  7  2 
25 1 NaN NaN NaN  5  1 
26 1 NaN NaN NaN  5  1 
27 1 NaN NaN NaN  5  1 
28 3 True NaN  3  8  2 

但需要NaN的所有在ASUM和ACount其中A爲NaN 這是爲了做到這一點的價值?

回答

2

你只是在做一筆款項,或者這是一個更復雜問題的簡單例子嗎?

如果它只是一個總和,那麼你可以使用fillna()混合和事實TrueFalse行爲像1和0 np.sum

In [8]: pd.rolling_sum(dt['A'].fillna(False), window=10, 
         min_periods=1)[dt['A'].fillna(False)] 
Out[8]: 
6  1 
9  2 
15 3 
19 2 
28 2 
dtype: float64 
+0

是值1僅僅是爲了簡單起見。它可以是任何數字> 0.我重新編輯樣本數據。謝謝 – Tony