Pergeseran dan Fitur Jeda
Buat kolom jeda dan awalan dengan shift(), hitung perubahan antarperiode dengan diff(), dan hitung perubahan persentase.
Pergeseran dan Fitur Jeda adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Mengapa Fitur Jeda Penting
Dalam analisis deret waktu, nilai pada langkah waktu sebelumnya (sebuah jeda) sering kali menjadi salah satu prediktor terbaik untuk nilai saat ini. Misalnya, penjualan kemarin memberikan informasi tentang penjualan hari ini. Membuat kolom jeda memungkinkan Anda menggunakan nilai historis sebagai fitur dalam model pembelajaran mesin atau analisis statistik autokorelasi. Pandas menyediakan shift() untuk membuat fitur jeda dalam satu pemanggilan tervectorisasi.
shift(): Memindahkan Nilai ke Depan atau ke Belakang
Series.shift(n) memindahkan semua nilai ke bawah sebanyak n posisi (n positif membuat jeda), lalu mengisi n baris pertama dengan NaN. Pemberian n negatif memindahkan nilai ke atas (membuat nilai pendahulu dengan menggeser nilai masa depan ke belakang, ke baris saat ini). Indeks tetap tidak berubah — hanya nilainya yang dipindahkan.
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'sales': [100, 120, 115, 130, 140, 125]},
index=pd.date_range('2024-01-01', periods=6, freq='D')
)
# Lag-1: yesterday's sales
df['sales_lag1'] = df['sales'].shift(1)
# Lead-1: tomorrow's sales (shifted up)
df['sales_lead1'] = df['sales'].shift(-1)
print(df)Membuat Beberapa Kolom Lag
Biasanya Anda membuat beberapa fitur lag sekaligus untuk pembelajaran mesin — lag-1, lag-7 (hari yang sama pada minggu lalu), dan lag-30 (hari yang sama pada bulan lalu). Cara yang paling mudah dibaca adalah membuatnya dalam perulangan dan menetapkan masing-masing fitur ke kolom baru. DataFrame yang dihasilkan berisi Series asli beserta semua versinya yang digeser, sehingga siap digunakan untuk pemodelan.
for lag in [1, 2, 3, 7]:
df[f'sales_lag{lag}'] = df['sales'].shift(lag)
print(df.columns.tolist())
# ['sales', 'sales_lag1', 'sales_lag2', 'sales_lag3', 'sales_lag7']
# Drop rows with NaN from the largest lag period
df_model = df.dropna()
print('Ready for modelling, shape:', df_model.shape)shift() dengan freq untuk Pergeseran Berbasis Waktu
Alih-alih menggeser berdasarkan jumlah baris bilangan bulat, Anda dapat menggeser berdasarkan offset waktu menggunakan parameter freq. df.shift(1, freq='ME') menggeser indeks maju satu akhir bulan, dengan mempertahankan nilai tetapi mengubah indeks. Ini berguna untuk menyelaraskan dua deret waktu yang bergeser berdasarkan periode waktu tetap tanpa mengatur ulang nilainya.
monthly = pd.Series(
[100, 120, 115],
index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
# Shift the index forward by 1 month (values stay, index moves)
shifted_index = monthly.shift(1, freq='ME')
print('Original index:', monthly.index.tolist())
print('Shifted index: ', shifted_index.index.tolist())
# Original: [2024-01-31, 2024-02-29, 2024-03-31]
# Shifted: [2024-02-29, 2024-03-31, 2024-04-30]diff(): Perubahan Antarperiode
Series.diff(n) menghitung selisih antara suatu nilai dan nilai yang berada n posisi sebelumnya: x[t] - x[t-n]. Ini umum digunakan untuk menghitung perubahan dari hari ke hari, perbedaan dari minggu ke minggu, atau perubahan dari tahun ke tahun. n baris pertama adalah NaN karena tidak ada nilai sebelumnya yang dapat dikurangkan.
df['sales_diff1'] = df['sales'].diff(1) # day-over-day change
df['sales_diff7'] = df['sales'].diff(7) # week-over-week change
print(df[['sales', 'sales_diff1']].head())
# sales sales_diff1
# 2024-01-01 100 NaN
# 2024-01-02 120 20.0 <- +20 from yesterday
# 2024-01-03 115 -5.0 <- -5 from yesterdaypct_change(): Perubahan Persentase
Series.pct_change(n) menghitung perubahan persentase relatif: (x[t] - x[t-n]) / x[t-n]. Ini penting untuk analisis keuangan (imbal hasil harian), penghitungan laju pertumbuhan, dan situasi apa pun ketika perubahan absolut kurang bermakna dibandingkan perubahan relatif. Kalikan dengan 100 untuk mendapatkan poin persentase.
df['pct_chg'] = df['sales'].pct_change().round(3)
df['pct_chg_7d'] = df['sales'].pct_change(7).round(3)
print(df[['sales', 'pct_chg']].head())
# sales pct_chg
# 2024-01-01 100 NaN
# 2024-01-02 120 0.200 <- 20% increase
# 2024-01-03 115 -0.042 <- 4.2% decreaseMenggabungkan shift() dengan Aritmetika
Anda dapat menggabungkan shift() dengan operasi aritmetika untuk menghitung fitur waktu turunan. Contohnya adalah rasio nilai hari ini terhadap nilai minggu lalu, jumlah kumulatif sejak awal yang ditentukan, atau selisih dari nilai setahun lalu. Semua ini mengikuti pola yang sama: geser Series asli, lalu lakukan operasi aritmetika per elemen dengan nilai saat ini.
# Week-over-week growth index (today / last week)
df['wow_ratio'] = (df['sales'] / df['sales'].shift(7)).round(3)
# Deviation from 3-day lag
df['dev_3d'] = df['sales'] - df['sales'].shift(3)
# Is today higher than yesterday? (boolean feature)
df['higher_than_yesterday'] = df['sales'] > df['sales'].shift(1)
print(df[['sales', 'wow_ratio', 'higher_than_yesterday']].head())cumsum() dan cumprod() untuk Fitur Kumulatif
Series.cumsum() menghitung total berjalan dari baris pertama hingga setiap baris, sedangkan Series.cumprod() menghitung hasil kali kumulatif. Keduanya berguna untuk pendapatan kumulatif, imbal hasil kumulatif (pertumbuhan majemuk), dan total tahun berjalan. Keduanya tidak memerlukan argumen dan dapat digunakan pada Series numerik atau kolom DataFrame apa pun.
# Cumulative sales (year-to-date total)
df['ytd_sales'] = df['sales'].cumsum()
# Cumulative product: compound growth factor
returns = pd.Series([0.02, -0.01, 0.03, 0.01, -0.005])
df_ret = pd.DataFrame({'daily_return': returns})
df_ret['compound'] = (1 + df_ret['daily_return']).cumprod() - 1
print(df_ret)Fitur Lag untuk Pembelajaran Mesin
Saat menyiapkan data deret waktu untuk pembelajaran mesin, langkah rekayasa fitur yang umum adalah membuat matriks fitur lag. Setiap kolom mewakili variabel target pada langkah waktu lampau yang berbeda. Setelah membuat lag, hapus baris yang berisi NaN (yang muncul di awal karena riwayat yang belum tersedia), lalu bagi data menjadi set pelatihan dan pengujian tanpa mengacaknya, dengan mempertahankan urutan waktu.
def make_lag_matrix(series, n_lags):
df_lags = pd.DataFrame({'y': series})
for lag in range(1, n_lags + 1):
df_lags[f'lag_{lag}'] = series.shift(lag)
return df_lags.dropna()
lag_df = make_lag_matrix(df['sales'], n_lags=3)
print(lag_df)
# y lag_1 lag_2 lag_3
# ... ... ... ...Menggeser di Dalam Kelompok
Jika data Anda berisi beberapa entitas (misalnya beberapa produk atau wilayah dalam satu DataFrame), Anda harus menghitung pergeseran di dalam setiap kelompok entitas secara terpisah. Gunakan groupby().shift() untuk memastikan bahwa lag pada baris pertama produk A adalah NaN, bukan nilai terakhir produk B. Mencampur kelompok tanpa langkah ini merupakan kesalahan kebocoran data yang umum dan sulit dideteksi.
df_multi = pd.DataFrame({
'product': ['A', 'A', 'A', 'B', 'B', 'B'],
'sales': [100, 120, 115, 200, 210, 195]
})
# WRONG: lag crosses product boundary
df_multi['lag_wrong'] = df_multi['sales'].shift(1)
# CORRECT: lag within each product
df_multi['lag_correct'] = df_multi.groupby('product')['sales'].shift(1)
print(df_multi)Menafsirkan Tanda pct_change
Nilai pct_change() positif berarti nilai saat ini lebih tinggi daripada nilai sebelumnya; nilai negatif berarti lebih rendah. Waspadai pembagian dengan nol ketika nilai sebelumnya adalah nol — hasilnya adalah NaN atau inf, bergantung pada tanda nilai saat ini. Gunakan replace([float('inf'), float('-inf')], float('nan')) untuk membersihkan nilai tak hingga setelah pct_change().
import numpy as np
s = pd.Series([0, 100, 50, 200])
chg = s.pct_change()
print(chg)
# 0 NaN <- no prior value
# 1 inf <- 0 -> 100 (division by zero)
# 2 -0.5 <- 100 -> 50 (-50%)
# 3 3.0 <- 50 -> 200 (+300%)
# Clean infinite values
chg_clean = chg.replace([float('inf'), float('-inf')], float('nan'))
print(chg_clean)Pemeriksaan Cepat
Uji pemahaman Anda tentang pergeseran dan fitur lag dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa: shift(n) membuat fitur lag dengan memindahkan nilai ke bawah sebanyak n posisi; diff(n) menghitung perubahan absolut antarperiode; pct_change(n) menghitung perubahan persentase relatif; dan saat bekerja dengan beberapa kelompok, Anda harus menggunakan groupby().shift() untuk mencegah kebocoran data. Selanjutnya, kita akan mengekstrak fitur temporal menggunakan pengakses .dt.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pergeseran dan Fitur Jeda” gratis?
Ya — teks lengkap “Pergeseran dan Fitur Jeda” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pergeseran dan Fitur Jeda”?
Buat kolom jeda dan awalan dengan shift(), hitung perubahan antarperiode dengan diff(), dan hitung perubahan persentase. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pergeseran dan Fitur Jeda” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- DatetimeIndex dan Rentang Periode
- Pengambilan Sampel Ulang Deret Waktu
- Pergeseran dan Fitur Jeda
- Mengekstrak Fitur Temporal