构建滚动均值预测:解决序列多余元素与测试集匹配问题
我来帮你一步步解决这两个问题,直接上实用的方案:
1. 移除fitmean末尾的第13个多余元素
问题出在滚动均值的计算逻辑上——默认的滚动窗口设置可能会多生成一个基于最后12个数据的均值(包含了本不该纳入的最新数据)。你可以用两种方式解决:
方式一:直接切片删除最后一个元素
如果fitmean是Pandas Series或DataFrame,直接用切片去掉最后一行即可:
# 保留前n-1个元素,n是当前fitmean的长度 fitmean = fitmean.iloc[:-1]
方式二:调整滚动窗口参数,从根源避免多余元素
如果你用的是Pandas的rolling()函数,可以设置closed='left',让滚动窗口只包含当前时间点之前的12个数据,这样就不会额外生成最后一个元素:
# 假设parts是带日期索引的Series fitmean = parts.rolling(window=12, closed='left').mean()
这个参数会让每个均值对应到窗口结束后的时间点,刚好符合你基于过去12个数据做预测的需求。
2. 解决测试集日期匹配问题(仅得到2017年1-6月的6个值)
核心是让滚动均值的日期索引和testparts完全对齐。你的目标是用过去12个月的均值预测2017年1-6月,所以需要确保每个预测值的日期正好对应测试集的月份:
步骤1:确保滚动均值的索引对应测试集时间点
假设parts包含了2016年1月-2017年6月的完整数据,你可以先计算滚动均值,再通过shift(1)把均值“挪”到下一个月(比如2016年1-12月的均值对应2017年1月的预测):
# 计算滚动均值,然后shift(1)让均值对应到下一个月的预测 rolling_mean = parts.rolling(window=12).mean().shift(1) # 只保留testparts对应的日期范围(2017年1-6月) fitmean_test = rolling_mean.loc[testparts.index]
步骤2:验证索引对齐
做完之后可以打印fitmean_test.index和testparts.index,确认两者完全一致,这样相减的时候就会得到完整的6个差值,不会出现日期不匹配的问题。
如果你的parts只有2016年6月-2017年6月的数据,那需要先补充2016年1-5月的数据(如果有的话),否则2017年1-5月的滚动均值会因为数据不足出现NaN。如果没有历史数据,那只能从2017年6月开始做有效预测,但根据你的需求,应该是有完整的12个月训练数据的。
内容的提问来源于stack exchange,提问作者Angus

