Pandas DataFrame:移动平均线,带滚动、均值和移位,忽略NaN

Pandas DataFrame:移动平均线,带滚动、均值和移位,忽略NaN,pandas,dataframe,missing-data,moving-average,Pandas,Dataframe,Missing Data,Moving Average,我有一个数据集,比如说,420x1。现在我要计算过去30天的移动平均数,不包括当前日期 如果我这样做: df.rolling(window = 30).mean().shift(1) my df会导致窗口中出现大量NaN,这可能是由原始数据帧中的NaN引起的(30个数据点中的1个NaN导致MA为NaN) 有没有忽略NaN的方法(避免应用方法,我在大数据上运行它,所以性能是关键)?我不想将该值替换为0,因为这可能会扭曲结果 与移动标准偏差相同。您可以尝试删除nan值或用特定值替换nan 或者,您

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

如果我这样做:

df.rolling(window = 30).mean().shift(1)
my df会导致窗口中出现大量NaN,这可能是由原始数据帧中的NaN引起的(30个数据点中的1个NaN导致MA为NaN)

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

与移动标准偏差相同。

您可以尝试删除nan值或用特定值替换nan

或者,您可以通过操作或在操作中过滤掉所有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有一个关于处理缺失数据(读取)的干净记录片。

选项1 选择2 备选案文2.5 选择3 备选案文3.5
例如,您可以添加
min\u时段
,然后
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

实际30天?营业日?样本数据在哪里?仅捕获工作日;所以我之前需要30行的“偏移量”。您仍然没有提供任何示例数据。抱歉,您也可以使用R.yan的示例数据。正是这样谢谢你的建议。我不想放弃观察,也不想用另一个值填充它(除非没有出路)。这就像计算一个平均值,但忽略缺失的值(3+3+NaN)/2=3,而不是(3+3+0)/3=2So(3+3+NaN)/3=2,这是你想要的吗?是的,因为窗口,即这里是3,它应该考虑NaN,而不是在这里为这个特定窗口计算取另一个值谢谢,piRSquared,我认为选项3和3.5正是我想要的。与R.yan的问题相同:当应用np.nanmean时,窗口是否仍然存在,即3、3、NaN或NaN是否被删除,NaN之后的值是否被使用(或者因为我们正在回顾前3个之前的值)?假设窗口为30,如果10为NaN,则会发现其他20.min_周期的平均值是标准值;使用apply效率很低fyi@eternity1根据杰夫的评论,你能接受温家宝的回答吗?谢谢,谢谢,温。如果我使用min_periods=1,这是否意味着程序将使用29个观测值来计算平均值?
df.interpolate('index').rolling('30D').mean()
df.interpolate('index').rolling(30).mean()
s.rolling('30D').apply(np.nanmean)
df.rolling(30).apply(np.nanmean)
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