Pulizia e miglioramento dei dati

Machine Learning per dati di serie temporali in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

I dati sono disordinati

  • I dati reali sono spesso disordinati
  • I due problemi più comuni sono valori mancanti e outlier
  • Succede per errori umani, sensori difettosi, problemi di database, ecc.
  • Visualizzare i dati grezzi aiuta a individuare questi problemi
Machine Learning per dati di serie temporali in Python

Com'è un dato disordinato

Machine Learning per dati di serie temporali in Python

Interpolazione: usare il tempo per colmare i dati mancanti

  • Un modo comune per gestire i valori mancanti è interpolare i valori
  • Con le serie temporali, puoi usare il tempo per aiutare l'interpolazione.
  • Qui, interpolazione significa usare i valori noti ai lati di un intervallo mancante per stimare ciò che manca.
Machine Learning per dati di serie temporali in Python

Interpolazione in Pandas

# Restituisce un booleano che indica dove ci sono valori mancanti
missing = prices.isna()

# Interpola linearmente nelle finestre con dati mancanti
prices_interp = prices.interpolate('linear')

# Traccia i dati interpolati in rosso e quelli con mancanti in nero
ax = prices_interp.plot(c='r')
prices.plot(c='k', ax=ax, lw=2)
Machine Learning per dati di serie temporali in Python

Visualizzare i dati interpolati

Machine Learning per dati di serie temporali in Python

Usare una finestra mobile per trasformare i dati

  • Un altro uso comune delle finestre mobili è trasformare i dati
  • Lo abbiamo già fatto una volta per smussare i dati
  • Possiamo anche usarle per trasformazioni più complesse
Machine Learning per dati di serie temporali in Python

Trasformare i dati per standardizzare la varianza

  • Una trasformazione comune è standardizzare media e varianza nel tempo. Ci sono molti modi.
  • Qui convertiamo il dataset così che ogni punto sia il % di variazione rispetto a una finestra precedente.
  • Rende i punti temporali più confrontabili se i valori assoluti variano molto
Machine Learning per dati di serie temporali in Python

Trasformare in variazione percentuale con Pandas

def percent_change(values):
    """Calcola la variazione % tra l'ultimo valore 
    e la media dei valori precedenti"""
    # Separa l'ultimo valore e tutti i precedenti
    previous_values = values[:-1]
    last_value = values[-1]

    # Calcola la differenza % tra l'ultimo valore 
    # e la media dei valori precedenti
    percent_change = (last_value - np.mean(previous_values)) \
    / np.mean(previous_values)
    return percent_change
Machine Learning per dati di serie temporali in Python

Applicarlo ai nostri dati

# Traccia i dati grezzi
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
ax = prices.plot(ax=axs[0])

# Calcola la % di variazione e traccia
ax = prices.rolling(window=20).aggregate(percent_change).plot(ax=axs[1])
ax.legend_.set_visible(False)

Machine Learning per dati di serie temporali in Python

Trovare outlier nei dati

  • Gli outlier sono punti dati significativamente diversi dal resto del dataset.
  • Possono ridurre la capacità predittiva del modello, spostandolo dal suo «vero» valore
  • Una soluzione è rimuovere o sostituire gli outlier con un valore più rappresentativo

Fai molta attenzione: spesso è difficile distinguere tra un valore davvero estremo e un'aberrazione

Machine Learning per dati di serie temporali in Python

Tracciare una soglia sui dati

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
for data, ax in zip([prices, prices_perc_change], axs):
    # Calcola media e deviazione standard
    this_mean = data.mean()
    this_std = data.std()

    # Traccia i dati, con una soglia a 3 deviazioni standard 
    # attorno alla media
    data.plot(ax=ax)
    ax.axhline(this_mean + this_std * 3, ls='--', c='r')
    ax.axhline(this_mean - this_std * 3, ls='--', c='r')
Machine Learning per dati di serie temporali in Python

Visualizzare le soglie degli outlier

Machine Learning per dati di serie temporali in Python

Sostituire gli outlier usando la soglia

# Centra i dati in modo che la media sia 0
prices_outlier_centered = prices_outlier_perc - prices_outlier_perc.mean()

# Calcola la deviazione standard
std = prices_outlier_perc.std()

# Usa il valore assoluto di ogni punto 
# per trovare più facilmente gli outlier
outliers = np.abs(prices_outlier_centered) > (std * 3)

# Sostituisci gli outlier con la mediana
# Usa np.nanmean perché potrebbero esserci nan attorno agli outlier
prices_outlier_fixed = prices_outlier_centered.copy()
prices_outlier_fixed[outliers] = np.nanmedian(prices_outlier_fixed)

Machine Learning per dati di serie temporali in Python

Visualizzare i risultati

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
prices_outlier_centered.plot(ax=axs[0])
prices_outlier_fixed.plot(ax=axs[1])

Machine Learning per dati di serie temporali in Python

Esercitiamoci!

Machine Learning per dati di serie temporali in Python

Preparing Video For Download...