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

如何将指数平滑模型预测值导入Power BI/Power Query并生成未来6个月数据集

解决Power BI中导出Holt-Winters未来预测值的问题

我看了你的代码,问题主要出在几个细节上,导致你没法得到独立的未来6个月预测数据集。咱们一步步来修正:

问题根源

  1. 训练集取错了:你在循环里用dataset.iloc[:4,0]取训练数据,但这是整个数据集的前4行,不是当前TPID的子数据集TPID_df,等于每个TPID都在重复用同一批错误的训练数据。
  2. 预测值没有绑定未来日期和TPID:你得到的y_hat只有数值,没有对应的未来月份,也没标记属于哪个TPID,最后自然没法生成有意义的独立数据集。
  3. 没有收集合并预测结果:循环里处理完每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:59:09