Im Moment importiere ich jedes Mal, wenn ich das Skript ausführe, ein recht großes CSV
als DataFrame. Gibt es eine gute Lösung, um das DataFrame dauerhaft zwischen den Durchläufen verfügbar zu halten, damit ich nicht die ganze Zeit damit verbringen muss, auf das Skript zu warten?
Antworten
Zu viele Anzeigen?Der einfachste Weg ist es, es mit pickle zu speichern, indem Sie to_pickle
verwenden:
df.to_pickle(file_name) # wohin gespeichert werden soll, normalerweise als .pkl
Dann können Sie es wieder laden:
df = pd.read_pickle(file_name)
_Hinweis: Vor 0.11.1 save
und load
waren der einzige Weg, um dies zu tun (sie sind jetzt veraltet zugunsten von to_pickle
bzw. read_pickle
)._
Eine weitere beliebte Wahl ist die Verwendung von HDF5 (pytables), das sehr schnelle Zugriffszeiten für große Datensätze bietet:
import pandas as pd
store = pd.HDFStore('store.h5')
store['df'] = df # speichern
store['df'] # laden
Weitere fortgeschrittene Strategien werden im Kochbuch diskutiert.
Seit 0.13 gibt es auch msgpack, das für Interoperabilität möglicherweise besser geeignet ist, als schnellere Alternative zu JSON, oder wenn Sie Python-Objekt-/Text-lastige Daten haben (siehe diese Frage).
Auch wenn es bereits einige Antworten gibt, habe ich einen interessanten Vergleich gefunden, in dem sie mehrere Möglichkeiten ausprobiert haben, Pandas DataFrames zu serialisieren: Efficiently Store Pandas DataFrames.
Sie vergleichen:
- pickle: ursprüngliches ASCII-Datenformat
- cPickle, eine C-Bibliothek
- pickle-p2: verwendet das neuere Binärformat
- json: standardmäßige json-Bibliothek
- json-no-index: wie json, aber ohne Index
- msgpack: binäre JSON-Alternative
- CSV
- hdfstore: HDF5-Speicherformat
In ihrem Experiment serialisieren sie ein DataFrame mit 1.000.000 Zeilen mit den beiden separat getesteten Spalten: eine mit Textdaten, die andere mit Zahlen. Ihr Haftungsausschluss besagt:
Sie sollten nicht davon ausgehen, dass das, was folgt, auf Ihre Daten verallgemeinerbar ist. Sie sollten Ihre eigenen Daten betrachten und Benchmarks selbst ausführen
Der Quellcode für den Test, auf den sie sich beziehen, ist online verfügbar hier. Da dieser Code nicht direkt funktionierte, habe ich einige geringfügige Änderungen vorgenommen, die Sie hier erhalten können: serialize.py Ich habe folgende Ergebnisse erhalten:
Sie erwähnen auch, dass die Serialisierung mit der Umwandlung von Textdaten in kategorische Daten viel schneller ist. In ihrem Test etwa 10-mal schneller (siehe auch den Testcode).
Bearbeiten: Die höheren Zeiten für pickle im Vergleich zu CSV können durch das verwendete Datenformat erklärt werden. Standardmäßig verwendet pickle
eine druckbare ASCII-Repräsentation, die größere Datensätze generiert. Wie jedoch aus dem Diagramm ersichtlich ist, hat pickle unter Verwendung des neueren binären Datenformats (Version 2, pickle-p2
) deutlich geringere Ladezeiten.
Weitere Referenzen:
- In der Frage Schnellste Python-Bibliothek zum Lesen einer CSV-Datei gibt es eine sehr detaillierte Antwort, die verschiedene Bibliotheken zum Lesen von CSV-Dateien mit einem Benchmark vergleicht. Das Ergebnis besagt, dass für das Lesen von CSV-Dateien
numpy.fromfile
am schnellsten ist. - Ein weiterer Serialisierungstest zeigt, dass msgpack, ujson und cPickle beim Serialisieren am schnellsten sind.
Wenn ich das richtig verstehe, verwenden Sie bereits pandas.read_csv()
und möchten den Entwicklungsprozess beschleunigen, damit Sie die Datei nicht jedes Mal laden müssen, wenn Sie Ihr Skript bearbeiten, stimmt das? Ich habe ein paar Empfehlungen:
-
Sie könnten nur einen Teil der CSV-Datei mit
pandas.read_csv(..., nrows=1000)
laden, um nur den oberen Teil der Tabelle zu laden, während Sie die Entwicklung durchführen -
verwenden Sie ipython für eine interaktive Sitzung, so dass Sie die Pandas-Tabelle im Speicher behalten, während Sie Ihr Skript bearbeiten und neu laden.
-
konvertiere das csv in eine HDF5-Tabelle
-
aktualisiert Verwenden Sie
DataFrame.to_feather()
undpd.read_feather()
, um die Daten im R-kompatiblen feather Binärformat zu speichern, das super schnell ist (bei mir etwas schneller alspandas.to_pickle()
bei numerischen Daten und bei Zeichendaten viel schneller).
Sie könnten auch an dieser Antwort auf Stackoverflow interessiert sein.
- See previous answers
- Weitere Antworten anzeigen