带有缺失数据的 Pandas 滚动应用程序

13

我希望对缺失数据进行滚动计算。

示例代码:(为简单起见,这里给出了一个滚动求和的例子,但我想要做一些更通用的东西。)

foo = lambda z: z[pandas.notnull(z)].sum() 
x = np.arange(10, dtype="float")    
x[6] = np.NaN
x2 = pandas.Series(x)    
pandas.rolling_apply(x2, 3, foo)

生成:

0   NaN    
1   NaN
2     3    
3     6    
4     9    
5    12    
6   NaN    
7   NaN    
8   NaN    
9    24

我认为在“滚动”计算过程中,缺失数据的窗口被忽略了。我想要得到如下结果:

0   NaN    
1   NaN    
2     3    
3     6    
4     9    
5    12    
6     9    
7    12    
8    15    
9    24

4
我认为这个问题的部分答案可能是使用滚动应用函数中的关键字参数min_periods。例如:pandas.rolling_apply(x2,3,foo,min_periods=1)会有所帮助。 - Mahesh
2个回答

11
In [7]: pandas.rolling_apply(x2, 3, foo, min_periods=2)
Out[7]: 
0   NaN
1     1
2     3
3     6
4     9
5    12
6     9
7    12
8    15
9    24

1
对于那些困惑的人来说,这是来自docs的内容:“min_periods:窗口中必须具有值的最小观测数(否则结果为NA)。 ” - Noah
任何对我一般回答的更正或建议都将不胜感激。虽然原帖已经消失,但这个措辞得当的问题仍然存在。 - user10316640

0
最好在对数据集进行操作之前,用逻辑替换来替换数据集中的NA值。

对于数值数据:

对于您给出的示例,简单的均值填充缺失值是完美的解决方案,但如果x[7] = np.NaN也被消除了呢?

周围数据的分析显示出线性模式,因此需要进行线性插值。

多项式、指数、对数和周期(余弦)数据同样适用。

如果在缺失数据期间发生二阶导数变化(两两点相减两次,并注意符号是否改变),则其位置无法确定,除非另一侧完美地捕捉到它,否则请随机选择一个点并继续。


针对分类数据:

from scipy import stats

使用:

x=pandas.rolling_apply(x2, 3, (lambda x : stats.mode(x,nan_policy='omit')) 来用最常见的邻近三个值替换缺失值。


针对静态数据:

使用:

将0替换为适当的值。

x = x.fillna(0)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接