
Seiring lanskap data science semakin kompleks, dengan teknologi baru bermunculan setiap hari, memilih perangkat yang tepat menjadi krusial bagi proyek Anda. Semakin kompleks proyeknya, semakin berhati-hati Anda harus memilih alat yang akan digunakan, karena pilihan tersebut akan berdampak signifikan pada pengembangan dan, pada akhirnya, keberhasilan proyek Anda.
Jika Anda mengerjakan proyek data science, keputusan desain melampaui perdebatan Python vs R. Keputusannya juga mencakup pustaka yang akan digunakan setelah Anda memilih bahasa pemrograman sebagai dasar proyek.
Dalam kasus Python untuk data science, pandas adalah alat standar de facto untuk manipulasi data. Alasan untuk menggunakan pandas sangat banyak dan meyakinkan, namun ada juga keterbatasan yang dapat menimbulkan hambatan penting dalam proyek Anda. Secara khusus, pandas dikenal memiliki kinerja terbatas saat menangani dataset berukuran besar.
Untuk mengatasi masalah ini, pandas baru-baru ini merilis versi 2.0, yang hadir dengan revisi penting dan peningkatan kinerja (lihat artikel ini untuk mengetahui semua yang perlu Anda ketahui tentang pandas 2.0).
Sementara itu, alternatif baru telah muncul di ekosistem Python untuk menantang dominasi pandas. Salah satu yang paling populer adalah polars, pustaka berbasis Python dan Rust untuk melakukan analisis data yang lebih cepat.
Artikel ini akan menganalisis perbedaan antara pandas 2.0 dan polars untuk manipulasi data. Kita akan mulai dengan menelaah strategi peningkatan kinerja komputasi dan diakhiri dengan serangkaian pengujian untuk membandingkan kinerja keduanya. Mari mulai!
Cara Memilih antara pandas dan polars
Tidak ada satu teknologi pun yang terbaik secara mutlak untuk menyelesaikan semua masalah dan situasi yang mungkin muncul selama alur kerja data science Anda. Berbagai faktor harus dipertimbangkan sebelum mengambil keputusan. Berikut beberapa faktor paling relevan yang perlu diperhatikan:
- Kinerja komputasi. Sebagai aturan praktis, semakin besar dan kompleks proyeknya, semakin Anda perlu mempertimbangkan alat berkinerja tinggi untuk menghindari hambatan komputasi.
- Kecocokan tumpukan teknologi. Alat yang digunakan dalam proyek data science jarang bekerja secara terisolasi. Biasanya, alat-alat tersebut bekerja bersama alat lain dalam tumpukan teknologi. Sebelum membuat pilihan, Anda harus memperhatikan sinergi dan kecocokan antar teknologi.
- Kompatibilitas kode. Memilih teknologi baru juga menyangkut kompatibilitas dan efisiensi kode. Jika mengadopsi alat baru akan mengakibatkan penulisan ulang kode pada proyek yang ada, hal itu harus Anda masukkan dalam pertimbangan.
- Popularitas. Terakhir, popularitas sebuah alat menjadi indikator berapa banyak orang yang menggunakannya, yang dapat menguntungkan untuk tujuan merekrut pengembang baru atau menyelesaikan keraguan pengkodean di platform seperti Stack Overflow.
Bagaimana Anda Dapat Meningkatkan Performa Manipulasi Data?
Di bagian ini, kita akan membahas teknik-teknik utama yang dapat membantu meningkatkan performa manipulasi data.
Mengurangi penyalinan dengan copy-on-write
Dalam alat tradisional untuk manipulasi data, setiap operasi data menghasilkan pembuatan salinan baru dari seluruh basis data. Perilaku ini dapat menjadi masalah bagi sumber daya memori Anda saat berhadapan dengan dataset berukuran besar.
Copy-on-write adalah teknik paling umum untuk mengatasi masalah ini. Intinya, copy-on-write adalah teknik manajemen sumber daya yang memungkinkan Anda menerapkan operasi "duplikat" atau "salin" secara efisien pada sumber daya yang dapat dimodifikasi. Artinya, jika sebuah dataset diduplikasi namun tidak (sepenuhnya) dimodifikasi, tidak perlu membuat sumber daya baru. Sebaliknya, sumber daya memori dapat dibagi antara salinan dan yang asli.
Komputasi paralel
Salah satu kekurangan utama pandas adalah bersifat threaded, artinya tidak dapat memanfaatkan teknik komputasi paralel yang kini umum di data science. Komputasi paralel terutama dilakukan oleh mesin multi-inti atau komputasi terdistribusi (yakni sekelompok komputer yang bekerja bersama dalam sebuah klaster).
Ambil contoh berikut menggunakan fungsi group by yang populer. Jika Anda ingin menghitung rata-rata usia pemain bola basket yang dikelompokkan berdasarkan tim, Anda dapat menggunakan komputasi paralel untuk menugaskan perhitungan rata-rata setiap kelompok ke satu inti atau mesin alih-alih menghitungnya satu per satu, sehingga meningkatkan kinerja.

