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

R中使用dplyr实现回归模型月度自动预测的数据处理方法咨询

R语言基于dplyr的月度小时级销售自动预测实现

完整实现代码

以下代码完全贴合你现有手动流程逻辑,通过日期维度自动对齐,无需手动调整数据截取范围:

# 加载依赖包
library(dplyr)
library(lubridate)

# 先给原始数据添加统一的时间维度标记
mydata <- mydata %>%
  mutate(
    year = year(datex),
    month = month(datex),
    # 给每个月内的小时按顺序编号,用于跨月对齐
    hour_of_month = row_number(),
    .by = c(year, month)
  )

# 通用月度预测函数,输入待预测年份、月份,输出该月小时级预测结果
predict_month_sales <- function(target_year, target_month) {
  # 自动计算待预测月前3个月的时间范围
  pre_3months <- seq.Date(
    ym(paste(target_year, target_month, sep = "-")) - months(3),
    ym(paste(target_year, target_month, sep = "-")) - months(1),
    by = "month"
  )
  # 提取前三个月的年、月信息
  m1 <- list(y = year(pre_3months[1]), m = month(pre_3months[1])) # 前第3个月
  m2 <- list(y = year(pre_3months[2]), m = month(pre_3months[2])) # 前第2个月
  m3 <- list(y = year(pre_3months[3]), m = month(pre_3months[3])) # 前第1个月(待预测月上月)

  # 自动提取三个月的全量小时数据
  m1_data <- filter(mydata, year == m1$y, month == m1$m)
  m2_data <- filter(mydata, year == m2$y, month == m2$m)
  m3_data <- filter(mydata, year == m3$y, month == m3$m)

  # 按三个月最小小时长度对齐,构造训练集
  min_train_hour <- min(nrow(m1_data), nrow(m2_data), nrow(m3_data))
  train_set <- data.frame(
    x1 = m1_data$sales[1:min_train_hour],
    x2 = m2_data$sales[1:min_train_hour],
    y = m3_data$sales[1:min_train_hour]
  )
  reg_model <- lm(y ~ ., data = train_set)

  # 计算待预测月总小时数,判断是否需要补充预测
  target_total_hour <- days_in_month(ym(paste(target_year, target_month, sep = "-"))) * 24
  add_pred_len <- target_total_hour - min_train_hour

  # 生成基础预测结果
  base_pred <- predict(reg_model, newdata = data.frame(
    x1 = m2_data$sales[1:min_train_hour],
    x2 = m3_data$sales[1:min_train_hour]
  ))

  # 补充预测并拼接完整结果
  if (add_pred_len > 0) {
    add_pred <- predict(reg_model, newdata = data.frame(
      x1 = m2_data$sales[(min_train_hour + 1):(min_train_hour + add_pred_len)],
      x2 = m3_data$sales[(min_train_hour + 1):(min_train_hour + add_pred_len)]
    ))
    full_pred <- c(as.numeric(base_pred), as.numeric(add_pred))
  } else {
    full_pred <- as.numeric(base_pred)[1:target_total_hour]
  }

  # 构造和原始数据格式对齐的输出结果
  pred_result <- data.frame(
    datex = seq(
      ymd_h(paste(target_year, target_month, "01 00", sep = "-")),
      by = "hour", length.out = target_total_hour
    ) %>% date(),
    hourx = seq(
      ymd_h(paste(target_year, target_month, "01 00", sep = "-")),
      by = "hour", length.out = target_total_hour
    ) %>% hour(),
    pred_sales = full_pred
  )
  return(pred_result)
}

# -------------------
# 使用示例
# -------------------
# 单个月份预测:预测2021年4月销售
apr_2021_pred <- predict_month_sales(2021, 4)
head(apr_2021_pred)

# 批量预测:批量生成2021年4-9月所有月份的预测结果
all_pred <- lapply(4:9, function(m) predict_month_sales(2021, m)) %>% bind_rows()

功能说明

  • 自动计算待预测月的前三个月时间范围,无需手动指定行号截取数据
  • 自动匹配不同月份的天数差异,完成训练集对齐、预测长度补全逻辑
  • 输出结果和原始销售数据格式完全对齐,可直接用于后续验证、合并操作
  • 支持单月预测和批量多月份预测,适配不同使用场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:15:05