Saltar al contenido

# series-de-tiempo-con-python

Series de Tiempo con Python

Volver a la portada del curso
Lectura (Markdown)

Revisión de Conceptos Clave

Sección 4 · Proyecto Aplicado de Series de Tiempo

Revisión de conceptos clave

Antes del proyecto final conviene tener el proceso completo en una sola página. Esta lección lo resume como una lista de verificación, en el orden en que se aplica a los pedidos de PyShop, y cierra con los errores que más cuestan porque no producen ningún mensaje de error.

Lista de verificación

  1. Frecuencia. Define la frecuencia de la serie y compruébala: 1443 filas cuando el periodo tiene 1461 días significa que faltan 18. asfreq("D") los vuelve visibles como NaN.
  2. Faltantes. Un día sin registro no es un día sin pedidos. interpolate() lo rellena con un valor razonable (162.5 entre 136 y 189); un 0 inventaría una caída que no existió.
  3. Cambio de frecuencia. Un flujo se agrega con resample().sum() (10,424 pedidos en diciembre de 2025); un stock, como el CO2, con resample().mean().
  4. Exploración. Medias por día de la semana y por mes, medias móviles (rolling) y cambios contra el año anterior (pct_change(12): +17.0 % en diciembre).
  5. Descomposición. Tendencia, estacionalidad y residuo. Si el pico estacional crece con el nivel, multiplicativa: en PyShop noviembre tiene un factor de 1.36. STL sirve para la estacionalidad semanal de los datos diarios.
  6. Estacionariedad. La prueba ADF sobre los pedidos mensuales da p = 0.9989; con diff(1) baja a 0.0. Con solo 48 meses la prueba tiene poca potencia: úsala como pista, no como juez.
  7. Partición temporal. Entrenar con 2022-2024 (36 meses) y probar con 2025 (12). Se corta por fecha; nunca se baraja.
  8. Piso ingenuo. Antes de cualquier modelo, el naive estacional: el mismo mes del año anterior.
  9. Suavizamiento exponencial. SES para series planas, Holt si hay tendencia, Holt-Winters si además hay estacionalidad.
  10. SARIMA. $(p,d,q)(P,D,Q)_s$, elegido por AIC en entrenamiento, con residuos revisados con Ljung-Box (p = 0.534: sin autocorrelación).
  11. Métricas. MAE en unidades de la serie y MAPE en porcentaje.
  12. Origen móvil. Repetir la evaluación con varios cortes para no depender de un solo año de prueba.
  13. Intervalos. Todo pronóstico se entrega con su intervalo de confianza.

Las métricas y el piso, en código

Para un pronóstico $\hat{y}_t$ de un valor real $y_t$ en $n$ periodos de prueba:

$$\text{MAE} = \frac{1}{n}\sum_{t=1}^{n} |y_t - \hat{y}_t| \qquad \text{MAPE} = \frac{100}{n}\sum_{t=1}^{n} \left|\frac{y_t - \hat{y}_t}{y_t}\right|$$

import numpy as np

m = generar_pedidos().asfreq("D").interpolate().resample("MS").sum()
tr, te = m[:"2024-12"], m["2025-01":]          # corte por fecha

def mae(real, pred):
    return np.mean(np.abs(real - pred))

def mape(real, pred):
    return np.mean(np.abs((real - pred) / real)) * 100

piso = tr.iloc[-12:].to_numpy()                # naive estacional
real = te.to_numpy()
print(round(mae(real, piso)), round(mape(real, piso), 1))   # 1174 15.5

Repetir 2024 como pronóstico de 2025 ya tiene un error de 15.5 %. Holt-Winters multiplicativo baja a 3.4 % y el SARIMA(1,1,0)(0,1,0,12) a 5.0 %; cualquier modelo que no baje de 15.5 % no aporta nada.

Un solo corte no basta

Con el origen móvil se entrena hasta un corte, se pronostican 6 meses y se repite con el corte siguiente. MAPE en cada corte:

CorteSARIMAHolt-WintersNaive estacional
2024-063.8 %4.9 %14.7 %
2024-126.2 %2.7 %15.4 %
2025-064.7 %1.7 %15.5 %

En el primer corte gana SARIMA y en los otros dos Holt-Winters. Con un solo año de prueba se habría declarado un ganador que no lo es siempre. Lo estable es que ambos quedan muy por debajo del piso. El notebook validacion-de-pronosticos implementa estos cortes.

Errores comunes

  • Barajar la serie. train_test_split con mezcla aleatoria pone días de 2025 en el entrenamiento: el modelo «ve» el futuro y el error de prueba sale optimista.
  • Fuga del futuro. Interpolar, escalar o calcular una media móvil centrada con toda la serie antes de cortar filtra información de la prueba. Primero se corta y después se transforma con datos del pasado.
  • MAPE con ceros. Divide entre el valor real: con un 0 es infinito y con valores pequeños se dispara. En esas series se reporta el MAE.
  • Sobreajustar a la prueba. El mejor AIC de la rejilla, (1,1,0)(0,1,0,12), da 5.0 %; el (0,1,1)(1,1,1,12) da 3.8 % en 2025. Elegir el segundo por mirar la prueba convierte a 2025 en parte del entrenamiento. El modelo se elige con datos de entrenamiento y la prueba solo se mira al final.
  • Entregar un número sin intervalo. El SARIMA pronostica 10,313 pedidos para diciembre de 2025 con intervalo [9129, 11498]; el real fue 10,424. El intervalo dice cuánto inventario extra conviene tener.

Con esta lista se resuelve el proyecto final: cada punto corresponde a una sección del enunciado.

Recursos