Mengoptimalkan impor data
Titik awal analisis data biasanya adalah membaca dataset yang ingin Anda pelajari. Namun, ini sering menjadi hambatan dalam proyek data yang melibatkan dataset besar. Berikut beberapa teknik yang dapat membantu meningkatkan performa saat membaca berkas data:
- Penggalian data (chunking). Alih-alih membaca seluruh berkas, Anda dapat memecahnya menjadi bagian-bagian kecil, alias chunk. Teknik ini memungkinkan impor data lebih cepat sekaligus mengurangi memori yang diperlukan untuk menyimpannya secara bersamaan.
- Hanya baca kolom yang diperlukan. Terkadang Anda sudah mengetahui kolom-kolom dari sebuah dataset yang Anda butuhkan untuk analisis. Alih-alih membaca seluruh dataset, Anda dapat melakukan penyaringan awal dan hanya membaca kolom yang diperlukan.
- Downcasting tipe data. Alat seperti pandas memiliki perilaku bawaan saat menetapkan tipe data ke kolom yang diimpor. Terkadang, mungkin ada tipe lain yang membutuhkan memori lebih sedikit tanpa kehilangan informasi. Downcasting adalah proses mengubah tipe data ke tipe terkecil yang masih dapat menangani nilainya.
Evaluasi Malas (Lazy) dan Perencanaan Kueri
Urutan pelaksanaan operasi dapat memengaruhi kinerja. Sering kali, Anda dapat menyusun ulang beberapa komputasi dan mendapatkan jawaban yang sama dengan lebih efisien.
Ada dua strategi untuk mencapainya: evaluasi malas (lazy evaluation) dan perencanaan kueri (query planning). Yang pertama merujuk pada proses menunda komputasi hingga benar-benar diperlukan. Sebaliknya, yang kedua adalah proses mencari cara paling efisien untuk melakukan banyak manipulasi data mengingat serangkaian kueri yang berbeda. Untuk melakukannya, perencanaan kueri biasanya melibatkan penggunaan pengoptimal kueri.
Pemrosesan Out-of-Core
Alat seperti pandas menyimpan seluruh dataset di memori Anda, yang dapat menjadi masalah jika Anda bekerja dengan dataset besar yang tidak muat di memori komputer atau melakukan operasi yang membutuhkan memori besar.
Di sinilah komputasi out-of-core menjadi relevan. Secara sederhana, pemrosesan out-of-core merujuk pada memori eksternal (misalnya, disk eksternal) yang menyimpan data yang sebaliknya tidak muat di memori inti Anda. Pemrosesan out-of-core memungkinkan Anda memproses data yang disimpan secara eksternal dalam potongan (chunk), sehingga pada akhirnya Anda akan mendapatkan hasil yang sama seolah-olah seluruh proses dilakukan di komputer Anda.
Apa Saja Alternatif pandas Berkinerja Tinggi?
Artikel ini berfokus pada perbandingan pandas 2.0 vs polars, namun patut juga menyebutkan alat lain yang dapat memenuhi kebutuhan Anda sebagai alternatif pandas. Berikut beberapa alat yang menjanjikan:
- Koalas. API pandas yang dibangun di atas PySpark. Jika Anda menggunakan Spark, Anda sebaiknya mempertimbangkan alat ini.
- Vaex. API pandas untuk komputasi out-of-memory, sangat baik untuk menganalisis data tabular besar hingga miliaran baris per detik.
- Modin. API pandas untuk pemrograman paralel, berbasis kerangka kerja Dask atau Ray untuk proyek big data. Jika Anda menggunakan Dask atau Ray, Modin adalah sumber daya yang hebat.
- cuDF. Bagian dari proyek RAPIDS, cuDF adalah API bergaya pandas untuk komputasi GPU yang bergantung pada GPU NVIDIA atau bagian lain dari RAPIDS untuk melakukan manipulasi data berkecepatan tinggi.
Mengapa Memilih polars?
Pandas adalah pilihan utama bagi praktisi data yang menggunakan Python, tetapi, seperti yang sudah dijelaskan, ada beberapa keterbatasan penting saat berurusan dengan dataset besar. Misi inti polars adalah menawarkan pustaka dataframe yang sangat cepat yang mengatasi semua masalah pandas.
Ditulis dalam Rusk (bahasa pemrograman yang kuat yang memberikan kinerja C/C++ dan memungkinkan kontrol penuh atas bagian-bagian kritis performa dalam mesin kueri), polars mengintegrasikan metodologi mutakhir untuk meningkatkan kinerja, yang dirancang untuk:
- Meningkatkan komputasi paralel sehingga Anda dapat memanfaatkan semua inti yang tersedia di mesin Anda.
- Mengoptimalkan kueri untuk mengurangi pekerjaan/alokasi memori yang tidak perlu menggunakan evaluasi malas dan perencanaan kueri.
- Meningkatkan performa penyimpanan dengan menggunakan semantik copy-on-write dan Apache Arrow.
- Menangani dataset yang jauh lebih besar daripada yang tersedia melalui kemampuan data out-of-core melalui API streaming-nya.
Terakhir, fitur penting dari polars adalah sintaksnya cukup mirip dengan pandas dan berbagi blok penyusun yang sama, seperti Series dan DataFrame. Ini akan memudahkan Anda jika memutuskan beralih ke polars.
Bagaimana Respons pandas terhadap Peningkatan Kompetisi dengan pandas 2.0?
Untuk mengatasi masalah kinerja dan menyeimbangkan tekanan dari para pesaing, pandas baru-baru ini merilis versi 2.0 yang telah lama ditunggu. Sebagai pembaruan mayor, pandas 2.0 menawarkan beragam fitur baru. Versi ini juga mencakup deprecation yang ditegakkan, yang mengakibatkan perubahan API.
Backend PyArrow baru adalah andalan utama pandas untuk mengatasi keterbatasan kinerjanya. Pengguna kini dapat memilih antara backend NumPy tradisional atau backend PyArrow yang baru. PyArrow adalah pustaka Python yang menyediakan antarmuka untuk menangani dataset besar menggunakan struktur memori Arrow.
pd.read_csv(my_file, engine='pyarrow')
Fitur penting lainnya adalah penggabungan beberapa peningkatan copy-on-write yang dimaksudkan untuk meningkatkan kinerja dengan menghemat sumber daya memori.
Akibatnya, banyak operasi pandas kini menggabungkan parameter default “copy” yang akan mengembalikan salinan malas dari objek dasar pandas, seperti series dan dataframe, alih-alih salinan identik yang di-cache dari objek tersebut.
Masih terlalu dini untuk mengetahui apakah kapabilitas pandas akan mengatasi masalah kinerjanya. Bahkan jika alat lain melampauinya, tetap akan ada alasan bagus untuk terus menggunakan pandas: Anda tidak perlu menulis ulang kode yang ada atau mempelajari kode baru karena Anda kemungkinan sudah menggunakannya.
pandas 2.0 vs polars: Kerangka Perbandingan
Setelah memahami teorinya, saatnya praktik. Pada bagian berikut, kita akan melakukan serangkaian pengujian untuk membandingkan kinerja pandas 2.0 vs polars. Tolok ukur kita adalah waktu yang diperlukan untuk melakukan suatu tugas. Untuk itu, kita akan menggunakan modul time, yang menyediakan cara sederhana menghitung waktu eksekusi.
Selain pengujian performa, kita juga akan menganalisis kompatibilitas kode polars dengan pandas (yakni, seberapa banyak kode yang perlu Anda ubah jika ingin beralih ke polars?).
Dataset
Kita akan menguji kinerja pandas 2.0 vs polars pada dataset fiktif penjualan per jam dari sebuah perusahaan dengan kantor di berbagai negara sepanjang periode 1980-2022. Untuk menambah kompleksitas analisis tolok ukur, kita akan menambahkan beberapa nilai hilang acak.
Secara keseluruhan, dataset mencakup lebih dari 22 juta baris dan lebih dari 1,6 GB memori, cukup untuk memberi tekanan besar pada pandas. Seluruh kode untuk pengujian tolok ukur dapat ditemukan di workbook DataLab ini.

