Bagaimana membantu panda dalam memproses data dalam jumlah besar?

Perpustakaan panda adalah salah satu alat terbaik untuk analisis data eksplorasi . Tetapi ini tidak berarti bahwa panda adalah alat universal yang cocok untuk menyelesaikan masalah. Secara khusus, kita berbicara tentang memproses data dalam jumlah besar. Saya kebetulan menghabiskan waktu yang sangat, sangat lama, menunggu panda untuk membaca banyak file, atau memprosesnya, menghitung berdasarkan informasi yang terkandung di dalamnya beberapa indikator yang menarik bagi saya. Faktanya adalah panda tidak mendukung mekanisme pemrosesan data paralel. Akibatnya, paket ini gagal memanfaatkan sepenuhnya kemampuan prosesor multi-core modern. Kumpulan data besar dalam panda diproses secara lambat.



Baru-baru ini, saya mulai mencari sesuatu yang akan membantu saya dalam pemrosesan data besar. Saya berhasil menemukan apa yang saya cari, saya menyematkan alat yang ditemukan dalam pipa pemrosesan data saya. Saya menggunakannya untuk bekerja dengan sejumlah besar data. Misalnya, untuk membaca file yang berisi 10 gigabytes data, untuk memfilter dan menggabungkannya. Ketika saya berhasil memecahkan masalah seperti itu, saya menyimpan apa yang saya dapatkan di file CSV yang lebih kecil yang cocok untuk panda, dan kemudian saya mulai bekerja dengan data yang diperoleh menggunakan panda.

Ini adalah buku catatan Jupyter yang berisi contoh-contoh dari bahan ini yang dapat Anda coba.

Dask


Alat yang saya gunakan untuk memproses sejumlah besar data adalah perpustakaan Dask . Ini mendukung pemrosesan data paralel, memungkinkan Anda untuk mempercepat pekerjaan alat yang ada. Ini termasuk numpy, panda, dan sklearn. Dask adalah proyek open source gratis. Ini menggunakan API Python dan struktur data, yang membuatnya mudah untuk mengintegrasikan Dask ke dalam proyek yang ada. Jika kita mendeskripsikan Dask secara singkat, maka kita dapat mengatakan bahwa pustaka ini menyederhanakan solusi dari masalah biasa dan memungkinkan untuk menyelesaikan masalah dengan kompleksitas yang sangat besar.

Membandingkan panda dan dask


Saya dapat menjelaskan kemungkinan Dask di sini, karena perpustakaan ini memiliki banyak hal menarik, tetapi sebaliknya, saya hanya mempertimbangkan satu contoh praktis. Dalam perjalanan, saya biasanya menemukan set file besar, data yang disimpan di mana perlu dianalisis. Mari kita memainkan salah satu tugas khas saya dan membuat 10 file, yang masing-masing berisi 100.000 catatan. Setiap file memiliki ukuran 196 MB.

from sklearn.datasets import make_classification
import pandas as pd
for i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y = make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i, index=False)

Sekarang baca file-file ini menggunakan panda dan ukur waktu yang diperlukan untuk membacanya. Tidak ada dukungan bawaan dalam panda glob, jadi kami harus membaca file dalam satu lingkaran:

%%time
import glob
df_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

Butuh panda 16 detik untuk membaca file-file ini:

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

Jika kita berbicara tentang Dask, dapat dicatat bahwa perpustakaan ini memungkinkan Anda untuk memproses file yang tidak sesuai dengan memori. Ini dilakukan dengan memecah mereka menjadi blok dan dengan menyusun rantai tugas. Mari kita ukur waktu yang dibutuhkan Dask untuk membaca file-file ini:

import dask.dataframe as dd
%%time
df = dd.read_csv('trainset_*.csv')
CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

Dask mengambil 154 ms! Bagaimana ini mungkin? Sebenarnya, ini tidak mungkin. Dask mengimplementasikan paradigma tugas yang tertunda. Perhitungan dilakukan hanya ketika hasilnya dibutuhkan. Kami menjelaskan grafik eksekusi, yang memberikan Dask kemampuan untuk mengoptimalkan pelaksanaan tugas. Ulangi percobaan ini. Perhatikan bahwa fungsi read_csvdari Dask memiliki dukungan bawaan untuk bekerja dengan glob:

%%time
df = dd.read_csv('trainset_*.csv').compute()
CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

Menggunakan fungsi ini computememaksa Dask untuk mengembalikan hasilnya, yang mana Anda harus benar-benar membaca file. Hasilnya adalah Dask membaca file dua kali lebih cepat dari panda.

Dapat dikatakan bahwa Dask memungkinkan Anda untuk melengkapi proyek Python dengan alat penskalaan.

Membandingkan Penggunaan CPU dalam Pandas dan Dask


Apakah Dask menggunakan semua core prosesor pada sistem? Bandingkan penggunaan sumber daya prosesor dalam panda dan di Dask saat membaca file. Kode yang sama yang kami ulas di atas berlaku di sini.


Menggunakan sumber daya prosesor saat membaca file dengan panda


Menggunakan sumber daya prosesor saat membaca file menggunakan Dask

Beberapa gambar animasi di atas memungkinkan Anda untuk melihat dengan jelas bagaimana panda dan Dask menggunakan sumber daya prosesor saat membaca file.

Apa yang terjadi di usus Dask?


Kerangka data Dask terdiri dari beberapa kerangka data panda, yang dipisahkan oleh indeks. Ketika kami menjalankan fungsi read_csvdari Dask, ia membaca file yang sama dengan beberapa proses.

Kami bahkan dapat memvisualisasikan grafik dari tugas ini.

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()


Grafik runtime Dask saat membaca banyak file

Kerugian Dask


Mungkin Anda sekarang memiliki pemikiran berikut: "Jika perpustakaan Dask begitu baik - mengapa tidak menggunakannya saja daripada panda?" Tapi tidak sesederhana itu. Hanya beberapa fungsi panda yang diporting ke Dask. Faktanya adalah bahwa tugas-tugas tertentu sulit diparalelkan. Misalnya, mengurutkan data dan menetapkan indeks ke kolom yang tidak disortir. Dask bukan alat yang sepenuhnya menyelesaikan semua tugas analisis dan pemrosesan data. Perpustakaan ini direkomendasikan untuk digunakan hanya untuk bekerja dengan set data yang tidak sepenuhnya sesuai dengan memori. Karena pustaka Dask didasarkan pada panda, segala sesuatu yang bekerja lambat di panda akan tetap lambat di Dask. Seperti yang saya katakan sebelumnya, Dask adalah alat yang berguna yang dapat dibangun ke dalam pipa pemrosesan data, tetapi alat ini tidak menggantikan perpustakaan lain.

Instal Dask


Untuk menginstal Dask, Anda dapat menggunakan perintah berikut:

python -m pip install "dask[complete]"

Ringkasan


Pada artikel ini, saya hanya secara dangkal menyentuh kemampuan Dask. Jika Anda tertarik di perpustakaan ini - lihat ini tutorial besar pada DASK, dan dokumentasi dari datafreymam DASK. Dan jika Anda ingin tahu fungsi apa yang mendukung kerangka data Dask, baca deskripsi API DataFrame.

Apakah Anda menggunakan perpustakaan Dask?

Kami mengingatkan Anda bahwa kami melanjutkan kontes prediksi di mana Anda dapat memenangkan iPhone baru. Masih ada waktu untuk menerobosnya, dan membuat perkiraan paling akurat tentang nilai-nilai topikal.


All Articles