TP3 Parties 2-4 : API REST FastAPI (health, predict, batch, erreurs 404)

This commit is contained in:
Johan LEROY
2026-07-22 11:22:50 +02:00
parent 9a52395c91
commit b0bd6cdb07
6 changed files with 262 additions and 0 deletions

66
lab/serving/features.py Normal file
View File

@@ -0,0 +1,66 @@
"""Recuperation des features de prediction.
Dans un systeme reel, ces valeurs proviendraient d'un feature store / d'une base
alimentee par le pipeline de calcul de features (lags, moyennes glissantes) sur
l'historique de consommation. On separe volontairement cette etape du calcul de la
prediction : la source des features peut changer sans toucher au modele.
Ici on SIMULE cette recuperation par un simple dictionnaire Python, comme demande
par l'enonce. Les valeurs sont des observations reelles (derniere ligne connue de
quelques clients dans data/test.parquet).
"""
from .. import constants
class UnknownClientError(KeyError):
"""Aucune feature disponible pour ce client (identifiant inconnu)."""
# feature store simule : client_id -> {feature: valeur}
FEATURE_STORE: dict[str, dict[str, float]] = {
"MT_124": {
"lag_1d": 107.656,
"lag_7d": 25.120,
"lag_30d": 70.574,
"lag_365d": 25.120,
"rolling_mean_7d": 65.870,
"rolling_mean_30d": 71.310,
},
"MT_156": {
"lag_1d": 13.149,
"lag_7d": 13.929,
"lag_30d": 21.577,
"lag_365d": 8.935,
"rolling_mean_7d": 16.648,
"rolling_mean_30d": 19.720,
},
"MT_158": {
"lag_1d": 30.739,
"lag_7d": 16.608,
"lag_30d": 34.094,
"lag_365d": 6.574,
"rolling_mean_7d": 19.067,
"rolling_mean_30d": 21.486,
},
"MT_159": {
"lag_1d": 23.305,
"lag_7d": 24.741,
"lag_30d": 21.386,
"lag_365d": 5.333,
"rolling_mean_7d": 11.707,
"rolling_mean_30d": 13.619,
},
}
def get_features(client_id: str) -> dict[str, float]:
"""Renvoyer les features du client, ordonnees comme a l'entrainement du modele.
Leve UnknownClientError si le client est inconnu.
"""
if client_id not in FEATURE_STORE:
raise UnknownClientError(client_id)
raw = FEATURE_STORE[client_id]
# On respecte l'ordre des colonnes attendu par le modele (SERVING_FEATURES).
return {feature: raw[feature] for feature in constants.SERVING_FEATURES}