DataFrame:忽略 NaN 的滚动、均值和偏移的移动平均值

DataFrame: Moving average with rolling, mean and shift while ignoring NaN

我有一个数据集,比方说,420x1。现在我要计算过去 30 天的移动平均值,不包括当前日期。

如果我执行以下操作:

df.rolling(window = 30).mean().shift(1)

我的 df 导致 window 有很多 NaN,这可能是由原始数据帧中到处都是 NaN 造成的(30 个数据点中有 1 个 NaN 导致 MA 为 NaN)。

是否有忽略 NaN 的方法(避免应用方法,我 运行 它用于大数据,因此性能是关键)?我不想用 0 替换该值,因为这可能会扭曲结果。

同样适用于移动标准偏差。

您可以尝试 dropna() to remove the nan values or fillna() 将 nan 替换为特定值。

或者您可以在操作中通过 notnull() or isnull() 过滤掉所有 nan 值。

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'],columns=['one', 'two', 'three'])
df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df2
        one       two     three
a  0.434024 -0.749472 -1.393307
b       NaN       NaN       NaN
c  0.897861  0.032307 -0.602912
d       NaN       NaN       NaN
e -1.056938 -0.129128  1.328862
f -0.581842 -0.682375 -0.409072
g       NaN       NaN       NaN
h -1.772906 -1.342019 -0.948151

df3 = df2[df2['one'].notnull()]
# use ~isnull() would return the same result
# df3 = df2[~df2['one'].isnull()]
print df3
    one       two     three
a  0.434024 -0.749472 -1.393307
c  0.897861  0.032307 -0.602912
e -1.056938 -0.129128  1.328862
f -0.581842 -0.682375 -0.409072
h -1.772906 -1.342019 -0.948151

为了进一步参考,Pandas 有一部关于处理缺失数据的干净的纪录片(阅读 this)。

选项 1

df.dropna().rolling('30D').mean()

选项 2

df.interpolate('index').rolling('30D').mean()

选项 2.5

df.interpolate('index').rolling(30).mean()

选项 3

s.rolling('30D').apply(np.nanmean)

选项 3.5

df.rolling(30).apply(np.nanmean)

例如,您可以添加 min_periods,而 NaN 则消失

df=pd.DataFrame({'A':[1,2,3,np.nan,2,3,4,np.nan]})
df.A.rolling(window=2,min_periods=1).mean()

Out[7]: 
0    1.0
1    1.5
2    2.5
3    3.0
4    2.0
5    2.5
6    3.5
7    4.0
Name: A, dtype: float64