2013-12-15 10 views
5

pandas.stats.momentsのrolling_std関数に関するいくつかの問題があります。 不思議なことに、配列上のローリングウィンドウに適用されたnumpy.std関数と比較して、この機能を使用して異なる結果が得られます。私は手でこれを計算するとnumpyの結果が正しいように思わ配列のウィンドウでpandas rolling_stdとnp.stdの違い

#pandas 
array([  nan,   nan,   nan, 1.29099445, 1.29099445, 
    1.29099445, 1.29099445, 1.29099445, 1.29099445, 1.29099445]) 
#numpy 
[0.0, 0.5, 0.81649658092772603, 1.1180339887498949, 1.1180339887498949, 1.1180339887498949, 1.1180339887498949, 1.1180339887498949, 1.1180339887498949, 1.1180339887498949] 

:降伏

# import the modules 
import numpy as np 
import pandas as pd 

# define timeseries and sliding window size 
timeseries = np.arange(10) 
periods = 4 

# output of different results 
pd.stats.moments.rolling_std(timeseries, periods) 
[np.std(timeseries[max(i-periods+1,0):i+1]) for i in np.arange(10)] 

:ここ

は、このエラーを再現するためのコードです。誰もこの前に遭遇したか説明を持っていますか?

答えて

6

パンダのrolling_stdはデフォルトのデルタ自由度ddof(1に等しい)を使用して計算され、そのアスペクトではRによく似ています。 numpyののstdのデフォルトDDOFは0ですがrolling_stdためnp.std

>>> [np.std(timeseries[max(i-periods+1,0):i+1], ddof=1) for i in np.arange(10)] 
[nan, 0.70710678118654757, 1.0, 1.2909944487358056, 1.2909944487358056, 1.2909944487358056, 1.2909944487358056, 1.29099444873580 
56, 1.2909944487358056, 1.2909944487358056] 

それともddof=0ためddof=1を指定しているときには、同等の結果が得られます:

>>> pd.stats.moments.rolling_std(timeseries, periods, ddof=0) 
array([  nan,   nan,   nan, 1.11803399, 1.11803399, 
     1.11803399, 1.11803399, 1.11803399, 1.11803399, 1.11803399]) 
関連する問題