Ricampionare serie temporali
Riduca i dati giornalieri a dati mensili con resample('ME').sum() e aumenti la frequenza usando il riempimento in avanti per completare gli intervalli mancanti.
Ricampionare serie temporali è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Che cos'è il ricampionamento?
Il ricampionamento modifica la frequenza di una serie temporale. Il downsampling riduce la frequenza, ad esempio convertendo dati giornalieri in totali mensili. L'upsampling aumenta la frequenza, ad esempio convertendo dati mensili in dati giornalieri e riempiendo i valori mancanti con valori interpolati. Entrambe le operazioni richiedono un DatetimeIndex e vengono eseguite con il metodo resample(), la versione di Pandas di groupby() sensibile al tempo.
Il metodo resample()
df.resample(rule) crea un oggetto DatetimeIndexResampler, in cui rule è un alias di offset della frequenza. Come con groupby(), non viene calcolato nulla finché non concatena un metodo di aggregazione. Regole comuni: 'D' (giorno), 'W' (settimana), 'ME' (fine del mese), 'QE' (fine del trimestre), 'YE' (fine dell'anno). Il DataFrame deve avere un 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 rowsDownsampling: da giornaliero a mensile
Per eseguire il downsampling dei dati giornalieri a mensili, chiami resample('ME') e concateni un'aggregazione. sum() restituisce i totali mensili; mean() restituisce le medie mensili; last() restituisce l'ultimo valore di ogni periodo. Il risultato contiene una riga per periodo, con la data di fine del periodo come etichetta dell'indice.
# 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)Downsampling a frequenza settimanale
Esegua il ricampionamento con 'W' per aggregare per settimana del calendario, con termine la domenica. Usi 'W-MON' se desidera settimane con termine il lunedì. Pandas raggruppa insieme tutte le date appartenenti a ciascuna settimana e applica l'aggregazione. È utile per la reportistica settimanale, quando desidera una riga riepilogativa per ogni settimana.
# 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())Applicare più aggregazioni
Proprio come con groupby(), può concatenare .agg() a un resampler per calcolare più statistiche in un'unica passata. Passi un elenco di nomi di funzioni o un dizionario per le aggregazioni con nome. È il modo più efficiente per creare una tabella riepilogativa completa di una serie temporale.
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 31Ricampionamento OHLC per dati finanziari
Per le serie temporali finanziarie, il metodo .ohlc() esegue il ricampionamento nei valori Open, High, Low, Close (OHLC) per periodo: la rappresentazione standard a candele. È significativo solo per dati numerici che rappresentano un prezzo o un livello. Ogni colonna dell'input genera quattro colonne OHLC nell'output.
# 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 ...Upsampling: da mensile a giornaliero
L'upsampling aumenta la frequenza e crea righe per timestamp che non esistevano nei dati originali. Queste nuove righe contengono inizialmente NaN. Le riempia quindi con un metodo adatto ai Suoi dati: ffill() (riempimento in avanti: propaga l'ultimo valore noto) o bfill() (riempimento all'indietro: usa il valore noto successivo), oppure interpolate() per un'interpolazione uniforme.
# 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
# ...Riempire i valori mancanti creati dall'upsampling
Dopo l'upsampling, riempia i valori mancanti NaN creati per i nuovi timestamp. ffill() propaga l'ultimo valore noto in avanti fino alla successiva osservazione reale: è adatto ai prezzi, quando l'ultimo prezzo negoziato rimane valido. interpolate(method='linear') riempie con valori distribuiti linearmente tra le osservazioni: è adatto alle variabili continue uniformi.
# 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))Ricampionamento all'interno dei gruppi
Può combinare groupby() e resample() per eseguire il ricampionamento separatamente all'interno di ciascun gruppo. Chiami groupby(column).resample(rule) su un DataFrame con DatetimeIndex. In questo modo ottiene un risultato con MultiIndex, in cui il livello esterno è la chiave del gruppo e quello interno è il periodo temporale ricampionato: è molto utile per analizzare serie temporali a livello di prodotto o di area geografica.
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)Ancoraggio personalizzato degli offset
Per impostazione predefinita, 'ME' si ancora alle date di fine del mese del calendario. Per periodi fiscali non standard, usi offset come 'QS-APR' (trimestre con inizio ad aprile) o 'YS-OCT' (anno con inizio a ottobre). Pandas supporta molti alias di offset ancorati. Consulti la documentazione di Pandas per l'elenco completo quando lavora con periodi fiscali non coincidenti con il calendario.
# 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)Verificare l'integrità del risultato del ricampionamento
Dopo il ricampionamento, verifichi sempre che il risultato sia sensato. Controlli che il numero di periodi nell'output corrisponda alle aspettative, che non manchino periodi (cerchi NaN nell'output) e che la somma dei totali mensili sia uguale alla somma dei dati giornalieri originali quando esegue il downsampling con sum(). Questi controlli di coerenza individuano errori di scarto di una posizione nelle stringhe di frequenza e intervalli di date mancanti.
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())Controllo rapido
Verifichi la Sua comprensione del ricampionamento delle serie temporali presentato in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato che resample() è l'equivalente di groupby() sensibile al tempo per modificare la frequenza delle serie temporali; il downsampling aggrega i dati (da giornaliero a mensile con sum/mean); l'upsampling crea nuovi timestamp che devono essere riempiti con ffill() o interpolate(); inoltre, può combinare groupby() con resample() per aggregare i dati temporali a livello di gruppo. Prossimamente esploreremo lo spostamento dei valori e le variabili ritardate.
Domande Frequenti
La lezione «Ricampionare serie temporali» è gratuita?
Sì — il testo completo di «Ricampionare serie temporali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Ricampionare serie temporali»?
Riduca i dati giornalieri a dati mensili con resample('ME').sum() e aumenti la frequenza usando il riempimento in avanti per completare gli intervalli mancanti. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Ricampionare serie temporali»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- DatetimeIndex e intervalli di periodi
- Ricampionare serie temporali
- Shift e variabili ritardate
- Estrarre caratteristiche temporali