DataFrame:移动平均值,包括滚动,平均值和移位,同时忽略NaN

时间:2018-04-06 03:15:39

标签: pandas dataframe missing-data moving-average

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

如果我执行以下操作:

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

我的df会产生一个包含大量NaN的窗口,这可能是由原始数据帧中的NaNs引起的(30个数据点中的1个NaN导致MA为NaN)。

是否有一种忽略NaN的方法(避免使用apply-method,我在大数据上运行它,因此性能是关键)?我不想将值替换为0,因为这可能会导致结果偏差。

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

3 个答案:

答案 0 :(得分:4)

例如,您可以添加min_periodsNaN已消失

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)

选项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)

答案 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)。