Materi
Banyak laporan tidak menanyakan nilai, melainkan perubahannya. shift(1) menggeser setiap nilai satu periode ke belakang, sehingga baris Maret berisi nilai Februari; nilai itu disebut lag 1. Selisih antarperiode adalah y − y.shift(1). pct_change() menghitung perubahan relatif (y − y.shift(1)) / y.shift(1). Dokumentasi pandas menegaskan hasilnya pecahan, bukan persen: 0,08 berarti naik 8%, dan harus dikali 100 bila ingin ditulis dalam persen. Baris pertama selalu NaN karena tidak punya pembanding.
Data bulanan yang musiman menyesatkan bila dibandingkan dengan bulan sebelumnya: penjualan Desember hampir selalu melonjak dari November karena musimnya, bukan karena usahanya tumbuh. Pola musiman menurut Hyndman dan Athanasopoulos punya periode tetap dan diketahui, sehingga cara menetralkannya adalah membandingkan bulan yang sama tahun lalu. Itulah pertumbuhan tahunan atau year-on-year (YoY): pct_change(periods=12) untuk data bulanan dan pct_change(periods=4) untuk data kuartalan.
Contoh dengan data lain: jumlah wisudawan per semester (dua periode per tahun).
import pandas as pd
wisuda = pd.Series([400, 520, 440, 546],
index=pd.date_range("2024-01-01", periods=4, freq="6MS"))
print((wisuda.pct_change() * 100).round(1).tolist()) # [nan, 30.0, -15.4, 24.1]
print((wisuda.pct_change(2) * 100).round(1).tolist()) # [nan, nan, 10.0, 5.0]