Uji impor
Mari mulai membandingkan kinerja pandas 2.0 dan polars saat mengimpor data. Polars secara eksplisit mempromosikan performa kuatnya untuk impor dari CSV. Apakah benar demikian?
Kita akan melakukan uji untuk mengecek berapa lama waktu yang dibutuhkan pandas dan polars untuk membaca subset kolom dan baris. Misalnya, anggap Anda hanya ingin menganalisis penjualan kantor Prancis. Dengan pandas, Anda perlu membaca semua baris lalu melakukan penyaringan untuk menghapus baris yang tidak diinginkan. Kita akan menggunakan metode baru .query() untuk itu. Untuk mencoba perilaku pandas 2.0, kita akan mengimpor CSV dengan mesin numpy tradisional dan mesin pyarrow yang baru.
Sebaliknya, polars menyediakan metode filter() yang dapat digunakan bersama serangkaian kondisi tertentu untuk membaca hanya baris yang Anda minati.
# pandas query
df_pd = pd.read_csv("./example.csv", engine="pyarrow")
df_pd = df_pd[['id', 'date', 'office', 'sales']]
df_pd = df_pd.query("office=='France'")
# polars filter
df_pl = pl.read_csv('example.csv').filter(
(pl.col('office') == 'France'))
df_pl.select(pl.col(['id', 'date', 'office', 'sales']))
Saat kita melakukan uji, polars berkinerja jauh lebih baik daripada pandas, seperti terlihat pada grafik. Mengejutkan, mesin pyarrow tidak memberikan hasil lebih baik daripada mesin numpy standar.

