Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
da387fa
resultats pfas udi annuel (model, dbt doc, notebook)
LounesAbd Apr 4, 2025
a0ae34c
fix dbt tests
LounesAbd Apr 4, 2025
2fc2cc2
Merge remote-tracking branch 'upstream/main' into analyst/lounes_pfas…
LounesAbd Apr 4, 2025
b568f05
fix: generic tests on PFAS models profile
LounesAbd Apr 10, 2025
20ce515
Merge remote-tracking branch 'upstream' into analyst/lounes_pfas_udi_…
LounesAbd Apr 11, 2025
0f828ed
Merge remote-tracking branch 'upstream' into analyst/lounes_pfas_udi_…
LounesAbd Apr 11, 2025
dda12d2
fix : MAJ du modèle 'int__resultats_pfas_udi_annuel' avec les nouvell…
LounesAbd Apr 13, 2025
3be0b02
Merge remote-tracking branch 'upstream' into analyst/lounes_pfas_udi_…
LounesAbd Apr 13, 2025
4e781d9
Merge remote-tracking branch 'upstream' into analyst/lounes_pfas_udi_…
LounesAbd Apr 13, 2025
f506731
Merge remote-tracking branch 'upstream' into analyst/lounes_pfas_udi_…
LounesAbd Apr 14, 2025
8fbc680
fix : smalls fixes on model and dbt profile
LounesAbd Apr 14, 2025
2b385ba
feat : added dbt test file for pfas results
LounesAbd Apr 14, 2025
ef0b977
Merge remote-tracking branch 'upstream' into analyst/lounes_pfas_udi_…
LounesAbd Apr 15, 2025
346f2a5
Merge branch 'main' into analyst/lounes_pfas_udi_annuel
jereze Apr 15, 2025
8d344fb
merge tests
jereze Apr 15, 2025
0ac21cb
ajoute test vérification de la couverture des 20 PFAS et 4 PFAS
jereze Apr 15, 2025
b9e49d0
update pfas annuel
jereze Apr 15, 2025
b9eb481
Merge branch 'main' into analyst/lounes_pfas_udi_annuel
jereze Apr 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions dbt_/models/intermediate/pfas/_int__pfas_models.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,56 @@ models:
- name: nb_parametres
description: "Nombre de paramètres analysés"
type: INT

- name: int__resultats_pfas_udi_annuel
description: >
Bilan annuel des prélèvements d’eau potable pour les PFAS à l’échelle des UDI (Unités de distribution d’eau).
Ce modèle agrège les résultats des prélèvements d’une année donnée en identifiant la fréquence de dépassement
de la limite règlementaire, et indique si la limite sanitaire a été depassée au moins une fois ou non.
columns:
- name: cdreseau
description: "Code de l’unité de distribution d’eau (UDI)."
tests:
- not_null

- name: annee
description: "Année du prélèvement (extraite de la colonne 'de_partition')."
type: SMALLINT
tests:
- not_null

- name: categorie
description: "Catégorie du paramètre analysé (ici, toujours 'pfas')."
type: VARCHAR
tests:
- accepted_values:
values: ["pfas"]

- name: periode
description: "Période d’analyse, définie sous la forme 'bilan_annuel_<année>'."
type: VARCHAR
tests:
- not_null
- dbt_utils.expression_is_true:
expression: "LIKE 'bilan_annuel%'"

- name: nb_prelevements
description: "Nombre total de prélèvements effectués dans l’année."
type: INTEGER
tests:
- not_null

- name: ratio_limite_qualite
description: "Ratio des prélèvements avec dépassement de la limite règlementaire (SPFAS >= 0.1 µg/L)."
type: FLOAT
tests:
- not_null
- dbt_expectations.expect_column_values_to_be_between:
min_value: 0
max_value: 1

- name: nb_sup_valeur_sanitaire
description: "Indique le nombre de dépassement de limite sanitaire observé dans l'année."
type: INTEGER
tests:
- not_null
74 changes: 74 additions & 0 deletions dbt_/models/intermediate/pfas/int__resultats_pfas_udi_annuel.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
WITH
pfas_prels AS (
SELECT DISTINCT
de_partition AS annee,
cdreseau,
referenceprel,
datetimeprel,
cdparametresiseeaux,
limite_qualite,
valeur_sanitaire_1,
valtraduite
FROM
{{ ref('int__resultats_udi_communes') }}
WHERE
categorie = 'pfas'
),

