当值列表的 SD 为 0 时,为什么 pandas.DataFrame.skew() return 0?

Why does pandas.DataFrame.skew() return 0 when the SD of a list of values is 0?

背景

让我们想想,有一个值列表可以显示一个人 activity 几个小时。那个人在那几个小时里没有任何动静。因此,所有的值都是0.

提出的问题是什么?

在 Google 上搜索,我发现了以下偏度公式。其他一些网站也提供相同的公式。在分母部分,包括标准差(SD)。对于相似的非零值列表(例如 [1, 1, 1])以及 0 值(即 [0, 0, 0]),SD 将为 0。因此,我应该得到NaN(除以 0)表示偏度。令人惊讶的是,我在调用 pandas.DataFrame.skew() 时得到 0。

我的问题

为什么当值列表的 SD 为 0 时 pandas.DataFrame.skew() return 0?


最小可重现示例

import pandas as pd
ot_df = pd.DataFrame(data={'Day 1': [0, 0, 0, 0, 0, 0],
                           'Day 2': [0, 0, 0, 0, 0, 0],
                           'Day 3': [0, 0, 0, 0, 0, 0]})
print(ot_df.skew(axis=1))

注意:我已经检查了这个网站的几个问答(例如GitHub的这个) and others (e.g., this one)。但是我没有找到问题的答案。

您可以在此处找到实现: https://github.com/pandas-dev/pandas/blob/main/pandas/core/nanops.py

如您所见,有一个:

    with np.errstate(invalid="ignore", divide="ignore"):
        result = (count * (count - 1) ** 0.5 / (count - 2)) * (m3 / m2 ** 1.5)

    dtype = values.dtype
    if is_float_dtype(dtype):
        result = result.astype(dtype)

    if isinstance(result, np.ndarray):
        result = np.where(m2 == 0, 0, result)
        result[count < 3] = np.nan
    else:
        result = 0 if m2 == 0 else result
        if count < 3:
            return np.nan

如您所见,如果 m2(对于所有常量值都等于 0)为 0,则结​​果将为 0。

如果你问为什么这样实现,我只能推测。我想,这样做是出于实际原因——如果你正在计算偏度,你想检查变量的分布是否对称(你可以争辩说,它确实是:https://stats.stackexchange.com/questions/114823/skewness-of-a-random-variable-that-have-zero-variance-and-zero-third-central-mom)。

编辑:这是由于: https://github.com/pandas-dev/pandas/issues/11974 https://github.com/pandas-dev/pandas/pull/12121

在变量为常量值的情况下,您可能可以添加一个问题,以在该方法的行为上添加一个标志。它应该很容易修复。