我有一个大型时间序列数据集,通常需要4小时才能使用1800时间序列中的顺序处理进行处理。我正在寻找一种方法来使用多个内核来减少这个时间,因为我有很多这些数据集可以定期通过。
我用于顺序处理的R代码如下。有4个文件包含不同的数据集,每个文件包含1800多个系列。我一直在尝试使用doParallel独立分析每个时间序列,并将结果连接成一个文件。即使是CSV文件也可以。
# load the dataset
files <- c("3MH Clean", "3MH", "6MH", "12MH")
for (j in 1:4)
{
title <- paste("\n\n\n Evaluation of", files[j], " - Started at", date(), "\n\n\n")
cat(title)
History <- read.csv(paste(files[j],"csv", sep="."))
# output forecast to XLSX
outwb <- createWorkbook()
sheet <- createSheet(outwb, sheetName = paste(files[j], " - ETS"))
Item <- unique(unlist(History$Item))
for (i in 1:length(Item))
{
title <- paste("Evaluation of item ", Item[i], "-", i, "of", length(Item),"\n")
cat(title)
data <- subset(History, Item == Item[i])
dates <- unique(unlist(data$Date))
d <- as.Date(dates, format("%d/%m/%Y"))
data.ts <- ts(data$Volume, frequency=12, start=c(as.numeric(format(d[1],"%Y")), as.numeric(format(d[1],"%m"))))
try(data.ets <- ets(data.ts))
try(forecast.ets <- forecast.ets(data.ets, h=24))
IL <-c(Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i],Item[i])
ets.df <- data.frame(forecast.ets)
ets.df$Item <- IL
r <- 24*(i-1)+2
addDataFrame(ets.df, sheet, col.names=FALSE, startRow=r)
}
title <- paste("\n\n\n Evaluation of", files[j], " - Completed at", date(), "\n\n\n")
cat(title)
saveWorkbook(outwb, paste(files[j],"xlsx",sep='.'))
}
答案 0 :(得分:1)
我在评论中反映了这种情绪,即应尽可能地对流程进行矢量化。如果没有可重复的示例,我将不得不对您的数据做出一些假设。我假设这个系列是一个堆叠在另一个上面,一个变量表示系列。如果不是,如果系列在单独的列中,您可以使用reshape2来融化数据框,然后使用下面的代码。
如果您使用的是linux或mac框,那么如果您设法更多地对代码进行矢量化,则可以使用并行软件包和mclapply。我偏爱数据。如果您不熟悉,那么这可能是一次陡峭的攀登。
require(forecast)
require(data.table)
require(parallel)
#create 10 sample series -not 1800, but you get the idea.
data <- data.table(series=rep(1:10,each=60),
date=seq(as.Date("01/08/2009",format("%d/%m/%Y")),length.out=60,by="1 month"),
Volume=rep(rnorm(10),each=60)+rnorm(600))
#Define some functions to get the job done.
getModel <- function(s) {
data[order(date)][series==s][,ets(ts(Volume,start=as.yearmon(min(date),format("%d/%m/%Y")),frequency=12))]
}
getForecast <- function(s,forward=24) {
model <- getModel(s)
fc <- forecast(model,h=forward)
return(data.frame(fc))
}
#Write the forecasts m at a time, where m is the number of cores.
Forecasts <- mclapply(1:10,getForecast)
使用您的数据框列表,您可以执行以下操作:
mclapply(Forecasts, function(x) {addDataFrame(x, sheet, col.names=FALSE, startRow=r))