如何使用pandas rolling_sum与滑动窗口

时间:2014-01-21 17:03:14

标签: python pandas

我想用滑动窗口计算总和或其他计算。 例如,我想计算当前位置的最后10个数据点的总和,其中A为True。 有没有办法做到这一点 ? 有了它,它没有返回我期望的价值。

我把期望值和计算放在一边。

谢谢

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 这是这样做的吗?

1 个答案:

答案 0 :(得分:2)

您只是在做一笔钱,还是这是一个更复杂问题的简化示例?

如果它只是一笔金额,那么您可以混合使用fillna()以及TrueFalsenp.sum中表现为1和0的事实:

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