我有100,000个用户,每个用户都有大约1,000个时间序列值的时间序列,我想为其计算指标。不幸的是,我现有的代码运行速度很慢,我认为主要是由于循环操作而没有充分利用data.table。
我找到了类似问题R: Using for-loop and filter data.table的解决方案,但我不确定如何将其应用于我的任务,这是一个更先进的统计/时间序列问题。我的目标是能够为每个用户运行N次计算,而不仅仅是我在下面做的3次计算(a,b和c)。我担心目前的方法不会很好地扩展。
当前代码大约需要32分钟才能运行10,000人。当我删除na.omit并订购时,我也没有看到任何速度降低。
非常感谢您的帮助!
更新:请参阅“数据”和“x”的详细信息。
names(data)= c('id''require''service_date'); names(x)= c('id')
m = 100000
h = data.frame(matrix(NA,m,8))
names(h) = c("id", "u", "m1", "m2", "m3", "m3_m1", "m3_m2", "m2_m1")
system.time(
for (i in 1:m){
dt = data.table(na.omit(data[data$id == x$id[i],]))
dt = dt[order(service_date)]$demand
u = floor(length(dt)/3);
a = median((dt[1:u])); b = median(dt[(u+1):(2*u)]) ; c = median(dt[(2*u+1):(3*u)])
h[i,] = data.frame(x$id[i],u,a,b,c,c-b,c-a,b-a)
})
答案 0 :(得分:0)
你是一些专家!我自己去弄清楚了。 :)顺便说一下,我昨天刚刚学习了data.table。
洛尔
你可以通过展示我在原始问题中提到的3个分裂如何做到这一点来赎回你的可信度,因为这只做二进制分裂。
x_dt = data.table(x); data_dt = na.omit(data)
setkey(x_dt,id); setkey(data_dt,id) ;
system.time(data_dt <- data_dt[x_dt][order(id,service_date),])
system.time(x2 <- data_dt[,.(lt = length(demand),md = median(demand)),
by =.(id, m = service_date < service_date[length(service_date)/2])])