【问题标题】:How does pandas calculate skew大熊猫如何计算偏斜
【发布时间】:2016-06-06 08:44:21
【问题描述】:

我正在计算一个 coskew 矩阵,并想用 skew 方法中内置的 pandas 仔细检查我的计算。我无法协调 pandas 执行计算的方式。

将我的系列定义为:

import pandas as pd

series = pd.Series(
    {0: -0.051917457635120283,
     1: -0.070071606515280632,
     2: -0.11204865874074735,
     3: -0.14679988245503134,
     4: -0.088062467095565145,
     5: 0.17579741198527793,
     6: -0.10765856028420773,
     7: -0.11971470229167547,
     8: -0.15169210769159247,
     9: -0.038616800990881606,
     10: 0.16988162977411481,
     11: 0.092999418364443032}
)

我比较了以下计算并期望它们是相同的。

熊猫

series.skew()

1.1119637586658944

(((series - series.mean()) / series.std(ddof=0)) ** 3).mean()

0.967840223081231

我 - 拿 2

这是明显不同的。我想可能是Fisher-Pearson coefficient。所以我做了:

n = len(series)
skew = series.sub(series.mean()).div(series.std(ddof=0)).apply(lambda x: x ** 3).mean()
skew * (n * (n - 1)) ** 0.5 / (n - 1)

1.0108761442417222

还差很多。

问题

pandas 如何计算 skew?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我发现scipy.stats.skew 带有参数bias=False 返回相等的输出,所以我认为pandas skew 默认是bias=False

    偏差:布尔值

    如果为 False,则计算会针对统计偏差进行校正。

    import pandas as pd
    import scipy.stats.stats as stats
    
    series = pd.Series(
        {0: -0.051917457635120283,
         1: -0.070071606515280632,
         2: -0.11204865874074735,
         3: -0.14679988245503134,
         4: -0.088062467095565145,
         5: 0.17579741198527793,
         6: -0.10765856028420773,
         7: -0.11971470229167547,
         8: -0.15169210769159247,
         9: -0.038616800990881606,
         10: 0.16988162977411481,
         11: 0.092999418364443032}
    )
    
    print (series.skew())
    1.11196375867
    
    print (stats.skew(series, bias=False))
    1.1119637586658944
    

    100% 不确定,但我想我可以在 code 找到它


    编辑(piRsquared)

    来自scipy skew code

    if not bias:
        can_correct = (n > 2) & (m2 > 0)
        if can_correct.any():
            m2 = np.extract(can_correct, m2)
            m3 = np.extract(can_correct, m3)
            nval = ma.sqrt((n-1.0)*n)/(n-2.0)*m3/m2**1.5
            np.place(vals, can_correct, nval)
    return vals
    

    调整是(n * (n - 1)) ** 0.5 / (n - 2)而不是(n * (n - 1)) ** 0.5 / (n - 1)

    【讨论】:

    • 谢谢@jezrael。这引出了 scipy 如何调整偏见的问题。此外,不带偏差参数的stats.skew(series) 与我的计算相符。
    • 也许有些scipy 大师知道,我不知道(不幸的是)。
    • 函数nanskew被pandas用来计算偏度,在pandas GitHub repo中有描述。它基本上是来自 Skewness Wikipedia page 的 G1。
    猜你喜欢
    • 2022-10-30
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2021-08-28
    • 2019-12-13
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多