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

如何用循环批量为多列时间序列执行AutoARIMA、SES等预测模型

批量处理多列时间序列预测方案

1. 数据预处理

先确保数据框的日期列是时间格式并设为索引,将各产品列转换为时间序列对象(以R语言forecast工具链为例):

library(forecast)
library(dplyr)

# 假设数据框名为df,日期列名为date,产品列从第2列开始
df <- df %>% 
  mutate(date = as.Date(date)) %>% 
  arrange(date) %>% 
  tibble::column_to_rownames(var = "date")

# 转换为时间序列,按数据频率设置frequency(日数据填365,周数据填52,月数据填12)
ts_list <- lapply(df, function(x) ts(x, frequency = 365))

2. 封装单序列模型函数

把你已有的单列模型逻辑打包成函数,输出包含模型拟合结果、预测值及误差指标的结构化数据:

run_ts_models <- function(ts_data, forecast_steps = 7) {
  # 拆分训练集/测试集(用于计算模型误差)
  train <- window(ts_data, end = length(ts_data) - forecast_steps)
  test <- window(ts_data, start = length(ts_data) - forecast_steps + 1)
  
  # 拟合指定模型
  model_arima <- auto.arima(train)
  model_naive <- naive(train, h = forecast_steps)
  model_ses <- ses(train, h = forecast_steps)
  model_tbats <- tbats(train)
  forecast_tbats <- forecast(model_tbats, h = forecast_steps)
  
  # 定义误差计算函数
  calc_error <- function(fc, actual) {
    data.frame(
      MAE = mean(abs(fc$mean - actual)),
      RMSE = sqrt(mean((fc$mean - actual)^2))
    )
  }
  
  # 计算各模型测试集误差
  errors <- list(
    ARIMA = calc_error(forecast(model_arima, h = forecast_steps), test),
    NAIVE = calc_error(model_naive, test),
    SES = calc_error(model_ses, test),
    TBATS = calc_error(forecast_tbats, test)
  )
  
  # 返回所有结果
  list(
    models = list(ARIMA = model_arima, NAIVE = model_naive, SES = model_ses, TBATS = model_tbats),
    forecasts = list(ARIMA = forecast(model_arima, h = forecast_steps),
                     NAIVE = model_naive,
                     SES = model_ses,
                     TBATS = forecast_tbats),
    errors = errors
  )
}

3. 批量遍历所有产品列

用lapply批量应用函数,一键生成所有产品的模型结果:

# 批量运行所有产品的模型,可自定义预测步长
all_results <- lapply(ts_list, run_ts_models, forecast_steps = 7)

# 为结果列表添加产品名称,方便后续索引
names(all_results) <- colnames(df)

4. 结果整理与提取

根据需求提取关键信息,比如汇总所有产品的各模型RMSE:

# 提取RMSE并整理成对比数据框
rmse_summary <- do.call(rbind, lapply(names(all_results), function(prod) {
  errors <- all_results[[prod]]$errors
  data.frame(
    Product = prod,
    ARIMA_RMSE = errors$ARIMA$RMSE,
    NAIVE_RMSE = errors$NAIVE$RMSE,
    SES_RMSE = errors$SES$RMSE,
    TBATS_RMSE = errors$TBATS$RMSE
  )
}))

print(rmse_summary)

关键注意事项

  • 时间频率匹配:务必根据实际数据周期(日/周/月)调整ts()函数的frequency参数,否则模型拟合会出错。
  • 缺失值处理:若数据存在缺失,可在预处理阶段用na.interp()或线性插值填充。
  • 模型自定义:如果需要指定ARIMA阶数、SES平滑系数等,可在run_ts_models函数内修改对应模型的参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:36:29