Topik ini membandingkan pandas dan Python murni untuk transformasi data pada dataset kecil yang sama, yaitu ringkasan total penjualan per produk. Kedua pendekatan dijalankan dan keluarannya disandingkan, kemudian diperbandingkan dari sisi ukuran data, kebutuhan dependensi, keterbacaan, dan kecepatan perkembangan kode. Bagian akhir merangkum kondisi ketika masing-masing pendekatan menjadi pilihan yang tepat.
Transformasi yang sama, dua pendekatan#
Transformasi yang dipakai sebagai bahan perbandingan adalah agregasi penjualan per produk dari berkas CSV berikut.
produk,jumlah,harga_satuan
buku tulis,3,4500
pensil,10,2000
buku tulis,2,4500
penghapus,0,1500
spidol,4,3500Versi Python murni memproses berkas baris demi baris dengan modul csv, tanpa memuat seluruh isi berkas ke dalam memori. Setiap baris diubah menjadi pasangan produk dan total, lalu disimpan dalam kamus agregasi.
"""Total penjualan per produk dengan Python murni, diproses baris demi baris."""
import csv
from pathlib import Path
def total_per_produk(berkas: Path) -> dict[str, float]:
"""Mengagregasi total penjualan per produk dari aliran baris CSV."""
hasil: dict[str, float] = {}
with berkas.open(newline="", encoding="utf-8") as sumber:
for baris in csv.DictReader(sumber):
total = int(baris["jumlah"]) * float(baris["harga_satuan"])
hasil[baris["produk"]] = hasil.get(baris["produk"], 0.0) + total
return hasil
if __name__ == "__main__":
for produk, total in total_per_produk(Path("penjualan.csv")).items():
print(f"{produk}: {total:.0f}")buku tulis: 22500
pensil: 20000
penghapus: 0
spidol: 14000Versi pandas membaca seluruh CSV menjadi DataFrame, yaitu tabel berlabel yang menyusun data per kolom, lalu menghitung kolom total secara sekaligus dan mengagregasinya dengan groupby. Kedua langkah itu hanya membutuhkan tiga baris kode.
"""Total penjualan per produk dengan pandas, diproses per kolom."""
import pandas as pd
def total_per_produk(berkas: str) -> pd.Series:
"""Membaca CSV lalu mengagregasi kolom total per produk."""
kerangka = pd.read_csv(berkas)
kerangka["total"] = kerangka["jumlah"] * kerangka["harga_satuan"]
return kerangka.groupby("produk", sort=False)["total"].sum()
if __name__ == "__main__":
for produk, total in total_per_produk("penjualan.csv").items():
print(f"{produk}: {total:.0f}")buku tulis: 22500
pensil: 20000
penghapus: 0
spidol: 14000Kedua keluaran identik karena transformasi yang dilakukan sama, sedangkan perbedaannya terletak pada cara berpikir. Python murni menyusun logika per baris sehingga setiap langkah terlihat eksplisit, sedangkan pandas menyusun logika per kolom sehingga operasi matematika dan agregasi menjadi ringkas. Karena hasilnya sama, pilihan diarahkan ke aspek lain yang dibahas pada bagian berikutnya.
Dua hal teknis pada versi pandas patut diperhatikan. Metode read_csv menentukan tipe setiap kolom secara otomatis dari isinya, sehingga kolom jumlah dan harga_satuan langsung dikenali sebagai angka tanpa konversi manual. Argumen sort=False pada groupby menjaga urutan keluaran mengikuti urutan kemunculan pertama di data, sehingga keluarannya sejajar dengan versi Python murni. Tanpa argumen itu, pandas mengurutkan kunci hasil agregasi secara alfabetis.
Perbandingan kedua pendekatan#
Perbandingan yang adil menyasar aspek yang berbeda antara kedua pendekatan, bukan sekadar jumlah baris kode. Tabel berikut merangkum aspek yang paling menentukan pilihan pada pekerjaan data engineering.
| Aspek | Python murni | pandas |
|---|---|---|
| Ukuran data | Aliran baris menjaga memori tetap kecil, layak untuk berkas sebesar apa pun | Data perlu muat di memori, sedangkan berkas yang lebih besar dari RAM memerlukan chunksize |
| Kebutuhan dependensi | Bagian pustaka standar, tanpa pemasangan tambahan | Paket terpisah yang perlu dipasang dan dirawat versinya |
| Keterbacaan | Eksplisit per baris, mudah dilacak untuk logika validasi yang rumit | Ringkas untuk agregasi, penggabungan, dan operasi kolom |
| Kecepatan perkembangan kode | Lebih banyak baris untuk agregasi kompleks | Sedikit baris untuk groupby, join, dan pivot |
Dua catatan melengkapi tabel tersebut. Pertama, kecepatan eksekusi sengaja tidak dijadikan baris pembanding karena nilainya bergantung pada ukuran dan bentuk data, sedangkan untuk dataset kecil seperti contoh di atas perbedaannya tidak terasa. Kedua, pada operasi kolom untuk data yang besar, pandas unggul karena operasinya berbasis array yang dikerjakan dalam satu langkah di level pustaka, sedangkan perulangan Python mengeksekusi setiap baris satu per satu pada penerjemahnya. Biaya pemasangan dan waktu impor pandas juga menjadi pertimbangan tersendiri pada skrip kecil, tetapi hal itu nyaris tidak terasa pada pipeline yang berjalan lama. Dengan demikian, pilihan pendekatan lebih ditentukan oleh bentuk masalahnya daripada oleh kebiasaan.
Kapan masing-masing unggul#
pandas menjadi pilihan utama ketika data sudah berada di memori dan transformasinya berbentuk kolom, misalnya agregasi multi dimensi, penggabungan antar tabel dengan merge, serta penyusunan ulang dengan pivot. Tahap eksplorasi juga nyaman di pandas karena tabel beserta statistiknya dapat diperiksa cepat. Python murni menjadi pilihan utama ketika skrip harus ringan tanpa dependensi, ketika berkasnya besar sehingga harus diproses streaming, atau ketika logikanya per baris dan rumit seperti validasi kustom yang sulit dinyatakan sebagai operasi kolom.
Pada pipeline yang nyata, keduanya sering bekerja bersama. Tahap ekstraksi yang menarik data dari API ditulis dengan Python murni dan menulis baris ke berkas, kemudian tahap transformasi memuat berkas itu dengan pandas. Untuk berkas yang lebih besar dari memori, pd.read_csv menerima argumen chunksize yang menghasilkan potongan DataFrame satu per satu, sehingga pola streaming dan kepraktisan pandas dapat digabungkan.
Kesalahan umum#
Perbandingan ini juga melahirkan kesalahan khas pada masing-masing pendekatan, dan hampir semuanya muncul ketika pola yang cocok untuk satu ukuran data dipaksakan ke ukuran yang lain. Empat berikut paling sering ditemui beserta perbaikannya.
- Metode
applydipakai untuk aritmetika antar kolom, sehingga proses berjalan baris demi baris dan lambat. Perbaikannya, tulis operasinya langsung antar kolom sepertikerangka["total"]. read_csvdipanggil pada berkas raksasa tanpachunksize, sehingga memori habis. Perbaikannya, proses berkas per potongan dan agregasikan hasilnya.- Logika per baris dipaksakan menjadi operasi kolom, sehingga kodenya sulit dibaca. Perbaikannya, gunakan Python murni untuk validasi yang rumit.
- Hasil kedua pendekatan dibandingkan dengan
==pada nilai float, sehingga perbedaan pembulatan terbaca sebagai ketidakcocokan. Perbaikannya, bandingkan dengan toleransi kecil pada selisihnya.
Ringkasan#
- Untuk transformasi yang sama, pandas dan Python murni menghasilkan keluaran yang identik, sedangkan perbedaannya ada pada cara berpikir baris dan kolom.
- Python murni unggul pada skrip tanpa dependensi, streaming berkas besar, dan validasi per baris yang rumit.
- pandas unggul pada agregasi, penggabungan, dan eksplorasi data yang muat di memori.
- Argumen
chunksizemenggabungkan keunggulan keduanya untuk berkas yang lebih besar dari RAM.
Referensi#
- pandas documentation — pandas project — Rujukan utama pandas, meliputi pembacaan CSV dan operasi DataFrame.
- Group by user guide — pandas project
— Panduan resmi
groupbyyang dipakai pada agregasi per produk.