在pandas中计算顺序滚动平均值作为数组函数?

时间:2014-03-03 11:54:53

标签: pandas

我正在尝试用大熊猫中的NaN计算数据帧的滚动均值,但是当它遇到NaN时,pandas似乎重置了窗口,听到一些代码作为示例......

import numpy as np
from pandas import *

foo = DataFrame(np.arange(0.0,13.0))
foo['1'] = np.arange(13.0,26.0)
foo.ix[4:6,0] = np.nan
foo.ix[4:7,1] = np.nan
bar = rolling_mean(foo, 4)

给出滚动平均值,在每个NaN之后重置窗口,而不仅仅是跳过NaNs

bar = 
       0     1
0    NaN   NaN
1    NaN   NaN
2    NaN   NaN
3    1.5  14.5
4    NaN   NaN
5    NaN   NaN
6    NaN   NaN
7    NaN   NaN
8    NaN   NaN
9    NaN   NaN
10   8.5   NaN
11   9.5  22.5
12  10.5  23.5

我找到了一个丑陋的iter / dropna()解决方法,给出正确答案

def sparse_rolling_mean(df_data, window):
     ...:     f_data = DataFrame(np.nan,index=df_data.index, columns=df_data.columns)
     ...:     for i in f_data.columns:
     ...:         f_data.ix[:,i] = rolling_mean(df_data.ix[:,i].dropna(),window)
     ...:     return f_data

bar = sparse_rolling_mean(foo,4)

bar
        0     1
0     NaN   NaN
1     NaN   NaN
2     NaN   NaN
3    1.50  14.5
4     NaN   NaN
5     NaN   NaN
6     NaN   NaN
7    3.25   NaN
8    5.00  16.5
9    6.75  18.5
10   8.50  20.5
11   9.50  22.5
12  10.50  23.5

是否有人知道是否可以将此作为数组函数执行? 非常感谢提前。

2 个答案:

答案 0 :(得分:2)

你可能会这样做:

>>> def sparse_rolling_mean(ts, window):
...     return rolling_mean(ts.dropna(), window).reindex_like(ts)
... 
>>> foo.apply(sparse_rolling_mean, args=(4,))
        0     1
0     NaN   NaN
1     NaN   NaN
2     NaN   NaN
3    1.50  14.5
4     NaN   NaN
5     NaN   NaN
6     NaN   NaN
7    3.25   NaN
8    5.00  16.5
9    6.75  18.5
10   8.50  20.5
11   9.50  22.5
12  10.50  23.5

[13 rows x 2 columns]

答案 1 :(得分:0)

你可以使用min_periods arg

控制得到的内容
In [12]:  rolling_mean(foo, 4,min_periods=1)
Out[12]: 
       0     1
0    0.0  13.0
1    0.5  13.5
2    1.0  14.0
3    1.5  14.5
4    2.0  15.0
5    2.5  15.5
6    3.0  16.0
7    7.0   NaN
8    7.5  21.0
9    8.0  21.5
10   8.5  22.0
11   9.5  22.5
12  10.5  23.5

[13 rows x 2 columns]

如果你想要结果,你可以这样做,除非原件是nan

In [27]:  rolling_mean(foo, 4,min_periods=1)[foo.notnull()]
Out[27]: 
       0     1
0    0.0  13.0
1    0.5  13.5
2    1.0  14.0
3    1.5  14.5
4    NaN   NaN
5    NaN   NaN
6    NaN   NaN
7    7.0   NaN
8    7.5  21.0
9    8.0  21.5
10   8.5  22.0
11   9.5  22.5
12  10.5  23.5

[13 rows x 2 columns]

您的预期有点奇怪,因为前3行应该有值。