我有一个数据集,比方说,420x1。现在我想计算过去30天的移动平均线,不包括当前日期。
如果我执行以下操作:
df.rolling(window = 30).mean().shift(1)
我的df会产生一个包含大量NaN的窗口,这可能是由原始数据帧中的NaNs引起的(30个数据点中的1个NaN导致MA为NaN)。
是否有一种忽略NaN的方法(避免使用apply-method,我在大数据上运行它,因此性能是关键)?我不想将值替换为0,因为这可能会导致结果偏差。
同样适用于移动标准偏差。
答案 0 :(得分:4)
例如,您可以添加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
答案 1 :(得分:2)
df.dropna().rolling('30D').mean()
df.interpolate('index').rolling('30D').mean()
df.interpolate('index').rolling(30).mean()
s.rolling('30D').apply(np.nanmean)
df.rolling(30).apply(np.nanmean)
答案 2 :(得分:1)
您可以尝试dropna()删除nan值或fillna()以替换具有特定值的nan。
或者您可以在操作中按notnull()或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)。