En pocas palabras
Biblioteca Python para pronosticar series temporales con modelos de machine learning.
Qué problema resuelve
Ingeniería repetitiva de rezagos y calendarios sobre grandes conjuntos de series.
Cuándo utilizarlo
Demanda, inventario y capacidad. Ejemplo: pronosticar ventas diarias por tienda y producto.
De la idea a la práctica
Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.
En el Radar compartido: Trial (valoración de la edición aportada).
Cómo funciona
Genera variables como lags y transformaciones y utiliza modelos compatibles con fit y predict. Incluye opciones distribuidas y estimación de incertidumbre.
Ejemplo de uso
Preparar columnas unique_id, ds e y para cada serie. Entrenar con rezagos semanales y evaluar pronósticos de siete días en varios cortes temporales, comparando con un baseline estacional.
Fragmento de preparación con un DataFrame series ya validado:
from mlforecast import MLForecast
from sklearn.linear_model import LinearRegression
forecast = MLForecast(models=[LinearRegression()], freq="D", lags=[7, 14])
forecast.fit(series)
predicciones = forecast.predict(h=7)
Formato de datos
| Columna | Contenido |
|---|---|
unique_id |
Identificador de la serie (sucursal, producto, cajero) |
ds |
Fecha o marca de tiempo |
y |
Valor a pronosticar |
| Otras | Variables exógenas (festivos, promociones, precio) |
Un solo modelo global se entrena con todas las series a la vez, lo que permite pronosticar series cortas aprovechando patrones de las demás.
Ingeniería de variables completa
import lightgbm as lgb
from mlforecast import MLForecast
from mlforecast.lag_transforms import ExpandingMean, RollingMean
from mlforecast.target_transforms import Differences
from mlforecast.utils import PredictionIntervals
fcst = MLForecast(
models={"lgbm": lgb.LGBMRegressor(n_estimators=300, learning_rate=0.05, verbose=-1)},
freq="D",
lags=[1, 7, 14, 28],
lag_transforms={
1: [ExpandingMean()],
7: [RollingMean(window_size=7), RollingMean(window_size=28)],
},
date_features=["dayofweek", "month"],
target_transforms=[Differences([7])], # quita la estacionalidad semanal antes de entrenar
)
fcst.fit(series, static_features=[], prediction_intervals=PredictionIntervals(n_windows=3, h=14))
pred = fcst.predict(h=14, level=[80, 95], X_df=exogenas_futuras)
X_df contiene los valores futuros de las variables exógenas: solo se pueden usar las que se conocen de antemano (festivos, campañas planificadas).
Validación temporal
cv = fcst.cross_validation(df=series, n_windows=4, h=14, step_size=14)
from utilsforecast.evaluation import evaluate
from utilsforecast.losses import mae, smape
metricas = evaluate(cv.drop(columns="cutoff"), metrics=[mae, smape])
Cada ventana entrena con los datos hasta un corte y evalúa los 14 días siguientes, imitando el uso real. Nunca uses una partición aleatoria en series temporales: filtra información del futuro.
Comparar siempre con un baseline
| Modelo | Papel |
|---|---|
| Naive estacional (mismo día semana pasada) | Referencia mínima que hay que superar |
| Modelos estadísticos (StatsForecast: ETS, ARIMA) | Robustos, rápidos y explicables |
| MLForecast (LightGBM, XGBoost, lineales) | Muchas series, variables exógenas |
| NeuralForecast | Grandes volúmenes y patrones complejos |
Las tres librerías son de Nixtla y comparten formato, por lo que se pueden comparar con el mismo código de evaluación.
Casos de uso en servicios financieros
- Demanda de efectivo por cajero o sucursal.
- Volumen de solicitudes de crédito para dimensionar el equipo de análisis.
- Recaudo esperado por día para planificar tesorería.
- Carga del centro de contacto por franja horaria.
Para grandes volúmenes, MLForecast puede ejecutarse sobre Dask, Spark o Ray. Registra experimentos y versiones de datos con Weights & Biases o MLflow.
Criterios de implementación
Comprobar frecuencia, huecos y disponibilidad futura de variables externas. Medir error por segmento e intervalos de predicción antes de decidir un despliegue distribuido.
Continúa en las fuentes
Documentación oficial para verificar detalles y explorar más.