如何在R中使用并行处理来分析大型时间序列数据集

时间:2014-08-08 13:12:41

标签: r time-series

我有一个大型时间序列数据集,通常需要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='.'))
}

1 个答案:

答案 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))