-- 1 : Agrégation des résultats en une seule ligne par prélèvement / udi / année
pfas_results_udi_agg AS (
SELECT
referenceprel,
cdreseau,
annee,
-- La somme des 20 PFAS est disponible comme un paramètre (SPFAS)
MAX(
CASE WHEN cdparametresiseeaux = 'SPFAS' THEN valtraduite ELSE 0 END
) AS sum_20_pfas,
COUNT(
DISTINCT CASE
WHEN cdparametresiseeaux = 'SPFAS' THEN referenceprel
END
) AS count_20_pfas,
-- On check si la somme des 20 PFAS est supérieure
-- à la limite reglementaire
MAX(
CASE
WHEN
cdparametresiseeaux = 'SPFAS'
AND limite_qualite IS NOT NULL
AND valtraduite IS NOT NULL
AND valtraduite >= limite_qualite
THEN 1
ELSE 0
END
) AS sum_20_pfas_above_limit,
COUNT(
DISTINCT CASE
WHEN
valeur_sanitaire_1 IS NOT NULL
AND valtraduite IS NOT NULL
AND valtraduite >= valeur_sanitaire_1
THEN cdparametresiseeaux
END
) AS nb_pfas_above_vs
FROM pfas_prels
GROUP BY referenceprel, cdreseau, annee
-- On drop les très rares cas où il n'y a pas la somme des 20 PFAS
HAVING count_20_pfas = 1
)

SELECT
cdreseau,
annee,
'pfas' AS categorie,
'bilan_annuel_' || annee AS periode,
COUNT(DISTINCT referenceprel) AS nb_prelevements,
ROUND((
SUM(CASE WHEN sum_20_pfas_above_limit = 1 THEN 1 ELSE 0 END)
/
COUNT(DISTINCT referenceprel)
), 2) AS ratio_limite_qualite,
SUM(nb_pfas_above_vs) AS nb_sup_valeur_sanitaire
FROM pfas_results_udi_agg
GROUP BY cdreseau, annee
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,12 @@ aggregated_results AS (
-- pour chaquecouple cdreseau/referenceprel
GROUP BY referenceprel, cdreseau
HAVING
-- On vérifie que la somme des 20 PFAS est bien présente (>95% des cas)
-- On vérifie que la somme des 20 PFAS est bien présente,
-- ce qui est quasiment toujours le cas (>98% des cas)
-- cf test de couverture dans test__coverage_20pfas_4pfas_98pct.sql
is_20_pfas = 1
AND
-- On vérifie que la somme des 4 PFAS est bien présente (>95% des cas)
-- Idem pour les 4 PFAS
nb_4_pfas = 4
)

Expand Down
51 changes: 51 additions & 0 deletions dbt_/tests/test__coverage_20pfas_4pfas_98pct.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
-- Dans le calcul des résultats PFAS derniers prélèvements
-- (int__resultats_pfas_udi_dernier.sql), on présuppose que la plupart du temps
-- la somme des 20 PFAS (SPFAS) et la somme des 4 PFAS (PFOA, PFOS, PFNA,
-- PFHXS) sont bien présentes. Ce test permet de vérifier que pour au moins 98%
-- des couples cdreseau/referenceprel c'est le cas.

WITH yearly_pfas_results AS (
SELECT
cdreseau,
referenceprel,
-- Vérifie si la somme des 20 PFAS est disponible
COUNT(
DISTINCT CASE
WHEN cdparametresiseeaux = 'SPFAS' THEN cdparametresiseeaux
END
) AS has_sum_20_pfas,
-- Vérifie si tous les 4 PFAS spécifiques sont disponibles
COUNT(
DISTINCT CASE
WHEN
cdparametresiseeaux IN ('PFOA', 'PFOS', 'PFNA', 'PFHXS')
THEN cdparametresiseeaux
END
) AS count_4_pfas
FROM {{ ref('int__resultats_udi_communes') }}
WHERE
categorie = 'pfas'
AND CURRENT_DATE - datetimeprel < INTERVAL 1 YEAR
GROUP BY cdreseau, referenceprel
)

