Cara menggunakan ITERROW pada Python


Overview

  • Pandas adalah Swiss Army Knife untuk tugas preprocessing data dengan Python tetapi bisa merepotkan saat menangani data dalam jumlah besar
  • Pelajari cara memanfaatkan Pandas dengan Python untuk menjadi profesional ilmu data yang lebih efisien

pengantar

Pandas adalah pustaka yang sangat populer sehingga bahkan pemrogram non-Python dan profesional ilmu data telah mendengar banyak tentangnya. Dan jika Anda seorang programmer Python berpengalaman, maka Anda akan sangat familiar dengan betapa fleksibelnya library Pandas.

Tapi masalah dengan Panda adalah bahwa ini bisa sangat lambat dalam situasi tertentu - terutama saat kita berurusan dengan data dalam jumlah besar. Dan di dunia yang didorong oleh tenggat waktu saat ini, efisiensi sering kali menjadi pemisah proyek sains data yang sukses dari yang gagal.

Jadi, bagaimana cara kita meningkatkan efisiensi dalam tugas pemrosesan awal data? Bisakah kita memanfaatkan Pandas, dengan beberapa penyesuaian, dan mempercepat tugas sains data kita?

Cara menggunakan ITERROW pada Python

Dalam artikel ini, kita akan fokus pada dua tugas pemrosesan awal data umum yang secara teratur saya lihat para ilmuwan data berjuang dengan:

  1. Binning
  2. Menambahkan baris ke dataframe

Kami akan berbicara tentang metode berbeda untuk melakukan dua tugas ini dan menemukan metode tercepat yang dapat meningkatkan efisiensi. Dan kami akan melakukan semua ini dengan bantuan Pandas!

Saya sangat merekomendasikan mengikuti kursus gratis di bawah ini untuk menjadi ilmuwan atau analis data yang lebih efisien:

Daftar Isi

  1. Mari Muat Set Data ke Lingkungan Python kita
  2. Pandas Tugas 1: Binning
    1. Pendekatan 1: Brute-force
    2. Pendekatan 2: iterrows ()
    3. Pendekatan 3: terapkan ()
    4. Pendekatan 4: potong ()
  3. Pandas Tugas 2: Menambahkan baris ke DataFrame
    1. Pendekatan 1: Menggunakan fungsi append
    2. Pendekatan 2: Fungsi Concat

Mari Muat Set Data ke Lingkungan Python kita

Ini akan dilakukan secepat mungkin. Saya pribadi percaya dalam belajar sambil melakukan - dan itulah ide yang akan kita ikuti di artikel ini.

Kami akan menemukan teknik tercepat untuk kedua tugas preprocessing ini dan memanfaatkan beberapa fungsi Pandas yang kurang dikenal untuk melakukannya. Sekarang, mari kita jalankan Jupyter Notebooks atau IDEs, dan muat dataset.

Kami akan menggunakan dataset 'mobil' untuk eksperimen kami. Anda dapat mengunduhnya dari sini atau jika Anda menggunakan perpustakaan seaborn untuk visualisasi - ini sudah memiliki kumpulan data 'mobil'.

# Mengimpor Perpustakaan impor panda sebagai pd impor numpy sebagai np import matplotlib.pyplot sebagai plt% matplotlib inline import seaborn sebagai sns

Mari muat dataset ke dalam dataframe:

mpg = sns.load_dataset ('mpg') mpg_head ()

Cara menggunakan ITERROW pada Python

Pandas Tugas 1: Binning

Untuk yang tidak tahu, binning adalah konversi variabel kontinu menjadi variabel kategori. Sekarang, jika kita ingin menerapkan kondisi pada kolom kontinu, misalkan pada kolom 'bobot', kita dapat membuat kolom kategorikal baru dengan:

  • berat> 1500 dan berat <2500 sebagai 'Ringan'
  • berat> 2500 dan berat <3500 sebagai 'Sedang'
  • berat> 3500 dan berat <4500 sebagai 'Berat'
  • berat> 4500 sebagai 'Sangat berat'

