12 · Features de retardo (lags)
El truco de la ventana deslizante convierte una serie 1-D en una tabla supervisada (X, y) de filas pasado-vs-presente — y ese único reshape permite que cualquier regresor pronostique.
Construir columnas lag_1..lag_k con .shift() reformula el pronóstico como aprendizaje supervisado ordinario: cada fila es (pasado reciente → valor siguiente). Ahora un random forest, gradient boosting o modelo lineal puede pronosticar — sin necesidad de ARIMA.
Sin esto:
Sin features de retardo tu serie es una sola columna de la que ningún regresor puede aprender; la ventana deslizante es el puente que conecta las series temporales clásicas con toda la caja de herramientas de scikit-learn.
Hasta ahora hemos pronosticado con modelos hechos para el tiempo (ARIMA, Holt-Winters). Pero hay un segundo camino, enormemente poderoso: reformatear la serie en una tabla supervisada y entregarla a cualquier regresor — random forest, gradient boosting, regresión lineal. El truco que lo hace posible son las features de retardo (lags).
Un lag de orden k es simplemente el valor k pasos en el pasado. En pandas, series.shift(k) desliza cada valor hacia abajo k filas, así que la columna lag_1 en la fila t contiene y[t-1], lag_2 contiene y[t-2], y así. Alinea varias columnas de lag junto al valor actual y habrás construido una ventana deslizante:
| target (yₜ) | lag_1 | lag_2 | lag_3 | |---|---|---|---| | yₜ | yₜ₋₁ | yₜ₋₂ | yₜ₋₃ |
Cada fila ahora dice "dados los últimos 3 valores, el siguiente valor fue yₜ." Esa es exactamente la forma (X, y) que espera scikit-learn: X son las columnas de lag, y es el target. El modelo aprende el mapeo del pasado reciente al paso siguiente.
Dos detalles prácticos. Primero, las filas más tempranas tienen lags NaN — no existe "el valor 3 días antes del día 0" — así que haces dropna() para descartar ese calentamiento. Segundo, debes construir los lags en orden temporal y nunca barajar: las columnas de lag son cómo el orden entra a un regresor que de otro modo es ciego al orden. Abajo tomamos una serie, construimos lag_1..lag_3, descartamos el calentamiento e inspeccionamos la tabla supervisada.
Python (in browser)
.shift(k) construye columnas de lag; dropna() recorta el calentamiento; el resultado es una tabla supervisada (X, y) limpia que cualquier regresor puede ajustar.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
En un DataFrame de features de retardo construido con shift(), ¿por qué las primeras filas contienen NaN, y qué haces con ellas?
- Un lag de orden k es el valor k pasos en el pasado; series.shift(k) construye la columna lag_k.
- Apilar lag_1..lag_k junto al valor actual reformatea una serie 1-D en una tabla supervisada (X, y) que cualquier regresor puede ajustar.
- Las primeras k filas tienen lags NaN (sin ventana completa) — haz dropna() del calentamiento, y nunca barajes el orden.
Las features de retardo impulsan todo forecaster de gradient boosting (LightGBM/XGBoost sobre series temporales tabulares) y son la capa de entrada de muchos ganadores de Kaggle en pronóstico de demanda.
Si lo quitas: Sin features de retardo un regresor solo ve la fila actual y no tiene memoria del pasado — no puede explotar la autocorrelación, toda la señal de pronóstico.