Pandas shift dan diff: Hitung Perubahan Antar Baris
TL;DR
Pandas shift menggeser nilai satu kolom ke atas atau ke bawah beberapa baris, sehingga nilai periode sebelumnya sejajar dengan periode sekarang. diff langsung ngitung selisih antara baris sekarang dan baris sebelumnya, yang jadi dasar buat persen pertumbuhan. Buat data yang punya beberapa grup, selalu shift atau diff di dalam groupby biar perhitungan nggak bocor antar grup.
shift dan diff di Pandas ngitung perubahan antar baris. shift menggeser nilai ke baris lain, diff langsung ngasih selisih antara baris sekarang dan sebelumnya.
Ini dasar dari hampir semua analisa pertumbuhan. Kenaikan omzet dibanding kemarin, selisih stok antar hari, atau perubahan harga dari minggu lalu.
Aku bakal tunjukin cara kerja keduanya, cara ngitung persen pertumbuhan, dan kenapa shift harus dilakuin di dalam grup kalau datamu punya beberapa kategori.
Apa itu shift dan diff di Pandas?
shift(n) menggeser seluruh nilai kolom sejauh n baris. shift(1) bikin nilai baris sebelumnya muncul sejajar dengan baris sekarang. diff(n) ngitung selisih antara baris sekarang dan baris n langkah sebelumnya. Keduanya sering dipakai buat data berurut waktu.
Hubungan keduanya sederhana: diff() sama dengan kolom dikurang shift-nya. diff cuma jalan pintas biar kamu nggak nulis pengurangan manual.
Gimana cara pakai shift?
df['omzet_kemarin'] = df['omzet'].shift(1)
Nilai omzet hari sebelumnya sekarang sejajar dengan baris hari ini. Baris pertama jadi NaN karena nggak punya hari sebelumnya.
shift juga bisa mundur pakai angka negatif, buat narik nilai hari besok:
df['omzet_besok'] = df['omzet'].shift(-1)
Gimana cara pakai diff?
df['selisih'] = df['omzet'].diff(1)
Kolom selisih langsung berisi omzet hari ini dikurang kemarin. Hasil positif berarti naik, negatif berarti turun. diff(7) ngitung selisih dibanding 7 baris sebelumnya, pas buat bandingin hari yang sama minggu lalu.
Gimana cara hitung persen pertumbuhan?
Bagi selisih dengan nilai sebelumnya, lalu kali 100.
df['growth_pct'] = (
(df['omzet'] - df['omzet'].shift(1))
/ df['omzet'].shift(1) * 100
)
Pandas punya jalan pintas yang hasilnya sama, namanya pct_change:
df['growth_pct'] = df['omzet'].pct_change() * 100
Dua-duanya bener. pct_change lebih ringkas, versi manual lebih jelas kelihatan logikanya.
Kenapa shift harus di dalam groupby?
Kalau datamu punya beberapa grup, misalnya beberapa cabang, shift biasa bakal narik nilai dari cabang lain di batas antar grup. Selisih pertama tiap cabang jadi salah.
df['selisih'] = df.groupby('cabang')['omzet'].diff(1)
Sekarang pengurangan cuma terjadi di dalam tiap cabang. Baris pertama tiap cabang dapat NaN dengan benar, tanpa nyampur data cabang sebelumnya. Buat perhitungan per grup lain, cek juga pandas transform buat hitung per grup.
Contoh kasus: pertumbuhan harian Toko Berkah
Toko Berkah, UMKM kelontong di dataset latihan ngulikdata, punya omzet harian sepanjang 2025, total 365 baris terurut per tanggal. Pemilik mau tau hari apa yang lonjakannya paling tajam dibanding hari sebelumnya.
df = df.sort_values('tanggal')
df['selisih'] = df['omzet'].diff(1)
df['growth_pct'] = df['omzet'].pct_change() * 100
lonjakan = df.nlargest(1, 'selisih')
Hasilnya jatuh di 24 Desember, dengan omzet naik Rp6.900.000 atau 78% dibanding sehari sebelumnya. Setelah dicek, itu belanja stok Natal dan tahun baru. Pola ini kebaca tiap akhir bulan juga, rata-rata omzet tanggal 25 sampai 31 naik 22% dibanding minggu awal bulan, seiring gajian.
Angka 22% ini yang bikin pemilik nambah stok di minggu terakhir tiap bulan, bukan nebak kapan ramainya.
Kesalahan umum saat pakai shift dan diff
1. Lupa ngurutin data dulu
shift dan diff ngikutin urutan baris apa adanya. Kalau tanggalnya acak, selisihnya jadi ngaco. Selalu sort_values berdasarkan tanggal sebelum ngitung.
2. Shift antar grup tanpa groupby
Data multi-cabang atau multi-produk butuh shift di dalam groupby. Tanpa itu, baris pertama satu grup ngambil nilai grup sebelumnya, dan angkanya salah diam-diam.
3. Panik lihat NaN di baris pertama
Baris pertama selalu NaN karena nggak punya pembanding. Itu wajar. Isi pakai fillna(0) kalau perlu, atau biarin kalau perhitungan pertama memang nggak bermakna.
FAQ
Apa beda shift dan diff di Pandas?
shift cuma menggeser nilai kolom ke baris lain tanpa menghitung apa-apa, jadi nilai kemarin muncul sejajar dengan hari ini. diff langsung menghitung selisih antara baris sekarang dan baris sebelumnya. Sebenernya diff() sama dengan kolom dikurang shift-nya sendiri. Pakai shift kalau kamu butuh nilai lamanya utuh, dan diff kalau langsung mau angka perubahannya.
Gimana cara hitung persen pertumbuhan pakai shift?
Bagi selisih dengan nilai sebelumnya, lalu kali 100. Rumusnya (df['nilai'] - df['nilai'].shift(1)) / df['nilai'].shift(1) * 100. Baris pertama bakal NaN karena nggak punya pembanding sebelumnya. Alternatifnya, Pandas punya pct_change() yang ngerjain langkah ini sekaligus dan hasilnya sama.
Kenapa baris pertama hasil shift dan diff jadi NaN?
Karena baris pertama nggak punya baris sebelumnya buat dibandingin. shift(1) narik nilai dari baris di atasnya, dan baris pertama nggak ada di atasnya, jadi diisi NaN. Ini normal dan bukan error. Kamu bisa isi NaN itu dengan 0 pakai fillna, atau biarin kalau memang perhitungan pertama nggak punya makna.
Kenapa harus shift di dalam groupby?
Kalau datamu punya beberapa grup, misalnya beberapa cabang toko, shift biasa bakal narik nilai dari cabang lain di batas antar grup. Ini bikin selisih pertama tiap cabang salah. Dengan df.groupby('cabang')['omzet'].shift(1), pergeseran cuma terjadi di dalam tiap cabang, jadi baris pertama tiap grup dapat NaN dengan benar dan nggak nyampur.
Penutup
- shift menggeser nilai antar baris, diff langsung ngasih selisihnya. diff sama dengan kolom dikurang shift-nya.
- Buat persen pertumbuhan, bagi selisih dengan nilai sebelumnya, atau pakai pct_change.
- Selalu sort dulu, dan shift di dalam groupby kalau datanya punya beberapa grup.
Coba sekarang: ambil data omzet harianmu, urutin per tanggal, lalu bikin kolom growth harian pakai pct_change. Cari hari dengan lonjakan terbesar.
Konsep ini setara LAG dan LEAD di SQL. Cek fungsi LAG dan fungsi LEAD buat versi window function-nya, dan baca pertumbuhan week over week di SQL buat pola yang sama di database. Detail parameter ada di dokumentasi resmi pandas shift.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.