Ikhtisar Paket Python Datatable

"Lima exabytes informasi diciptakan oleh umat manusia dari saat kelahiran peradaban hingga 2003, tetapi jumlah yang sama sekarang diciptakan setiap dua hari." Eric Schmidt


Datatable adalah pustaka Python untuk melakukan pemrosesan data multi-threaded yang efisien. Datatable mendukung dataset yang tidak sesuai dengan memori.

Jika Anda menulis dalam R, maka Anda mungkin sudah menggunakan paket data.table . Data.table adalah ekstensi dari paket data.frame R. Selain itu, mereka yang menggunakan R untuk dengan cepat mengumpulkan kumpulan data besar tidak dapat melakukan tanpa paket ini (kita berbicara, khususnya, sekitar 100 GB data dalam RAM).

Paket data.table untuk R sangat fleksibel dan kuat. Menggunakannya mudah dan nyaman, program yang digunakan ditulis dengan cukup cepat. Paket ini dikenal luas di kalangan programmer-R. Ini diunduh lebih dari 400 ribu kali sebulan, digunakan di hampir 650 paket CRAN dan Bioconductor ( sumber ).

Apa gunanya penambangan data untuk Python? Masalahnya adalah bahwa ada paket datatable Python yang merupakan analog dari data.table dari dunia R. Paket datatable jelas berfokus pada pemrosesan set data besar. Ini ditandai dengan kinerja tinggi - baik ketika bekerja dengan data yang sepenuhnya ditempatkan dalam RAM, dan ketika bekerja dengan data yang ukurannya melebihi jumlah RAM yang tersedia. Ini mendukung pemrosesan data multi-threaded. Secara umum, paket datatable dapat disebut sebagai adik dari data.table .

Datatable



Sistem pembelajaran mesin modern perlu memproses data dalam jumlah yang sangat besar dan menghasilkan banyak fitur. Ini diperlukan untuk membangun model seakurat mungkin. Modul Python yang dapat datatable dibuat untuk mengatasi masalah ini. Ini adalah seperangkat alat untuk melakukan operasi dengan volume data yang besar (hingga 100 GB) pada satu komputer dengan kecepatan setinggi mungkin. Sponsor pengembangan dataat adalah H2O.ai , dan pengguna pertama paket tersebut adalah Driverless.ai .

Toolkit ini sangat mirip dengan panda , tetapi lebih fokus pada penyediaan pemrosesan data berkecepatan tinggi dan mendukung kumpulan data besar. Selain itu, pengembang paket yang dapat datatable , berupaya agar nyaman bagi pengguna untuk menggunakannya. Ini, khususnya, API yang kuat dan pesan kesalahan yang dipikirkan dengan matang. Pada artikel ini, kita akan berbicara tentang bagaimana menggunakan datatable , dan bagaimana tampilannya dibandingkan dengan pandas saat memproses set data yang besar.

Instalasi


Di macOS, datatable dapat dengan mudah diinstal menggunakan pip :

 pip install datatable 

Di Linux, instalasi dilakukan dari distribusi biner:

 #  Python 3.5 pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp35-cp35m-linux_x86_64.whl #  Python 3.6 pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp36-cp36m-linux_x86_64.whl 

Saat ini, datatable tidak berfungsi di bawah Windows, tetapi pekerjaan sedang berlangsung dalam arah ini, jadi dukungan Windows hanyalah masalah waktu.

Detail tentang cara menginstal datatable dapat ditemukan di sini .

Kode yang akan digunakan dalam artikel ini dapat ditemukan di repositori GitHub ini atau di sini di mybinder.org.

Membaca data


Kumpulan data yang akan kami uji di sini diambil dari Kaggle ( Data Pinjaman Klub Data ). Set ini terdiri dari data lengkap tentang semua pinjaman yang diterbitkan pada 2007-2015, termasuk status pinjaman saat ini (Lancar, Terlambat, Dibayar Penuh, dll.) Dan informasi pembayaran terbaru. File ini terdiri dari 2,26 juta baris dan 145 kolom. Ukuran dataset ini sangat ideal untuk menunjukkan kemampuan perpustakaan yang dapat datatable .

 #    import numpy as np import pandas as pd import datatable as dt 

Mari memuat data ke objek Frame . Unit dasar analisis dalam sebuah datatable adalah Frame . Ini sama dengan DataFrame dari pandas atau tabel SQL. Yaitu, kita berbicara tentang data yang diatur sebagai larik dua dimensi di mana baris dan kolom dapat dibedakan.