Mari kita amati berbagai pendekatan untuk melakukan tugas ini dan melihat apakah tugas preprocessing ini dapat dioptimalkan dengan Pandas.

Pendekatan 1: Brute-force

Metode brute-force paling lambat adalah melakukan iterasi melalui setiap baris dan kemudian mengkategorikan baris tersebut sesuai dengan itu. Untuk itu, pertama-tama kita membuat fungsi yang memeriksa nilai bobot dan menetapkan kategori ke dalamnya:

def apply_weights (weight): if 1500 <= weight <2500: category = 'Light' elif 2500 <= weight <3500: category = 'Medium' elif 3500 <= weight <4500: category = 'Heavy' else: category = ' Kategori pengembalian yang sangat berat

Kami kemudian mengambil kolom 'bobot' dan meneruskan nilai setiap baris ke fungsi di atas:

%% timeit cat_list = [] untuk i dalam jangkauan (len (mpg)): wt = mpg.iloc [i] ['weight'] cat = apply_weights (wt) cat_list.append (cat) mpg ['Wt_Categories'] = cat_list

Mari kita manfaatkan utilitas timeit untuk menghitung waktu yang dibutuhkan untuk tugas di atas. Untuk itu baru kita tambahkan %% waktu itu ke sel kode yang ingin kita jalankan.

Keluaran:

mpg.head ()

Cara menggunakan ITERROW pada Python

Dan waktu yang dibutuhkan untuk tugas di atas:

Cara menggunakan ITERROW pada Python

Jelas, loop ini membutuhkan banyak waktu untuk dieksekusi, dan semakin banyak baris yang kita miliki, semakin lambat operasinya. Tidak ideal!

Pendekatan 2: iterrows ()

Mari kita percepat proses ini dengan memanfaatkan iterrows () berfungsi di Pandas. Itu iterrows function pada dasarnya adalah versi yang dioptimalkan dari pernyataan ini:

untuk saya dalam jangkauan (len (mpg)):

Ini memungkinkan kami untuk bekerja dengan baris individual. Seperti yang Anda lihat, kami telah menghindari penggunaan iloc, dan kolom bobot setiap baris dapat diakses seperti yang kami lakukan di dataframe:

%% timeit cat_list = [] untuk indeks, baris dalam mpg.iterrows (): wt = row ['weight'] cat = apply_weights (wt) cat_list.append (cat) #print (len (cat_list)) mpg ['Wt_Categories_iter '] = cat_list

Mari kita konfirmasi kolom baru:

mpg.head ()

Cara menggunakan ITERROW pada Python

dan waktu eksekusi:

Cara menggunakan ITERROW pada Python

Bagus! Kami mengurangi waktu yang dibutuhkan hingga 30 md! Ingatlah bahwa perbedaan ini akan lebih terlihat untuk kumpulan data yang lebih besar dan fungsi yang kompleks.

Percayakah Anda jika saya mengatakan bahwa kita bisa membuat ini lebih cepat? Mari kita lihat caranya.

Pendekatan 3: terapkan ()

Metode apply () memungkinkan penerapan fungsi tertentu di sepanjang sumbu tertentu (0 untuk baris, dan 1 untuk kolom). Secara internal, apply () juga digunakan untuk loop, tetapi dengan banyak pengoptimalan, yang tidak akan kita bahas di sini.

%% timeit mpg ['wt_cat_apply'] = mpg.apply (baris lambda: apply_weights (baris ['weight']), axis = 1)

Seperti sebelumnya, mari kita konfirmasikan kolom baru dan waktu eksekusi:

mpg.head ()

Cara menggunakan ITERROW pada Python

serta

Cara menggunakan ITERROW pada Python

