Подсчитать количество событий за предыдущий период - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать переменную (созданная единица «events60» в данных ниже, которая хранит «текущий» счетчик количества событий в прошлом (в этом примере это 60 минут, но это может быть любой произвольное значение). Таким образом, он сохраняет подсчет «сколько событий произошло за предыдущий час».

Я медленно продвигаюсь с cumsum, rle, diff et c. и еще чем, но я Конечно, есть более элегантное и более быстрое решение. Оно будет применено к набору данных минимум 30 миллионов строк, поэтому, вероятно, al oop не очень эффективен.

Пример данных ниже в формате R

structure(list(Performed_DT_TM = structure(c(1508310211, 1508312843,
1508322697, 1508331061, 1508331161, 1508331452, 1508332222, 1508332900,
1508333781, 1508334349, 1508337531, 1508341065, 1508343542, 1508346756,
1508363905, 1508371639, 1508388245, 1508402001, 1508413612, 1508430173,
1508445426, 1508453675), class = c("POSIXct", "POSIXt"), tzone = ""),
time_since_prev_obs = c(0, 43.8666666666667, 164.233333333333,
139.4, 1.66666666666667, 4.85, 12.8333333333333, 11.3, 14.6833333333333,
9.46666666666667, 53.0333333333333, 58.9, 41.2833333333333,
53.5666666666667, 285.816666666667, 128.9, 276.766666666667,
229.266666666667, 193.516666666667, 276.016666666667, 254.216666666667,
137.483333333333), events60 = c(0, 1, 0, 0, 1, 2, 3, 4, 5,
6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
-22L), class = "data.frame")

Любая помощь, конечно, высоко ценится

Cheers Norm

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

в Base R вы можете сделать:

 m <- outer(df$Performed_DT_TM,df$Performed_DT_TM,"-")
 c(0,rowsum(as.numeric(m[lower.tri(m)]<3600),row(m)[lower.tri(m)]))
 [1] 0 1 0 0 1 2 3 4 5 6 1 1 1 1 0 0 0 0 0 0 0 0
0 голосов
/ 04 февраля 2020

Так как ваш набор данных огромен, вы можете попробовать скользящее соединение, а затем неэквиное соединение от data.table для скорости:

setDT(DT)[, Performed_DT_TM := as.POSIXct(Performed_DT_TM, format="%Y-%-%d %T")]
DT[, c("rn", "endtime") := .(.I, Performed_DT_TM - 60L*60L)]

DT[, Last60mins := 
    DT[DT, on=.(Performed_DT_TM=endtime), roll=Inf, i.rn - x.rn - 1L]
]
DT[is.na(Last60mins), Last60mins := fcoalesce(Last60mins, 
    DT[.SD, on=.(Performed_DT_TM>=endtime, Performed_DT_TM<Performed_DT_TM), .N, by=.EACHI]$N)
]
DT

данные:

library(data.table)
DT <- structure(list(Performed_DT_TM = structure(c(1508310211, 1508312843,
    1508322697, 1508331061, 1508331161, 1508331452, 1508332222, 1508332900,
    1508333781, 1508334349, 1508337531, 1508341065, 1508343542, 1508346756,
    1508363905, 1508371639, 1508388245, 1508402001, 1508413612, 1508430173,
    1508445426, 1508453675), class = c("POSIXct", "POSIXt"), tzone = ""),
    time_since_prev_obs = c(0, 43.8666666666667, 164.233333333333,
        139.4, 1.66666666666667, 4.85, 12.8333333333333, 11.3, 14.6833333333333,
        9.46666666666667, 53.0333333333333, 58.9, 41.2833333333333,
        53.5666666666667, 285.816666666667, 128.9, 276.766666666667,
        229.266666666667, 193.516666666667, 276.016666666667, 254.216666666667,
        137.483333333333), events60 = c(0, 1, 0, 0, 1, 2, 3, 4, 5,
            6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
                -22L), class = "data.frame")
...