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

Python中如何将Prophet预测结果与实际值高效关联?

嘿,我来分享几个更靠谱的方法,帮你把Prophet的预测结果和实际值精准结合起来——直接用forecast['actuals'] = weekly['y']很容易因为索引或者行数不匹配出问题,试试下面的方案:

1. 按日期列(ds)合并(最推荐)

因为你的原始数据weekly和预测结果forecast都有ds这个日期列,用pandas的merge按日期关联是最稳妥的方式,完全不用担心行顺序或者行数的问题:

import pandas as pd

# 先确保两个数据集的日期列都是datetime格式(避免格式不匹配导致合并失败)
weekly['ds'] = pd.to_datetime(weekly['ds'])
forecast['ds'] = pd.to_datetime(forecast['ds'])

# 左合并:保留所有预测行,匹配对应日期的实际值;未发生的日期(比如你预测的下周)会显示NaN
combined_df = pd.merge(forecast, weekly[['ds', 'y']], on='ds', how='left')

# 把原始实际值列重命名为更直观的名字
combined_df.rename(columns={'y': 'actuals'}, inplace=True)

# 查看最后几行的结果,包含日期、实际值、预测值和预测区间
print(combined_df[['ds', 'actuals', 'yhat', 'yhat_lower', 'yhat_upper']].tail())

这种方法的好处是:不管你的历史数据有没有打乱顺序,都能准确匹配到对应日期的实际值,新增的预测行(还没实际数据的)会自动填充NaN,逻辑非常清晰。

2. 索引对齐时用assign优雅赋值(仅限确定索引完全匹配的情况)

如果你能100%确定weekly的行数和forecast中历史部分的行数完全一致,且索引一一对应,那么可以用assign方法来添加实际值列,代码更简洁:

# 给历史行赋值实际值,预测的新行补None
combined_df = forecast.assign(actuals=weekly['y'].append(pd.Series([None]))).reset_index(drop=True)

⚠️ 注意:这个方法有风险,如果后续数据更新或者索引变动,很容易出现数据错位的问题,所以还是优先推荐第一种合并方法。

额外福利:可视化对比预测与实际值

Prophet自带的绘图工具可以结合实际值一起展示,帮你直观看到预测效果:

import matplotlib.pyplot as plt

# 绘制Prophet的预测图
fig = m.plot(combined_df)
ax = fig.gca()

# 在图上叠加实际值的散点图,用红色区分
ax.scatter(combined_df['ds'], combined_df['actuals'], color='crimson', label='Actual Values')
ax.legend()
plt.show()

这样你就能一眼看到实际值落在预测区间内的情况,非常直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:45:50