▍Pemuatan data menggunakan dataat


 %%time datatable_df = dt.fread("data.csv") ____________________________________________________________________ CPU times: user 30 s, sys: 3.39 s, total: 33.4 s           Wall time: 23.6 s 

Fungsi fread() di atas adalah mekanisme yang kuat dan sangat cepat. Secara otomatis dapat mendeteksi dan memproses parameter untuk sebagian besar file teks, mengunduh data dari arsip .ZIP dan file Excel, mengambil data dengan URL, dan banyak lagi.

Selain itu, pengurai datatable memiliki fitur berikut:

  • Secara otomatis dapat mendeteksi pembatas, heading, tipe kolom, aturan pelolosan karakter, dan sebagainya.
  • Ia dapat membaca data dari berbagai sumber. Diantaranya adalah sistem file, URL, command shell, teks mentah, arsip.
  • Ia mampu melakukan pembacaan data multithread untuk kinerja maksimum.
  • Ini menampilkan indikator kemajuan saat membaca file besar.
  • Itu bisa membaca file yang sesuai dan tidak sesuai dengan RFC4180 .

▍Mengunduh data menggunakan panda


Sekarang mari kita lihat berapa lama pandas perlu membaca file yang sama.

 %%time pandas_df= pd.read_csv("data.csv") ___________________________________________________________ CPU times: user 47.5 s, sys: 12.1 s, total: 59.6 s Wall time: 1min 4s 

Anda dapat melihat bahwa datatable jelas lebih cepat daripada pandas saat membaca dataset besar. Pandas dalam percobaan kami membutuhkan waktu lebih dari satu menit, dan waktu yang diperlukan oleh data diukur dalam detik.

Konversi Objek Bingkai


Objek Frame paket datatable ada dapat dikonversi ke objek DataFrame numpy atau pandas . Ini dilakukan seperti ini:

 numpy_df = datatable_df.to_numpy() pandas_df = datatable_df.to_pandas() 

Mari kita coba untuk mengonversi Frame sudah ada menjadi datatable menjadi pandas DataFrame dan lihat berapa lama.

 %%time datatable_pandas = datatable_df.to_pandas() ___________________________________________________________________ CPU times: user 17.1 s, sys: 4 s, total: 21.1 s Wall time: 21.4 s 

Tampaknya membaca file menjadi Frame datatable dan kemudian mengonversinya menjadi objek DataFrame pandas membutuhkan waktu lebih sedikit daripada memuat data ke DataFrame menggunakan pandas . Oleh karena itu, mungkin, jika Anda berencana untuk memproses sejumlah besar data menggunakan pandas , akan lebih baik memuatnya menggunakan datatable , dan kemudian mengubahnya menjadi DataFrame .

 type(datatable_pandas) ___________________________________________________________________ pandas.core.frame.DataFrame 

Properti dasar dari objek Frame


Pertimbangkan properti dasar objek Frame dari datatable . Mereka sangat mirip dengan properti serupa dari objek DataFrame dari pandas :

 print(datatable_df.shape)       # ( ,  ) print(datatable_df.names[:5])   #   5  print(datatable_df.stypes[:5])  #   5  ______________________________________________________________ (2260668, 145) ('id', 'member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv') (stype.bool8, stype.bool8, stype.int32, stype.int32, stype.float64) 

Di sini kita dapat menggunakan metode head() , yang menampilkan n baris pertama:

 datatable_df.head(10) 


10 baris pertama objek Frame dari dataat

Warna header menunjukkan tipe data. Merah menunjukkan garis, hijau menunjukkan bilangan bulat, biru menunjukkan angka floating-point.

Statistik Ringkasan


Menghitung statistik ringkasan dalam pandas adalah operasi yang membutuhkan banyak memori untuk menyelesaikannya. Dalam kasus datatable ini tidak demikian. Berikut adalah perintah yang dapat Anda gunakan untuk menghitung berbagai metrik dalam data yang dapat datatable :

 datatable_df.sum()      datatable_df.nunique() datatable_df.sd()       datatable_df.max() datatable_df.mode()     datatable_df.min() datatable_df.nmodal()   datatable_df.mean() 

Kami menghitung nilai rata-rata di atas kolom menggunakan datatable dan pandas dan menganalisis waktu yang diperlukan untuk menyelesaikan operasi ini.

▍ Mencari rata-rata menggunakan datatable


 %%time datatable_df.mean() _______________________________________________________________ CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 s Wall time: 1.43 s 

