Проблема иерархического прогнозирования при создании объекта hts - PullRequest
0 голосов
/ 01 февраля 2020

Привет. Я хочу сделать иерархический прогноз, как описано в книге Хиндмана по прогнозированию в главе 10: https://otexts.com/fpp2/

Моя проблема заключается в том, что для генерации такого типа прогнозирования (особенно в нижней части) подход) Мне нужно создать объект hts, который является матрицей. Например:

Если у меня есть такой фрейм данных: Изображение примера фрейма данных до объекта hts

Мне нужно преобразовать его в такую ​​матрицу: Изображение матрицы, которая мне нужна Для этой матрицы каждая строка представляет собой единицу времени (это могут быть дни, месяцы и т. Д. c.).

Моя проблема в том, что мой фрейм данных такой : Изображение проблемы с фреймом данных

Один столбец - это дата, а другие - категории, по которым мне нужно прогнозировать продажи. Проблема в следующем: для супермаркета = 4, id_product = 187 и id_label = a система регистрирует движения в день 21 и 23, но в день 22 ничего не происходит, что означает, что мне нужно иметь продажи = 0 в тот день или, другими словами, строка, подобная этой: Изображение отсутствующей строки

Как мне сгенерировать матрицу, необходимую для создания объекта hts, создавая отсутствующие строки с 0? (У меня тысячи пропущенных строк, поэтому было бы страшно делать это вручную)

Вот пример, который можно воспроизвести:

date=c("2019-03-22","2019-03-23","2019-04-24","2019-03-25")
id_supermarket=c(4,4,2,2)
id_product=c(187,187,189,190)
id_label=c("a","a","c","d")
sales=c(21,22,23,24)

df=as.data.frame(cbind(date,id_supermarket,id_product,id_label,sales))

Заранее спасибо.

1 Ответ

0 голосов
/ 01 февраля 2020

Я рекомендую использовать пакет fable вместо hts. Это более недавно и намного легче использовать. Вот пример с вашими данными.

библиотека (tsibble) библиотека (басня)

# Create tsibble
df <- tibble(
  date = lubridate::ymd(c("2019-03-22", "2019-03-23", "2019-03-24", "2019-03-25")),
  id_supermarket = as.character(c(4, 4, 2, 2)),
  id_product = c(187, 187, 189, 190),
  id_label = c("a", "a", "c", "d"),
  sales = c(21, 22, 23, 24)
) %>%
  as_tsibble(index = date, key = c(id_supermarket, id_product, id_label)) %>%
  fill_gaps(.full = TRUE)

# Forecast with reconciliation
fc <- df %>%
  aggregate_key(id_supermarket * id_label, sales = sum(sales, na.rm = TRUE)) %>%
  model(
    arima = ARIMA(sales)
  ) %>%
  reconcile(
    arima = min_trace(arima)
  ) %>%
  forecast(h = "5 days")

fc
#> # A fable: 45 x 6 [1D]
#> # Key:     id_supermarket, id_label, .model [9]
#>    id_supermarket id_label .model date       sales .distribution
#>    <chr>          <chr>    <chr>  <date>     <dbl> <dist>       
#>  1 2              c        arima  2019-03-26  5.82 N(5.8, 44)   
#>  2 2              c        arima  2019-03-27  5.82 N(5.8, 44)   
#>  3 2              c        arima  2019-03-28  5.82 N(5.8, 44)   
#>  4 2              c        arima  2019-03-29  5.82 N(5.8, 44)   
#>  5 2              c        arima  2019-03-30  5.82 N(5.8, 44)   
#>  6 2              d        arima  2019-03-26  6.34 N(6.3, 46)   
#>  7 2              d        arima  2019-03-27  6.34 N(6.3, 46)   
#>  8 2              d        arima  2019-03-28  6.34 N(6.3, 46)   
#>  9 2              d        arima  2019-03-29  6.34 N(6.3, 46)   
#> 10 2              d        arima  2019-03-30  6.34 N(6.3, 46)   
#> # … with 35 more rows

Создано в 2020-02-01 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...