fix(backend,airflow,ml): cloture la reconciliation entre les deux sources de lectures (#15)

This commit is contained in:
Dorian
2026-09-23 14:45:38 +02:00
parent c7744483b4
commit b00c39277b
9 changed files with 269 additions and 21 deletions
+10 -4
View File
@@ -47,9 +47,15 @@ NUMERIC_COLUMNS = [
# `bool` : `astype(bool)` ferait un `True` d'une absence, et les deux chargeurs divergeraient.
FLAG_COLUMNS = ["is_working_hours"]
# `uq_reading_source` autorise deux lignes au meme (site_id, timestamp) des que `source` differe
# (cf. `app/etl/mock_api_import.py`, qui refuse desormais d'importer une fenetre deja couverte par
# le CSV, mais ne protege pas le sens inverse). `build_features` suppose une ligne par
# (site_id, timestamp) sans doublon : le `DISTINCT ON` l'impose plutot que de la supposer.
# 'csv' gagne sur 'api_history' en cas de recouvrement, l'historique etant une source verifiee
# alors que l'API Mock est traitee comme une entree hostile (cf. OWASP API10).
_READING_QUERY = text(
"""
SELECT
SELECT DISTINCT ON (r.site_id, r.timestamp)
r.site_id,
r.timestamp,
r.consumption_kwh,
@@ -61,14 +67,14 @@ _READING_QUERY = text(
s.capacity_kw
FROM reading r
JOIN site s ON s.site_id = r.site_id
ORDER BY r.site_id, r.timestamp
ORDER BY r.site_id, r.timestamp, (r.source = 'csv') DESC, r.reading_id DESC
"""
)
_RECENT_READING_QUERY = text(
"""
SELECT
SELECT DISTINCT ON (r.site_id, r.timestamp)
r.site_id,
r.timestamp,
r.consumption_kwh,
@@ -81,7 +87,7 @@ _RECENT_READING_QUERY = text(
FROM reading r
JOIN site s ON s.site_id = r.site_id
WHERE r.timestamp >= :since AND r.timestamp <= :until
ORDER BY r.site_id, r.timestamp
ORDER BY r.site_id, r.timestamp, (r.source = 'csv') DESC, r.reading_id DESC
"""
)