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

为何Pandas中Series的rolling mean返回NaN?附代码与输出

问题根源分析与解决方案

嘿,我一眼就揪出问题所在了——你的df_train和y_hat_avg的索引完全不匹配!

先看输出里的关键细节:

  • df_train.head()展示的是2014年4月1日的日期数据
  • 但y_hat_avg.head()的日期却是2014年8月1日

当你执行这条代码时:

y_hat_avg['moving_avg_forecast'] = df_train['pickups'].rolling(1).mean()

df_train['pickups'].rolling(1).mean()生成的是一个和df_train同索引(4月日期)的Series,而你把它赋值给索引是8月日期的y_hat_avg,Pandas找不到任何匹配的索引项,自然只能填充NaN。而.mean()返回的是一个标量值,赋值给整个列时不需要索引匹配,所以能正常显示。

解决办法

根据你的需求,有两种常见处理路径:

1. 对y_hat_avg自身的pickups列计算滚动均值

如果你的目标是基于y_hat_avg里的现有数据计算滚动平均,直接操作它自己的列即可:

y_hat_avg['moving_avg_forecast'] = y_hat_avg['pickups'].rolling(1).mean()

(不过窗口设为1的话,滚动均值其实等于原数据,你大概率是想用更大的窗口,比如按小时滚动设rolling(24),按天滚动设rolling(7)这类合理的窗口值)

2. 用df_train的滚动均值填充y_hat_avg(需索引对齐)

如果你确实需要把df_train的滚动均值结果放到y_hat_avg里,得先对齐两个数据集的索引:

import numpy as np

# 先计算df_train的滚动均值
train_rolling_mean = df_train['pickups'].rolling(1).mean()
# 重新索引适配y_hat_avg的日期范围,缺失值可按需填充(比如ffill/bfill或指定值)
y_hat_avg['moving_avg_forecast'] = train_rolling_mean.reindex(y_hat_avg.index, fill_value=np.nan)

不过要注意:因为df_train和y_hat_avg的日期范围完全不重叠,即使对齐后还是会得到NaN,所以你可能需要重新梳理数据逻辑——是不是应该基于y_hat_avg的历史数据做滚动预测,或者数据拆分/索引处理环节出了问题?

快速验证方法

你可以先检查两个DataFrame的索引是否有交集:

print(df_train.index.intersection(y_hat_avg.index))

如果输出是空的,就坐实了两个数据集索引完全不匹配,这正是NaN出现的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:59