ttzzs's picture
Deploy Chronos2 Forecasting API v3.0.0 with new SOLID architecture
c40c447 verified
"""
Interface para modelos de forecasting.
Este m贸dulo define la abstracci贸n IForecastModel que permite
diferentes implementaciones de modelos (Chronos, Prophet, ARIMA, etc.)
cumpliendo con DIP (Dependency Inversion Principle).
"""
from abc import ABC, abstractmethod
from typing import List, Dict, Any, Optional
import pandas as pd
class IForecastModel(ABC):
"""
Interface para modelos de forecasting.
Esta abstracci贸n permite que diferentes implementaciones de modelos
sean intercambiables sin modificar el c贸digo que las usa (DIP + LSP).
Ejemplos de implementaciones:
- ChronosModel (Chronos-2)
- ProphetModel (Facebook Prophet)
- ARIMAModel (ARIMA tradicional)
"""
@abstractmethod
def predict(
self,
context_df: pd.DataFrame,
prediction_length: int,
quantile_levels: List[float],
**kwargs
) -> pd.DataFrame:
"""
Genera pron贸sticos probabil铆sticos.
Args:
context_df: DataFrame con datos hist贸ricos.
Debe contener columnas: id, timestamp, target
prediction_length: N煤mero de pasos a predecir
quantile_levels: Lista de cuantiles a calcular (ej: [0.1, 0.5, 0.9])
**kwargs: Par谩metros adicionales espec铆ficos del modelo
Returns:
pd.DataFrame: Pron贸sticos con columnas:
- id: Identificador de serie
- timestamp: Timestamp de predicci贸n
- predictions: Valor mediano
- {q}: Valor para cada cuantil q
Raises:
ValueError: Si los datos de entrada son inv谩lidos
RuntimeError: Si el modelo falla al predecir
"""
pass
@abstractmethod
def get_model_info(self) -> Dict[str, Any]:
"""
Retorna informaci贸n del modelo.
Returns:
Dict con informaci贸n del modelo:
- type: Tipo de modelo (ej: "Chronos2", "Prophet")
- model_id: ID del modelo
- version: Versi贸n del modelo
- device: Dispositivo usado (cpu/cuda)
- otros campos espec铆ficos del modelo
"""
pass
def validate_context(self, context_df: pd.DataFrame) -> bool:
"""
Valida que el DataFrame de contexto tenga el formato correcto.
Args:
context_df: DataFrame a validar
Returns:
bool: True si es v谩lido
Raises:
ValueError: Si el DataFrame es inv谩lido
"""
required_columns = {"id", "timestamp", "target"}
if not isinstance(context_df, pd.DataFrame):
raise ValueError("context_df debe ser un pandas DataFrame")
missing_columns = required_columns - set(context_df.columns)
if missing_columns:
raise ValueError(
f"Faltan columnas requeridas: {missing_columns}. "
f"Se encontraron: {set(context_df.columns)}"
)
if context_df.empty:
raise ValueError("context_df no puede estar vac铆o")
if context_df["target"].isnull().any():
raise ValueError("La columna 'target' contiene valores nulos")
return True