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
我有一个数据集,比方说,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