Dari sisi kompatibilitas sintaks, polars jelas memiliki nuansa yang sama dengan pandas, dengan fungsi seperti pl.read_csv() yang sangat merefleksikan pandas. Namun, kedua pustaka bekerja berbeda di balik layar, dan itu tak terelakkan menghasilkan perbedaan sintaks, seperti ditunjukkan oleh metode query() vs filter().
Uji group by
Operasi groupby sangat cocok untuk diparalelkan. Mari lihat bagaimana pandas dan polars berperilaku dalam beberapa operasi agregasi berdasarkan pengelompokan. Secara khusus, kita akan menghitung mean dan median penjualan per kantor dan bulan.
df_pd.groupby([df_pd.office, df_pd.date.dt.month])['sales'].agg('mean') # pandas groupby mean
df_pl.groupby([pl.col('office'), pl.col('date').dt.month()]).agg([pl.mean('sales')]) # polars groupby mean

df_pd.groupby([df_pd.office, df_pd.date.dt.month])['sales'].agg('median') # pandas groupby median
df_pl.groupby([pl.col('office'), pl.col('date').dt.month()]).agg([pl.median('sales')]) pandas groupby median

Hasilnya menunjukkan bahwa, dalam perhitungan group by dan agregasi, polars berkinerja lebih baik daripada pandas. Sekali lagi, sintaks polars mirip dengan pandas.
Uji statistik rolling
Operasi lain yang cocok untuk menguji performa pandas dan polars adalah statistik rolling. Mengoptimalkan jenis komputasi ini melibatkan banyak pekerjaan algoritmik yang rumit. Mari lihat bagaimana keduanya berperilaku saat kita melakukan rolling mean penjualan per hari.
# pandas rolling mean
df_pd['sales'].rolling(1440, min_periods=1).mean()
# polars rolling mean
df_pl['sales'].rolling_mean(1440, min_periods=1)
Sekali lagi, polars menjadi pemenang. Perhatikan perbedaan halus dalam sintaks. polars memiliki metode rolling_mean(), sedangkan pandas menggunakan metode rolling() yang perlu dikombinasikan dengan metode lain, seperti mean(), untuk memberikan hasil yang sama.

