如何将指数平滑模型预测值导入Power BI/Power Query并生成未来6个月数据集
解决Power BI中导出Holt-Winters未来预测值的问题
我看了你的代码,问题主要出在几个细节上,导致你没法得到独立的未来6个月预测数据集。咱们一步步来修正:
问题根源
- 训练集取错了:你在循环里用
dataset.iloc[:4,0]取训练数据,但这是整个数据集的前4行,不是当前TPID的子数据集TPID_df,等于每个TPID都在重复用同一批错误的训练数据。 - 预测值没有绑定未来日期和TPID:你得到的
y_hat只有数值,没有对应的未来月份,也没标记属于哪个TPID,最后自然没法生成有意义的独立数据集。 - 没有收集合并预测结果:循环里处理完每个TPID后,没把结果存起来合并,最后等于没返回有效的预测数据。
修正后的完整代码
# 'dataset' holds the input data for this script dataset = dataset.drop_duplicates() import pandas as pd from datetime import datetime, timedelta from statsmodels.tsa.holtwinters import ExponentialSmoothing # 标准化日期格式,设置为索引 dataset['Month'] = pd.to_datetime(dataset['Month']) dataset.set_index('Month', inplace=True) def get_prediction(dataset): # 用来存储所有TPID的预测结果 all_predictions = [] list_TPID = dataset.TPID.unique() for TPID in list_TPID: # 筛选当前TPID的历史数据 TPID_df = dataset.loc[dataset['TPID'] == TPID].copy() # 时序模型必须按时间排序,这一步很关键 TPID_df = TPID_df.sort_index() # 用当前TPID的全部历史数据训练模型(如果需要拆分训练测试集可以调整) train_data = TPID_df.iloc[:, 0] # 这里假设目标变量是第一列,换成列名更稳妥,比如TPID_df['Your_Target_Col'] # 训练Holt-Winters模型 model = ExponentialSmoothing(train_data, trend='add', damped=False).fit() # 生成未来6个月的日期索引 last_hist_date = TPID_df.index[-1] future_months = [last_hist_date + timedelta(months=i+1) for i in range(6)] # 预测未来6个月的值,并绑定日期索引 y_hat = model.forecast(6) y_hat.index = future_months # 把预测值转换成带TPID和日期的DataFrame pred_df = pd.DataFrame(y_hat, columns=['Predicted_Value']) pred_df['TPID'] = TPID pred_df.reset_index(inplace=True) pred_df.rename(columns={'index': 'Month'}, inplace=True) # 把当前TPID的预测结果加入总列表 all_predictions.append(pred_df) # 合并所有TPID的预测结果成一个完整数据集 final_predictions = pd.concat(all_predictions, ignore_index=True) return final_predictions # 调用函数得到预测结果,赋值给dataset让Power BI识别 dataset = get_prediction(dataset)
关键改动说明
- 精准筛选TPID数据:每个循环只处理当前TPID的历史数据,确保模型训练的是对应实体的时序规律。
- 生成未来日期:根据每个TPID的最后一个历史月份,自动计算出接下来6个月的日期,让预测值和时间一一对应。
- 添加TPID标识:每个预测结果都标记所属的TPID,方便你在Power BI中按维度分析。
- 合并结果:把所有TPID的预测数据整合成一个数据集,直接返回给Power BI作为输出。
额外提示
如果你的目标变量不是数据集的第一列,记得把iloc[:, 0]改成实际的列名,比如TPID_df['Sales'],这样更不容易出错。另外,运行前确保你的历史数据没有缺失或乱序,时序模型对数据质量要求很高。
内容的提问来源于stack exchange,提问作者joker123
相关产品推荐
相关产品推荐

