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

pandas.rolling.apply(raw参数不同时,np.prod处理NaN的行为差异疑问

pandas.rolling.apply结合np.prod处理NaN的行为差异解释

核心原因:raw参数决定传递给np.prod的数据类型

  • 当设置raw=False时,滚动窗口会将数据以pandas Series对象传递给np.prod。pandas的Series在计算乘积时默认启用skipna=True,即便调用的是np.prod,底层也会沿用Series的乘积逻辑,自动忽略NaN值。
  • 当设置raw=True时,滚动窗口会将数据以numpy数组传递给np.prod。numpy原生的prod函数没有跳过NaN的默认逻辑,只要数组中存在NaN,最终乘积结果就会直接返回NaN。

场景验证

以2013-01-04的B列滚动窗口为例:

  • 窗口内的数据为[1.0, 2.0, np.nan]
  • raw=False时,传递的是Series,np.prod(Series)等价于Series.prod(skipna=True),计算结果为1.0*2.0=2.0
  • raw=True时,传递的是numpy数组np.array([1.0,2.0,np.nan]),np.prod直接返回NaN

解决办法:用np.nanprod替代np.prod

如果要保留raw=True的性能优势,同时实现忽略NaN的乘积计算,只需使用numpy专门的忽略NaN乘积函数np.nanprod:

df.rolling('3D', min_periods=1).apply(np.nanprod, raw=True)

执行后结果与raw=False时完全一致:

B   C
2013-01-01  1.0 1.0
2013-01-02  1.0 2.0
2013-01-03  2.0 6.0
2013-01-04  2.0 24.0
2013-01-05  8.0 60.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:25:19