.std()和.skew()使用.rolling给出错误答案

时间:2018-08-20 17:02:07

标签: python pandas numpy scipy

我正在使用熊猫版本:“ 0.23.4”

在调试我的代码时,我意识到std和skew不能在滚动窗口中给出正确的结果。 检查以下代码:

public function mentorapplication()
{
    return $this->hasMany(mentorApplication::class, 'user_id');
}

public function mentorAssigned()
    {
          return ($this->mentorapplication()->status == "counsellorAssigned");
    }

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

1 个答案:

答案 0 :(得分:3)

区别在于指定的自由度增量。

Numpy使用ddof to be 0 as default,而熊猫使用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,熊猫计算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