【问题标题】:Simple Moving Average Column-Wise in RR中的简单移动平均列
【发布时间】:2020-10-16 17:35:06
【问题描述】:

因此,我每季度都会清理收入数据,并且需要使用两个季度的移动平均线来预测每种产品未来五年的季度收入(我知道这最终会是相同的平均值)。这里附上数据框:Revenue Df

现在我有宽格式的数据,你会看到我创建了空的预测列,方法是让用户输入预测的开始日期和结束日期,然后它为每个季度创建列。如何使用移动平均线填充这些预测?我也将它转换为长,但仍然无法弄清楚如何填写预测。另外我知道预测中显示的是 2020 年 9 月 30 日,我们希望将其替换为实际值,即使用户输入了该日期进行预测。


for(i in ncol(Revenue_df)){
  
  if(i<3)
  {Revenue_df[,i]<- Revenue_df[,i]}
  else{
  Revenue_df[,i]<-(Revenue_df[,i-1]+Revenue_df[,i-2])/2
  }
  
}

Product<- c("a","b","c","d","e")
Revenue.3_30_2020<- c(50,40,30,20,10)
Revenue.6_30_2020<- c(50,45,28,19,17)
Revenue.9_30_2020<- c(25,20,22,17,24)


revenue<- data.frame(Product,Revenue.3_30_2020,Revenue.6_30_2020,Revenue.9_30_2020)

forecast.sequence<- c("2020-09-30","2020-12-31","2021-03-31","2021-06-30","2021-09-30","2021-12-31","2022-03-31"
 "2022-06-30","2022-09-30","2022-12-31","2023-03-31","2023-06-30","2023-09-30","2023-12-31","2024-03-31"
"2024-06-30","2024-09-30","2024-12-31")


forecast.sequence.amount<- paste("FC.Amount.",forecast.sequence)
revenue[,forecast.sequence.amount]<-NA

我尝试了这段代码,但它不起作用,有什么建议吗?还附上了图片中显示的示例数据框的代码,抱歉格式不好这是我第二次在这里提问。

【问题讨论】:

    标签: r forecasting


    【解决方案1】:

    这对于产品预测来说似乎有点简单。您可能需要查看 forecast 和 fable 包中的预测功能,这些功能可以解释预测中的趋势和季节性。然而,这些将需要两个数据点以上的数据。无论如何,考虑到您的问题,以下代码似乎可以满足您的描述。

    编辑

    我已将预测计算设为一个函数,使其更易于使用。

    library(tidyverse)
    
    product<- c("a","b","c","d","e")
    Revenue.3_30_2020<- c(50,40,30,20,10)
    Revenue.6_30_2020<- c(50,45,28,19,17)
    Revenue.9_30_2020<- c(25,20,22,17,24)
    revenue<- data.frame( Product = product, Revenue.3_30_2020,Revenue.6_30_2020,Revenue.9_30_2020)
    
    rev_frcst <- function(revenue, frcst_end, frcst_prefix) {
    #      
    #  Arguments:
    #     revenue = data frame with 
    #               Product containing product name
    #               columns with the format "prefix.m_day_year" containing product quantities for past quarters
    #     frcst_end = end date for quarterly forecast
    #     frcst_prefix = string containing prefix for forecast
    #     
    #  convert revenue to long format
    #     
     rev_long <-  revenue %>% pivot_longer(cols = -Product, names_to = "Quarter", values_to = "Revenue") %>%
                mutate(quarter_end = as.Date(str_remove(Quarter,"Revenue."), "%m_%d_%Y")) 
     num_revenue <- nrow(rev_long)/length(product)      
    #
    #  generate forecast dates
    #
     forecast.sequence <- seq( max(rev_long$quarter_end), 
                             as.Date(frcst_end),
                             by = "quarter")[-1] 
    #
    #  Add forecast rows to data
    #
      rev_long <- rev_long %>% 
                  bind_rows(expand_grid(Product=unique(revenue$Product), quarter_end = forecast.sequence) %>%
                            mutate(Quarter = paste(frcst_prefix, quarter_end)) ) )
    #
    #  Define moving average function
    #
     mov_avg <- function(num_frcst, x) {
       y <- c(x, numeric(num_frcst))
       for(i in 1:num_frcst + 2) { 
          y[i] <- .5*(y[i-1] + y[i-2]) }
      y[1:num_frcst + 2]
     }
    #
    # Calculate forecast
    # 
      rev_long_2 <-  rev_long %>% group_by(Product) %>% 
                     mutate(forecast = c(Revenue[1:num_revenue],
                                     mov_avg(num_frcst =length(forecast.sequence),
                                             x = Revenue[1:2 + num_revenue - 2]))) %>%
                 arrange(Product, quarter_end)
    }
    #
    #  call rev_frcst to calcuate forecast
    #
      rev_forecast <- rev_frcst(revenue=revenue,
                            frcst_end = "2024-12-31",
                            frcst_prefix = "FC.Amount.")
     
    

    给了

       Product   Quarter               Revenue quarter_end forecast
       <chr>     <chr>                   <dbl> <date>         <dbl>
       1 a       Revenue.3_30_2020          50 2020-03-30      50  
       2 a       Revenue.6_30_2020          50 2020-06-30      50  
       3 a       Revenue.9_30_2020          25 2020-09-30      25  
       4 a       FC.Amount. 2020-12-30      NA 2020-12-30      37.5
       5 a       FC.Amount. 2021-03-30      NA 2021-03-30      31.2
       6 a       FC.Amount. 2021-06-30      NA 2021-06-30      34.4
       7 a       FC.Amount. 2021-09-30      NA 2021-09-30      32.8
       8 a       FC.Amount. 2021-12-30      NA 2021-12-30      33.6
       9 a       FC.Amount. 2022-03-30      NA 2022-03-30      33.2
      10 a       FC.Amount. 2022-06-30      NA 2022-06-30      33.4
    
           
    

    【讨论】:

    • 嘿 WaltS,当我尝试预测时,它给了我这个错误:错误:分配的数据 value 必须与现有数据兼容。 x 现有数据有 100 行。 x 分配的数据有 20 行。 i 只有大小为 1 的向量被回收。似乎它没有考虑 group by 并且只计算预测的前 20 个观测值,因此它不会填充数据框。关于解决方案的任何想法?
    • 我已经进行了上述更改。让我知道这是否有问题。
    • 我发现这是我的问题,因为我没有为 mutate 指定 dplyr(显然我有另一个带有 mutate 函数的包)。非常抱歉占用您的时间 WaltS,再次感谢您的帮助!
    猜你喜欢
    • 2013-11-22
    • 2015-01-29
    • 1970-01-01
    • 2014-03-17
    • 2011-03-07
    • 2012-10-04
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多