当值列表的 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
在变量为常量值的情况下,您可能可以添加一个问题,以在该方法的行为上添加一个标志。它应该很容易修复。
背景
让我们想想,有一个值列表可以显示一个人 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的这个
您可以在此处找到实现: 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
在变量为常量值的情况下,您可能可以添加一个问题,以在该方法的行为上添加一个标志。它应该很容易修复。