Pandas按列滚动计算np.float64正常 np.float32/16返回空数组问题
问题根因分析
- 该问题是 pandas 1.2.x版本的滚动窗口校验逻辑与numpy 1.20.1~1.20.3版本的dtype判定规则不兼容导致的bug,根因出在pandas侧的校验逻辑缺陷。
- 具体触发逻辑:pandas 1.2.x版本处理
axis=1的滚动窗口计算时,会先校验计算结果的dtype是否符合预期,校验代码直接用np.result_type的返回值与目标dtype做严格相等比较。numpy 1.20.1版本修复了np.result_type处理float16、float32的计算逻辑,导致np.result_type(np.float32)、np.result_type(np.float16)的返回值无法通过pandas 1.2.x的校验,pandas误判为无有效计算结果,直接返回空DataFrame。 - 版本适配说明:numpy 1.20.0版本中
np.result_type的旧逻辑刚好可以通过pandas 1.2.x的校验,因此降级numpy到1.20.0可以临时解决问题。
修复方案
你可以根据自己的项目环境选择任意一种方案解决该问题:
- 升级pandas到1.3.0及以上版本,该版本官方已经修复了滚动窗口的dtype校验缺陷,适配所有numpy兼容版本,float16/float32/float64的滚动计算都可以得到正确结果
- 如果不方便升级pandas版本,除了显式指定数据类型为
np.float64之外,也可以在调用rolling时添加raw=True参数绕开有问题的校验逻辑,示例代码如下:
print(pd.DataFrame(a, dtype=np.float32).rolling(3, axis=1, raw=True).mean())
运行后即可得到和float64类型一致的正确输出。
内容的提问来源于stack exchange,提问作者Rm4n
相关产品推荐
相关产品推荐

