我正在使用 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/