Menakjubkan! Kode kami dimulai dengan mengambil 75 milidetik untuk dieksekusi, dan kami berakhir dengan kode hanya membutuhkan sekitar 7 milidetik untuk menjalankan fungsi. Selain itu, kami juga dapat melakukannya dengan kode yang lebih tajam.

Namun jika Anda amati, masih ada beberapa kendala dalam metode di atas:

  • Kami masih harus menulis fungsi yang membosankan apply_weights () dan menggunakan beberapa pernyataan bersyarat untuk kategori bobot. Ini mungkin terlihat sederhana untuk hanya 4 kategori, tetapi jika untuk 6 atau lebih, kami memiliki pekerjaan yang cocok untuk kami
  • Selain itu, kami tidak selalu dapat memastikan batas bawah dan atas setiap kategori bobot karena bisa jadi terdapat banyak ambiguitas dalam menentukan interval kategori.
  • Interval kategori tidak seimbang - ini tidak intuitif

Tanpa masalah - Panda memiliki utilitas untuk mengotomatiskan proses kategorisasi juga dan menghilangkan batasan di atas!

Pendekatan 4: potong ()

Kami menggunakan fungsi cut () dari pustaka Pandas untuk melakukan tugas preprocessing ini, dan dengan demikian, secara otomatis memasukkan data kami. Kita hanya perlu mengetahui empat kategori tempat kita ingin memasukkan kolom kita ke dalamnya dan fungsi cut membagi data ke dalam kategori ini.

%% timeit mpg ['wt_cat_cut'] = pd.cut (np.array (mpg ['weight']), 4, labels = ["Ringan", "Sedang", "Berat", "Sangat berat"])

Cara menggunakan ITERROW pada Python

Dan kolom baru juga:

Cara menggunakan ITERROW pada Python

Luar biasa! Kami hanya membutuhkan waktu sekitar 1 md untuk mengkategorikan data kami - perbedaan mencolok dari 72 md yang kami gunakan untuk memulai dan peningkatan yang nyata pada fungsi apply ().

Untuk meringkas, inilah hasil kami:

Cara menggunakan ITERROW pada Python

Pandas Tugas 2: Menambahkan Baris ke Dataframe

Mari kita coba menambahkan baris baru ke dataframe yang ada. Dua cara umum untuk melakukan ini adalah:

  • menambahkan
  • concat

Keduanya merupakan bagian dari pustaka Pandas dan perlu dibandingkan untuk memahami pendekatan mana yang membantu kami mencapai teknik preprocessing secara efektif dalam menambahkan baris ke kerangka data.

Mari kita temukan cara tercepat untuk melakukannya. Untuk ini, mari kita buat 3 dataframe sederhana:

raw_data = {'subject_id': ['1', '2', '3', '4', '5'], 'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']} df_a = pd.DataFrame (raw_data, kolom = ['subject_id', 'first_name', 'last_name']) df_a

Cara menggunakan ITERROW pada Python

raw_data = { 'subject_id': ['4', '5', '6', '7', '8'], 'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name'])
df_b

Cara menggunakan ITERROW pada Python

raw_data = {'subject_id': ['6', '5', '1', '3', '9'], 'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze']} df_c = pd.DataFrame (raw_data, kolom = ['subject_id', 'first_name', 'last_name']) df_c

Cara menggunakan ITERROW pada Python

Pendekatan 1: Menggunakan fungsi append

Kami akan menggunakan menambahkan() berfungsi untuk menambahkan baris kerangka data ke akhir kerangka data yang ada. Fungsi ini sangat berguna karena memiliki parameter seperti 'verifikasi_integrity' yang menimbulkan kesalahan jika baris dengan indeks duplikat ditambahkan. Kami juga dapat mengurutkan dataframe yang dihasilkan dengan kolom menggunakan parameter sortir.

