Limpando e melhorando seus dados

Machine Learning para dados de séries temporais em Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Dados são bagunçados

  • Dados do mundo real geralmente são bagunçados
  • Os dois problemas mais comuns são dados ausentes e outliers
  • Isso ocorre por erro humano, falha de sensor, problemas no banco de dados, etc.
  • Visualizar os dados brutos ajuda a identificar esses problemas
Machine Learning para dados de séries temporais em Python

Como são dados bagunçados

Machine Learning para dados de séries temporais em Python

Interpolação: usando o tempo para preencher dados ausentes

  • Uma forma comum de lidar com dados ausentes é interpolar valores faltantes
  • Em séries temporais, você pode usar o tempo para ajudar na interpolação.
  • Aqui, interpolação significa usar os valores conhecidos dos dois lados de uma lacuna para estimar o que falta.
Machine Learning para dados de séries temporais em Python

Interpolação no Pandas

# Return a boolean that notes where missing values are
missing = prices.isna()

# Interpolate linearly within missing windows
prices_interp = prices.interpolate('linear')

# Plot the interpolated data in red and the data w/ missing values in black
ax = prices_interp.plot(c='r')
prices.plot(c='k', ax=ax, lw=2)
Machine Learning para dados de séries temporais em Python

Visualizando os dados interpolados

Machine Learning para dados de séries temporais em Python

Usando janela móvel para transformar dados

  • Outro uso comum de janelas móveis é transformar os dados
  • Já fizemos isso para suavizar os dados
  • Também podemos usá-las para transformações mais complexas
Machine Learning para dados de séries temporais em Python

Transformando dados para padronizar a variância

  • Uma transformação comum é padronizar média e variância ao longo do tempo. Há várias formas de fazer isso.
  • Aqui, vamos converter o conjunto para que cada ponto represente a % de mudança em relação a uma janela anterior.
  • Isso torna os instantes mais comparáveis quando os valores absolutos variam muito
Machine Learning para dados de séries temporais em Python

Transformando para % de mudança com Pandas

def percent_change(values):
    """Calculates the % change between the last value 
    and the mean of previous values"""
    # Separate the last value and all previous values into variables
    previous_values = values[:-1]
    last_value = values[-1]

    # Calculate the % difference between the last value 
    # and the mean of earlier values
    percent_change = (last_value - np.mean(previous_values)) \
    / np.mean(previous_values)
    return percent_change
Machine Learning para dados de séries temporais em Python

Aplicando isso aos dados

# Plot the raw data
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
ax = prices.plot(ax=axs[0])

# Calculate % change and plot
ax = prices.rolling(window=20).aggregate(percent_change).plot(ax=axs[1])
ax.legend_.set_visible(False)

Machine Learning para dados de séries temporais em Python

Encontrando outliers nos seus dados

  • Outliers são pontos muito diferentes estatisticamente do conjunto de dados.
  • Eles podem prejudicar o poder preditivo do modelo, enviesando-o do seu "valor real"
  • Uma solução é remover ou substituir outliers por um valor mais representativo

Tenha muito cuidado ao fazer isso — muitas vezes é difícil distinguir um valor extremo legítimo de uma aberração

Machine Learning para dados de séries temporais em Python

Plotando um limite nos dados

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
for data, ax in zip([prices, prices_perc_change], axs):
    # Calculate the mean / standard deviation for the data
    this_mean = data.mean()
    this_std = data.std()

    # Plot the data, with a window that is 3 standard deviations 
    # around the mean
    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 para dados de séries temporais em Python

Visualizando limites de outliers

Machine Learning para dados de séries temporais em Python

Substituindo outliers usando o limite

# Center the data so the mean is 0
prices_outlier_centered = prices_outlier_perc - prices_outlier_perc.mean()

# Calculate standard deviation
std = prices_outlier_perc.std()

# Use the absolute value of each datapoint 
# to make it easier to find outliers
outliers = np.abs(prices_outlier_centered) > (std * 3)

# Replace outliers with the median value
# We'll use np.nanmean since there may be nans around the outliers
prices_outlier_fixed = prices_outlier_centered.copy()
prices_outlier_fixed[outliers] = np.nanmedian(prices_outlier_fixed)

Machine Learning para dados de séries temporais em Python

Visualize os resultados

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 para dados de séries temporais em Python

Vamos praticar!

Machine Learning para dados de séries temporais em Python

Preparing Video For Download...