l oop за месяц для расчета обнаружения аномалий по временным рядам в r - PullRequest
0 голосов
/ 22 февраля 2020

Я использую большие данные для нахождения аномалий во временных рядах более 220 категорий в год и хочу делать это ежемесячно, потому что если я запускаю обнаружение аномалий в течение года, это занимает много времени. Вот мой код:

dates <- seq(as.Date('2019-01-01'), as.Date('2019-01-30'), "days")
df <- data.frame()
for (i in 1:length(dates)){
  dateofgen <- dates[i]
  A_path <- 's3://***/'
  filepath <- paste(A_path, "y=", format(as.Date(dateofgen), '%Y'), "/m=", format(as.Date(dateofgen), '%m'), "/A", dateofgen, ".csv", sep='')
  temp_df<- s3read_using(fread, object=filepath, stringsAsFactors = F,bucket=gsub("/.*", '', gsub("s3://", '', filepath)))
  finaldf<- rbind(df,temp_df)
  base::print(paste("completed data merging for ",dateofgen,sep=""))
  rm(temp_df)
}

Здесь все данные объединяются из s3: Затем я применяю параллельные вычисления, чтобы найти аномалии в течение одного месяца.

registerDoParallel()
temp_anom<- ddply(finaldf, .(id), function(x){
  temp_country <- ddply(x,.(country), function(y){
    z <- y[,c('date','col2')] %>% data.frame(.,row.names = NULL)
    z$date <- as.Date(z$date)
    temp <- AnomalyDetectionTs(z, max_anoms = 0.002, direction = "both", alpha = 0.05, e_value = FALSE, plot = FALSE, y_log = FALSE)
    if (nrow(temp$anoms) != 0) {
      temp <- temp$anoms
      temp$country <- unique(y$country)
      temp
    }
  }, .parallel = T)
  gc()
  if (nrow(temp_country) != 0) {
    temp_country$id <- unique(x$id)
    temp_country
  }
}, .progress = 'text')

После всего, что я сохранил файл в s3:

anolamy_path<- "s3://***"
filepath <- paste(anolamy_path, "y=", format(as.Date(dateofgen), '%Y'), "/m=", format(as.Date(dateofgen), '%m'), "/anomaly", dateofgen, ".csv", sep = '')
s3write_using(temp_anom, FUN=write.csv, row.names = F, object = filepath, bucket = gsub("/.*", '', gsub("s3://", '', filepath)))

У меня есть 2 вопроса: 1: как я могу добавить l oop, чтобы найти аномалии месяц за месяцем? 2: Каждый месяц уходит около 3 часов. Как я могу написать код более эффективным способом?

...