Ich habe eine Funktion, die einen DataFrame verarbeitet, vor allem Daten in Buckets zu verarbeiten, erstellen Sie eine binäre Matrix von Features in einer bestimmten Spalte mit pd.get_dummies(df[col])
.Warum wird die Verkettung von DataFrames exponentiell langsamer?
Verarbeitung all meiner Daten Um zu vermeiden, sofort mit dieser Funktion (die aus dem Speicher geht und bewirkt, dass ipython zum Absturz), ich habe den großen Datenrahmen in Stücke gebrochen werden:
chunks = (len(df)/10000) + 1
df_list = np.array_split(df, chunks)
pd.get_dummies(df)
automatisch erstellen neue Spalten basierend auf dem Inhalt von df[col]
und diese werden sich wahrscheinlich für jede df
in df_list
unterscheiden.
Nach der Verarbeitung Ich bin Verketten der Datenrahmen mit wieder zusammen:
for i, df_chunk in enumerate(df_list):
print "chunk", i
[x, y] = preprocess_data(df_chunk)
super_x = pd.concat([super_x, x], axis=0)
super_y = pd.concat([super_y, y], axis=0)
print datetime.datetime.utcnow()
Die Bearbeitungszeit des ersten Brocken durchaus akzeptabel ist, wächst pro Chunk jedoch! Dies ist nicht mit der preprocess_data(df_chunk)
zu tun, da es keinen Grund für die Erhöhung gibt. Tritt dieser Zeitanstieg als Folge des Anrufs auf pd.concat()
auf?
siehe unten log:
chunks 6
chunk 0
2016-04-08 00:22:17.728849
chunk 1
2016-04-08 00:22:42.387693
chunk 2
2016-04-08 00:23:43.124381
chunk 3
2016-04-08 00:25:30.249369
chunk 4
2016-04-08 00:28:11.922305
chunk 5
2016-04-08 00:32:00.357365
Gibt es eine Abhilfe dies zu beschleunigen? Ich habe 2900 Brocken zu verarbeiten, so dass jede Hilfe geschätzt wird!
Offen für alle anderen Vorschläge in Python!
Hallo @unutbu, danke für die ausführliche Erklärung, das hat die Theorie wirklich im Detail erklärt! – jfive
Ist es möglich, 2900 Blöcke dieser Form auf diese Weise zu verketten (43717, 3261)? Der Bearbeitungsschritt dauert jetzt nur noch 10 Sekunden. – jfive