Pandas & NumPy Academy · Pelajaran

Jendela Bergulir

Hitung rata-rata, jumlah, dan simpangan baku bergulir pada jumlah baris tetap dengan rolling(n).mean() dan metode terkait.

Pelajaran 1 dari 413 langkah

Jendela Bergulir adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Apa Itu Jendela Rolling?

Jendela rolling (juga disebut jendela geser atau jendela bergerak) menghitung suatu statistik pada jendela berukuran tetap yang berisi baris-baris berurutan, sambil bergerak maju satu baris setiap kali. Misalnya, mean rolling 7 hari mengganti nilai setiap hari dengan rata-rata hari tersebut dan 6 hari sebelumnya. Jendela rolling menjadi dasar rata-rata bergerak dalam keuangan, penghalusan data sensor yang bising, dan penghitungan metrik historis pada dasbor bisnis.

import pandas as pd
import numpy as np

# Simple example: 3-day rolling mean
data = pd.Series([10, 12, 15, 11, 9, 13, 16, 14, 12, 18],
                 index=pd.date_range('2024-01-01', periods=10))

rolling_mean = data.rolling(window=3).mean()
print('Original:')
print(data.values)
print('\n3-day rolling mean:')
print(rolling_mean.values.round(2))

Metode rolling() dan Parameter window

Series.rolling(window=n) mengembalikan objek Rolling. Parameter window menentukan ukuran jendela geser dalam jumlah baris (untuk jendela bilangan bulat) atau offset waktu seperti '7D' (untuk Series yang diindeks berdasarkan waktu). Setelah membuat objek rolling, rangkai metode agregasi apa pun: .mean(), .sum(), .std(), .min(), .max(), atau bahkan .apply(func). Sebanyak window-1 baris pertama akan selalu berisi NaN karena belum ada cukup baris sebelumnya untuk memenuhi jendela.

import pandas as pd
import numpy as np

prices = pd.Series(
    [100, 102, 98, 105, 110, 108, 115, 112, 120, 118],
    index=pd.date_range('2024-01-01', periods=10),
    name='price'
)

df = pd.DataFrame({'price': prices})
df['MA3'] = df['price'].rolling(3).mean()
df['MA7'] = df['price'].rolling(7).mean()
df['std3'] = df['price'].rolling(3).std()
print(df.round(2))

Parameter min_periods

Secara bawaan, rolling(n) memerlukan tepat n nilai non-NaN dalam jendela sebelum menghitung hasil. Parameter min_periods mengurangi persyaratan ini — misalnya, rolling(7, min_periods=3) menghitung mean segera setelah tersedia setidaknya 3 nilai, sehingga menghasilkan nilai non-NaN lebih awal dalam Series. Ini berguna ketika Anda ingin memperoleh rata-rata bergerak sejak awal deret waktu, bukan NaN untuk n-1 baris pertama.

import pandas as pd
import numpy as np

prices = pd.Series([100, 102, 98, 105, 110, 108, 115],
                   index=pd.date_range('2024-01-01', periods=7))

# Default: first 6 rows are NaN
ma7_default = prices.rolling(7).mean()

# min_periods=3: compute mean once 3 values available
ma7_minperiods = prices.rolling(7, min_periods=3).mean()

df = pd.DataFrame({
    'price': prices,
    'MA7_default': ma7_default,
    'MA7_min3': ma7_minperiods
})
print(df.round(2))

Jumlah Rolling untuk Total Berjalan

rolling(n).sum() menghitung total n baris terakhir pada setiap posisi. Jumlah rolling 30 hari dari penjualan harian memberikan pendapatan bulanan berjalan untuk setiap hari — lebih informatif daripada total bulanan statis karena diperbarui setiap hari. Jumlah rolling umum digunakan dalam analitik ritel (penjualan 30 hari terakhir), analitik web (pengguna aktif 7 hari terakhir), dan keuangan (volume n periode terakhir).

import pandas as pd
import numpy as np

np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=60)
daily_sales = pd.Series(np.random.randint(100, 500, 60), index=dates, name='daily_sales')

df = pd.DataFrame({'daily_sales': daily_sales})
df['trailing_7d'] = df['daily_sales'].rolling(7).sum()
df['trailing_30d'] = df['daily_sales'].rolling(30).sum()

