Saya memiliki program pemodelan dan penilaian yang banyak menggunakan DataFrame.isin
fungsi panda, mencari melalui daftar facebook "seperti" catatan pengguna individu untuk masing-masing dari beberapa ribu halaman tertentu. Ini adalah bagian yang paling memakan waktu dari program, lebih dari pemodelan atau penilaian, hanya karena hanya berjalan pada satu inti sedangkan sisanya berjalan pada beberapa lusin secara bersamaan.
Meskipun saya tahu saya bisa secara manual memecah dataframe menjadi potongan-potongan dan menjalankan operasi secara paralel, apakah ada cara mudah untuk melakukannya secara otomatis? Dengan kata lain, apakah ada paket di luar sana yang akan mengenali saya menjalankan operasi yang mudah didelegasikan dan secara otomatis mendistribusikannya? Mungkin itu meminta terlalu banyak, tapi saya sudah cukup terkejut di masa lalu oleh apa yang sudah tersedia di Python, jadi saya pikir itu layak ditanyakan.
Ada saran lain tentang bagaimana hal ini dapat dicapai (bahkan jika tidak oleh paket unicorn ajaib!) Juga akan dihargai. Terutama, hanya berusaha mencari cara untuk mengurangi 15-20 menit per kali berjalan tanpa menghabiskan waktu yang sama untuk mengkodekan solusi.
sumber
Jawaban:
Sayangnya, paralelisasi belum diimplementasikan dalam panda. Anda dapat bergabung dengan masalah github ini jika Anda ingin berpartisipasi dalam pengembangan fitur ini.
Saya tidak tahu "paket unicorn ajaib" untuk tujuan ini, jadi yang terbaik adalah menulis solusi Anda sendiri. Tetapi jika Anda masih tidak ingin menghabiskan waktu untuk hal itu dan ingin belajar sesuatu yang baru - Anda dapat mencoba dua metode yang dibangun ke dalam MongoDB (kerangka pengurangan peta dan gabungkan). Lihat mongodb_agg_framework .
sumber
Saya pikir taruhan terbaik Anda adalah rosetta . Saya menemukan ini sangat berguna dan mudah. Periksa metode panda -nya .
Anda bisa mendapatkannya melalui pip .
sumber
Ada
dask
perpustakaan yang berguna untuk pekerjaan paralel numpy / pandaTautan: https://github.com/blaze/dask
sumber
Ada versi yang lebih umum dari pertanyaan ini mengenai paralelisasi pada panda menerapkan fungsi - jadi ini adalah pertanyaan yang menyegarkan :)
Pertama , saya ingin menyebutkan lebih cepat karena Anda meminta solusi "paket", dan itu muncul pada sebagian besar pertanyaan SO mengenai paralelisasi panda.
Tapi .. Saya masih ingin membagikan kode inti pribadi saya untuk itu, karena setelah beberapa tahun bekerja dengan DataFrame saya tidak pernah menemukan solusi paralelisasi 100% (terutama untuk fungsi yang berlaku) dan saya selalu harus kembali untuk " kode "manual.
Terima kasih kepada Anda, saya membuatnya lebih umum untuk mendukung metode DataFrame (secara teoritis) apa pun dengan namanya (jadi Anda tidak perlu menyimpan versi untuk isin, melamar, dll.).
Saya mengujinya pada fungsi "isin", "apply" dan "isna" menggunakan kedua python 2.7 dan 3.6. Itu di bawah 20 baris, dan saya mengikuti konvensi penamaan panda seperti "subset" dan "njobs".
Saya juga menambahkan perbandingan waktu dengan kode setara dask untuk "isin" dan tampaknya ~ X2 kali lebih lambat dari intinya.
Ini mencakup 2 fungsi:
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 ini adalah kode uji untuk isin yang diparalelkan , yang membandingkan kinerja asli, multi-core, dan dask. Pada mesin I7 dengan 8 core fisik, saya mendapatkan kecepatan X4 kali. Saya ingin mendengar apa yang Anda dapatkan dari data asli Anda!
sumber
isin
- sepertinya potongan kode paling efektif dengan 'isin' - ~ X1.75 kali lebih cepat daripada dask (dibandingkan denganapply
fungsi yang hanya mendapat 5% lebih cepat daripada dask)