Jendela Meluas
Hitung statistik kumulatif yang mencakup semua baris sejak awal hingga setiap titik menggunakan expanding().sum().
Jendela Meluas adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 yang Meluas?
Jendela yang meluas mencakup semua baris sejak awal Series hingga baris saat ini — jendela bertambah setiap kali ada baris baru, bukan tetap. Pada baris 0, jendela hanya berisi satu nilai; pada baris 5, jendela berisi enam nilai; pada baris 100, jendela berisi 101 nilai. Jendela yang meluas digunakan untuk menghitung statistik kumulatif yang menunjukkan total berjalan, rata-rata berjalan, atau nilai maksimum berjalan sejak awal dataset hingga titik waktu saat ini.
import pandas as pd
import numpy as np
sales = pd.Series(
[100, 150, 120, 200, 180, 160, 220, 190],
index=pd.date_range('2024-01-01', periods=8)
)
# Expanding mean — grows with each row
df = pd.DataFrame({'sales': sales})
df['cumulative_mean'] = df['sales'].expanding().mean()
print(df)Metode expanding()
Series.expanding(min_periods=1) mengembalikan objek Expanding. Parameter min_periods (nilai bawaan 1) menetapkan jumlah minimum observasi yang diperlukan untuk menghasilkan hasil non-NaN pertama. Berbeda dari rolling(n), jendela dalam expanding() tidak tetap — jendela selalu dimulai dari awal. Rangkaikan agregasi apa pun: .sum(), .mean(), .std(), .min(), .max().
import pandas as pd
import numpy as np
np.random.seed(42)
monthly_revenue = pd.Series(
np.random.randint(500, 1500, 12),
index=pd.date_range('2024-01', periods=12, freq='ME'),
name='revenue'
)
df = pd.DataFrame({'revenue': monthly_revenue})
df['cumsum'] = df['revenue'].expanding().sum()
df['cummean'] = df['revenue'].expanding().mean()
df['cummax'] = df['revenue'].expanding().max()
df['cummin'] = df['revenue'].expanding().min()
print(df)cumsum, cumprod, cummax, cummin pada Pandas
Untuk statistik kumulatif yang paling umum, Pandas menyediakan metode langsung pada Series dan DataFrame tanpa memerlukan expanding(): cumsum(), cumprod(), cummax(), dan cummin(). Metode ini merupakan implementasi yang dioptimalkan dan sedikit lebih cepat daripada padanan expanding()-nya. Gunakan pintasan ini untuk metrik bisnis umum seperti pendapatan year-to-date (cumsum) atau harga maksimum sepanjang waktu (cummax).
import pandas as pd
import numpy as np
prices = pd.Series(
[100, 95, 110, 105, 120, 115, 130, 125],
index=pd.date_range('2024-01-01', periods=8)
)
df = pd.DataFrame({'price': prices})
df['cummax'] = df['price'].cummax() # all-time high
df['cummin'] = df['price'].cummin() # all-time low
df['cumsum'] = df['price'].cumsum() # cumulative total
df['cumprod'] = (1 + df['price'].pct_change()).cumprod() # growth index
print(df.round(3))Perhitungan Year-to-Date dengan Expanding
Salah satu penggunaan klasik jendela yang meluas adalah pendapatan year-to-date (YTD). Untuk setiap hari, Anda ingin menjumlahkan semua pendapatan sejak 1 Januari tahun berjalan hingga hari tersebut. Caranya adalah menerapkan cumsum() dalam setiap grup tahun. Terapkan dengan groupby(year).cumsum() — cumsum dimulai ulang pada awal setiap tahun kalender sambil terus mengakumulasi nilai sepanjang tahun.
import pandas as pd
import numpy as np
np.random.seed(0)
dates = pd.date_range('2023-01-01', '2024-06-30', freq='ME')
daily = pd.DataFrame({
'date': dates,
'revenue': np.random.randint(100, 500, len(dates))
})
# Year-to-date cumulative revenue
daily['year'] = daily['date'].dt.year
daily['ytd_revenue'] = daily.groupby('year')['revenue'].cumsum()
daily = daily.drop(columns='year')
print(daily.tail(10).to_string(index=False))Deviasi Standar Jendela yang Meluas
expanding().std() menghitung deviasi standar berjalan menggunakan semua data sejak awal hingga baris saat ini. Ini berguna untuk memantau apakah variabilitas suatu metrik meningkat atau menurun seiring waktu — misalnya, melacak apakah penjualan harian suatu produk menjadi lebih atau kurang dapat diprediksi seiring bisnis berkembang. Berbeda dari std bergulir (yang hanya mencerminkan variabilitas terkini), std yang meluas menangkap penyebaran seluruh riwayat data.
import pandas as pd
import numpy as np
np.random.seed(42)
sales = pd.Series(
np.concatenate([
np.random.normal(100, 5, 30), # stable period
np.random.normal(100, 25, 30) # volatile period
]),
index=pd.date_range('2024-01-01', periods=60)
)
df = pd.DataFrame({'sales': sales})
df['expanding_std'] = df['sales'].expanding().std()
df['rolling_30d_std'] = df['sales'].rolling(30).std()
print(df.tail(10).round(2))Membandingkan Rolling dan Expanding
Perbedaan utamanya: jendela bergulir mencerminkan kinerja terkini (n hari terakhir) dan tidak sensitif terhadap data dari masa lampau, sedangkan jendela yang meluas mencakup seluruh riwayat sehingga perlahan mendekati nilai yang stabil. Gunakan rolling jika Anda memperhatikan tren terkini (rata-rata bergerak 7 hari lebih responsif terhadap perubahan terkini daripada rata-rata 90 hari). Gunakan expanding jika Anda menginginkan statistik sepanjang waktu atau metrik YTD yang tidak boleh melupakan data sebelumnya.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(10)
data = pd.Series(
np.random.randn(60).cumsum() + 50,
index=pd.date_range('2024-01-01', periods=60)
)
df = pd.DataFrame({'value': data})
df['rolling_10'] = data.rolling(10).mean()
df['expanding'] = data.expanding().mean()
df.plot(figsize=(12, 5), title='Rolling 10-day Mean vs. Expanding Mean')
plt.ylabel('Value')
plt.show()Apply Expanding untuk Statistik Kumulatif Khusus
expanding().apply(func) menerapkan fungsi khusus pada semua data sejak awal hingga baris saat ini, sama seperti rolling().apply(). Ini memungkinkan penghitungan statistik kumulatif yang tidak tersedia sebagai fungsi bawaan — misalnya, koefisien variasi kumulatif (std/mean), median berjalan, atau rasio Sharpe kumulatif. Fungsi tersebut menerima array NumPy yang berisi semua nilai yang telah terlihat hingga saat ini dan harus mengembalikan satu nilai skalar.
import pandas as pd
import numpy as np
np.random.seed(0)
returns = pd.Series(
np.random.normal(0.001, 0.02, 60),
index=pd.date_range('2024-01-01', periods=60)
)
# Cumulative Sharpe ratio (mean/std of returns)
def sharpe(arr):
if len(arr) < 2:
return float('nan')
return arr.mean() / arr.std() * (252 ** 0.5) # annualised
df = pd.DataFrame({'returns': returns})
df['cum_sharpe'] = df['returns'].expanding().apply(sharpe, raw=True)
print(df.tail(8).round(4))Jendela yang Meluas dengan Penanganan NaN
Jendela yang meluas secara bawaan melewati nilai NaN — NaN di tengah Series diabaikan saat menghitung jumlah atau rata-rata kumulatif. Anda dapat memeriksanya dengan skipna=True (nilai bawaan pada sebagian besar agregasi Pandas). Jika Anda memiliki deret waktu dengan nilai yang benar-benar hilang (misalnya, tidak ada perdagangan pada akhir pekan), statistik yang meluas hanya akan dihitung dari nilai non-NaN yang telah terlihat hingga saat ini, dan biasanya itulah perilaku yang diinginkan.
import pandas as pd
import numpy as np
data = pd.Series([10, np.nan, 20, 30, np.nan, 40, 50])
# cumsum skips NaN by default
df = pd.DataFrame({'value': data})
df['cumsum'] = df['value'].cumsum() # NaN propagates in cumsum!
df['expanding_sum'] = df['value'].expanding().sum() # NaN skipped
print(df)
print('\nNote: cumsum propagates NaN; expanding().sum() skips it.')Jendela yang Meluas untuk Tolok Ukur Berjalan
Jendela yang meluas sangat ideal untuk menghitung tolok ukur berjalan: nilai maksimum sepanjang waktu, kuartal terbaik sepanjang masa, atau tingkat kesalahan terendah sejak peluncuran. KPI ini perlu mengingat semua nilai historis — jendela bergulir akan melupakan catatan lama. Menggunakan cummax() atau cummin() akan mengembalikan nilai terbaik (atau terburuk) yang berjalan pada setiap titik, sehingga Anda dapat dengan mudah melacak kapan rekor baru tercapai.
import pandas as pd
import numpy as np
np.random.seed(5)
sales = pd.Series(
np.random.randint(100, 300, 20),
index=pd.date_range('2024-01-01', periods=20),
name='daily_sales'
)
df = pd.DataFrame({'sales': sales})
df['all_time_max'] = df['sales'].cummax()
df['new_record'] = df['sales'] == df['all_time_max']
print('Days where a new sales record was set:')
print(df[df['new_record']].drop(columns='new_record'))Contoh Praktis: Imbal Hasil Kumulatif
Dalam keuangan, imbal hasil kumulatif menunjukkan seberapa besar pertumbuhan investasi sejak tanggal mulai hingga setiap tanggal berikutnya. Berdasarkan imbal hasil persentase harian, hasil kali kumulatif dari (1 + daily_return) memberikan faktor pertumbuhan total. Hasil kali yang meluas lebih sesuai digunakan di sini daripada hasil kali bergulir — Anda ingin melacak total pertumbuhan sejak awal investasi, bukan hanya selama n hari terakhir.
import pandas as pd
import numpy as np
np.random.seed(7)
start_price = 100
daily_returns = pd.Series(
np.random.normal(0.0005, 0.015, 252),
index=pd.date_range('2024-01-01', periods=252)
)
# Cumulative return = product of (1 + r_i)
cum_returns = (1 + daily_returns).cumprod()
portfolio_value = start_price * cum_returns
print(f'Start value: ${start_price:.2f}')
print(f'End value: ${portfolio_value.iloc[-1]:.2f}')
print(f'Total return: {(portfolio_value.iloc[-1]/start_price - 1)*100:.1f}%')Kapan Menggunakan Expanding, Rolling, atau cumsum
Panduan untuk memilih pendekatan yang tepat:
- Gunakan
cumsum() / cummax() / cummin()untuk agregasi kumulatif sederhana — ini adalah opsi tercepat. - Gunakan
expanding().mean() / std()jika Anda memerlukan rata-rata berjalan atau varians kumulatif. - Gunakan
expanding().apply(custom_func)untuk statistik kompleks sepanjang waktu yang tidak tersedia sebagai fungsi bawaan. - Gunakan
rolling(n), bukan expanding, jika hanya riwayat terkini yang seharusnya memengaruhi nilai saat ini.
Pemeriksaan Singkat
Uji pemahaman Anda tentang jendela yang meluas dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda telah mempelajari: expanding() menghitung statistik kumulatif dalam jendela yang terus membesar sejak awal Series, cumsum/cummax/cummin merupakan pintasan yang dioptimalkan untuk operasi kumulatif umum, dan jendela yang meluas ideal untuk rekor sepanjang waktu, metrik YTD, serta imbal hasil investasi kumulatif. Selanjutnya, kita akan mempelajari rata-rata bergerak berbobot eksponensial (EWMA) — yang memberikan bobot lebih besar pada observasi terkini.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Jendela Meluas” gratis?
Ya — teks lengkap “Jendela Meluas” 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 Meluas”?
Hitung statistik kumulatif yang mencakup semua baris sejak awal hingga setiap titik menggunakan expanding().sum(). 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 2 dari 4.
Berapa lama pelajaran “Jendela Meluas” 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
- Jendela Bergulir
- Jendela Meluas
- Rata-Rata Bergerak Berbobot Eksponensial
- Peringkat dan Persentil dalam Grup