在for循环中拼接多个DataFrame失败,仅显示最后一个产品数据
解决SARIMAX循环预测结果仅保留最后一个产品的问题
你遇到的问题核心是每次循环都直接覆盖了df_estimado变量,没有累积存储所有产品的预测结果。默认情况下,如果你在循环里写df_estimado = 当前产品预测,前一次循环的结果会被完全替换,最终只保留最后一次迭代的数据。
修复步骤
- 初始化空DataFrame:在循环开始前创建一个空的DataFrame,用来存储所有产品的预测结果。
- 循环拼接结果:每个产品的预测生成后,用
pd.concat()将其追加到总DataFrame中,而不是直接赋值覆盖。 - 保留产品标识:确保每个子预测结果中包含
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
相关产品推荐
相关产品推荐

