假设您有一个如下所示的数据集:
|Month|Food|Sales|
|01|Apple|1564|
|02|Apple|1323|
....
|12|Apple|1645|
|01|Banana|2158|
这种模式一直延续到"西葫芦"。
所以假设你想预测R的销售额:
ets <- forecast(ets(data))
我如何预测"食物"栏中的每一个值,使其单独给出所有预测?
目前,我正在将我的数据设置为只看"苹果"并进行预测。然后,我必须返回并将我的子设置数据更改为"Banana",然后进行预测。我想把它们的每一个输出都分开,这样我就可以把它们导出到Excel中。
谢谢!
您可以编写一个自定义函数,该函数采用水果的名称并执行预测所需的所有步骤,然后将该函数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)
如果需要,也可以使用purrr
包中的map
函数,而不是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
您可以通过使用R中的应用函数和查找水果类型的唯一值的levels函数来创建多个预测。
然后创建一个"预测函数",根据水果类型[Firuit]对输入数据帧[DF]进行切片,如下面的代码所示,以预测特定的输入水果。函数返回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]])
然后,lapply的输出将由预测ets中的三个对象组成。