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

使用Python Prophet做预测时,如何保留测试集id列并避免索引异常?

解决Prophet预测结果丢失id列且对应关系异常的问题

核心原因是你尝试通过索引合并时,Prophet内部处理可能改变了行顺序;而id是Date(ds)、Var1、Var2的唯一组合,所以可以通过这三个字段作为唯一合并键来确保匹配准确,以下是两种可靠的解决方法:

方法一:预测时直接保留id列

Prophet的predict()方法会保留输入DataFrame中的所有非模型必需列(除ds和回归变量外的列都会被带回预测结果),只需确保你的df_test包含id列即可:

# 重命名Date为ds时,保留原test数据中的所有列(包括id)
df_test = df_test_clean.rename(columns={'Date':'ds'})

# 执行预测,test_forecast会自动包含id列
test_forecast = m.predict(df_test)

方法二:通过唯一键合并id列(兼容所有Prophet版本)

如果方法一不生效,直接用ds、Var1、Var2这三个唯一标识字段做合并键,把id匹配到预测结果中:

# 执行预测
test_forecast = m.predict(df_test)

# 合并id列,确保匹配准确
test_forecast_with_id = pd.merge(
    test_forecast,
    df_test_clean[['id', 'Date', 'Var1', 'Var2']],
    left_on=['ds', 'Var1', 'Var2'],
    right_on=['Date', 'Var1', 'Var2'],
    how='left'
).drop(columns='Date')  # 删除重复的Date列

额外注意:训练数据处理的潜在问题

你的代码中使用df_train_clean.index.get_level_values('Date'),说明Date是索引的一部分,但后续执行rename(columns={'Date':'ds'})时,Date是索引而非列,重命名操作不会生效,会导致Prophet训练时找不到ds列报错。修正方法如下:

# 先把Date从索引移到列
df_train_clean = df_train_clean.reset_index(level='Date')

# 再进行数据分割和重命名
split_date = '2019-01-01'
df_train = df_train_clean[df_train_clean['Date'] < split_date]
df_val = df_train_clean[df_train_clean['Date'] >= split_date]

df_train = df_train.rename(columns={'Date':'ds','Y':'y'})
df_val = df_val.rename(columns={'Date':'ds','Y':'y'})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:55:18