Interpolazione e imputazione avanzata
Usi interpolate() per un riempimento uniforme basato sul tempo e comprenda quando sia appropriata l'imputazione con la media o con la mediana.
Interpolazione e imputazione avanzata è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 4 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.
Quando l'interpolazione è preferibile a fillna()
Il riempimento in avanti e all'indietro propagano il valore noto più vicino senza considerare la tendenza dei dati. L'interpolazione stima i valori mancanti assumendo una transizione graduale tra i valori noti: ad esempio, se la temperatura era di 20 °C lunedì e di 30 °C venerdì, l'interpolazione stima 25 °C per mercoledì. Questo produce imputazioni più realistiche per segnali che cambiano gradualmente, come dati dei sensori, prezzi o conteggi della popolazione.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'day': [1, 2, 3, 4, 5],
'temp': [20.0, np.nan, np.nan, np.nan, 30.0]
})
# Linear interpolation fills gaps smoothly
df['temp_interp'] = df['temp'].interpolate(method='linear')
print(df)
# day temp temp_interp
# 0 1 20.0 20.0
# 1 2 NaN 22.5
# 2 3 NaN 25.0
# 3 4 NaN 27.5
# 4 5 30.0 30.0Metodi di interpolate()
Pandas interpolate() supporta diversi metodi. I più comuni sono 'linear' (valori equidistanti tra quelli noti), 'time' (tiene conto degli intervalli temporali non uniformi quando è impostato un DatetimeIndex), 'polynomial' (adatta una curva polinomiale e richiede un argomento order) e 'spline' (polinomio a tratti uniforme). Linear è l'impostazione predefinita più sicura; i metodi di ordine superiore possono causare overfitting su intervalli brevi.
import pandas as pd
import numpy as np
s = pd.Series([0, np.nan, np.nan, 8.0])
print('linear:', s.interpolate('linear').tolist())
# [0.0, 2.6666..., 5.3333..., 8.0]
print('polynomial(2):', s.interpolate('polynomial', order=2).tolist())
# [0.0, 2.222..., 5.111..., 8.0]Interpolazione time con DatetimeIndex
Quando la Series ha un DatetimeIndex con intervalli temporali non uniformi (ad esempio, solo giorni feriali, con i fine settimana mancanti), method='time' esegue l'interpolazione in proporzione al tempo effettivamente trascorso, non solo in base alla posizione. È più preciso dell'interpolazione lineare, che considera ogni riga equidistante indipendentemente dall'intervallo del calendario.
import pandas as pd
import numpy as np
# Unequal gaps: Jan 1, Jan 3, Jan 10
idx = pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-10'])
s = pd.Series([100.0, np.nan, 170.0], index=idx)
# linear treats gaps as equal (position-based)
print(s.interpolate('linear').tolist()) # [100.0, 135.0, 170.0]
# time accounts for actual day count
# Jan 1 to Jan 3 = 2 days, Jan 1 to Jan 10 = 9 days
# fraction: 2/9 of the way from 100 to 170
print(s.interpolate('time').tolist()) # [100.0, 115.55..., 170.0]Limitazione dell'estensione dell'interpolazione
Come ffill(), interpolate() accetta un parametro limit per limitare il numero di posizioni NaN consecutive da riempire. I NaN oltre il limite rimangono mancanti. Questo impedisce all'interpolazione di attraversare intervalli molto lunghi, in cui il valore reale potrebbe essere qualsiasi; gli intervalli lunghi dovrebbero essere segnalati per una verifica manuale.
import pandas as pd
import numpy as np
s = pd.Series([1.0, np.nan, np.nan, np.nan, np.nan, 10.0])
# Only fill the first 2 NaN positions
filled = s.interpolate('linear', limit=2)
print(filled.tolist())
# [1.0, 2.8, 4.6, NaN, NaN, 10.0]Scelta tra imputazione con media e mediana
L'imputazione con media e mediana è semplice, ma presenta importanti compromessi. La media è sensibile ai valori anomali: pochi valori molto grandi la fanno aumentare, rendendola inadatta per una distribuzione asimmetrica a destra come quella dei redditi o dei prezzi delle abitazioni. La mediana è robusta rispetto ai valori anomali ed è la scelta migliore per le colonne asimmetriche. Utilizzi la media solo quando i dati sono approssimativamente simmetrici e privi di valori anomali estremi.
import pandas as pd
import numpy as np
# Skewed income data with an outlier
income = pd.Series([30000, 35000, 32000, 1_000_000, np.nan])
print('Mean: ', income.mean()) # ~274000 — pulled by outlier
print('Median:', income.median()) # ~33500 — robust choice
# Prefer median for skewed data
filled = income.fillna(income.median())
print(filled.tolist())
# [30000, 35000, 32000, 1000000, 33500.0]Concetto di imputazione KNN
L'imputazione K-Nearest Neighbour (KNN) sostituisce un valore mancante con la media (o la media ponderata) delle k righe più simili, misurata in base alla distanza tra le feature non mancanti. Questa è una strategia multivariata: utilizza le informazioni delle altre colonne per determinare il valore da inserire, risultando più precisa dell'imputazione con la media di una singola colonna quando le feature sono correlate.
KNNImputer di Scikit-learn si integra direttamente con gli array NumPy e i DataFrame Pandas.
import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer
df = pd.DataFrame({
'age': [25, 35, np.nan, 45],
'income': [50000, 70000, 60000, np.nan]
})
imputer = KNNImputer(n_neighbors=2)
df_imputed = pd.DataFrame(
imputer.fit_transform(df),
columns=df.columns
)
print(df_imputed.round(1))
# age income
# 0 25.0 50000.0
# 1 35.0 70000.0
# 2 30.0 60000.0 <- filled from neighbours
# 3 45.0 65000.0 <- filled from neighboursImputazione multipla con IterativeImputer
L'imputazione multipla è considerata lo standard di riferimento per la gestione dei dati mancanti nella ricerca statistica. IterativeImputer di Scikit-learn implementa un approccio MICE (Multiple Imputation by Chained Equations): modella ogni colonna con valori mancanti in funzione delle altre colonne, ripetendo l'imputazione finché i valori convergono. Questo cattura le relazioni tra le feature meglio delle strategie basate su una singola colonna.
import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer # noqa
from sklearn.impute import IterativeImputer
df = pd.DataFrame({
'x1': [1, 2, np.nan, 4, 5],
'x2': [2, np.nan, 6, 8, 10],
'y': [3, 5, 7, np.nan, 11]
})
imp = IterativeImputer(max_iter=10, random_state=0)
df_filled = pd.DataFrame(imp.fit_transform(df), columns=df.columns)
print(df_filled.round(2))Colonne indicatrici per i dati mancanti
Invece di nascondere il fatto che un valore è stato imputato, è buona pratica aggiungere una colonna indicatrice binaria che segnali quali righe contenevano valori mancanti prima dell'imputazione. In questo modo i modelli a valle possono apprendere dal modello stesso dei valori mancanti: a volte il fatto che un valore manchi è predittivo quanto il valore stesso.
import pandas as pd
import numpy as np
df = pd.DataFrame({'salary': [50000, np.nan, 70000, np.nan, 90000]})
# Add indicator before filling
df['salary_was_missing'] = df['salary'].isna().astype(int)
# Then fill
df['salary'] = df['salary'].fillna(df['salary'].median())
print(df)
# salary salary_was_missing
# 0 50000.0 0
# 1 70000.0 1
# 2 70000.0 0
# 3 70000.0 1
# 4 90000.0 0Imputazione e fuga di dati
Una regola fondamentale nelle pipeline di machine learning è calcolare le statistiche di imputazione (media, mediana, moda) solo sul training set, quindi applicare gli stessi valori al test set. Calcolare le statistiche sull'intero dataset prima della suddivisione causa una fuga di dati: il modello vede indirettamente i dati di test durante l'addestramento, gonfiando le stime delle prestazioni. Adatti sempre gli imputatori ai dati di addestramento e trasformi sia i dati di addestramento sia quelli di test.
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
df = pd.DataFrame({'feature': [1, 2, np.nan, 4, np.nan, 6, 7, 8]})
train, test = train_test_split(df, test_size=0.25, random_state=0)
# Fit ONLY on training data
imp = SimpleImputer(strategy='mean')
train['feature'] = imp.fit_transform(train[['feature']])
# Transform test using training statistics
test['feature'] = imp.transform(test[['feature']])
print('Train mean used:', imp.statistics_[0])Confronto visivo delle strategie di imputazione
Dopo aver applicato diversi metodi di imputazione, ne confronti l'effetto tracciando fianco a fianco la distribuzione delle colonne originali e imputate. Una buona imputazione dovrebbe preservare il più possibile la forma (media, varianza, asimmetria) della distribuzione originale. L'imputazione con la media restringe la distribuzione; KNN e MICE tendono a preservarla meglio.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
original = np.random.exponential(scale=5, size=200)
with_nan = original.copy()
with_nan[np.random.choice(200, 40, replace=False)] = np.nan
s = pd.Series(with_nan)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
s.dropna().hist(ax=axes[0], bins=20, title='Original (no NaN)')
s.fillna(s.mean()).hist(ax=axes[1], bins=20, title='Mean-imputed')
plt.tight_layout()
plt.savefig('imputation_comparison.png')
print('Saved comparison chart')Scelta della strategia di imputazione corretta
Non esiste una strategia di imputazione universalmente migliore: la scelta corretta dipende dal contesto. Utilizzi mean/median per casi univariati semplici con pochi valori mancanti. Utilizzi ffill/bfill per serie temporali con tendenze stabili. Utilizzi KNN o IterativeImputer quando le feature sono correlate e desidera sfruttare le loro relazioni. Utilizzi costanti definite dal dominio (ad esempio, 0 per assente, -1 per sconosciuto) quando il valore mancante ha un significato aziendale chiaro. Documenti sempre la Sua scelta.
# Decision guide (no runnable code)
#
# Missing < 5% AND data is MCAR? -> Mean/median fill is fine
# Time series with stable trend? -> ffill() with limit
# Features are correlated? -> KNNImputer or IterativeImputer
# Categorical column? -> Mode fill or 'Unknown' sentinel
# Going into ML model? -> Add indicator column + fill
# Research / publication quality? -> Multiple imputation (MICE)
print('Strategy selected based on context')Verifica rapida
Verifichi la Sua comprensione dell'interpolazione e dell'imputazione avanzata.
Riepilogo della lezione
In questa lezione ha imparato che: interpolate() stima i valori mancanti assumendo una tendenza graduale tra i valori noti, method='time' gestisce gli intervalli non uniformi di DatetimeIndex e strategie avanzate come KNNImputer e IterativeImputer utilizzano le altre colonne per determinare i valori da inserire. Aggiunga sempre colonne indicatrici prima dell'imputazione e calcoli le statistiche solo sul training set per evitare la fuga di dati. Ora esamineremo e convertiremo i tipi di dati delle colonne del DataFrame.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Interpolazione e imputazione avanzata» è gratuita?
Sì — il testo completo di «Interpolazione e imputazione avanzata» è 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 «Interpolazione e imputazione avanzata»?
Usi interpolate() per un riempimento uniforme basato sul tempo e comprenda quando sia appropriata l'imputazione con la media o con la mediana. 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 4 di 4.
Quanto tempo richiede la lezione «Interpolazione e imputazione avanzata»?
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
- Rilevare i valori mancanti
- Eliminare i valori mancanti
- Riempire i valori mancanti
- Interpolazione e imputazione avanzata