SELECT

COUNT(*) AS total_aggregations,
-- Pourcentage d'agrégations avec la somme des 20 PFAS présente
ROUND(
(
SUM(CASE WHEN has_sum_20_pfas = 1 THEN 1 ELSE 0 END)
* 100.0
/ COUNT(*)
),
2
) AS pct_with_sum_20_pfas,
-- Pourcentage d'agrégations avec tous les 4 PFAS spécifiques présents
ROUND(
(SUM(CASE WHEN count_4_pfas = 4 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)),
2
) AS pct_with_all_4_pfas
FROM yearly_pfas_results

HAVING pct_with_sum_20_pfas < 98 OR pct_with_all_4_pfas < 98
100 changes: 89 additions & 11 deletions dbt_/tests/test_pfas_results.sql
Original file line number Diff line number Diff line change
@@ -1,29 +1,107 @@
SELECT *
FROM {{ ref('int__resultats_pfas_udi_dernier') }}
-- dernier udi
SELECT
'dernier_prel' AS periode,
cdreseau,
categorie,
resultat,
0 AS ratio_limite_qualite,
0 AS nb_sup_valeur_sanitaire
FROM
{{ ref('int__resultats_pfas_udi_dernier') }}
WHERE
(
-- test n°1
-- test
-- l'UDI 013001457 a un prélevement le 2025-02-19 09:58:00
-- avec un dépassement de valeur sanitaire pour PFOS
cdreseau = '013001457'
AND dernier_prel_datetime = TIMESTAMP '2025-02-19 09:58:00'
AND resultat != 'sup_valeur_sanitaire'
)
OR (
-- test n°2
cdreseau = '003000370'
AND dernier_prel_datetime = TIMESTAMP '2025-02-18 08:45:00'
AND resultat != 'non_quantifie'
)
OR (
-- test n°3
cdreseau = '004001032'
AND dernier_prel_datetime = TIMESTAMP '2025-02-28 12:33:00'
AND resultat != 'somme_20pfas_inf_0_1_et_4pfas_inf_0_02'
)
OR (
-- test n°4
cdreseau = '008000855'
AND dernier_prel_datetime = TIMESTAMP '2025-02-27 09:24:00'
AND resultat != 'sup_valeur_sanitaire'
)
OR
(
cdreseau = '00800107747'
AND dernier_prel_datetime = '2025-02-27 09:24:00'
AND resultat != 'sup_valeur_sanitaire'
)
OR
(
cdreseau = '011004114'
AND dernier_prel_datetime = '2025-02-24 13:55:00'
AND resultat != 'somme_20pfas_sup_0_1'
)
OR
(
cdreseau = '001000404'
AND dernier_prel_datetime = '2024-11-29 08:08:00'
AND resultat != 'somme_20pfas_inf_0_1_et_4pfas_sup_0_02'
)
OR
(
cdreseau = '001000511'
AND dernier_prel_datetime = '2024-11-28 09:58:00'
AND resultat != 'somme_20pfas_inf_0_1_et_4pfas_inf_0_02'
)
OR
(
cdreseau = '003000370'
AND dernier_prel_datetime = TIMESTAMP '2025-02-18 08:45:00'
AND resultat != 'non_quantifie'
)
UNION ALL
-- annuel udi
SELECT
'bilan_annuel' AS periode,
cdreseau,
categorie,
'' AS resultat,
ratio_limite_qualite,
nb_sup_valeur_sanitaire
FROM
{{ ref('int__resultats_pfas_udi_annuel') }}
WHERE
(
cdreseau = '001000356'
AND annee = '2025'
AND
(
ratio_limite_qualite != 0
OR nb_sup_valeur_sanitaire != 0
)
)
OR
(
cdreseau = '074000043'
AND annee = '2022'
AND (
ratio_limite_qualite != 0.1
OR nb_sup_valeur_sanitaire != 2
)
)
OR
(
cdreseau = '030000200'
AND annee = '2024'
AND (
nb_sup_valeur_sanitaire != 0
OR ratio_limite_qualite != 0.25
)
)
OR
(
cdreseau = '069000025'
AND annee IN ('2022', '2023', '2024')
AND (
nb_sup_valeur_sanitaire != 0
OR ratio_limite_qualite != 0
)
)