You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas 2.2.2中skew/kurtosis计算异常问题咨询

关于pandas 2.2.2(numpy 2.0.0)中skew和kurtosis计算异常的原因分析

问题现象

1. pandas与scipy的偏度/峰度计算结果不一致

a = pd.Series([0,0,0,0,0.00005])

a.kurtosis()
Out[205]: np.float64(0.0)

scipy.stats.kurtosis(a,bias=False)
Out[206]: np.float64(4.999999999999997)

2. 滚动计算中后续数据改变历史结果

以时间索引的Series d 为例,截取不同长度的数据时,同一时刻t的滚动偏度/峰度结果差异明显:

# 仅取到t时刻的数据
d.loc[:t].rolling(24,min_periods=1).skew().loc[t]
Out[214]: np.float64(4.8898633318381295)

# 取到t+92天的数据
d.loc[:t+timedelta(days=92)].rolling(24,min_periods=1).skew().loc[t]
Out[215]: np.float64(4.692266003534232)

滚动峰度差异更显著:

d.loc[:t+timedelta(days=92)].rolling(24,min_periods=1).kurt().loc[t]
Out[220]: np.float64(-12419.650647074468)

d.loc[:t+timedelta(days=91)].rolling(24,min_periods=1).kurt().loc[t]
Out[221]: np.float64(-2561.6779850060675)

原因分析

1. pandas与scipy计算差异的根源

  • 定义与校正差异:pandas的kurtosis()默认返回超额峰度(原始峰度减3),但即使scipy使用bias=False,两者的无偏估计自由度校正逻辑仍有区别。对于小样本+大量重复值的极端情况,这种差异会被放大;加上pandas内部数值优化的近似处理,导致结果出现0这类异常值。
  • 数值稳定性问题:当数据中存在近乎恒定的序列(如4个0),计算高阶矩(峰度)时容易出现数值下溢或精度丢失,pandas的实现未针对这种场景做特殊处理,而scipy的统计函数在小样本下的精度控制更严格。

2. 滚动计算结果随后续数据变化的原因

这是pandas 2.2.x与numpy 2.0.0兼容时出现的滚动窗口递推算法bug:

  • pandas为提升滚动计算效率,采用递推式更新统计量(如均值、方差、三阶/四阶矩),而非每次重新计算窗口内所有数据。但numpy 2.0.0的数值计算逻辑变更,导致递推过程中的累积误差被放大。
  • 后续数据加入时,整个Series的统计量缓存被重新计算,算法未正确隔离历史窗口的独立计算,导致后续数据的统计量污染了更早窗口的结果,最终出现同一时刻t的滚动结果随后续数据变化的异常。

内容的提问来源于stack exchange,提问作者z xt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:35:12