2013-12-15 10 views
5

मुझे pandas.stats.moments के rolling_std फ़ंक्शन के बारे में कुछ समस्याएं हैं। आश्चर्यजनक रूप से मुझे इस कार्यक्षमता का उपयोग करके अलग-अलग परिणाम मिलते हैं जो numpy.std फ़ंक्शन की तुलना में एक सरणी पर रोलिंग विंडो पर लागू होते हैं।एक सरणी की खिड़की पर pandas rolling_std और np.std के बीच अंतर

# 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)] 

पैदावार:

#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] 

अगर मैं हाथ से यह गणना numpy परिणाम सही हो रहा है

यहाँ इस त्रुटि पुन: पेश करने कोड है। क्या किसी ने इसका सामना किया है या स्पष्टीकरण है?

उत्तर

6

पांडस rolling_std स्वतंत्रता की डिफ़ॉल्ट डेल्टा डिग्री, ddof, 1 के बराबर, उस पहलू में आर की तरह अधिक होने के साथ गणना की जाती है। जबकि 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]) 
संबंधित मुद्दे