Im Moment importiere CSV
ich jedes Mal, wenn ich das Skript ausführe , einen ziemlich großen Datenrahmen. Gibt es eine gute Lösung, um diesen Datenrahmen zwischen den Läufen ständig verfügbar zu halten, damit ich nicht die ganze Zeit auf die Ausführung des Skripts warten muss?
317
Antworten:
Am einfachsten ist es, es mit folgenden Zutaten zu beizen
to_pickle
:Dann können Sie es wieder laden mit:
Hinweis: vor 0.11.1
save
undload
waren der einzige Weg , dies zu tun (sie sind jetzt für veraltetto_pickle
undread_pickle
respectively).Eine weitere beliebte Option ist die Verwendung von HDF5 ( pytables ), das sehr schnelle Zugriffszeiten für große Datenmengen bietet :
Weiterführende Strategien werden im Kochbuch besprochen .
Seit 0.13 gibt es auch msgpack, das für die Interoperabilität besser geeignet ist , als schnellere Alternative zu JSON oder wenn Sie pythonobjekt- / textlastige Daten haben (siehe diese Frage ).
quelle
Obwohl es bereits einige Antworten gibt, habe ich einen schönen Vergleich gefunden, bei dem verschiedene Möglichkeiten zur Serialisierung von Pandas DataFrames ausprobiert wurden: Effizientes Speichern von Pandas DataFrames .
Sie vergleichen:
In ihrem Experiment serialisieren sie einen DataFrame mit 1.000.000 Zeilen, wobei die beiden Spalten separat getestet werden: eine mit Textdaten, die andere mit Zahlen. Ihr Haftungsausschluss lautet:
Der Quellcode für den Test, auf den sie sich beziehen, ist online verfügbar . Da dieser Code nicht direkt funktionierte, habe ich einige kleinere Änderungen vorgenommen, die Sie hier erhalten können: serialize.py Ich habe die folgenden Ergebnisse erhalten:
Sie erwähnen auch, dass mit der Konvertierung von Textdaten in kategoriale Daten die Serialisierung viel schneller ist. In ihrem Test etwa 10 mal so schnell (siehe auch Testcode).
Bearbeiten : Die höheren Zeiten für Pickle als CSV können durch das verwendete Datenformat erklärt werden. Standardmäßig
pickle
wird eine druckbare ASCII-Darstellung verwendet, die größere Datenmengen generiert. Wie aus der Grafik ersichtlich ist, hat Pickle mit dem neueren Binärdatenformat (Version 2pickle-p2
) viel kürzere Ladezeiten.Einige andere Referenzen:
numpy.fromfile
am schnellsten ist.quelle
.to_pickle()
(der Binärspeicher verwendet) gegen.to_hdf()
(ohne Komprimierung) durchgeführt. Das Ziel war Geschwindigkeit, Dateigröße für HDF war 11x Pickle und Zeit zum Laden war 5x Pickle. Meine Daten waren ~ 5k Dateien mit ~ 7k Zeilen x 6 Spalten, meistens numerisch.Wenn ich das richtig verstehe, verwenden Sie bereits
pandas.read_csv()
, möchten aber 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önnen nur einen Teil der CSV-Datei
pandas.read_csv(..., nrows=1000)
laden, indem Sie nur das oberste Bit der Tabelle laden, während Sie die Entwicklung durchführenVerwenden Sie ipython für eine interaktive Sitzung, sodass Sie die Pandas-Tabelle beim Bearbeiten und erneuten Laden Ihres Skripts im Speicher behalten.
Konvertieren Sie die CSV in eine HDF5-Tabelle
aktualisierte Verwendung
DataFrame.to_feather()
undpd.read_feather()
zum Speichern von Daten im R-kompatiblen Feder- Binärformat, das superschnell ist (in meinen Händen etwas schneller alspandas.to_pickle()
bei numerischen Daten und viel schneller bei String-Daten).Diese Antwort zum Stackoverflow könnte Sie auch interessieren .
quelle
to_feather
mit Zeichenfolgendaten gut arbeiten können? Ich habe ein Benchmarking durchgeführtto_pickle
undto_feature
auf meinem numerischen Datenrahmen ist Pickle ungefähr dreimal schneller.Gurke funktioniert gut!
quelle
.pkl
wie in der Antwort von @Andy Haydens vorgeschlagen.Sie können eine Datei im Federformat verwenden. Es ist extrem schnell.
quelle
R
über diefeather
Bibliothek verwendet werden.Pandas DataFrames haben die
to_pickle
Funktion, die zum Speichern eines DataFrames nützlich ist:quelle
Wie bereits erwähnt, gibt es verschiedene Optionen und Dateiformate ( HDF5 , JSON , CSV , Parkett , SQL ) zum Speichern eines Datenrahmens. Ist
pickle
jedoch kein erstklassiger Bürger (abhängig von Ihrer Einrichtung), weil:pickle
ist ein potenzielles Sicherheitsrisiko. Bilden Sie die Python-Dokumentation für pickle :pickle
ist langsam. Finden Sie hier und hier Benchmarks.Abhängig von Ihrem Setup / Ihrer Verwendung gelten beide Einschränkungen nicht, aber ich würde nicht
pickle
als Standardpersistenz für Pandas-Datenrahmen empfehlen .quelle
Numpy Dateiformate sind für numerische Daten ziemlich schnell
Ich bevorzuge die Verwendung von Numpy-Dateien, da diese schnell und einfach zu bearbeiten sind. Hier ist ein einfacher Benchmark zum Speichern und Laden eines Datenrahmens mit 1 Spalte mit 1 Million Punkten.
mit der
%%timeit
magischen Funktion von ipythondie Ausgabe ist
um die Daten wieder in einen Datenrahmen zu laden
die Ausgabe ist
NICHT SCHLECHT!
Nachteile
Es gibt ein Problem, wenn Sie die Numpy-Datei mit Python 2 speichern und dann versuchen, sie mit Python 3 zu öffnen (oder umgekehrt).
quelle
https://docs.python.org/3/library/pickle.html
Die Pickle-Protokollformate:
Protokollversion 0 ist das ursprüngliche, für Menschen lesbare Protokoll und abwärtskompatibel mit früheren Versionen von Python.
Protokollversion 1 ist ein altes Binärformat, das auch mit früheren Versionen von Python kompatibel ist.
Protokoll Version 2 wurde in Python 2.3 eingeführt. Es bietet ein viel effizienteres Beizen von Klassen neuen Stils. Informationen zu Verbesserungen durch Protokoll 2 finden Sie in PEP 307.
Protokollversion 3 wurde in Python 3.0 hinzugefügt. Es unterstützt explizit Byte-Objekte und kann von Python 2.x nicht entfernt werden. Dies ist das Standardprotokoll und das empfohlene Protokoll, wenn Kompatibilität mit anderen Python 3-Versionen erforderlich ist.
Protokollversion 4 wurde in Python 3.4 hinzugefügt. Es bietet Unterstützung für sehr große Objekte, das Beizen weiterer Objekttypen und einige Optimierungen des Datenformats. Informationen zu Verbesserungen durch Protokoll 4 finden Sie in PEP 3154.
quelle
Pyarrow-Kompatibilität zwischen Versionen
Insgesamt ging es um Pyarrow / Feder (Verfallswarnungen von Pandas / Msgpack). Ich habe jedoch eine Herausforderung mit Pyarrow mit vorübergehender Spezifikation. Mit Pyarrow 0.15.1 serialisierte Daten können mit 0.16.0 ARROW-7961 nicht deserialisiert werden . Ich verwende Serialisierung, um Redis zu verwenden, daher muss eine binäre Codierung verwendet werden.
Ich habe verschiedene Optionen erneut getestet (mit Jupyter Notebook)
Mit folgenden Ergebnissen für meinen
out
Datenrahmen (in Jupiter-Variable)Feder und Parkett funktionieren nicht für meinen Datenrahmen. Ich werde weiterhin Pyarrow verwenden. Ich werde jedoch mit Gurke ergänzen (keine Kompression). Speichern Sie beim Schreiben in den Cache serialisierte Formulare für Pyarrow und Pickle. Beim Lesen vom Cache-Fallback zum Pickle, wenn die Deserialisierung von Pyarrows fehlschlägt.
quelle
Das Format hängt von Ihrem Anwendungsfall ab
Ein Vergleich der Pandas-Dateiformate finden Sie in diesem Video .
quelle