Pandas rolling: Moving Average di Python (2026)
TL;DR
Pandas rolling bikin jendela geser buat menghitung moving average dan menghaluskan data time series yang naik-turun. Panggil .rolling(window=7).mean() pada kolom angka setelah data diurutkan berdasarkan tanggal. Atur window sesuai periode dan pakai min_periods kalau gak mau baris awal kosong.
Pandas rolling itu metode buat menghitung nilai agregat (kayak rata-rata atau total) dari sekelompok baris berurutan yang geser satu per satu. Paling sering dipakai buat bikin moving average, yaitu rata-rata bergerak yang menghaluskan data harian yang naik-turun jadi garis tren yang lebih enak dibaca.
Kalau kamu pegang data penjualan harian, angkanya pasti loncat-loncat. Hari gajian rame, tanggal tua sepi. Susah lihat apakah bisnisnya lagi naik atau turun.
Di sini aku bahas cara pakai rolling dari nol, plus contoh nyata pakai data penjualan toko. Kita mulai dari satu baris kode.
Apa itu pandas rolling?
rolling adalah metode pandas yang bikin jendela geser di atas data kamu. Kamu tentuin jendelanya selebar berapa baris, misalnya 7, lalu pandas hitung agregat dari tiap 7 baris berturut-turut sambil jendelanya maju satu baris. Hasilnya kolom baru yang lebih halus dari data aslinya.
Istilah kerennya moving average atau rata-rata bergerak. Fungsinya buat lihat arah tren tanpa terganggu lonjakan harian.
Bedanya sama mean() biasa: mean() kasih satu angka untuk seluruh kolom. rolling kasih satu angka untuk tiap titik waktu, jadi kamu bisa lihat perubahannya dari hari ke hari.
Gimana cara pakai pandas rolling?
Pola dasarnya cuma dua langkah. Panggil .rolling(window=n) di kolom yang mau dihaluskan, lalu tempelin fungsi agregat kayak .mean() di belakangnya. Window itu jumlah baris yang dirata-ratakan tiap langkah.
import pandas as pd
df = pd.read_csv('penjualan_harian.csv', parse_dates=['tanggal'])
df = df.sort_values('tanggal')
# moving average 7 hari
df['ma_7'] = df['omzet'].rolling(window=7).mean()
print(df[['tanggal', 'omzet', 'ma_7']].head(10))
Hasilnya, kolom ma_7 bakal kosong (NaN) di 6 baris pertama. Wajar, soalnya jendela 7 hari belum penuh. Baru di baris ke-7 pandas punya cukup data buat ngitung rata-rata pertamanya.
Satu hal penting: urutin dulu datanya pakai sort_values('tanggal'). Kalau tanggalnya acak, moving average-nya jadi ngawur.
Apa itu window dan min_periods?
window nentuin lebar jendela. min_periods nentuin minimal berapa baris yang harus ada sebelum pandas mau ngitung. Default-nya min_periods sama dengan window, makanya baris awal jadi NaN. Kalau kamu set min_periods=1, pandas langsung ngitung dari baris pertama.
# tetap hitung meski jendela belum penuh
df['ma_7'] = df['omzet'].rolling(window=7, min_periods=1).mean()
Pakai min_periods=1 kalau kamu gak mau ada baris kosong di awal. Tapi hati-hati, rata-rata di hari pertama cuma dari 1 angka, jadi belum benar-benar halus.
| Parameter | Fungsi | Contoh nilai |
|---|---|---|
| window | Lebar jendela (jumlah baris) | 7, 30, 90 |
| min_periods | Minimal baris sebelum dihitung | 1 |
| center | Taruh hasil di tengah jendela, bukan ujung | True / False |
Fungsi agregat apa aja yang bisa dipakai?
Selain .mean(), rolling bisa dipasangin banyak agregat. Kamu tinggal ganti fungsi di belakangnya sesuai kebutuhan.
df['total_7'] = df['omzet'].rolling(7).sum() # rolling total
df['max_7'] = df['omzet'].rolling(7).max() # puncak 7 hari
df['std_7'] = df['omzet'].rolling(7).std() # sebaran 7 hari
df['min_7'] = df['omzet'].rolling(7).min()
Rolling sum berguna buat hitung total penjualan 7 hari terakhir di tiap titik. Rolling std bantu kamu lihat kapan penjualan lagi stabil dan kapan lagi liar.
Contoh kasus: penjualan harian toko_berkah
Anggap kita punya data toko_berkah, sebuah UMKM sembako, dengan omzet harian selama 90 hari. Angka hariannya loncat dari Rp 1,2 juta di tanggal tua sampai Rp 4,8 juta di hari gajian. Susah dibaca mentah-mentah.
import pandas as pd
df = pd.read_csv('toko_berkah.csv', parse_dates=['tanggal'])
df = df.sort_values('tanggal')
df['ma_7'] = df['omzet'].rolling(7).mean()
df['ma_30'] = df['omzet'].rolling(30).mean()
# tren naik kalau ma_7 di atas ma_30
df['sinyal'] = df['ma_7'] > df['ma_30']
print(df[['tanggal','omzet','ma_7','ma_30','sinyal']].tail())
Dari dataset ngulikdata, standar deviasi omzet harian mentah toko_berkah ada di angka Rp 980 ribu. Setelah dihaluskan pakai moving average 7 hari, sebarannya turun jadi cuma Rp 310 ribu. Artinya garis ma_7 tiga kali lebih stabil buat dibaca dibanding data aslinya.
Trik ma_7 di atas ma_30 ini klasik. Kalau rata-rata jangka pendek naik di atas rata-rata jangka panjang, biasanya bisnis lagi ada momentum naik.
Kesalahan umum saat pakai rolling
Yang paling sering bikin hasil salah:
- Lupa sort tanggal.
rollingngikutin urutan baris, bukan urutan tanggal. Data acak = hasil ngawur. - Ada tanggal bolong. Kalau ada hari yang hilang, window 7 baris gak sama dengan 7 hari kalender. Isi dulu tanggal kosongnya atau pakai
rolling('7D')berbasis waktu. - Salah baca NaN di awal. Baris NaN itu normal, bukan error. Jangan buru-buru di-drop kalau kamu masih butuh barisnya.
- Window kekecilan. Window 2-3 hari nyaris gak menghaluskan apa-apa. Buat penjualan harian, mulai dari 7.
Buat rolling berbasis waktu (bukan jumlah baris), kamu bisa kasih string kayak '7D'. Ini otomatis ngikutin kalender walau ada tanggal bolong.
df = df.set_index('tanggal')
df['ma_7d'] = df['omzet'].rolling('7D').mean()
FAQ
Apa bedanya rolling sama resample di pandas?
rolling bikin jendela geser dan hasilnya sama banyak dengan baris asli, cocok buat moving average. resample ngubah frekuensi data, misalnya dari harian jadi bulanan, dan hasilnya lebih sedikit. Kalau kamu mau haluskan tren tanpa mengurangi baris, pakai rolling. Kalau mau ringkas per bulan, pakai resample.
Kenapa hasil rolling saya banyak NaN?
Karena default min_periods sama dengan window. Jendela belum penuh di baris-baris awal, jadi pandas kasih NaN. Kalau kamu mau tetap dapat angka sejak baris pertama, set min_periods=1. Tapi ingat, rata-rata di awal itu dari sedikit data, jadi belum stabil.
Window berapa yang bagus buat data penjualan?
Buat penjualan harian, window 7 populer karena nutup satu minggu penuh dan meredam efek weekend. Buat tren jangka panjang, coba 30 buat gambaran bulanan. Gak ada angka ajaib. Coba beberapa window, lalu pilih yang garisnya paling enak dibaca tanpa kehilangan pola penting.
Bisa gak rolling buat lebih dari satu kolom sekaligus?
Bisa. Panggil .rolling() di beberapa kolom lalu .mean(), misalnya df[['omzet','qty']].rolling(7).mean(). Pandas hitung moving average buat tiap kolom secara terpisah. Hasilnya DataFrame baru dengan kolom yang sama.
Rolling bikin data saya bergeser ke belakang, kenapa?
Default-nya hasil rolling ditaruh di ujung kanan jendela, jadi terlihat telat beberapa hari. Kalau kamu mau hasilnya sejajar di tengah jendela, pakai center=True. Ini bikin garis moving average gak ketinggalan dari data aslinya, cocok buat visualisasi.
Penutup
Rekap singkat: rolling bikin jendela geser buat menghaluskan data time series. Pasangin sama .mean() buat moving average, atur window sesuai periode, dan selalu sort tanggal dulu.
Sekarang coba buka data penjualan kamu sendiri, bikin kolom ma_7, dan lihat trennya. Bedanya langsung kerasa.
Mau lanjut belajar olah data time series? Baca cara agregasi time series pakai pandas resample dan cara agregasi data ala pivot pakai pandas groupby. Buat dasar konsepnya, cek glosarium moving average dan glosarium time series. Dokumentasi resminya ada di halaman pandas.DataFrame.rolling.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Seaborn Pairplot: Cara Eksplorasi Data Cepat dengan Python (2026)
Satu baris kode buat lihat hubungan semua kolom numerik sekaligus. Ini cara pakai seaborn pairplot buat eksplorasi data, lengkap dengan contoh dan cara bacanya.
Seaborn Heatmap: Visualisasi Matriks Korelasi (2026)
Seaborn heatmap ngubah matriks korelasi jadi grid warna, jadi kamu bisa langsung lihat variabel mana yang saling terkait. Ini cara bikinnya dari df.corr() sampai atur warna dan angka.
Seaborn untuk Pemula: Visualisasi Statistik di Python (2026)
Seaborn bikin chart statistik yang rapi cuma dengan satu baris kode. Ini dasar-dasarnya buat pemula, dari histogram sampai heatmap.