Почему data.table занимает слишком много времени для выполнения определенной части скрипта в r (приведен воспроизводимый пример)?

#r #function #datetime #data.table

#r #функция #дата и время #data.table

Вопрос:

У меня возникли некоторые проблемы с чрезвычайно медленной обработкой нескольких строк моего скрипта, как указано ниже.Я предполагаю, что применение и настраиваемая функция замедляют производительность. Какие-либо предложения по ускорению этого сценария / вычисления??

Можно использовать эти таблицы и проверить код

 dt1=data.table(location_id=rep("abc",52),report_date=c(rep("2020-04-22",24),rep("2020-04-23",24),rep("2020-04-24",4)),hour=c(rep(c(0:23),2),0,1,2,3),hr_visitors=c(20:67,345,236,123,67))


dt2=dt1[, date_hour := as.POSIXct(paste0(report_date,hour), format = "%Y-%m-%d %H")]
  

Часть 1

Создание столбца временных меток с использованием наблюдений за датой и часом

 Sys.time()
"2020-09-30 06:22:55 GMT"

dt2=copy(dt1)[, date_hour := as.POSIXct(paste0(report_date,hour), 
format = "%Y-%m-%d %H")]

Sys.time()
"2020-09-30 06:31:51 GMT"
  

Часть 2

Применение функциональной модели к большему набору данных

 stl_model_outlier<-function(xyz){
model=ts(xyz,frequency=24)
f=stl(model,"periodic",robust = TRUE)
result=data.table(row_id=which(f$weights<1e-8))%>%mutate(outlier="Yes")
return(list(result))
}

Sys.time()
"2020-09-30 06:41:51 GMT"

results1<-dt2[,lapply(.SD, stp_model_outlier), by = location_id, .SDcols = "hr_visitors"]

Sys.time()
"2020-09-30 06:54:51 GMT"
  

Комментарии:

1. Было бы легче понять, если бы вы предоставили воспроизводимый пример данных и приняли более чистый стиль для своего кода (отступ, пробел после запятой и т. Д.)

2. Я предоставил воспроизводимый пример данных… Спасибо

3. Пожалуйста, протестируйте свой код, я полагаю, вам не хватает закрывающей скобки после as.POSIXct(...) . И … .SDcols=c(1:2,5:10) относится к большему количеству столбцов, чем присутствует в dt1 . (Воспроизводимое это не так.)

4. Почему вы смешиваете data.table и dplyr ? Если вы используете data.table по соображениям скорости или памяти, то использование mutate сводит на нет это довольно быстро. Это не значит, что mutate это медленно, но … это нарушает семантику изменения на месте data.table , вызывая больше копирования данных, чем необходимо (в соответствии с data.table методами).

5. dt2 содержит все 4 важных столбца, которых было бы достаточно для запуска скрипта, поскольку в моих данных были некоторые нерелевантные столбцы, следовательно. SDcols=c(1: 2,5:10)… Кстати, я удалил эту часть…… Выполнение функции не занимает и секунды, поэтому основной проблемой, замедляющей работу скрипта, является использование функции lapply внутри кода data.table .работает, но занимает много времени …..Для Части1, может быть.POSIXct замедляет скрипт