【问题标题】:Using Prophet package to forecast by groups and create plot使用 Prophet 包进行分组预测并创建绘图
【发布时间】:2019-02-19 01:17:19
【问题描述】:

我正在使用 Prophet 包在数据框中进行分组预测,并且我想使用分组数据框创建图。

我正在关注Using Prophet Package to Predict by Group in Dataframe in R 中的答案。与我在下面的操作相比,是否有更简单的方法来创建绘图?

library(dplyr)
library(prophet)    

df <- data_frame(ds = seq(as.Date("2017/01/01"), as.Date("2019/01/01"), "month"), 
                     a = rnorm(n = 25, mean = 100000, sd = 7500), 
                     b = rnorm(n = 25, mean = 100000, sd = 7500), 
                     c = rnorm(n = 25, mean = 100000, sd = 7500))

a、b 和 c 列是每个产品的销售数字。而且,我想对所有 3 种产品和未来 12 个时期的总销售额进行预测。

所以,我整理了数据框,然后进行分组预测。

d1 <- df %>%
        gather(key = "prod", value = "y", a:c) %>%
        nest(-prod) %>%
        mutate(m = map(data, prophet)) %>%
        mutate(future = map(m, make_future_dataframe, period = 12, freq = "month")) %>%
        mutate(forecast = map2(m, future, predict)) %>%
        mutate(p = map2(m, forecast, plot))

输出如下:

# A tibble: 3 x 6
  dept  data              m             future                forecast               p       
  <chr> <list>            <list>        <list>                <list>                 <list>  
1 a     <tibble [25 x 2]> <S3: prophet> <data.frame [37 x 1]> <data.frame [37 x 16]> <S3: gg>
2 b     <tibble [25 x 2]> <S3: prophet> <data.frame [37 x 1]> <data.frame [37 x 16]> <S3: gg>
3 c     <tibble [25 x 2]> <S3: prophet> <data.frame [37 x 1]> <data.frame [37 x 16]> <S3: gg>

然后,我手动创建绘图,并使用 grid.arrange 重新排列它们

gridExtra::grid.arrange(d1$p[[1]], d1$p[[2]], d1$p[[3]]

有什么方法可以更快、更自动地做到这一点?

【问题讨论】:

  • 嗨,Alex,当您期待“更快”和“自动”的方式时,您在想什么?
  • 我在考虑是否可以继续使用管道自动生成组图。目前,我需要手动查看创建了多少个图并使用 grid.arrange 手动排列它们

标签: r dplyr time-series forecasting facebook-prophet


【解决方案1】:

我找不到将调用传递给grid.arrange 的方法,但您可以使用do.call 来避免手动选择绘图。

do.call(gridExtra::grid.arrange, d1$p)

例子:

library(dplyr)
library(prophet)  
library(tidyr)
library(purrr)

df <- data_frame(ds = seq(as.Date("2017/01/01"), as.Date("2019/01/01"), "month"), 
                 a = rnorm(n = 25, mean = 100000, sd = 7500), 
                 b = rnorm(n = 25, mean = 100000, sd = 7500), 
                 c = rnorm(n = 25, mean = 100000, sd = 7500))



d1 <- df %>%
  gather(key = "prod", value = "y", a:c) %>%
  nest(-prod) %>%
  mutate(m = map(data, prophet)) %>%
  mutate(future = map(m, make_future_dataframe, period = 12, freq = "month")) %>%
  mutate(forecast = map2(m, future, predict)) %>%
  mutate(p = map2(m, forecast, plot)) 

【讨论】:

  • 是否可以在这个框架内添加回归器?如果是的话,我可以得到一个如何添加回归器的例子吗?
【解决方案2】:

单一情节: 使用cowplot

cowplot::plot_grid(plotlist =d1$p)

多个地块: 使用purrr::walk function

walk(.x=d1$p,.f=gridExtra::grid.arrange)

.x 是第一个参数,.f 是函数。如果您需要多个参数,则应使用 walk2 (2) 或 pwalk (3+)

【讨论】:

  • 这并没有把情节安排成一个。它创建多个图。
  • @AlexHo 我的错,我刚刚在 cowplot 中加入了一个替代解决方案
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2020-05-07
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多