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
相关产品推荐
相关产品推荐

