假设您有一个数据集,如下所示:
|Month|Food|Sales|
|01|Apple|1564|
|02|Apple|1323|
....
|12|Apple|1645|
|01|Banana|2158|
...一直延续到“西葫芦”模式。
因此,可以说您希望这样预测R中的销售额:
ets <- forecast(ets(data))
我该如何预测“食品”列中的每个值,以使它们的所有预测值分开?
当前,我正在将数据设置为仅查看“ Apple”并进行预测。然后,我必须返回并将子设置数据更改为“香蕉”并进行预测。我希望将它们的每个输出都分开,以便将它们导出到Excel。
谢谢!
答案 0 :(得分:0)
您可以编写一个自定义函数,该函数使用水果的名称并执行预测所需的所有步骤,然后将该功能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
对象-您可能想要选择{{1 }}模型的一部分。
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
答案 1 :(得分:0)
您可以使用R中的apply函数和levels函数来创建多个预测,该函数可以找到水果类型的唯一值。
然后,您将创建一个“预测功能”,根据水果类型[Fruit]对输入数据帧[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的输出将根据预测集合中的三个对象列出。