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

