import pandas as pd import pytest from src.utils.monitoring_stats import compute_metrics, build_histogram, THRESHOLD def make_logs(n=5, inference_ms=50.0): return pd.DataFrame({ "sk_id_curr": list(range(1, n + 1)), "inference_time_ms": [inference_ms] * n, }) def make_predictions(sk_ids, proba_values): return pd.DataFrame({ "sk_id_curr": sk_ids, "proba_class_1": proba_values, }) # --- compute_metrics --- def test_compute_metrics_taux_defaut_zero(): logs = make_logs() preds = make_predictions([1, 2, 3, 4, 5], [0.01, 0.02, 0.03, 0.04, 0.05]) result = compute_metrics(logs, preds) assert result["taux_defaut"] == 0.0 def test_compute_metrics_taux_defaut_cent_pour_cent(): logs = make_logs() preds = make_predictions([1, 2, 3, 4, 5], [0.5, 0.6, 0.7, 0.8, 0.9]) result = compute_metrics(logs, preds) assert result["taux_defaut"] == 100.0 def test_compute_metrics_score_moyen(): logs = make_logs() preds = make_predictions([1, 2, 3, 4, 5], [0.1, 0.2, 0.3, 0.4, 0.5]) result = compute_metrics(logs, preds) assert abs(result["score_moyen"] - 0.3) < 1e-9 def test_compute_metrics_temps_moyen(): logs = make_logs(inference_ms=75.0) preds = make_predictions([1, 2, 3, 4, 5], [0.1] * 5) result = compute_metrics(logs, preds) assert result["temps_moyen"] == 75.0 def test_compute_metrics_retourne_zero_si_pas_de_jointure(): logs = make_logs() preds = make_predictions([99, 100], [0.5, 0.6]) # different sk_id_curr result = compute_metrics(logs, preds) assert result["n_clients"] == 0 # --- build_histogram --- def test_build_histogram_retourne_une_figure(): import plotly.graph_objects as go preds = make_predictions([1, 2, 3], [0.05, 0.15, 0.5]) fig = build_histogram(preds) assert isinstance(fig, go.Figure) def test_build_histogram_contient_deux_traces(): preds = make_predictions([1, 2, 3], [0.05, 0.15, 0.5]) fig = build_histogram(preds) # one trace per Risque category (Remboursé and Défaut) assert len(fig.data) == 2 def test_compute_metrics_retourne_zeros_si_logs_vide(): logs = pd.DataFrame(columns=["sk_id_curr", "inference_time_ms"]) preds = make_predictions([1, 2, 3], [0.5, 0.6, 0.7]) result = compute_metrics(logs, preds) assert result == {"taux_defaut": 0.0, "score_moyen": 0.0, "temps_moyen": 0.0, "n_clients": 0}