Method agregat seperti sum() meringkas seluruh kolom menjadi satu angka akhir. Kadang kita justru butuh jejak perjalanan menuju angka tersebut: total berjalan per hari untuk memantau target bulanan, rekor tertinggi sementara, atau titik terendah yang pernah tercatat. Keluarga method kumulatif pandas, yaitu cumsum(), cummax(), dan cummin(), menjawab kebutuhan itu dengan mempertahankan panjang data. Pada Chapter ini kita menghitung ketiganya pada data penjualan es krim selama satu minggu.
Tiga Method Kumulatif Bawaan pandas #
Setiap method kumulatif memproses data berurutan dari baris pertama dan menyimpan lariannya di setiap posisi:
cumsum(): jumlah berjalan; nilai pada posisi ke-n adalah penjumlahan semua nilai dari awal sampai posisi tersebut.cummax(): rekor berjalan; nilai tertinggi yang pernah tercatat dari awal sampai posisi tersebut.cummin(): titik terendah berjalan; nilai terendah yang pernah tercatat dari awal sampai posisi tersebut.
Berbeda dengan sum() yang mengembalikan satu angka, hasil method kumulatif tetap sepanjang data aslinya. Bila input berupa Series, hasilnya Series; bila input berupa DataFrame, hasilnya DataFrame dengan ukuran sama. Sifat inilah yang membuat hasil kumulatif nyaman disisipkan sebagai kolom baru di samping data mentahnya.
Menghitung Total Berjalan Satu Minggu #
Kita memakai catatan gelas es krim yang terjual dari Senin sampai Minggu. Kolom gelas berisi penjualan harian, dan kita tambahkan tiga kolom hasil kumulatif agar ketiga method terlihat berdampingan.
import pandas as pd
mingguan = pd.DataFrame({
"hari": ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"],
"gelas": [120, 98, 135, 110, 150, 210, 175],
}).set_index("hari")
mingguan["total_berjalan"] = mingguan["gelas"].cumsum()
mingguan["rekor_berjalan"] = mingguan["gelas"].cummax()
mingguan["terendah_berjalan"] = mingguan["gelas"].cummin()
print(mingguan)Output yang Dihasilkan:
gelas total_berjalan rekor_berjalan terendah_berjalan
hari
Senin 120 120 120 120
Selasa 98 218 120 98
Rabu 135 353 135 98
Kamis 110 463 135 98
Jumat 150 613 150 98
Sabtu 210 823 210 98
Minggu 175 998 210 98Mari kita bedah kode di atas:
- Baris 3-6: kita membangun DataFrame dan langsung menjadikan kolom
harisebagai index melaluiset_index("hari"), sehingga setiap baris berlabel nama hari. - Baris 8 (
mingguan["total_berjalan"] = ...):cumsum()menumpuk penjualan; pada Selasa hasilnya218karena120 + 98, pada Rabu menjadi353, dan seterusnya hingga998di akhir minggu. - Baris 9 (
mingguan["rekor_berjalan"] = ...):cummax()menyimpan rekor tertinggi; nilai120bertahan pada Selasa karena98lebih kecil, lalu digantikan135di Rabu,150di Jumat, dan210di Sabtu. - Baris 10 (
mingguan["terendah_berjalan"] = ...):cummin()menyimpan titik terendah; nilai120turun menjadi98di Selasa dan tidak pernah naik lagi, karena method ini hanya menyimpan nilai terkecil yang pernah lewat. - Baris 12: kita mencetak seluruh tabel untuk melihat ketiga kolom kumulatif di samping data mentah.
Pola di kolom rekor_berjalan dan terendah_berjalan mudah dikenali: keduanya bergerak naik atau turun satu kali saja ketika rekor baru muncul, lalu membeku. Kolom total_berjalan selalu naik untuk data positif dan berakhir sama dengan hasil mingguan["gelas"].sum(). Dengan kolom semacam ini, pertanyaan seperti “kapan total mingguan menyentuh 1000 gelas” langsung terjawab: Sabtu mencatat 823 dan Minggu baru mencapai 998, sehingga target 1000 belum tersentuh minggu ini.
Hati-hati pada Kolom Teks #
Cara paling sederhana untuk menghindari keliru arah adalah memilih kolom secara eksplisit seperti pola mingguan["gelas"].cumsum() di atas. Dokumentasi pandas.Series.cumsum
, pandas.Series.cummax
, dan pandas.Series.cummin
merinci perilaku ketiga method ini, termasuk perlakuan terhadap nilai NaN yang dilewatkan tanpa memutus rantai perhitungan.
Operasi kumulatif bekerja baik pada kolom numerik yang punya urutan alami. Ketika data kita berisi kategori alih-alih angka, pertanyaan analisisnya berubah bentuk: kategori mana yang paling sering muncul dan seberapa besar porsinya? Chapter berikutnya menjawabnya dengan value_counts().