Uji sampling
Mempelajari seluruh populasi yang diminati untuk menganalisis suatu fenomena biasanya tidak memungkinkan. Itulah mengapa sampling menjadi salah satu tugas paling umum dalam statistik dan data science. Ini melibatkan pengambilan sampel acak menggunakan teknik Simulasi Monte Carlo, seperti bootstrap dan permutasi. Namun, operasi ini juga membutuhkan banyak penyalinan variabel, yang bisa menjadi tantangan jika Anda kekurangan sumber daya komputasi.
Mari lihat bagaimana pandas dan polars bekerja saat melakukan bootstrap, yakni pengambilan sampel ulang dengan pengembalian. Kita akan mengestimasi rata-rata penjualan dalam 10000 sampel yang masing-masing terdiri dari 1000 titik data.
#pandas bootstrap
simu_weights = []
for i in range(10000):
bootstrap_sample = random.choices(df_pd['sales'], k=1000)
simu_weights.append(np.nanmean(bootstrap_sample))
#polars bootstrap
simu_weights = []
for i in range(10000):
bootstrap_sample = df_pl['sales'].sample(n=1000,with_replacement=True)
simu_weights.append(bootstrap_sample.mean())
Saat melakukan bootstrap sampling, polars hampir 5x lebih cepat daripada pandas.
Terkait sintaks, sementara pandas bergantung pada numpy untuk melakukan operasi sampling, polars hadir dengan metode sample() bawaan yang praktis.

Manipulasi majemuk
Untuk uji terakhir, kita akan melakukan serangkaian manipulasi data yang saling terhubung. Ini adalah bagian dari keseharian para profesional data. Namun, operasi data yang melibatkan banyak langkah mudah ditulis dengan cara yang kurang optimal secara komputasi.
Bayangkan kantor Italia dari perusahaan fiksi tersebut mempertimbangkan untuk merekrut beberapa peserta magang tahun 2022 setelah masa magangnya berakhir. Tujuan kita adalah menganalisis siapa saja peserta magang yang melakukan sepuluh transaksi penjualan terbesar pada 2022, sehingga kita dapat menggunakan informasi tersebut untuk memilih kandidat yang paling sesuai.
Untuk melakukannya, kita harus menggabungkan dataset kita dengan dataset kedua, bernama “italy_2022”, yang berisi informasi tentang orang yang melakukan setiap transaksi pada 2022. Kolom “id” adalah kolom yang sama di kedua dataset.

# pandas compound operations
df_pd.merge(italy_2022, on='id').query("responsibility =='Sales Intern'").sort_values('sales', ascending=False).head(10)[['name','surname','sales','sex']]
#polars compound manipulations
df_pl.join(italy_2022_pl, on="id").filter(pl.col('responsability') == 'Sales Intern').sort('sales',descending=True).head(10).select(pl.col(['name','surname','sales','sex']))

