使用Facebook Prophet训练加密货币价格预测模型报错ValueError求助
问题排查与解决
错误原因
报错核心是可视化时传入Plotly的列数据长度不匹配,具体由3个问题共同导致:
- Prophet返回的forecast结果默认包含历史数据的拟合值+未来预测值,直接用append拼接历史df和forecast会导致日期重复,数据错位
- Yahoo Finance返回的日期是带时区的datetime格式,而Prophet输出的forecast日期是无时区的格式,两者拼接时日期无法对齐,产生大量空值
- Pandas 2.0及以上版本已正式移除
append方法,原有拼接逻辑本身就存在语法兼容问题
修复代码
1. 修改getData函数(统一日期时区)
在getData函数的return df之前新增一行去除时区的逻辑:
# 原有代码 df = df.reset_index().rename(columns={"Date": "ds", "MA": "y"}) # 新增:去掉ds的时区信息,和Prophet输出格式统一 df['ds'] = df['ds'].dt.tz_localize(None) return df
2. 修改visFBP函数(替换append为按日期合并)
将原来的append逻辑替换为按ds列外连接,保证所有数据按日期对齐:
def visFBP(df, forecast): """ 传入训练用的原始df和预测结果forecast,返回实际价格和预测价格的可视化图表 """ # 替换原append逻辑为按日期合并 vis_df = pd.merge(df[['ds','Open']], forecast, on='ds', how='outer').rename( columns={'yhat': 'Prediction', 'yhat_upper': "Predicted High", 'yhat_lower': "Predicted Low"} ) # 原有可视化代码不变 fig = px.line( vis_df, x='ds', y=['Open', 'Prediction', 'Predicted High', 'Predicted Low'], title='Crypto Forecast', labels={'value':'Price', 'ds': 'Date'} ) fig.update_xaxes( rangeselector=dict( buttons=list([ dict(count=1, label="1m", step="month", stepmode="backward"), dict(count=3, label="3m", step="month", stepmode="backward"), dict(count=6, label="6m", step="month", stepmode="backward"), dict(count=1, label="YTD", step="year", stepmode="todate"), dict(count=1, label="1y", step="year", stepmode="backward"), dict(step="all") ]) ) ) return fig.show()
修改完成后重新运行即可正常生成可视化图表,不会再触发长度不匹配的报错。
内容的提问来源于stack exchange,提问作者prophetdev771
相关产品推荐
相关产品推荐

