生成 hts 对象的分层预测问题
Hierarchical Forecasting problem generating the hts object
您好,我想按照 Hyndman Forecasting 书中第 10 章中的描述进行分层预测:https://otexts.com/fpp2/
我的问题是,为了生成这种类型的预测(特别是自下而上的方法),我需要生成一个 hts 对象,它是一个矩阵。例如:
如果我有这样的数据框:
Image of example of dataframe prior to hts object
我需要将它转换成这样的矩阵:
Image of Matrix that I need
对于这个矩阵,每一行都是一个时间单位(可能是天、月等)。
我的问题是我的数据框是这样的:
Image of Problem with dataframe
一栏是日期,另一栏是我需要预测销售额的类别。问题是这样的:对于 supermarket=4、id_product=187 和 id_label=a,系统在第 21 天和第 23 天记录了移动,但在第 22 天没有任何反应,这意味着我需要 sales=0在那一天,或者换句话说,像这样的一行:
Image of Row missing
如何生成创建 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))
提前致谢。
我建议您使用 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
由 reprex package (v0.3.0)
于 2020-02-01 创建
您好,我想按照 Hyndman Forecasting 书中第 10 章中的描述进行分层预测:https://otexts.com/fpp2/
我的问题是,为了生成这种类型的预测(特别是自下而上的方法),我需要生成一个 hts 对象,它是一个矩阵。例如:
如果我有这样的数据框: Image of example of dataframe prior to hts object
我需要将它转换成这样的矩阵: Image of Matrix that I need 对于这个矩阵,每一行都是一个时间单位(可能是天、月等)。
我的问题是我的数据框是这样的: Image of Problem with dataframe
一栏是日期,另一栏是我需要预测销售额的类别。问题是这样的:对于 supermarket=4、id_product=187 和 id_label=a,系统在第 21 天和第 23 天记录了移动,但在第 22 天没有任何反应,这意味着我需要 sales=0在那一天,或者换句话说,像这样的一行: Image of Row missing
如何生成创建 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))
提前致谢。
我建议您使用 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
由 reprex package (v0.3.0)
于 2020-02-01 创建