print(df.tail(10).round(0))

Simpangan Baku Rolling untuk Volatilitas

Dalam keuangan, volatilitas diukur sebagai simpangan baku rolling dari imbal hasil harian. std rolling yang tinggi berarti harga berfluktuasi dengan tajam; std rolling yang rendah menunjukkan harga stabil. Metrik ini digunakan dalam perhitungan risiko untuk penetapan harga opsi dan pengelolaan portofolio. Rumusnya: hitung imbal hasil logaritmik harian dengan np.log(price/price.shift(1)), lalu terapkan rolling(window).std().

import pandas as pd
import numpy as np

np.random.seed(0)
prices = pd.Series(
    100 * np.exp(np.cumsum(np.random.normal(0.001, 0.02, 120))),
    index=pd.date_range('2024-01-01', periods=120)
)

# Daily log returns
log_returns = np.log(prices / prices.shift(1))

# 20-day rolling volatility (annualised)
volatility = log_returns.rolling(20).std() * np.sqrt(252)

print('Last 5 rows of daily volatility:')
print(volatility.tail(5).round(4))

Jendela Rolling Berbasis Waktu

Selain jumlah baris tetap, Anda dapat menentukan offset waktu sebagai jendela: rolling('7D') berarti “data dalam 7 hari kalender terakhir”. Cara ini secara otomatis menangani deret waktu yang tidak beraturan (akhir pekan atau hari libur yang tidak memiliki data) dengan benar — jendela berdasarkan jumlah baris akan mencakup durasi kalender yang berbeda bergantung pada celah, sedangkan jendela berdasarkan offset waktu selalu mencakup tepat 7 hari data. Series harus memiliki DatetimeIndex untuk menggunakan jendela berbasis waktu.

import pandas as pd
import numpy as np

# Business-day index (no weekends)
biz_dates = pd.bdate_range('2024-01-01', periods=15)
sales = pd.Series(np.random.randint(100, 300, 15), index=biz_dates)

# 7-calendar-day window (variable row count near weekends)
df = pd.DataFrame({'sales': sales})
df['rolling_7d'] = sales.rolling('7D').mean()

print(df.round(1))

Apply Rolling untuk Fungsi Kustom

rolling(n).apply(func) meneruskan setiap jendela sebagai larik NumPy ke fungsi kustom Anda. Ini memungkinkan penghitungan rolling apa pun yang tidak tercakup oleh agregasi bawaan — misalnya deviasi absolut median rolling, kemencengan rolling, atau kuartil pertama rolling. Fungsi tersebut harus menerima larik 1-D dan mengembalikan skalar. Catatan: apply lebih lambat daripada metode bawaan karena tidak dapat divektorisasi.

import pandas as pd
import numpy as np

prices = pd.Series(
    [100, 102, 98, 105, 110, 95, 115, 112, 120, 108],
    index=pd.date_range('2024-01-01', periods=10)
)

# Rolling range (max - min) over a 5-day window
def rolling_range(arr):
    return arr.max() - arr.min()

df = pd.DataFrame({'price': prices})
df['5d_range'] = prices.rolling(5).apply(rolling_range, raw=True)
print(df.round(2))

Rolling pada Kolom DataFrame

Anda dapat menerapkan rolling().mean() langsung pada DataFrame untuk menghitung statistik rolling bagi semua kolom numerik secara bersamaan. Setiap kolom mendapatkan jendela rolling-nya sendiri secara independen. Ini berguna untuk menghitung rata-rata bergerak dari beberapa harga saham atau beberapa lini penjualan produk dalam satu operasi tanpa mengulang kolom.

import pandas as pd
import numpy as np

np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=10)
df = pd.DataFrame({
    'AAPL': 100 + np.cumsum(np.random.randn(10)),
    'MSFT': 200 + np.cumsum(np.random.randn(10)),
    'GOOG': 150 + np.cumsum(np.random.randn(10))
}, index=dates)

# 3-day moving average of all three stocks
ma3 = df.rolling(3).mean()
print('3-day MA for all stocks:')
print(ma3.round(2))

