2016-03-23 10 views
0

Ich möchte die Differenz (in Tagen) zwischen zwei Spalten in einem Datenframe (genauer gesagt in der Graphlab SFrame Datenstruktur) zu finden.Datetime in Python - Geschwindigkeit der Berechnungen - Big Data

Ich habe versucht, ein paar Funktionen zu schreiben, um dies zu tun, aber ich kann nicht scheinen, um eine Funktion zu erstellen, die schnell genug ist. Geschwindigkeit ist jetzt mein Problem, da ich ~ 80 Millionen Zeilen verarbeiten muss.

Ich habe zwei verschiedene Funktionen ausprobiert, aber beide sind zu langsam:

Die t2_colname_str und t1_colname_str Argumente sind die Spaltennamen, von denen ich verwenden möchte, und beide Spalten enthalten datetime.datetime Objekte.

For-Schleife

def diff_days(sframe_obj,t2_colname_str,t1_colname_str): 
    import graphlab as gl 
    import datetime as datetime 

    # creating the new column name to be used later 
    new_colname = str(t2_colname_str[:-9] + "_DiffDays_" + t1_colname_str[:-9]) 
    diff_days_list = [] 

    for i in range(len(sframe_obj[t2_colname_str])): 
     t2 = sframe_obj[t2_colname_str][i] 
     t1 = sframe_obj[t1_colname_str][i] 
     try: 
      diff = t2 - t1 
      diff_days = diff.days 
      diff_days_list.append(diff_days) 
     except TypeError: 
      diff_days_list.append(None) 

    sframe_obj[new_colname] = gl.SArray(diff_days_list) 

Listenkomprehension

Ich weiß, dass dies nicht der beabsichtigte Zweck der Listenkomprehensionen ist, aber ich versuchte es nur um zu sehen, ob es schneller war.

def diff_days(sframe_obj,t2_colname_str,t1_colname_str): 
    import graphlab as gl 
    import datetime as datetime 

    # creating the new column name to be used later 
    new_colname = str(t2_colname_str[:-9] + "_DiffDays_" + t1_colname_str[:-9]) 

    diff_days_list = [(sframe_obj[t2_colname_str][i]-sframe_obj[t1_colname_str][i]).days if sframe_obj[t2_colname_str][i] and sframe_obj[t1_colname_str][i] != None else None for i in range(len(sframe_obj[t2_colname_str]))] 

    sframe_obj[new_colname] = gl.SArray(diff_days_list) 

Zusätzliche Hinweise

Ich habe mit GraphLab-Erstellen von Dato und ihre SFrame Datenstruktur vor allem, weil es die ganze Berechnung parallelisiert, die meine Analyse superschnell macht und es hat eine große Bibliothek für maschinelle Lernanwendungen. Es ist ein großartiges Produkt, wenn Sie es nicht schon ausgecheckt haben.

GraphLab User Guide finden Sie hier: https://dato.com/learn/userguide/index.html

+0

Ich bekomme einen "Zugriff verweigert" -Fehler, wenn ich versuche, den verwendeten SFrame zu bekommen. Ist es offen für "Jeder" herunterzuladen? Ich wäre daran interessiert, damit zu spielen. –

Antwort

0

Ich bin froh, dass Sie für Sie eine praktikable Art und Weise gefunden, jedoch Sarrays Vektoroperationen zu ermöglichen, so müssen Sie nicht über jedes Element der Spalte Schleife. SArrays werden iterieren, aber sie sind WIRKLICH langsam.

Leider unterstützen SArrays Vektoroperationen auf Datetime-Typen nicht, da sie keinen "timedelta" -Typ unterstützen. Sie können dies aber tun:

diff = sframe_obj[t2_colname].astype(int) - sframe_obj[t1_colname].astype(int) 

, dass die Spalten auf einem UNIX-Zeitstempel umwandeln und tun dann eine vektorisiert Differenzoperation, die viel schneller ... zumindest schneller sein sollte als eine Umstellung auf NumPy.

+0

Großartig !!!! Vielen Dank. Das ist perfekt und super schnell >> 1,57 Sekunden für alle ~ 80 Millionen Zeilen. ----- – mkultra

+0

Sie können hinzufügen, dass Sie "Diff" um 86400 (Sekunden an einem Tag) teilen müssen, um den gesamten Tag Unterschied zu erhalten. – mkultra

Verwandte Themen