Fix DEB training truth finality handling
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
from src.database.runtime_state import (
|
||||
DailyRecordRepository,
|
||||
RuntimeStateDB,
|
||||
TrainingFeatureRecordRepository,
|
||||
TruthRecordRepository,
|
||||
)
|
||||
|
||||
|
||||
def _wire_runtime_repos(monkeypatch, tmp_path):
|
||||
from src.analysis import deb_algorithm
|
||||
|
||||
db = RuntimeStateDB(str(tmp_path / "polyweather.db"))
|
||||
daily_repo = DailyRecordRepository(db)
|
||||
truth_repo = TruthRecordRepository(db)
|
||||
feature_repo = TrainingFeatureRecordRepository(db)
|
||||
monkeypatch.setattr(deb_algorithm, "_daily_record_repo", daily_repo)
|
||||
monkeypatch.setattr(deb_algorithm, "_truth_record_repo", truth_repo)
|
||||
monkeypatch.setattr(deb_algorithm, "_training_feature_repo", feature_repo)
|
||||
monkeypatch.setattr(deb_algorithm, "_history_cache", {})
|
||||
monkeypatch.setattr(deb_algorithm, "_history_mtime", 0)
|
||||
monkeypatch.setenv("POLYWEATHER_STATE_STORAGE_MODE", "sqlite")
|
||||
return db
|
||||
|
||||
|
||||
def test_intraday_daily_record_does_not_persist_unfinal_actual_as_truth(monkeypatch, tmp_path):
|
||||
from src.analysis.deb_algorithm import update_daily_record
|
||||
|
||||
db = _wire_runtime_repos(monkeypatch, tmp_path)
|
||||
|
||||
update_daily_record(
|
||||
"ankara",
|
||||
"2026-06-24",
|
||||
{"ECMWF": 28.0, "GFS": 27.0},
|
||||
24.0,
|
||||
deb_prediction=27.5,
|
||||
mu=27.2,
|
||||
actual_is_final=False,
|
||||
)
|
||||
|
||||
with db.connect() as conn:
|
||||
daily = conn.execute(
|
||||
"""
|
||||
SELECT actual_high, deb_prediction, mu, payload_json
|
||||
FROM daily_records_store
|
||||
WHERE city = ? AND target_date = ?
|
||||
""",
|
||||
("ankara", "2026-06-24"),
|
||||
).fetchone()
|
||||
truth_count = conn.execute(
|
||||
"""
|
||||
SELECT count(*) AS n
|
||||
FROM truth_records_store
|
||||
WHERE city = ? AND target_date = ?
|
||||
""",
|
||||
("ankara", "2026-06-24"),
|
||||
).fetchone()["n"]
|
||||
|
||||
assert daily is not None
|
||||
assert daily["actual_high"] is None
|
||||
assert daily["deb_prediction"] == 27.5
|
||||
assert daily["mu"] == 27.2
|
||||
assert truth_count == 0
|
||||
|
||||
|
||||
def test_dynamic_weights_skip_actual_only_rows_when_selecting_recent_training_days(monkeypatch):
|
||||
from src.analysis.deb_algorithm import calculate_dynamic_weight_components
|
||||
|
||||
history = {"ankara": {}}
|
||||
for day in range(23, 15, -1):
|
||||
history["ankara"][f"2026-06-{day:02d}"] = {"actual_high": 20.0}
|
||||
history["ankara"]["2026-06-15"] = {
|
||||
"actual_high": 20.0,
|
||||
"forecasts": {"ECMWF": 20.0, "GFS": 30.0},
|
||||
}
|
||||
history["ankara"]["2026-06-14"] = {
|
||||
"actual_high": 20.0,
|
||||
"forecasts": {"ECMWF": 20.0, "GFS": 30.0},
|
||||
}
|
||||
monkeypatch.setattr("src.analysis.deb_algorithm.load_history", lambda _path: history)
|
||||
|
||||
components = calculate_dynamic_weight_components(
|
||||
"ankara",
|
||||
{"ECMWF": 20.0, "GFS": 30.0},
|
||||
lookback_days=7,
|
||||
)
|
||||
|
||||
assert components["weights"]["ECMWF"] > components["weights"]["GFS"]
|
||||
assert components["prediction"] < 25.0
|
||||
Reference in New Issue
Block a user