我正在尝试创建一个工作流程,该工作流程可以根据过去的数据为产品级别的销售时间序列产生预测。
我从data.tables列表开始:名称是我想要预测数量的产品ID,内容是历史数量的矢量,范围是1 / jan / 12到1 / sep / 16。
> rawlist[1]
$ 2456057
Qty
1: 1
2: 1
3: 1
4: 1
5: 1
---
1701: 1
1702: 1
1703: 1
1704: 1
1705: 1
我已经设置了一个foreach()%dopar%构造以加快速度,在其中我将矢量转换为时间序列并在其上拟合STLF模型。我追加产品数据(列表中的对象名称)以及预测日期,以便为每个产品创建一个数据预测表。
我的问题:我正在尝试将其扩展为约100万种产品。我目前正在测试1000个产品~1.1分钟,10.000个产品~13分钟。
我已经在最后优化了第一次拆分产品和联合(rbind),但是难以改善%dopar%部分 - 认为应该有更多的东西。任何想法赞赏!感谢
循环分析:
> summaryRprof(tmp[[13]])
$by.self
self.time self.pct total.time total.pct
".Call" 0.12 75.0 0.12 75.0
"NextMethod" 0.02 12.5 0.02 12.5
"seq.int" 0.02 12.5 0.02 12.5
$by.total
total.time total.pct self.time self.pct
"data.table" 0.16 100.0 0.00 0.0
"ets" 0.16 100.0 0.00 0.0
"etsmodel" 0.16 100.0 0.00 0.0
"forecast" 0.16 100.0 0.00 0.0
"forecast.stl" 0.16 100.0 0.00 0.0
"forecastfunction" 0.16 100.0 0.00 0.0
"stlf" 0.16 100.0 0.00 0.0
".Call" 0.12 75.0 0.12 75.0
".cbind.ts" 0.04 25.0 0.00 0.0
"as.ts" 0.04 25.0 0.00 0.0
"Ops.ts" 0.04 25.0 0.00 0.0
"window" 0.04 25.0 0.00 0.0
"window.default" 0.04 25.0 0.00 0.0
"window.ts" 0.04 25.0 0.00 0.0
"NextMethod" 0.02 12.5 0.02 12.5
"seq.int" 0.02 12.5 0.02 12.5
$sample.interval
[1] 0.02
$sampling.time
[1] 0.16
以下完整代码:
horizon = 14
raw2 = data.table(raw)
rawlist = raw2[, list(list(.SD)), by=Ordered_Product_Key]$V1
setattr(rawlist, 'names', unique(raw2$Ordered_Product_Key))
dates = seq(from = as.Date(as.character(max(raw$Date_Key)),format='%Y%m%d')+1, to = as.Date(as.character(max(raw$Date_Key)),format='%Y%m%d')+horizon, by=1)
s3 = Sys.time()
no_cores <- detectCores() - 1
cl<-makeCluster(no_cores)
registerDoParallel(cl)
bulkdata = foreach(i=rawlist, x=names(rawlist), .packages=c('forecast','data.table')) %dopar% {
data.table(Product = x, Dates = dates , Forecast = forecast(stlf(ts( i$Qty , frequency = 365, start=2012)),h=horizon)$mean )
}
stopCluster(cl)
s4 = Sys.time()
df = do.call(rbind,bulkdata)