2017-08-22 10 views
1

Ich hoffe, Ihr Gehirn auf Optimierung zu holen. Ich lerne immer noch mehr über Python und benutze es für meine tägliche Operations-Analysten-Position. Eine der Aufgaben, die ich habe, ist das Durchsuchen von ca. 60.000 eindeutigen Datensatz-Identifikatoren und das Durchsuchen eines anderen Datenrahmens mit ca. 120.000 Aufzeichnungen von Interaktionen, des Mitarbeiters, der die Interaktion verfasst hat, und der Zeit, zu der es passiert ist.Pandas - übereinstimmende Referenznummer zu finden, frühestes Datum

als Referenz, die beiden Datenrahmen an dieser Stelle wie folgt aussehen:

main_data = Unique Identifier Nur nok_data = Authored nach Namen, einzigartiger Identifer (bekannt als Fall Identifier Datei), Bemerkung Text, Erstellt am.

Mein Setup läuft derzeit ungefähr bei der Sortierung durch und vergleicht meine Daten mit 2500 Zeilen pro Minute, also etwa 25-30 Minuten oder so für einen Lauf. Was ich neugierig bin, ist gibt es irgendwelche Schritte, die ich durchgeführt, die:

  1. Redundante und ineffiziente Gesamt meinen Prozess
  2. Eine schlechte Verwendung von Syntax Verlangsamung um meinen Mangel an Wissen zu arbeiten.

Unten ist mein Code:

nok_data = pd.read_csv("raw nok data.csv") #Data set from warehouse 

main_data = pd.read_csv("exampledata.csv") #Data set taken from iTx ids from referral view 

row_count = 0 
error_count = 0 
print(nok_data.columns.values.tolist()) 
print(main_data.columns.values.tolist()) #Commented out, used to grab header titles if needed. 
data_length = len(main_data) #used for counting how many records left. 
earliest_nok = {} 
nok_data["Created On"] = pd.to_datetime(nok_data["Created On"]) #convert all dates to datetime at beginning. 


for row in main_data["iTx Case ID"]: 
    list_data = [] 
    nok = nok_data["Case File Identifier"] == row 
    matching_dates = nok_data[["Created On", "Authored By Name"]][nok == True] #takes created on date only if nok shows row was true 
    if len(matching_dates) > 0: 
     try: 
      min_dates = matching_dates.min(axis=0) 
      earliest_nok[row] = [min_dates[0], min_dates[1]] 
     except ValueError: 
      error_count += 1 
      earliest_nok[row] = None 

    row_count += 1 
    print("{} out of {} records").format(row_count, data_length) 


with open('finaloutput.csv','wb') as csv_file: 
    writer = csv.writer(csv_file) 
    for key, value in earliest_nok.items(): 
     writer.writerow([key, value]) 

der Suche nach jeder Beratung oder Know-how von jener Durchführung Code wie diesen viel länger dann habe ich. Ich schätze all diejenigen, die sich nur die Zeit genommen haben, dies zu lesen. Glücklicher Dienstag,

Andy M.

**** EDIT abgefragten Daten ZEIGEN Sorry für meine Anfänger bewegen sich nicht jeder Datentyp einschließlich.

main_data Beispiel

ITX Case ID 
2017-023597 
2017-023594 
2017-023592 
2017-023590 

nok_data aka "raw nok data.csv"

Authored By: Case File Identifier: Note Text: Authored on 
John Doe   2017-023594   Random Text  4/1/2017 13:24:35 
John Doe   2017-023594   Random Text  4/1/2017 13:11:20 
Jane Doe   2017-023590   Random Text  4/3/2017 09:32:00 
Jane Doe   2017-023590   Random Text  4/3/2017 07:43:23 
Jane Doe   2017-023590   Random Text  4/3/2017 7:41:00 
John Doe   2017-023592   Random Text  4/5/2017 23:32:35 
John Doe   2017-023592   Random Text  4/6/2017 00:00:35 
+2

Sie sollten einige Beispieldaten [MCVE] veröffentlichen. Der erste Blick ist, dass das Iterieren nach Zeilen sehr langsam ist. – Alexander

+0

Können Sie einige Dummy-Daten für 'main_data' und' nok_data' bereitstellen? –

+0

Hallo @Alexander Ich habe ein paar Zeilen von Basisdaten für jeden hinzugefügt. –

Antwort

1

Es sieht aus wie Sie auf der Case File Identifier gruppieren möchten und die minimale Datum erhalten und korrespondierender Autor.

# Sort the data by `Case File Identifier:` and `Authored on` date 
# so that you can easily get the author corresponding to the min date using `first`. 

nok_data.sort_values(['Case File Identifier:', 'Authored on'], inplace=True) 
df = (
    nok_data[nok_data['Case File Identifier:'].isin(main_data['ITX Case ID'])] 
    .groupby('Case File Identifier:')['Authored on', 'Authored By:'].first() 
) 
d = {k: [v['Authored on'], v['Authored By:']] for k, v in df.to_dict('index').iteritems()} 

>>> d 
{'2017-023590': ['4/3/17 7:41', 'Jane Doe'], 
'2017-023592': ['4/5/17 23:32', 'John Doe'], 
'2017-023594': ['4/1/17 13:11', 'John Doe']} 

>>> df 
         Authored on Authored By: 
Case File Identifier:       
2017-023590    4/3/17 7:41  Jane Doe 
2017-023592   4/5/17 23:32  John Doe 
2017-023594   4/1/17 13:11  John Doe 

Es ist wahrscheinlich einfacher df.to_csv(...) zu verwenden.

Die Elemente von main_data ['ITX-Fall-ID'], für die kein übereinstimmender Datensatz vorhanden ist, wurden ignoriert, können jedoch bei Bedarf hinzugefügt werden.

+0

Dies wird mein Rookiness in Codierung mit allem kompakt sein, aber ich habe versucht, meinen Weg durch zu arbeiten und es herauszufinden. Bei der Ausgabe an einen CSV kombiniert es beide zu einer Zeile ohne Leerzeichen. Würde ich eine neue Spalte im Datenrahmen erstellen, um die Informationen getrennt zu halten? sowie den Autor von diesem bestimmten Zeitstempel zu greifen? Vielen Dank! –

+0

Ich habe es bearbeitet. Passt das zu dem, was Sie erreichen wollen? – Alexander

+0

Ich habe die Antwort als richtig markiert und Sie waren zu 100% richtig, dass das Schreiben des Datenrahmens in CSV die effizientere, sauberere Art war, mit den Daten zu arbeiten. Ich lerne immer noch Pandas, also ist deine Lösung des Matching ein bisschen über meinem Kopf, aber ich hoffe, dass ich mich durch die Dokumentation arbeiten kann, wenn ich die Chance bekomme. Als Referenz ging der Code von 25+ min auf weniger als 3 Minuten, sogar mit der pd.to_datetime. Vielen Dank für Ihre Expertise, Andy. –

Verwandte Themen