Meskipun menambahkan baris dataframe ke dataframe lain cukup sederhana, ketika kita harus menambahkan 3 atau lebih dataframe bersama-sama kita menemui masalah. Kita tidak bisa melewatkan lebih dari satu kerangka data sebagai argumen ke fungsi append. Jadi, kami tidak punya pilihan selain menambahkan 2 kerangka data dan menambahkan hasilnya ke kerangka data ke-3.

Ini bisa sangat membosankan jika ada lebih banyak kerangka data yang terlibat.

Di bawah ini adalah kode Python - mari kita evaluasi waktu yang dibutuhkan untuk melakukan operasi ini. Harap ingat untuk mengatur abaikan_indeks parameter ke True sehingga indeks kerangka data baru berkisar dari 0 hingga n-1:

%% timeit temp_df = df_a.append (df_b, ignore_index = True) df_new = temp_df.append (df_c, ignore_index = True)

Seperti apa tampilan kerangka data yang baru?

Cara menggunakan ITERROW pada Python

Mari kita lihat juga waktu pelaksanaan operasi ini:

Cara menggunakan ITERROW pada Python

Cukup lama waktu yang dibutuhkan untuk menambahkan 3 dataframe dengan hanya 5 baris! Jelas, ini akan memakan waktu lebih lama jika kita bekerja dengan kerangka data yang lebih besar.

Bisakah kita mengoptimalkan ini dan mempercepat proses ini juga? Tentu saja kita bisa. 🙂

Pendekatan 2: Fungsi Concat

Fungsi concat di Pandas sangat mirip dengan fungsi concatenate di NumPy. Salah satu keuntungan dari fungsi concat adalah banyaknya parameter yang memungkinkan, seperti 'axis': 0 atau 1 yang memungkinkan penggabungan dataframe berdasarkan baris atau kolom, bersama dengan verifikasi_integritas serta jenis.

Parameter lain digunakan saat kita ingin menggabungkan dengan kolom. Keuntungan utama dari fungsi append adalah kita dapat mengirimkan dataframe sebanyak argumen ke fungsi concat seperti yang kita inginkan. Ini menghasilkan kode yang lebih tajam karena kita dapat menambahkan beberapa baris dengan satu baris kode:

%% timeit df_concat = pd.concat ([df_a, df_b, df_c], axis = 0)

Kerangka data yang dihasilkan:

Cara menggunakan ITERROW pada Python

Cara menggunakan ITERROW pada Python

Clocking di sekitar 491 µseconds, dibutuhkan waktu yang jauh lebih sedikit daripada fungsi append. Meskipun perbedaan ini mungkin terlihat dapat diabaikan sekarang, ini akan lebih terlihat untuk kerangka data yang lebih besar. Selain itu, fungsi append () secara internal lebih tidak efisien karena melibatkan pembuatan objek baru dengan data yang digabungkan.

Ini dikatakan, jika Anda ingin menambahkan baris individu ke dataframe, yang terbaik adalah menggunakan fungsi .loc:

df_a.loc [5] = ['5', 'Billy', 'Bounder']

Catatan Akhir

Di sini, kami mengamati 2 tugas prapemrosesan yang umum dan membandingkan pendekatan yang berbeda untuk menemukan bagaimana pustaka Pandas secara efektif dan efektif membantu kami mencapai tugas ini.

Penting untuk menggunakan teknik yang paling efisien saat melakukan praproses data Anda karena data scientist menghabiskan sebagian besar waktunya untuk membersihkan data dan mempersiapkannya untuk langkah selanjutnya dalam analisis data dan pembuatan model.

Hubungi kami jika Anda memiliki pertanyaan di bagian komentar di bawah. Selain itu, beri tahu kami fungsi yang Anda gunakan atau telah digunakan untuk mengoptimalkan langkah-langkah praproses data Anda!

Anda juga dapat membaca artikel ini di APLIKASI Seluler kami

Cara menggunakan ITERROW pada Python
Cara menggunakan ITERROW pada Python

Artikel terkait

Sumber: https://www.analyticsvidhya.com/blog/2020/09/pandas-speed-up-preprocessing/