Okna kroczące
Obliczaj kroczące średnie, sumy i odchylenia standardowe dla stałej liczby wierszy za pomocą rolling(n).mean() i powiązanych metod.
Okna kroczące to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Czym są okna kroczące?
Okno kroczące (nazywane również oknem przesuwanym lub ruchomym) oblicza statystykę dla okna o stałym rozmiarze, obejmującego kolejne wiersze, przesuwanego do przodu po jednym wierszu. Na przykład 7-dniowa średnia krocząca zastępuje wartość każdego dnia średnią z tego dnia i sześciu dni poprzedzających. Okna kroczące są podstawą średnich ruchomych w finansach, wygładzania zaszumionych danych z czujników oraz obliczania metryk kroczących na pulpitach biznesowych.
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))Metoda rolling() i parametr window
Series.rolling(window=n) zwraca obiekt Rolling. Parametr window określa rozmiar przesuwanego okna w liczbie wierszy (dla okien całkowitoliczbowych) albo jako przesunięcie czasowe, na przykład '7D' (dla Series indeksowanej czasem). Po utworzeniu obiektu rolling można łączyć z nim dowolne metody agregujące: .mean(), .sum(), .std(), .min(), .max() lub nawet .apply(func). Pierwsze window-1 wierszy zawsze będzie zawierać NaN, ponieważ nie ma wystarczającej liczby poprzedzających wierszy, aby wypełnić okno.
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))Parametr min_periods
Domyślnie rolling(n) wymaga dokładnie n wartości innych niż NaN w oknie, zanim obliczy wynik. Parametr min_periods zmniejsza to wymaganie — na przykład rolling(7, min_periods=3) oblicza średnią, gdy tylko dostępne są co najmniej 3 wartości, dzięki czemu wartości inne niż NaN pojawiają się wcześniej w Series. Jest to przydatne, gdy chcą Państwo obliczać średnie ruchome od początku szeregu czasowego, zamiast otrzymywać NaN dla pierwszych n-1 wierszy.
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))Suma krocząca dla sum bieżących
rolling(n).sum() oblicza sumę ostatnich n wierszy w każdej pozycji. 30-dniowa suma krocząca dziennej sprzedaży daje kroczący miesięczny przychód dla każdego dnia — jest bardziej informacyjna niż staczna suma miesięczna, ponieważ aktualizuje się codziennie. Sumy kroczące są często używane w analizie sprzedaży detalicznej (sprzedaż z ostatnich 30 dni), analizie stron internetowych (aktywni użytkownicy z ostatnich 7 dni) oraz finansach (wolumen z ostatnich n okresów).
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))Kroczące odchylenie standardowe a zmienność
W finansach zmienność mierzy się jako kroczące odchylenie standardowe dziennych stóp zwrotu. Wysokie kroczące odchylenie standardowe oznacza gwałtowne wahania cen, natomiast niskie wskazuje na ich stabilność. Ta metryka jest wykorzystywana w obliczeniach ryzyka przy wycenie opcji i zarządzaniu portfelem. Wzór jest następujący: należy obliczyć dzienne logarytmiczne stopy zwrotu za pomocą np.log(price/price.shift(1)), a następnie zastosować 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))Okna kroczące oparte na czasie
Zamiast stałej liczby wierszy można określić przesunięcie czasowe jako okno: rolling('7D') oznacza „dane z ostatnich 7 dni kalendarzowych”. Automatycznie poprawnie obsługuje to nieregularne szeregi czasowe (brakujące weekendy i święta) — okno określone liczbą wierszy obejmowałoby różną ilość czasu kalendarzowego zależnie od przerw, natomiast okno oparte na przesunięciu czasowym zawsze obejmuje dokładnie 7 dni danych. Series musi mieć DatetimeIndex, aby można było używać okien opartych na czasie.
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))Rolling apply dla funkcji niestandardowych
rolling(n).apply(func) przekazuje każde okno do niestandardowej funkcji jako tablicę NumPy. Umożliwia to wykonywanie dowolnych obliczeń kroczących, których nie obejmują wbudowane agregacje — na przykład kroczącego medianowego odchylenia bezwzględnego, kroczącej skośności lub kroczącego pierwszego kwartylu. Funkcja musi przyjmować tablicę jednowymiarową i zwracać skalar. Uwaga: apply działa wolniej niż metody wbudowane, ponieważ nie można go zwektoryzować.
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 w kolumnach DataFrame
Można zastosować rolling().mean() bezpośrednio do DataFrame, aby jednocześnie obliczyć statystyki kroczące dla wszystkich kolumn numerycznych. Każda kolumna otrzymuje własne, niezależnie obliczane okno kroczące. Jest to przydatne podczas obliczania średnich ruchomych dla wielu cen akcji lub wielu linii sprzedaży produktów w ramach jednej operacji, bez iterowania po kolumnach.
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))Łączenie średniej kroczącej z oryginalnymi danymi
Popularnym sposobem wizualizacji jest przedstawienie surowego szeregu czasowego i jego średniej kroczącej na tych samych osiach. Średnia krocząca pokazuje trend, wygładzając szum występujący z dnia na dzień, natomiast surowy szereg pokazuje zmienność. Odległość między nimi wskazuje poziom obecnego szumu. Dodanie średniej kroczącej do DataFrame jest tak proste, jak przypisanie wyniku do nowej kolumny.
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()Wyśrodkowane okna kroczące
Domyślnie rolling używa okna końcowego (bieżący wiersz i n-1 poprzedzających wierszy). Ustawienie center=True tworzy okno wyśrodkowane, w którym bieżący wiersz znajduje się pośrodku, a wykorzystywana jest taka sama liczba wierszy z przeszłości i przyszłości. Okna wyśrodkowane zapewniają gładsze wyniki i są odpowiednie do wygładzania offline danych historycznych, gdy znane są wartości przyszłe. NIE nadają się do prognozowania na żywo, ponieważ wymagają danych z przyszłości.
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))Okna kroczące dla danych grupowanych
Można obliczać kroczące statystyki dla poszczególnych grup za pomocą groupby().rolling(). Przykładowo, można obliczyć kroczący przychód z 7 dni dla każdej kategorii produktów — okno jest resetowane na początku każdej grupy, więc dane jednego produktu nie przenikają do danych innego. Po wykonaniu operacji kroczącej należy użyć .reset_index(level=0, drop=True), aby usunąć dodatkowy poziom grupy z indeksu i dopasować wynik z powrotem do oryginalnego obiektu DataFrame.
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))Szybki test
Sprawdź swoją wiedzę na temat okien kroczących z tego modułu.
Podsumowanie modułu
W tym module nauczyłeś się, że: rolling(n) tworzy przesuwne okno obejmujące n wierszy, dla którego można obliczać średnią, sumę, odchylenie standardowe, minimum, maksimum lub wartości za pomocą własnych funkcji; min_periods zmniejsza minimalną liczbę wartości potrzebnych do obliczenia wyniku; a center=True tworzy wyśrodkowane okna do wygładzania offline. Następnie omówimy okna rozszerzające — skumulowane statystyki, które rosną od początku obiektu Series.
Często zadawane pytania
Czy lekcja „Okna kroczące” jest bezpłatna?
Tak — pełny tekst „Okna kroczące” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Okna kroczące”?
Obliczaj kroczące średnie, sumy i odchylenia standardowe dla stałej liczby wierszy za pomocą rolling(n).mean() i powiązanych metod. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Okna kroczące”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.