关于pandas.stats.moments的rolling_std函数,我遇到了一些问题。
奇怪的是,与应用于数组上滚动窗口的numpy.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的结果似乎是正确的。有人之前遇到过这个问题或有任何解释吗?

最佳答案

Pandas 的rolling_std是使用等于1的默认自由度Deltat ddof计算的,在该方面更像R。虽然numpy的std的默认ddof为0。当为ddof=1指定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=0rolling_std:
>>> 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])

关于python - 数组窗口上的 Pandas rolling_std和np.std之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20600962/

10-12 18:46