Seperti pada semua pengujian sebelumnya, polars mengungguli pandas dari sisi performa. Pada uji ini, operasi join tampaknya menjadi tantangan terbesar bagi pandas. Sebaliknya, polars jauh lebih efisien, memerlukan waktu kurang dari dua detik untuk menyelesaikan semua tugas berantai.
Tabel Perbandingan pandas 2.0 vs polars
Kami merangkum pengujian di atas dalam sebuah tabel untuk menunjukkan perbandingan cepat:
|
Uji |
Pandas 2.0 |
Polars |
Pemenang |
Kemiripan Sintaks |
|
Uji Impor |
Membaca semua baris lalu menyaring baris yang tidak diinginkan menggunakan metode .query() |
Langsung membaca hanya baris yang diminati menggunakan metode filter() |
Polars (kinerja lebih baik) |
Mirip, tetapi ada perbedaan karena implementasi dasar (.query() vs filter()) |
|
Uji Group By |
Menggunakan .groupby() untuk operasi agregasi seperti mean dan median penjualan per kantor dan bulan |
Sama seperti pandas, tetapi dengan kinerja lebih baik |
Polars (kinerja lebih baik) |
Mirip |
|
Uji Statistik Rolling |
Menggunakan metode rolling() yang dikombinasikan dengan metode lain, seperti mean(), untuk perhitungan rolling mean |
Menggunakan metode rolling_mean() untuk perhitungan rolling mean |
Polars (kinerja lebih baik) |
Mirip, namun ada perbedaan kecil (.rolling().mean() vs rolling_mean()) |
|
Uji Sampling |
Menggunakan numpy untuk operasi bootstrap sampling |
Menggunakan metode sample() bawaan untuk operasi bootstrap sampling |
Polars (hampir 5x lebih cepat) |
Berbeda, pandas bergantung pada numpy sedangkan polars memiliki metode bawaan |
|
Uji Manipulasi Majemuk |
Melakukan operasi join dengan dataset lain lalu mengurutkan dan memilih data |
Melakukan tugas yang sama tetapi lebih efisien |
Polars (jauh lebih cepat) |
Mirip, tetapi ada perbedaan kecil (merge().query().sort_values().head() vs join().filter().sort().head().select()) |
Naik ke Level Berikutnya
Selamat telah mencapai akhir tutorial ini. Menurut pengujian, polars berkinerja jauh lebih baik daripada pandas 2.0 di hampir semua uji. Meski ini menjadi ancaman nyata bagi dominasinya, pandas masih memiliki keunggulan sebagai opsi utama untuk manipulasi data di Python, sehingga menikmati semua manfaat dari komunitas pengguna yang lebih besar.
Jika Anda bekerja dengan dataset besar, meningkatkan performa adalah sebuah keharusan. DataCamp siap membantu. Berikut daftar kursus yang dapat membantu Anda meningkatkan performa komputasi ke level berikutnya:
Saya adalah analis data lepas yang berkolaborasi dengan perusahaan dan organisasi di seluruh dunia dalam proyek ilmu data. Saya juga instruktur ilmu data dengan pengalaman lebih dari 2 tahun. Saya rutin menulis artikel terkait ilmu data dalam bahasa Inggris dan Spanyol, beberapa di antaranya telah diterbitkan di situs tepercaya seperti DataCamp, Towards Data Science, dan Analytics Vidhya. Sebagai ilmuwan data dengan latar belakang ilmu politik dan hukum, tujuan saya adalah bekerja pada irisan kebijakan publik, hukum, dan teknologi, memanfaatkan kekuatan gagasan untuk mendorong solusi serta narasi inovatif yang dapat membantu kita menghadapi tantangan mendesak, khususnya krisis iklim. Saya menganggap diri saya seorang autodidak, pembelajar sepanjang hayat, dan pendukung kuat pendekatan multidisipliner. Tidak pernah ada kata terlambat untuk mempelajari hal baru.

