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

在for循环中拼接多个DataFrame失败,仅显示最后一个产品数据

解决SARIMAX循环预测结果仅保留最后一个产品的问题

你遇到的问题核心是每次循环都直接覆盖了df_estimado变量,没有累积存储所有产品的预测结果。默认情况下,如果你在循环里写df_estimado = 当前产品预测,前一次循环的结果会被完全替换,最终只保留最后一次迭代的数据。

修复步骤

  1. 初始化空DataFrame:在循环开始前创建一个空的DataFrame,用来存储所有产品的预测结果。
  2. 循环拼接结果:每个产品的预测生成后,用pd.concat()将其追加到总DataFrame中,而不是直接赋值覆盖。
  3. 保留产品标识:确保每个子预测结果中包含producto列,方便后续区分不同产品的预测数据。

完整代码示例

import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX

# 1. 初始化存储所有预测的空DataFrame
df_estimado = pd.DataFrame()

# 2. 获取所有唯一产品
unique_productos = df_galletas['producto'].unique()

for producto in unique_productos:
    # 拆分当前产品的子数据集(用copy避免视图警告)
    df_product = df_galletas[df_galletas['producto'] == producto].copy()
    
    # 配置时间序列索引(假设你的时间列名为'fecha',目标值列为'demanda')
    df_product = df_product.set_index('fecha')
    df_product = df_product.asfreq('M')  # 根据你的数据频率调整,比如月频'M'、日频'D'
    
    # 训练SARIMAX模型(参数需根据你的数据调整,这里是示例参数)
    modelo = SARIMAX(df_product['demanda'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
    resultados = modelo.fit(disp=False)
    
    # 生成15步预测
    pronostico = resultados.get_forecast(steps=15)
    
    # 将预测结果转换为DataFrame并添加产品标识
    df_pronostico = pronostico.predicted_mean.to_frame(name='prediccion')
    df_pronostico['producto'] = producto
    df_pronostico['fecha_pronostico'] = df_pronostico.index  # 可选:将索引转为列
    
    # 3. 拼接当前预测到总结果中
    df_estimado = pd.concat([df_estimado, df_pronostico], ignore_index=True)

关键注意点

  • 避免视图问题:拆分子DataFrame时用.copy(),防止后续操作影响原数据集。
  • 时间序列频率:确保子数据集的时间索引是正确的频率(如每日、每月),SARIMAX模型需要严格的时间序列输入。
  • 模型参数调整:示例中的order=(1,1,1)和seasonal_order=(1,1,1,12)是通用参数,实际需要通过ACF/PACF图或自动调参工具优化。
  • 置信区间:如果需要预测的置信区间,可以添加df_pronostico[['lower', 'upper']] = pronostico.conf_int()。

内容的提问来源于stack exchange,提问作者Mateo Severi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:25:19