Open data DPE et Audit énergétique

Bases des diagnostics de performance énergétique (DPE) et des audits énergétiques réglementaires, anonymisées, interrogeables en SQL avec DuckDB depuis DBeaver, la ligne de commande ou Python. Aucun compte ni clé n'est nécessaire.

1. Mise en place (une seule fois)

Les lignes SQL à exécuter, quel que soit l'outil, dans une base nommée opendata.duckdb :

ATTACH 'https://s3.fr-par.scw.cloud/prod-dpe-opendata/audit/audit.duckdb' AS src_audit (READ_ONLY);
ATTACH 'https://s3.fr-par.scw.cloud/prod-dpe-opendata/dpe/dpe.duckdb' AS src_dpe (READ_ONLY);
COPY FROM DATABASE src_audit TO opendata;
COPY FROM DATABASE src_dpe TO opendata;
DETACH DATABASE IF EXISTS src_audit;
DETACH DATABASE IF EXISTS src_dpe;

Avec DBeaver

  1. Menu Base de données > Nouvelle connexion > DuckDB > Suivant.
  2. À droite du champ Path, cliquer sur Create ..., choisir un dossier et saisir le nom du fichier : opendata.duckdb.
  3. Accepter le téléchargement du pilote DuckDB s'il est proposé, puis Terminer.
  4. Clic droit sur la connexion > Editeur SQL > Script SQL.
  5. Coller les lignes ci-dessus, puis cliquer sur Exécuter le script SQL dans la barre d'outils de l'éditeur.
  6. Clic droit sur la connexion > Rafraîchir. Les tables apparaissent dans main > Vues.

En ligne de commande

Installer DuckDB : duckdb.org/docs/installation, puis ouvrir la base et coller les lignes ci-dessus :

duckdb opendata.duckdb

En Python

pip install duckdb
import duckdb

con = duckdb.connect("opendata.duckdb")
for base in ("audit", "dpe"):
    con.execute(f"ATTACH 'https://s3.fr-par.scw.cloud/prod-dpe-opendata/{base}/{base}.duckdb' AS src_{base} (READ_ONLY)")
    con.execute(f"COPY FROM DATABASE src_{base} TO opendata")
    con.execute(f"DETACH DATABASE IF EXISTS src_{base}")

2. Interroger

Les tables s'interrogent comme dans une base classique. Sélectionner les colonnes utiles plutôt que SELECT *.

DPE

-- nombre de DPE par département
SELECT ban_departement, count(*) AS dpe
FROM dpe_t_adresse
GROUP BY 1 ORDER BY 2 DESC;

-- nombre de DPE par énergie de chauffage principale
SELECT e.lib AS energie_chauffage, count(*) AS dpe
FROM dpe d
JOIN dpe_enum_type_energie e ON e.id = d.enum_type_energie_chauffage_principal_id
GROUP BY 1 ORDER BY 2 DESC;

Audit énergétique

-- nombre d'audits par année d'établissement
SELECT year(date_etablissement_audit) AS annee, count(*) AS audits
FROM audit
GROUP BY 1 ORDER BY 1;

-- jointure avec un référentiel
SELECT e.lib AS derogation, count(*) AS audits
FROM audit_administratif a
JOIN audit_enum_derogation_technique e ON e.id = a.enum_derogation_technique_id
GROUP BY 1 ORDER BY 2 DESC;

Les tables *_enum_* et *_tv_* sont les référentiels : elles donnent le libellé des codes utilisés dans les autres tables.

Si de nouvelles tables apparaissent : fermer la connexion, supprimer le fichier opendata.duckdb, puis refaire la mise en place.

3. Vérifier que tout fonctionne

SELECT count(*) FROM audit;   -- nombre d'audits publiés
SELECT count(*) FROM dpe;     -- nombre de DPE publiés