2017-02-14 6 views
0

müssen Wert des Ausdrucks (wie im Code), für jede Zeile des Datenrahmens zu berechnen. der aktuelle Code funktioniert, dauert jedoch zu lange, um zu berechnen. brauchen einen schnelleren Weg, um das gleiche zu implementieren.schneller Weg zur Berechnung von Zeilenwerten auf der Grundlage der Werte der vorherigen Zeilen, Pandas Datenrahmen

Code:

num =0 
den = 0  
for i in range(1,2000): 
    p1 = p[i] 
    t1 = tx[i] 
    num = num * pow(numpy.e,-1*t1) + p1 
    den = den * pow(numpy.e,-1*t1) + 1 
    t["s"][i] = num/den 

alle Werte in dem Datenrahmen sind von float-Datentyp oben Code dauert ca. 2000 Zeilen 80SEK. Aktueller Datenrahmen hat über eine Million Zeilen

bitte vorschlagen. Danke!

Antwort

0

Wenn t ist die einzige Variable, die Sie auswerten müssen, brauchen Sie nicht pow(numpy.e, -t1)

num = 0 
den = 0  
for i in range(1,2000): 
    p1 = p[i] 
    #t1 = tx[i] 
    num += p1 
    den += 1 
    t["s"][i] = num/den 

Dies würde ausreichen.

EDIT:

def mytest(a, b): 
    t = [] 
    num, den = 0, 0 
    for i in range(1, 2000): 
     num = num * pow(np.e, -b[i]) + a[i] 
     den = den * pow(np.e, -b[i]) + 1 
     t.append(num/den) 
    return t 

def mytest2(a, b): 
    t = [] 
    num, den = 0, 0 
    neck = pow(np.e, -b) # bottle neck 
    for i in range(1, 2000): 
     num = num * neck[i] + a[i] 
     den = den * neck[i] + 1 
     t.append(num/den) 
    return t 

Ausgang:

%timeit mytest(random.rand(2000), random.rand(2000)) 
100 loops, best of 3: 3.26 ms per loop 
%timeit mytest2(random.rand(2000), random.rand(2000)) 
100 loops, best of 3: 1.54 ms per loop 

Leider kann ich Ihre (sehr groß) 80 Sekunden nicht reproduzieren. Sie sollten woanders reparieren.

+0

Entschuldigung mein schlechtes. den Code aktualisiert – Rishi

+0

Danke !, ich folge Ihrem Ansatz, in meinem Code t ["s"] [i] = num/den, war zeitaufwendig. also jetzt in eine Liste speichern und dann an den Datenrahmen anhängen. funktioniert viel schneller. – Rishi

Verwandte Themen