Rolling_apply和scipy nanmean行为

时间:2013-10-31 16:06:05

标签: python pandas scipy

我有一个名为dF的数据框:

                      Twa_mean
Date_Time                    
2007-01-01 07:00:00       6.5
2007-01-01 07:10:00       6.4
2007-01-01 07:20:00       6.4
2007-01-01 07:30:00       NaN
2007-01-01 07:40:00       NaN
2007-01-01 07:50:00       NaN

我试图获得滚动均值(window = 2),但是没有考虑NaN,所以,我使用了scipy.stats的nanmean函数:

import scipy.stats as st

f=lambda x: st.nanmean(x)

d=pd.rolling_apply(dF,2,f)

但是,我得到了这个:

                     Twa_mean
Date_Time                    
2007-01-01 07:00:00       NaN
2007-01-01 07:10:00      6.45
2007-01-01 07:20:00      6.40
2007-01-01 07:30:00       NaN
2007-01-01 07:40:00       NaN
2007-01-01 07:50:00       NaN

就像st.nanmean没有忽视NaN,发生了什么?

我希望如此:

                     Twa_mean
Date_Time                    
2007-01-01 07:00:00       NaN
2007-01-01 07:10:00      6.45
2007-01-01 07:20:00      6.40
2007-01-01 07:30:00      6.40
2007-01-01 07:40:00       NaN
2007-01-01 07:50:00       NaN

1 个答案:

答案 0 :(得分:0)

我认为大熊猫滚动意味着将涵盖你给出的案例。您只需要将minimum_periods参数指定为rolling_mean

In [53]: df
Out[53]: 
                       1
0                       
2007-01-01 07:00:00  6.5
2007-01-01 07:10:00  6.4
2007-01-01 07:20:00  6.4
2007-01-01 07:30:00  NaN
2007-01-01 07:40:00  NaN
2007-01-01 07:50:00  NaN

In [54]: pd.rolling_mean(df, 2, min_periods=1)
Out[54]: 
                        1
0                        
2007-01-01 07:00:00  6.50
2007-01-01 07:10:00  6.45
2007-01-01 07:20:00  6.40
2007-01-01 07:30:00  6.40
2007-01-01 07:40:00   NaN
2007-01-01 07:50:00   NaN

这不是你想要的,但我会说它更加一致。你期望第一个NaN,大概是因为你只有1次观察。但对于后者,你将平均值设置为等于单个观察值(由于NaNs)。如果你真的想要这个,你可以通过并设置第一个n观察(在这种情况下为n=1)等于NaN之后(res = pd.rolling_mean(df, 2, min_periods=1); res.iloc[:n] = np.nan)。