2016-07-16 14 views
0

Ich habe zwei Funktionen, die das gleiche Ergebnis geben, ein Vektor und ein mit einer "for" Schleife. Überraschenderweise ist die for-Schleife schneller als die vektorisierte Version. Irgendeine Idee warum ist es so?Pandas - vektorisierter Code langsamer als für Schleife

def loop_for(df): 
    gpd = df.groupby([pd.TimeGrouper(freq="QS-JAN"), 'CD_PDP']) 
    result = [] 
    for (quarter, unite), data in gpd: 
     nb_MAT_RH = data["MAT_RH" ].nunique() 
     nb_MAT_RHPI = data["MAT_RHPI"].nunique() 
     result.append({"CD_PDP": unite, "MOIS_COMPTABLE": quarter, "nb_mat_rh" : nb_MAT_RH, "nb_MAT_RHPI" : nb_MAT_RHPI}) 

    return pd.DataFrame(result) 


def vectorisation(df): 
    b = df.groupby([pd.TimeGrouper(freq="QS-JAN"), 'CD_PDP']).apply(lambda x: pd.Series({"nb_mat_rh" : x["MAT_RH" ].nunique(), 
                          "nb_MAT_RHPI" : x["MAT_RHPI"].nunique()})) 
    return b.reset_index() 

bei der Prüfung:

import timeit 
print "loop" 
print timeit.timeit(stmt="loop_for(df)",number= 2, setup="from __main__ import loop_for; from __main__ import df") 
print "vector" 
print timeit.timeit(stmt="vectorisation(df)",number= 2, setup="from __main__ import vectorisation; from __main__ import df") 

es gibt:

loop 
6.83789801598 
vector 
7.13991713524 
+4

Mit '.apply (Lambda ...)' ist nicht wirklich Vektorisierung; Es ist im Wesentlichen das gleiche wie eine For-Schleife über die Daten auszuführen. –

+0

Auch haben wir keine Ahnung, was "df" Sie an Ihre Funktionen weitergeben. Aber was noch wichtiger ist ... was @ajcr gesagt hat. – piRSquared

+0

gut zu wissen :) Könnte hier eine Vektorisierung möglich sein? Und wenn ja wie? –

Antwort

1

Doing .nunique() auf einem SeriesGroupBy Objekt tut Vorteil der Vektorisierung nehmen:

grouped = df.groupby([pd.TimeGrouper(freq="QS-JAN"), 'CD_PDP']) 

b = df.groupby('a').agg({'MAT_RH': 'nunique', 'MAT_RHPI': 'nunique'}) 
b = b.rename(columns={'MAT_RH': 'nb_mat_rh', 'MAT_RHPI': 'nb_MAT_RHPI'}) 

Aber wi sogar eine Probe Ihrer ursprünglichen df ist es unmöglich, irgendwelche Benchmarks zu laufen.

+0

@romainjouin, bitte in Betracht ziehen, eine Antwort zu akzeptieren, die hilfreich war – MaxU

+0

@romainjouin, wenn diese oder irgendeine Antwort Ihre Frage gelöst hat, betrachten Sie bitte [akzeptieren] (http://meta.stackexchange.com/q/5234/179419), indem Sie auf klicken Häkchen. Dies zeigt der breiteren Gemeinschaft, dass Sie eine Lösung gefunden haben und sowohl dem Antworter als auch Ihnen einen guten Ruf verschaffen. Es besteht keine Verpflichtung, dies zu tun. –

Verwandte Themen