使用skforecast ForecasterRecursive结合外生特征时触发Timestamp与NoneType相加的TypeError错误
使用skforecast ForecasterRecursive结合外生特征时触发Timestamp与NoneType相加的TypeError错误
我之前碰到过一模一样的问题,从你提供的报错追踪信息来看,根源其实出在时间索引的频率(freq)没有被正确识别或设置上。
看报错的最后几行关键代码:
new_index = pd.date_range( start = index[-1] + index.freq, periods = steps, freq = index.freq )
这里的index.freq是None,才会出现「Timestamp和NoneType无法相加」的错误。虽然你提到已经用asfreq('D', method='bfill')处理了数据,但很可能你的外生变量数据框df_exog的时间索引没有明确的频率属性,或者训练集的索引频率在模型拟合时没有被正确记录。
给你几个具体的解决步骤:
第一步:强制为所有数据框设置明确的时间频率
对你的主数据和外生变量数据都执行以下操作,确保索引的freq属性被正确设置:import pandas as pd # 为主数据框设置日频率,填充缺失值(如果需要) df = df.asfreq('D', method='bfill') # 对外生变量数据框做同样的操作 df_exog = df_exog.asfreq('D', method='bfill') # 验证频率是否设置成功,应该输出 <Day> print("df索引频率:", df.index.freq) print("df_exog索引频率:", df_exog.index.freq)如果输出是
None,可以手动强制设置:df.index.freq = pd.DateOffset(days=1) df_exog.index.freq = pd.DateOffset(days=1)第二步:拟合模型前确认训练数据的索引频率
在调用forecaster_exog.fit()之前,先检查训练集的索引频率是否有效:train_y = df_exog.loc[train_start:train_end, 'y'] train_exog = df_exog.loc[train_start:train_end, ['exog_1', 'exog_2']] print("训练集y的索引频率:", train_y.index.freq) print("训练集外生变量的索引频率:", train_exog.index.freq)只有当两者都输出明确的频率(比如
<Day>)时,再进行模型拟合。第三步:验证测试集外生变量的起始时间
skforecast会严格检查外生变量的起始时间是否是训练集最后一个时间点的下一个时间步。你可以提前验证:# 获取训练集最后一个时间点 last_train_time = train_y.index[-1] # 计算预期的测试外生变量起始时间 expected_test_start = last_train_time + pd.Timedelta(days=1) # 获取实际测试外生变量的起始时间 actual_test_start = df_exog.loc[test_start:test_end].index[0] if expected_test_start != actual_test_start: print(f"测试外生变量起始时间不匹配:预期{expected_test_start},实际{actual_test_start}")如果不匹配,需要调整你的
test_start参数,确保测试集从正确的时间点开始。
为什么原教程的数据集没问题?因为教程里的示例数据大概率已经预先设置了明确的时间频率,而你的自定义数据虽然日期连续,但pandas没有自动识别出频率,导致index.freq为None,最终在模型生成预测索引时触发错误。
备注:内容来源于stack exchange,提问作者Mara
相关产品推荐
相关产品推荐

