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
相关产品推荐
相关产品推荐

