19. Pronóstico de series de tiempo
¿Cómo usar el pasado reciente para anticipar recuperación o riesgo?
Pronóstico de series de tiempo
Usamos rezagos, ventanas móviles y separación temporal para pronosticar indicadores de flotación.
1. Pregunta de planta
El pronóstico de series de tiempo usa el pasado reciente para estimar lo que podría ocurrir en las siguientes horas.
2. Matemática simple
Una serie de tiempo es una variable ordenada por fecha u hora.
El modelo aprende con retrasos o ventanas móviles:
3. Aplicación en flotación
| Pronóstico | Pregunta | Uso |
|---|---|---|
| Recuperación próxima | ¿La recuperación podría caer? | Revisión temprana de variables. |
| Score de riesgo próximo | ¿El riesgo va subiendo? | Alerta preventiva. |
| Nivel de celda | ¿El nivel seguirá subiendo? | Evitar inestabilidad o desborde. |
| Evento futuro | ¿Podría ocurrir sobre-espumación? | Clasificación con horizonte. |
4. Excel: rezagos y promedio móvil
Primero se ordenan los datos por fecha_hora.
Valor anterior de recuperación
Si estamos en la fila 3, esa fórmula representa la recuperación de la hora anterior.
Promedio móvil de 4 registros
Cambio de recuperación
Alerta de tendencia
5. Python: pronóstico con variables rezagadas
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
archivo = "flotacion_cobre.xlsx"
df = pd.read_excel(archivo)
df = df.sort_values("fecha_hora").reset_index(drop=True)
# Variables del pasado reciente
df["rec_lag1"] = df["recuperacion_cu"].shift(1)
df["score_lag1"] = df["score_riesgo"].shift(1)
df["nivel_lag1"] = df["nivel_celda"].shift(1)
df["esp_lag1"] = df["dosificacion_espumante"].shift(1)
df["rec_media_4"] = df["recuperacion_cu"].rolling(4).mean()
df["score_media_4"] = df["score_riesgo"].rolling(4).mean()
# Objetivo: recuperación del siguiente registro
df["recuperacion_siguiente"] = df["recuperacion_cu"].shift(-1)
features = [
"rec_lag1", "score_lag1", "nivel_lag1", "esp_lag1",
"rec_media_4", "score_media_4", "flujo_aire", "ph", "p80"
]
data = df[features + ["recuperacion_siguiente"]].dropna()
X = data[features]
y = data["recuperacion_siguiente"]
# Separación temporal: primeras filas entrenan, últimas filas prueban
split = int(len(data)*0.8)
X_train, X_test = X.iloc[:split], X.iloc[split:]
y_train, y_test = y.iloc[:split], y.iloc[split:]
modelo = RandomForestRegressor(n_estimators=200, random_state=42)
modelo.fit(X_train, y_train)
pred = modelo.predict(X_test)
print("MAE:", mean_absolute_error(y_test, pred))
6. Pronosticar evento futuro
Tambien podemos crear una etiqueta futura para anticipar eventos.
df["evento_siguiente"] = df["evento_sobre_espumacion"].shift(-1)
# Luego se entrena un clasificador usando variables actuales y rezagadas
# para estimar si en el siguiente periodo podría aparecer el evento.
7. Lectura operativa
Un pronóstico corto sirve para preparar revisiones antes de que el indicador llegue tarde.
- Si recuperación estimada baja: revisar variables de proceso.
- Si score futuro sube: elevar nivel de atención.
- Si nivel viene subiendo: revisar control, sensor y espuma.
- Si evento futuro es probable: activar revisión operacional, no automatización ciega.
Mensaje final: pronosticar series de tiempo no es adivinar el futuro; es usar el pasado reciente para anticipar una conversación operativa.
