Time series: ARIMA, Prophet, Neural
- ⬜📏 Cross-validation e métricas honestas(Machine Learning Clássico)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Por que time series é um universo à parte
Séries temporais carregam dependência ordenada: o valor em t depende dos valores anteriores. Isso quebra a premissa iid (independente e identicamente distribuído) de ML clássico. Modelos e validação precisam respeitar a ordem.
Estacionariedade, ACF e PACF
import pandas as pd
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# Teste de estacionariedade (ADF)
result = adfuller(series.dropna())
print(f'ADF statistic: {result[0]:.3f}')
print(f'p-value: {result[1]:.4f}')
# p < 0.05 -> rejeita raiz unitária -> estacionário
# Differencing se não-estacionário
diff = series.diff().dropna()
# ACF/PACF para escolher p e q
plot_acf(diff, lags=40) # sugere q (MA order)
plot_pacf(diff, lags=40) # sugere p (AR order)ARIMA e SARIMA
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
# ARIMA(p, d, q) — p AR terms, d differencing, q MA terms
model = ARIMA(train, order=(2, 1, 2))
fit = model.fit()
forecast = fit.forecast(steps=30)
# SARIMA adiciona sazonalidade (P, D, Q, s)
sarima = SARIMAX(
train,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12), # s=12 para dados mensais com sazonalidade anual
enforce_stationarity=False,
enforce_invertibility=False,
)
sarima_fit = sarima.fit(disp=False)
print(sarima_fit.summary())Use pmdarima.auto_arima para busca automática de ordem. Ele roda AIC/BIC sobre várias combinações (p, d, q) e retorna a melhor. Economiza horas de tentativa manual.
Prophet — baseline de produção
from prophet import Prophet
# Prophet espera colunas 'ds' (datetime) e 'y' (valor)
df_p = df.rename(columns={'date': 'ds', 'sales': 'y'})
m = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
changepoint_prior_scale=0.05, # flexibilidade de mudanças de tendência
seasonality_mode='multiplicative',
)
m.add_country_holidays(country_name='BR')
m.fit(df_p)
future = m.make_future_dataframe(periods=90)
forecast = m.predict(future)
m.plot(forecast)
m.plot_components(forecast) # decomposição em trend + seasonality + holidaysProphet erra quando há autocorrelação forte de curto prazo (horário, minuto). Para dados de alta frequência, prefira modelos clássicos ou deep (NeuralProphet, DeepAR).
Que premissa do aprendizado clássico as séries temporais quebram, e o que isso muda na validação?
Backtesting walk-forward
from sklearn.model_selection import TimeSeriesSplit
import numpy as np
tss = TimeSeriesSplit(n_splits=5, test_size=30, gap=0)
maes = []
for train_idx, val_idx in tss.split(series):
train, val = series.iloc[train_idx], series.iloc[val_idx]
m = ARIMA(train, order=(2, 1, 2)).fit()
pred = m.forecast(steps=len(val))
maes.append(np.mean(np.abs(val.values - pred.values)))
print(f'MAE walk-forward: {np.mean(maes):.2f} +/- {np.std(maes):.2f}')Neural para time series
DeepAR (AWS), NBEATS, Temporal Fusion Transformer e neuralforecast (Nixtla) ganham quando há muitas séries relacionadas (demand forecasting multi-produto) e features exógenas. Para uma série única, raramente valem o custo.
Regra sênior: comece com seasonal naive baseline, depois Prophet, depois SARIMA, depois neural. Só escale complexidade quando a métrica justificar — em 70% dos casos Prophet basta para entregar valor em produção.
Perguntas frequentes
❓ Preciso de estacionariedade?
❓ Modelo clássico ou modelo com rede neural para série temporal?
❓ Como avaliar previsão honestamente?
Fixando
Quando o modelo aditivo com sazonalidade explícita erra, segundo o módulo?
Qual é a ordem recomendada para escalar complexidade em previsão?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…