Resampling szeregów czasowych
Zmniejszaj częstotliwość danych dziennych do miesięcznej za pomocą resample('ME').sum() i zwiększaj ją, używając uzupełniania poprzednią wartością do wypełnienia brakujących przedziałów.
Resampling szeregów czasowych to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 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 jest zmiana częstotliwości próbkowania?
Zmiana częstotliwości próbkowania zmienia częstotliwość szeregu czasowego. Zmniejszanie częstotliwości redukuje jej częstotliwość — na przykład przez przekształcenie danych dziennych w sumy miesięczne. Zwiększanie częstotliwości ją zwiększa — na przykład przez przekształcenie danych miesięcznych w dzienne i wypełnienie luk interpolowanymi wartościami. Obie operacje wymagają DatetimeIndex i są wykonywane za pomocą metody resample(), będącej uwzględniającym czas odpowiednikiem groupby() w Pandas.
Metoda resample()
df.resample(rule) tworzy obiekt DatetimeIndexResampler, w którym rule jest aliasem przesunięcia określającym częstotliwość. Podobnie jak w przypadku groupby(), nic nie jest obliczane do momentu dołączenia metody agregującej. Typowe reguły to: 'D' (dzień), 'W' (tydzień), 'ME' (koniec miesiąca), 'QE' (koniec kwartału) i 'YE' (koniec roku). DataFrame musi mieć indeks DatetimeIndex.
import pandas as pd
import numpy as np
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'sales': np.random.randint(100, 500, 90)}, index=dates)
print(df.head())
print('Shape:', df.shape) # (90, 1) -- 90 daily rowsZmniejszanie częstotliwości: z dziennej na miesięczną
Aby zmniejszyć częstotliwość danych dziennych do miesięcznej, wywołaj resample('ME') i dołącz agregację. sum() zwraca sumy miesięczne, mean() średnie miesięczne, a last() ostatnią wartość w każdym okresie. Wynik zawiera jeden wiersz na okres, a etykietą indeksu jest data końca okresu.
# Monthly totals
monthly_sum = df.resample('ME').sum()
print(monthly_sum)
# sales
# 2024-01-31 9876
# 2024-02-29 8765
# 2024-03-31 9234
# Monthly averages
monthly_mean = df.resample('ME').mean().round(1)
print(monthly_mean)Zmniejszanie częstotliwości do tygodniowej
Użyj 'W' do agregowania według tygodni kalendarzowych kończących się w niedzielę. Jeśli tygodnie mają kończyć się w poniedziałek, użyj 'W-MON'. Pandas grupuje wszystkie daty należące do danego tygodnia i stosuje agregację. Jest to przydatne w raportach tygodniowych, gdy potrzebny jest jeden wiersz podsumowania na tydzień.
# Weekly sum
weekly = df.resample('W').sum()
print(weekly.head())
# sales
# 2024-01-07 2010 <- Jan 1-7
# 2024-01-14 2340 <- Jan 8-14
# ...
# Weekly max and count using agg()
weekly_stats = df.resample('W').agg(['sum', 'mean', 'max'])
print(weekly_stats.head())Stosowanie wielu agregacji
Podobnie jak w przypadku groupby(), do obiektu zmieniającego częstotliwość próbkowania można dołączyć .agg(), aby obliczyć wiele statystyk w jednym przebiegu. Przekaż listę nazw funkcji lub słownik do agregacji z nazwami. Jest to najbardziej wydajny sposób tworzenia kompleksowej tabeli podsumowującej szereg czasowy.
monthly_stats = df.resample('ME').agg(
total_sales=('sales', 'sum'),
avg_sales=('sales', 'mean'),
peak_sales=('sales', 'max'),
days_counted=('sales', 'count')
)
print(monthly_stats.round(1))
# total_sales avg_sales peak_sales days_counted
# 2024-01-31 9876 318.6 499 31Zmiana częstotliwości OHLC dla danych finansowych
W przypadku finansowych szeregów czasowych metoda .ohlc() zmienia częstotliwość próbkowania, tworząc dla każdego okresu wartości Open, High, Low i Close (OHLC) — standardową reprezentację świecową. Ma to sens tylko w przypadku danych liczbowych reprezentujących cenę lub poziom. Każda kolumna wejściowa daje w wyniku cztery kolumny OHLC.
# OHLC monthly resampling
ohlc = df['sales'].resample('ME').ohlc()
print(ohlc)
# open high low close
# 2024-01-31 365 499 101 243
# 2024-02-29 ...Zwiększanie częstotliwości: z miesięcznej na dzienną
Zwiększanie częstotliwości tworzy wiersze dla znaczników czasu, które nie występowały w danych pierwotnych. Te nowe wiersze początkowo zawierają NaN. Następnie należy je wypełnić metodą odpowiednią dla danych: ffill() (uzupełnianie w przód — przenoszenie ostatniej znanej wartości do kolejnych wierszy), bfill() (uzupełnianie wstecz — użycie następnej znanej wartości) lub interpolate() w celu uzyskania płynnej interpolacji.
# Monthly data
monthly = pd.Series(
[100, 120, 115],
index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
print(monthly)
# Upsample to daily (creates NaN rows)
daily = monthly.resample('D').asfreq()
print(daily.head(10))
# 2024-01-31 100.0
# 2024-02-01 NaN <- new row
# ...Wypełnianie luk po zwiększeniu częstotliwości
Po zwiększeniu częstotliwości wypełnij luki NaN utworzone dla nowych znaczników czasu. ffill() propaguje ostatnią znaną wartość do przodu aż do następnej rzeczywistej obserwacji — sprawdza się w przypadku cen, gdy ostatnia cena transakcyjna pozostaje aktualna. interpolate(method='linear') wypełnia luki wartościami rozmieszczonymi liniowo między obserwacjami — sprawdza się w przypadku płynnie zmieniających się zmiennych ciągłych.
# Forward fill: carry monthly value forward to every day
daily_ffill = monthly.resample('D').ffill()
print(daily_ffill.head(35))
# 2024-01-31 100
# 2024-02-01 100 <- forward filled
# ...
# 2024-02-29 120 <- new month value
# Linear interpolation
daily_interp = monthly.resample('D').interpolate(method='linear')
print(daily_interp.head(10))Zmiana częstotliwości próbkowania w grupach
Można połączyć groupby() i resample(), aby osobno zmieniać częstotliwość próbkowania w każdej grupie. Wywołaj groupby(column).resample(rule) dla DataFrame z indeksem DatetimeIndex. W wyniku powstaje MultiIndex, w którym poziom zewnętrzny zawiera klucz grupy, a poziom wewnętrzny — okres po zmianie częstotliwości. Jest to bardzo przydatne w analizie szeregów czasowych na poziomie produktów lub regionów.
df2 = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 120, 130, 110, 160]
}, index=pd.date_range('2024-01-01', periods=6, freq='ME'))
# Monthly sum per product
result = df2.groupby('product').resample('QE').sum()
print(result)Niestandardowe zakotwiczanie przesunięć
Domyślnie 'ME' wskazuje daty końca miesiąca kalendarzowego. W przypadku niestandardowych okresów obrachunkowych użyj przesunięć takich jak 'QS-APR' (kwartał rozpoczynający się w kwietniu) lub 'YS-OCT' (rok rozpoczynający się w październiku). Pandas obsługuje wiele aliasów zakotwiczonych przesunięć. Pełną listę znajdziesz w dokumentacji Pandas podczas pracy z okresami obrachunkowymi niezwiązanymi z kalendarzem.
# Fiscal year starting in April
fiscal_annual = df.resample('YE-MAR').sum()
print(fiscal_annual)
# sales
# 2024-03-31 XXXX <- April 2023 to March 2024
# Quarter starting in April
fiscal_q = df.resample('QE-MAR').mean().round(0)
print(fiscal_q)Sprawdzanie spójności wyniku zmiany częstotliwości
Po zmianie częstotliwości zawsze sprawdź, czy wynik ma sens. Zweryfikuj, czy liczba okresów wyjściowych jest zgodna z oczekiwaniami, czy nie brakuje żadnych okresów (szukaj wartości NaN w wyniku) oraz czy suma miesięcznych wartości jest równa sumie pierwotnych danych dziennych, gdy podczas zmniejszania częstotliwości użyto sum(). Te kontrole poprawności pomagają wykryć błędy przesunięcia o jeden w ciągach częstotliwości i brakujące zakresy dat.
monthly = df.resample('ME').sum()
# Verify: monthly totals should sum to daily total
assert monthly['sales'].sum() == df['sales'].sum(), 'Sum mismatch!'
# Verify: expected number of months
print('Months:', len(monthly)) # should be 3 for 90 days Jan-Mar
# Check for any NaN
print('NaN count:', monthly.isna().sum().sum())Szybki test
Sprawdź swoją znajomość zmiany częstotliwości szeregów czasowych z tej lekcji.
Podsumowanie lekcji
W tej lekcji dowiedziałeś się, że resample() jest uwzględniającym czas odpowiednikiem groupby() służącym do zmiany częstotliwości szeregu czasowego; zmniejszanie częstotliwości agreguje dane (z dziennych do miesięcznych za pomocą sumy lub średniej); zwiększanie częstotliwości tworzy nowe znaczniki czasu, które trzeba wypełnić za pomocą ffill() lub interpolate(); a groupby() można połączyć z resample() w celu agregowania danych czasowych na poziomie grup. Następnie zajmiemy się przesuwaniem i cechami opóźnionymi.
Często zadawane pytania
Czy lekcja „Resampling szeregów czasowych” jest bezpłatna?
Tak — pełny tekst „Resampling szeregów czasowych” 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 „Resampling szeregów czasowych”?
Zmniejszaj częstotliwość danych dziennych do miesięcznej za pomocą resample('ME').sum() i zwiększaj ją, używając uzupełniania poprzednią wartością do wypełnienia brakujących przedziałów. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Resampling szeregów czasowych”?
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.
Wszystkie lekcje w tym kursie
- DatetimeIndex i zakresy okresów
- Resampling szeregów czasowych
- Przesuwanie i cechy opóźnione
- Wyodrębnianie cech czasowych