▍ Menemukan rata-rata menggunakan panda


 pandas_df.mean() __________________________________________________________________ Throws memory error. 

Seperti yang Anda lihat, di pandas kami tidak bisa mendapatkan hasilnya - kesalahan yang terkait dengan memori dikeluarkan.

Manipulasi data


Frame dan DataFrame adalah struktur data yang berupa tabel. Dalam datatable , tanda kurung siku digunakan untuk memanipulasi data. Ini mirip dengan cara kerjanya dengan matriks konvensional, tetapi di sini, saat menggunakan tanda kurung, Anda dapat menggunakan fitur tambahan.


Bekerja dengan data yang dapat didata menggunakan kurung siku

Dalam matematika, ketika bekerja dengan matriks, konstruksi bentuk DT[i, j] juga digunakan. Struktur serupa dapat ditemukan di C, C ++ dan R, dalam paket pandas dan numpy , serta dalam banyak teknologi lainnya. Pertimbangkan untuk melakukan manipulasi data umum dalam data.

▍ Membentuk Baris atau Sampel Kolom


Kode berikut memilih semua baris dari kolom funded_amnt :

 datatable_df[:,'funded_amnt'] 


Pilih semua baris kolom funded_amnt

Berikut cara memilih 5 baris dan 3 kolom pertama:

 datatable_df[:5,:3] 


Pemilihan 5 baris pertama dan 3 kolom

▍Menyortir data menggunakan datatable


Urutkan set data dengan kolom yang dipilih:

 %%time datatable_df.sort('funded_amnt_inv') _________________________________________________________________ CPU times: user 534 ms, sys: 67.9 ms, total: 602 ms Wall time: 179 ms 

▍Menyortir data menggunakan panda


 %%time pandas_df.sort_values(by = 'funded_amnt_inv') ___________________________________________________________________ CPU times: user 8.76 s, sys: 2.87 s, total: 11.6 s Wall time: 12.4 s 

Perhatikan perbedaan signifikan dalam waktu yang diperlukan untuk mengurutkan data dan pandas .

El Hapus baris dan kolom


Berikut cara menghapus kolom bernama member_id :

 del datatable_df[:, 'member_id'] 

Pengelompokan


Datatable, seperti pandas , mendukung kemampuan pengelompokan data. Mari kita lihat bagaimana cara mendapatkan rata-rata kolom funded_amound , data yang dikelompokkan berdasarkan kolom grade .

▍Mengelompokkan data menggunakan datatable


 %%time for i in range(100):   datatable_df[:, dt.sum(dt.f.funded_amnt), dt.by(dt.f.grade)] ____________________________________________________________________ CPU times: user 6.41 s, sys: 1.34 s, total: 7.76 s Wall time: 2.42 s 

Di sini Anda dapat melihat penggunaan konstruksi .f . Ini disebut frame proxy - mekanisme sederhana yang memungkinkan Anda untuk merujuk ke objek Frame yang saat ini beberapa tindakan sedang dilakukan. Dalam kasus kami, dt.f sama dengan datatable_df .

▍ Mengelompokkan data menggunakan panda


 %%time for i in range(100):   pandas_df.groupby("grade")["funded_amnt"].sum() ____________________________________________________________________ CPU times: user 12.9 s, sys: 859 ms, total: 13.7 s Wall time: 13.9 s 

Penyaringan garis


Sintaksis penyaringan mirip dengan sintaksis pengelompokan. loan_amnt garis loan_amnt yang nilai loan_amnt lebih besar dari funded_amnt .

 datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"] 

Menyimpan Objek Bingkai


Isi objek Frame dapat ditulis ke file CSV, yang memungkinkan penggunaan data di masa depan. Ini dilakukan seperti ini:

 datatable_df.to_csv('output.csv') 

Anda dapat membaca tentang metode yang dapat datatable lainnya untuk bekerja dengan data di sini .

Ringkasan


Modul Python yang dapat datatable pasti lebih cepat daripada pandas biasa. Ini juga merupakan anugerah bagi mereka yang perlu memproses set data yang sangat besar. Sejauh ini, satu-satunya minus datatable dibandingkan dengan pandas adalah jumlah fungsionalitas. Namun, pekerjaan aktif sedang dilakukan pada datatable , sehingga sangat mungkin bahwa di masa depan, data akan melampaui pandas di semua arah.

Pembaca yang budiman! Apakah Anda berencana untuk menggunakan paket datatable dalam proyek Anda?



Source: https://habr.com/ru/post/id455507/


All Articles