fix(ml): borne la fenetre de scoring a l'instant demande, pour que --now rejoue l'historique
`load_recent_from_database` n'avait qu'une borne basse. `build_scoring_frame` repartait donc de la derniere lecture de toute la table quel que soit `--now` : `target_at` valait toujours "fin du jeu + 1h", et `_age = instant - derniere_lecture` devenait negatif, ce qui passait le seuil de peremption sans rien signaler. Consequence concrete : sur le jeu historique, arrete au 31/12/2024, aucune boucle de rattrapage ne pouvait produire une prevision dont le realise existe deja. La surveillance de derive livree par la migration precedente n'aurait donc rien eu a comparer en demonstration. `until` est desormais obligatoire sur ce chargeur, ce qui interdit de l'oublier, et le mode CSV filtre symetriquement. En exploitation rien ne change, aucune lecture n'etant posterieure a l'heure courante.
This commit is contained in:
@@ -275,3 +275,24 @@ def test_run_scoring_in_csv_mode_scores_without_touching_a_database(tmp_path: Pa
|
||||
assert {r.site_id for r in resultats} == {"site-a", "site-b"}
|
||||
assert all(r.status == "available" for r in resultats)
|
||||
assert all(r.predicted_value == 7.0 for r in resultats)
|
||||
|
||||
|
||||
def test_run_scoring_in_csv_mode_targets_the_hour_after_the_reference_instant(
|
||||
tmp_path: Path,
|
||||
) -> None:
|
||||
depart = datetime(2026, 1, 1, tzinfo=UTC)
|
||||
frame = make_recent("site-a", heures=400, depart=depart)
|
||||
csv_path = tmp_path / "recent.csv"
|
||||
frame.to_csv(csv_path, index=False)
|
||||
model_path = tmp_path / "model.txt"
|
||||
model_path.write_bytes(b"peu importe le contenu pour ce test")
|
||||
rattrapage = depart + timedelta(hours=300)
|
||||
|
||||
with pytest.MonkeyPatch.context() as monkeypatch:
|
||||
monkeypatch.setattr(
|
||||
"enervision_ml.score.lgb.Booster", lambda model_file: FakeBooster(valeur=7.0)
|
||||
)
|
||||
|
||||
resultats = run_scoring(model_path=model_path, csv_path=csv_path, now=rattrapage)
|
||||
|
||||
assert [r.target_at for r in resultats] == [rattrapage + timedelta(hours=1)]
|
||||
|
||||
Reference in New Issue
Block a user