projet_MLops_part2 / src /api /prediction.py
github-actions
Deploy to HF
0f82473
Raw
History Blame Contribute Delete
2.01 kB
import time
import streamlit as st
from src.utils.database import get_client
from src.utils.logs import log_prediction_request
st.title("Prédiction remboursement de crédit")
user = st.session_state.user
sk_id = st.text_input("Numéro du client (SK_ID_CURR)")
if st.button("Rechercher"):
if not sk_id or not sk_id.strip().isdigit() or int(sk_id) > 2_147_483_647:
st.error("Numéro de client invalide. Saisissez un identifiant numérique entier (ex : 100002).")
st.stop()
client = get_client()
start = time.perf_counter()
response = (
client.table("predictions")
.select("proba_class_0, proba_class_1")
.eq("sk_id_curr", int(sk_id))
.execute()
)
inference_time_ms = (time.perf_counter() - start) * 1000
found = bool(response.data)
proba_class_1 = float(response.data[0]["proba_class_1"]) if found else None
log_prediction_request(
user_id=user["id"],
username=user["username"],
sk_id_curr=int(sk_id),
inference_time_ms=inference_time_ms,
found=found,
proba_class_1=proba_class_1,
)
if not found:
st.error(f"Client n° {int(sk_id)} introuvable. Vérifiez l'identifiant et réessayez.")
else:
row = response.data[0]
proba_0 = float(row["proba_class_0"])
proba_1 = float(row["proba_class_1"])
predicted = 1 if proba_1 >= 0.0913 else 0
st.subheader(f"Résultats pour le client {int(sk_id)}")
if predicted == 0:
st.success(f"Classe prédite : {predicted} — Crédit remboursé")
else:
st.error(f"Classe prédite : {predicted} — Défaut de remboursement")
st.metric("Probabilité classe 0 (remboursé)", f"{proba_0:.2%}")
st.metric("Probabilité classe 1 (défaut de remboursement)", f"{proba_1:.2%}")
if user["role"] == "administrateur":
st.divider()
st.caption(f"Debug — SK_ID: {sk_id} | Rôle: {user['role']}")