Saya secara teratur melakukan operasi panda pada bingkai data lebih dari 15 juta baris atau lebih dan saya ingin memiliki akses ke indikator kemajuan untuk operasi tertentu.
Apakah ada indikator kemajuan berbasis teks untuk operasi panda split-apply-menggabungkan?
Misalnya, dalam sesuatu seperti:
df_users.groupby(['userID', 'requestDate']).apply(feature_rollup)
di mana feature_rollup
ada fungsi yang agak terlibat yang mengambil banyak kolom DF dan membuat kolom pengguna baru melalui berbagai metode. Operasi ini dapat memakan waktu cukup lama untuk kerangka data yang besar sehingga saya ingin tahu apakah mungkin untuk memiliki keluaran berbasis teks di notebook iPython yang memperbarui saya tentang perkembangannya.
Sejauh ini, saya sudah mencoba indikator progress loop kanonik untuk Python tetapi mereka tidak berinteraksi dengan panda dengan cara yang berarti.
Saya berharap ada sesuatu yang saya abaikan di perpustakaan panda / dokumentasi yang memungkinkan seseorang untuk mengetahui kemajuan split-apply-menggabungkan. Implementasi sederhana mungkin akan melihat jumlah total himpunan bagian bingkai data yang menjadi dasar apply
fungsinya dan melaporkan kemajuan sebagai bagian yang lengkap dari himpunan bagian tersebut.
Apakah ini mungkin sesuatu yang perlu ditambahkan ke perpustakaan?
Jawaban:
Karena permintaan populer,
tqdm
telah menambahkan dukungan untukpandas
. Tidak seperti jawaban lain, ini tidak akan memperlambat panda - inilah contoh untukDataFrameGroupBy.progress_apply
:Jika Anda tertarik pada cara kerjanya (dan bagaimana memodifikasinya untuk panggilan balik Anda sendiri), lihat contoh di github , dokumentasi lengkap tentang pypi , atau impor modul dan jalankan
help(tqdm)
.EDIT
Untuk langsung menjawab pertanyaan awal, ganti:
dengan:
Catatan: tqdm <= v4.8 : Untuk versi tqdm di bawah 4.8,
tqdm.pandas()
Anda tidak harus:sumber
tqdm
sebenarnya diciptakan untuk iterables biasa saja awalnya:from tqdm import tqdm; for i in tqdm( range(int(1e8)) ): pass
Dukungan panda adalah hack baru-baru ini saya buat :)from tqdm import tqdm_notebook; tqdm_notebook().pandas(*args, **kwargs)
tqdm
v5 yang membuat semuanya lebih termodulasi.Untuk men-tweak jawaban Jeff (dan memiliki ini sebagai fungsi yang dapat digunakan kembali).
Catatan: berlaku pembaruan persentase kemajuan sebaris . Jika fungsi Anda stdouts maka ini tidak akan berfungsi.
Seperti biasa Anda dapat menambahkan ini ke objek grup Anda sebagai metode:
Seperti yang disebutkan dalam komentar, ini bukan fitur yang akan diterapkan oleh panda inti. Tapi python memungkinkan Anda untuk membuat ini untuk banyak objek / metode panda (melakukannya akan sedikit kerja ... meskipun Anda harus bisa menggeneralisasi pendekatan ini).
sumber
Jika Anda membutuhkan dukungan untuk cara menggunakannya di notebook Jupyter / ipython, seperti yang saya lakukan, berikut adalah panduan dan sumber yang bermanfaat untuk artikel yang relevan :
Perhatikan garis bawah dalam pernyataan impor untuk
_tqdm_notebook
. Seperti yang disebutkan dalam artikel yang dirujuk, pengembangan sedang dalam tahap akhir beta.sumber
Bagi siapa saja yang ingin menerapkan tqdm pada kode panda-berlaku paralel kustom mereka.
(Saya mencoba beberapa perpustakaan untuk paralelisasi selama bertahun-tahun, tetapi saya tidak pernah menemukan solusi paralelisasi 100%, terutama untuk fungsi yang berlaku, dan saya selalu harus kembali untuk kode "manual" saya.)
df_multi_core - ini adalah yang Anda panggil. Ia menerima:
_df_split - ini adalah fungsi pembantu internal yang harus diposisikan secara global ke modul yang sedang berjalan (Pool.map adalah "penempatan bergantung"), kalau tidak saya akan menemukannya secara internal ..
inilah kode dari intisari (saya akan menambahkan lebih banyak tes fungsi panda di sana):
Di bawah adalah kode uji untuk penerapan paralel dengan tqdm "progress_apply".
Dalam output Anda dapat melihat 1 progress bar untuk berjalan tanpa paralelisasi, dan progress bar per-core saat berjalan dengan paralelisasi. Ada sedikit hickup dan kadang-kadang sisa core muncul sekaligus, tetapi meskipun begitu saya pikir itu berguna karena Anda mendapatkan statistik kemajuan per inti (itu / detik dan total catatan, misalnya)
Terima kasih @abcdaa untuk perpustakaan yang luar biasa ini!
sumber
try: splits = np.array_split(df[subset], njobs) except ValueError: splits = np.array_split(df, njobs)
karena pengecualian KeyError alih-alih ValueError, ubah ke Pengecualian untuk menangani semua kasus.Anda dapat dengan mudah melakukan ini dengan dekorator
lalu gunakan fungsi modified_function (dan ubah ketika Anda ingin mencetak)
sumber
logged_apply(g, func)
fungsi, di mana Anda akan memiliki akses ke pesanan, dan dapat login dari awal.Saya telah mengubah jawaban Jeff , untuk memasukkan total, sehingga Anda dapat melacak kemajuan dan variabel untuk hanya mencetak setiap iterasi X (ini sebenarnya meningkatkan banyak kinerja, jika "print_at" cukup tinggi)
fungsi clear_output () berasal dari
jika tidak pada jawaban IPython Andy Hayden melakukannya tanpa itu
sumber