Saat ini saya mengimpor CSV
frame data yang cukup besar setiap kali saya menjalankan skrip. Apakah ada solusi yang baik untuk menjaga agar frame data selalu tersedia di sela-sela proses jadi saya tidak perlu menghabiskan waktu menunggu skrip dijalankan?
317
Jawaban:
Cara termudah adalah dengan acar menggunakan
to_pickle
:Kemudian Anda dapat memuatnya kembali menggunakan:
Catatan: sebelum 0.11.1
save
danload
merupakan satu-satunya cara untuk melakukan ini (sekarang tidak digunakan lagito_pickle
danread_pickle
masing - masing).Pilihan populer lainnya adalah menggunakan HDF5 ( pytables ) yang menawarkan waktu akses sangat cepat untuk kumpulan data besar:
Strategi yang lebih maju dibahas dalam buku masak .
Sejak 0.13 ada juga msgpack yang mungkin lebih baik untuk interoperabilitas, sebagai alternatif yang lebih cepat untuk JSON, atau jika Anda memiliki data objek python / teks-berat (lihat pertanyaan ini ).
sumber
Meskipun sudah ada beberapa jawaban, saya menemukan perbandingan yang bagus di mana mereka mencoba beberapa cara untuk membuat serial Pandas DataFrames: Efisien Menyimpan Pandas DataFrames .
Mereka membandingkan:
Dalam percobaan mereka, mereka membuat serial DataFrame dari 1.000.000 baris dengan dua kolom diuji secara terpisah: satu dengan data teks, yang lain dengan angka. Penafian mereka mengatakan:
Kode sumber untuk tes yang mereka rujuk tersedia online . Karena kode ini tidak berfungsi secara langsung, saya membuat beberapa perubahan kecil, yang bisa Anda dapatkan di sini: serialize.py Saya mendapat hasil berikut:
Mereka juga menyebutkan bahwa dengan konversi data teks ke data kategorisasi , serialisasi menjadi jauh lebih cepat. Dalam pengujian mereka sekitar 10 kali lebih cepat (lihat juga kode tes).
Sunting : Waktu acar yang lebih tinggi daripada CSV dapat dijelaskan dengan format data yang digunakan. Secara default
pickle
menggunakan representasi ASCII yang dapat dicetak, yang menghasilkan set data yang lebih besar. Seperti yang dapat dilihat dari grafik, acar menggunakan format data biner yang lebih baru (versi 2,pickle-p2
) memiliki waktu muat yang jauh lebih rendah.Beberapa referensi lain:
numpy.fromfile
adalah yang tercepat.sumber
.to_pickle()
(yang menggunakan penyimpanan biner) terhadap.to_hdf()
(tanpa kompresi). Tujuannya adalah kecepatan, ukuran file untuk HDF adalah Acar 11x, dan waktu untuk memuat adalah 5x Pickle. Data saya ~ 5 k file ~ 7r baris x 6 cols masing-masing, sebagian besar numerik.Jika saya mengerti dengan benar, Anda sudah menggunakan
pandas.read_csv()
tetapi ingin mempercepat proses pengembangan sehingga Anda tidak perlu memuat file setiap kali Anda mengedit skrip Anda, apakah itu benar? Saya punya beberapa rekomendasi:Anda dapat memuat hanya bagian dari file CSV yang digunakan
pandas.read_csv(..., nrows=1000)
untuk hanya memuat sedikit bagian atas tabel, saat Anda melakukan pengembangangunakan ipython untuk sesi interaktif, sehingga Anda menyimpan tabel panda dalam memori saat Anda mengedit dan memuat ulang skrip Anda.
mengkonversi csv ke tabel HDF5
penggunaan yang diperbarui
DataFrame.to_feather()
danpd.read_feather()
untuk menyimpan data dalam format biner bulu yang kompatibel dengan R yang super cepat (di tangan saya, sedikit lebih cepat daripandas.to_pickle()
pada data numerik dan lebih cepat pada data string).Anda mungkin juga tertarik dengan jawaban ini di stackoverflow.
sumber
to_feather
akan bekerja dengan baik pada data string? Saya membandingkanto_pickle
danto_feature
pada kerangka data numerik saya dan acar sekitar 3x lebih cepat.Acar bekerja dengan baik!
sumber
.pkl
seperti yang disarankan dalam jawaban @Andy Haydens.Anda dapat menggunakan file format bulu. Ini sangat cepat.
sumber
R
menggunakanfeather
perpustakaan.Pandas DataFrames memiliki
to_pickle
fungsi yang berguna untuk menyimpan DataFrame:sumber
Seperti yang telah disebutkan ada berbagai opsi dan format file ( HDF5 , JSON , CSV , parket , SQL ) untuk menyimpan bingkai data. Namun,
pickle
bukan warga negara kelas satu (tergantung pengaturan Anda), karena:pickle
adalah risiko keamanan potensial. Bentuk dokumentasi Python untuk acar :pickle
lambat. Temukan tolok ukur di sini dan di sini .Tergantung pada pengaturan Anda / penggunaan kedua keterbatasan tidak berlaku, tetapi saya tidak akan merekomendasikan
pickle
sebagai kegigihan default untuk bingkai data panda.sumber
Format file numpy cukup cepat untuk data numerik
Saya lebih suka menggunakan file numpy karena cepat dan mudah digunakan. Berikut ini adalah patokan sederhana untuk menyimpan dan memuat bingkai data dengan 1 kolom 1 juta poin.
menggunakan
%%timeit
fungsi ajaib ipythonoutputnya adalah
untuk memuat data kembali ke dalam kerangka data
outputnya adalah
TIDAK BURUK!
Kon
Ada masalah jika Anda menyimpan file numpy menggunakan python 2 dan kemudian coba buka menggunakan python 3 (atau sebaliknya).
sumber
https://docs.python.org/3/library/pickle.html
Format protokol acar:
Protokol versi 0 adalah protokol “terbaca oleh manusia” asli dan kompatibel dengan versi Python sebelumnya.
Protokol versi 1 adalah format biner lama yang juga kompatibel dengan versi Python sebelumnya.
Protokol versi 2 diperkenalkan dengan Python 2.3. Ini memberikan pengawetan kelas gaya baru yang jauh lebih efisien. Lihat PEP 307 untuk informasi tentang perbaikan yang dibawa oleh protokol 2.
Protokol versi 3 ditambahkan dalam Python 3.0. Ini memiliki dukungan eksplisit untuk objek byte dan tidak dapat dihapuskan dengan Python 2.x. Ini adalah protokol default, dan protokol yang direkomendasikan ketika kompatibilitas dengan versi Python 3 lainnya diperlukan.
Protokol versi 4 ditambahkan dalam Python 3.4. Ini menambahkan dukungan untuk objek yang sangat besar, pengawetan lebih banyak jenis objek, dan beberapa optimasi format data. Lihat PEP 3154 untuk informasi tentang perbaikan yang dibawa oleh protokol 4.
sumber
kompatibilitas pyarrow lintas versi
Langkah keseluruhan adalah ke pyarrow / feather (peringatan penghentian dari panda / msgpack). Namun saya memiliki tantangan dengan pyarrow dengan transient dalam spesifikasi Data bersambung dengan pyarrow 0.15.1 tidak dapat di-deserialized dengan 0.16.0 ARROW-7961 . Saya menggunakan serialisasi untuk menggunakan redis jadi harus menggunakan pengkodean biner.
Saya telah menguji ulang berbagai opsi (menggunakan notebook jupyter)
Dengan hasil berikut untuk bingkai data saya (dalam
out
variabel jupyter)bulu dan parket tidak berfungsi untuk bingkai data saya. Saya akan terus menggunakan pyarrow. Namun saya akan melengkapi dengan acar (tanpa kompresi). Saat menulis ke cache, simpan pyarrow dan acar formulir bersambung. Saat membaca dari cadangan mundur untuk acar jika deserialisation pyarrow gagal.
sumber
Formatnya tergantung pada kasus penggunaan Anda
Perbandingan format file panda ada di video ini .
sumber