2016-07-20 9 views
-5

Ich habe 100.000 Benutzer mit einer Zeitreihe von etwa 1.000 Zeitreihenwerte, für die ich Metriken berechnen möchte. Leider läuft mein existierender Code sehr langsam, ich glaube hauptsächlich wegen der Schleifenoperation und nicht vollen Nutzung der data.table.R data.table innerhalb von for loop läuft sehr langsam

Ich fand eine Lösung für ein ähnliches Problem R: Using for-loop and filter data.table, aber ich bin mir nicht sicher, wie ich es auf meine Aufgabe anwenden könnte, die ein viel fortgeschritteneres Statistik/Zeitreihen-Problem ist. Mein Ziel ist es, N-Berechnungen für jeden Benutzer ausführen zu können, anstatt nur die 3, die ich unten mache (a, b und c). Ich fürchte, mein aktueller Ansatz wird nicht gut skalieren.

Der aktuelle Code dauert etwa 32 Minuten für 10.000 Personen. Als ich die na.omit und die Bestellung entfernte, sah ich auch keine Geschwindigkeitsreduzierungen.

Ihre Hilfe wird sehr geschätzt!

Update: Siehe Details für "Daten" und "x".

  • Daten repräsentieren alle Geschichte Kundendaten (Tagesbedarf)
  • x ist die Liste der Kunden von Interesse.

Namen (Daten) = c ('id' 'Nachfrage' 'service_date'); Namen (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

warum brauchen Sie eine Schleife dafür. Kannst du nicht nach "ID" gruppieren und dies tun? Die Verwendung der '==' zu Untermenge sollte die Geschwindigkeit verringern – akrun

+0

Hallo akrun, ja guter Punkt. Ich bin mir nicht sicher, ob ich eine for-Schleife brauche, es ist die einzige Art, wie ich sie bauen kann. Meine Frage ist, wie man den Code beschleunigt. In der Tat, wenn ich die for-Schleife umgehen kann, die ausgezeichnet wäre, aber ich weiß nicht, wie man all die komplizierten Sachen mit den Zeitreihenberechnungen gibt. Einfachste und schnellste Methode wäre am besten. – HHMM

+0

Wer sind 'Daten' und' x'? Bitte geben Sie ein reproduzierbares Beispiel an. – nicola

Antwort

0

Es ist offensichtlich, dass ihr meine Frage Downvoted einfach, weil es zu schwierig war für Dich zu lösen.

Einige Experten sind Sie! Ich ging und fand es selbst heraus. :) BTW Ich habe gerade data.table gestern gelernt.

lol

Sie Ihre Glaubwürdigkeit zeigt einlösen können, wie wir 3 Splits dies für die tun, kann ich in meiner ursprünglichen Frage bezeichnet, da diese nur binäre spaltet der Fall ist.

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])])