Menggabungkan Mean Rolling dengan Data Asli

Pola visualisasi yang umum adalah memplot deret waktu mentah dan mean rolling-nya pada sumbu yang sama. Mean rolling menampilkan tren dengan menghaluskan noise dari hari ke hari, sedangkan deret mentah menunjukkan volatilitas. Jarak di antara keduanya menunjukkan seberapa besar noise yang ada. Menambahkan mean rolling ke DataFrame semudah menetapkan hasilnya ke kolom baru.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=60)
sales = pd.Series(
    200 + np.cumsum(np.random.randn(60) * 10),
    index=dates, name='Daily Sales'
)

df = pd.DataFrame({'sales': sales})
df['MA7'] = df['sales'].rolling(7).mean()
df['MA30'] = df['sales'].rolling(30).mean()

df.plot(figsize=(12, 5), title='Sales with 7-day and 30-day Moving Average')
plt.ylabel('Sales')
plt.show()

Jendela Rolling Terpusat

Secara bawaan, rolling menggunakan jendela trailing (baris saat ini dan n-1 baris sebelumnya). Menetapkan center=True membuat jendela terpusat, dengan baris saat ini berada di tengah dan menggunakan jumlah baris sebelumnya serta sesudahnya yang sama. Jendela terpusat menghasilkan hasil yang lebih halus dan sesuai untuk penghalusan luring pada data historis ketika nilai masa depan sudah diketahui. Jendela ini TIDAK sesuai untuk peramalan langsung karena memerlukan data masa depan.

import pandas as pd
import numpy as np

np.random.seed(0)
data = pd.Series(
    np.sin(np.linspace(0, 4*3.14159, 30)) + np.random.normal(0, 0.3, 30)
)

df = pd.DataFrame({'signal': data})
df['trailing_MA5'] = data.rolling(5).mean()
df['centered_MA5'] = data.rolling(5, center=True).mean()

print('Comparison (first 8 rows):')
print(df.head(8).round(3))

Jendela Bergulir untuk Data GroupBy

Anda dapat menghitung statistik bergulir per grup menggunakan groupby().rolling(). Misalnya, menghitung pendapatan bergulir selama 7 hari per kategori produk — jendela dimulai ulang di awal setiap grup, sehingga data satu produk tidak tercampur dengan data produk lain. Setelah operasi bergulir, gunakan .reset_index(level=0, drop=True) untuk menghapus tingkat grup tambahan dari indeks dan menyelaraskan kembali hasilnya dengan DataFrame asli.

import pandas as pd
import numpy as np

np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=10)
df = pd.DataFrame({
    'date': list(dates) * 2,
    'product': ['A'] * 10 + ['B'] * 10,
    'sales': np.random.randint(50, 200, 20)
}).sort_values(['product', 'date'])

# 3-day rolling mean per product
df['rolling_mean'] = (df
    .groupby('product')['sales']
    .transform(lambda x: x.rolling(3).mean())
)
print(df.to_string(index=False))

Pemeriksaan Singkat

Uji pemahaman Anda tentang jendela bergulir dari pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini Anda telah mempelajari: rolling(n) membuat jendela geser berisi n baris yang dapat digunakan untuk menghitung mean, sum, std, min, max, atau fungsi khusus; min_periods mengurangi jumlah minimum nilai yang diperlukan untuk menghitung hasil; dan center=True membuat jendela terpusat untuk penghalusan offline. Selanjutnya, kita akan mempelajari jendela yang meluas — statistik kumulatif yang berkembang dari awal Series.

Gratis untuk memulai

Belajar Python dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
30
Pelajaran
120

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Jendela Bergulir” gratis?

Ya — teks lengkap “Jendela Bergulir” 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 “Jendela Bergulir”?

Hitung rata-rata, jumlah, dan simpangan baku bergulir pada jumlah baris tetap dengan rolling(n).mean() dan metode terkait. 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 1 dari 4.

Berapa lama pelajaran “Jendela Bergulir” 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

  1. Jendela Bergulir
  2. Jendela Meluas
  3. Rata-Rata Bergerak Berbobot Eksponensial
  4. Peringkat dan Persentil dalam Grup
← Kembali ke Pandas & NumPy Academy