我正在使用 Pandas 版本:'0.23.4'

在调试我的代码时,我意识到,std & skew 没有通过滚动窗口给出正确的结果。
检查下面的代码:

import pandas as pd
import numpy as np
import scipy.stats as sp

df = pd.DataFrame(np.random.randint(1,10,(5)))
df_w = df.rolling(window=3, min_periods=1)

m1 = df_w.apply(lambda x: np.mean(x))
m2 = df_w.mean()

s1 = df_w.apply(lambda x: np.std(x))
s2 = df_w.std()

sk1 = df_w.apply(lambda x: sp.skew(x))
sk2 = df_w.skew()

尽管均值的结果相同,但标准和偏斜的结果却不同?
这是预期的行为还是我错过了什么?

最佳答案

不同之处在于指定的 delta 自由度。
Numpy 使用 ddof to be 0 as default ,而 pandas 使用 ddof to be 1 as default 。此值会影响 std 的计算方式(特别是,您如何对其进行标准化,例如引用 here )

如果两者都指定为 0,则结​​果相同

s1 = df_w.apply(lambda k: np.std(k, ddof=0), raw=True)
s2 = df_w.std(ddof=0)

>>> (s1==s2).all()
True

同样,对于 skew ,pandas 计算 unbiased skewness ,而 scipy calculates the biased.

因此,要获得相同的结果,只需在 bias=False 中指定 scipy
sk1 = df_w.apply(lambda x: sp.skew(x, bias=False))
sk2 = df_w.skew()

>>> (sk1==sk2).all()
True

关于python - .std() & .skew() 用 .rolling 给出错误答案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51935456/

10-13 00:04