0Pricing
Pandas & NumPy Academy · Lekcja

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 rows

Zmniejszanie 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            31

Zmiana 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

  1. DatetimeIndex i zakresy okresów
  2. Resampling szeregów czasowych
  3. Przesuwanie i cechy opóźnione
  4. Wyodrębnianie cech czasowych
← Powrót do Pandas & NumPy Academy