Как я могу спрогнозировать одну переменную несколько раз по одному сценарию в R? - PullRequest
0 голосов
/ 22 января 2019

Предположим, у вас есть набор данных, который выглядит следующим образом:

|Month|Food|Sales|
|01|Apple|1564|
|02|Apple|1323|
....
|12|Apple|1645|
|01|Banana|2158|

... это продолжается по шаблону вплоть до "Цуккини".

Допустим, вы хотели бы спрогнозировать продажи в R следующим образом:

ets <- forecast(ets(data))

Как я могу прогнозировать каждое из значений в столбце "Пища" таким образом, чтобы он дал мне все их прогнозы отдельно?

В настоящее время я настраиваю свои данные, чтобы посмотреть только на «Apple» и сделать прогноз. Затем я должен вернуться и изменить данные поднабора на «Банан» и сделать прогноз. Я хотел бы, чтобы каждый из их выходных данных был отдельным, чтобы я мог экспортировать их в Excel.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Вы можете создать несколько прогнозов, используя функции apply в R и функцию level , которая находит уникальные значения типа фрукта.

Затем вы создаете «функцию прогноза», которая разрезает фрейм входных данных [DF] на основе типа фруктов [Fruit], как показано в коде ниже, для прогноза для конкретного входного фрукта. Функция возвращает прогнозный объект ets.

library(forecast)
DF <- data.frame(month = rep(seq(1,12,by=1),3),
                 fruit = c(rep("apples",12),rep("banana",12),rep("orange",12)),
                 Sales = sample(0:1000, 12*3))


forecastFruit <- function(Fruit, inputDF)
{
  timeSeries <- ts(inputDF[inputDF$fruit == Fruit,]$Sales)
  forecast(ets(timeSeries))
}

Forecast <- lapply(levels(DF$fruit), forecastFruit, inputDF = DF)


plot(Forecast[[1]])
plot(Forecast[[2]])
plot(Forecast[[3]])

В этом случае вывод из таблицы будет выполнен по списку из трех объектов из прогноза ets.

0 голосов
/ 22 января 2019

Вы можете написать пользовательскую функцию, которая берет имя фрукта и выполняет все шаги, необходимые для прогноза, а затем apply эта функция выводит список всех известных вам фруктов.У меня есть пример кода здесь, но помните, что вам может потребоваться изменить многие вещи в зависимости от ваших конкретных обстоятельств.

Сначала некоторые данные:

df <- data.frame(
  month = rep(1:12, times = 5),
  fruit = rep(c("Apple", "Banana", "Citrus", "Date", "Elderberry"), each = 12),
  sales = runif(12*5, min = 100, max = 10000)
)

Далее я хочусоздать пользовательскую функцию.В этом случае единственный аргумент, который я имею, это тип фруктов.Я мог бы хотеть добавить больше аргументов, таких как «как долго я хочу, чтобы мой прогноз был» и т. Д. Обратите внимание, что эта функция возвращает весь объект forecast - вы можете выбрать, например, часть fittedмодель.

forecast_custom <- function(selected_fruit) {
  df_sub <- subset(df, fruit == selected_fruit)
  ts_sub <- ts(df_sub$sales)

  forecast(ets(ts_sub))
}

Я могу запустить эту функцию, сообщив ей, какой плод прогнозировать:

forecast_custom("Apple")

Я также могу использовать что-то из семейства apply, чтобы запустить еговсе виды фруктов одновременно.

lapply(unique(df$fruit), forecast_custom)

Если хотите, вы также можете использовать функцию map из пакета purrr вместо lapply или sapply.Функция map немного более строга в отношении того, что входит и что выходит.Например, было бы проще создать красивый фрейм данных, используя purrr:

forecast_custom <- function(selected_fruit) {
  df_sub <- subset(df, fruit == selected_fruit)
  ts_sub <- ts(df_sub$sales)

  data.frame(
    fruit = selected_fruit,
    month = 13:24,
    forecasted_sales = as.numeric(forecast(ets(ts_sub))$fitted)
  )
}

> map_df(unique(df$fruit), forecast_custom)
#>         fruit month forecasted_sales
#> 1       Apple    13        4781.3679
#> 2       Apple    14        4781.3330
#> 3       Apple    15        4780.8736
#> 4       Apple    16        4781.2790
#> 5       Apple    17        4781.3523
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...