Étude GeoCity — Bordeaux, appartements et dépendances, millésime DVF 2025 Source : DVF géolocalisées, dérivées des données DGFiP et diffusées par Etalab. Fichier figé : https://files.data.gouv.fr/geo-dvf/2025-12/csv/2025/communes/33/33063.csv SHA-256 du fichier CSV : db2ad0e849169489aabdf949b0651cbb74691de4b3a05837a548b1031707a262 Périmètre : commune INSEE 33063 (Bordeaux), dates de mutation en 2025. Pour reproduire : téléchargez le fichier CSV ci-dessus. Sauvegardez le code ci-dessous dans etude.py, puis lancez : python3 etude.py 33063.csv Python 3, bibliothèque standard uniquement. Aucune adresse individuelle n'est publiée dans l'étude. --- Début du code Python --- import csv import hashlib import sys from collections import defaultdict from pathlib import Path EXPECTED_SHA256 = "db2ad0e849169489aabdf949b0651cbb74691de4b3a05837a548b1031707a262" path = Path(sys.argv[1]) digest = hashlib.sha256(path.read_bytes()).hexdigest() if digest != EXPECTED_SHA256: raise SystemExit("Fichier différent de l'édition étudiée : " + digest) groups = defaultdict(list) with path.open(encoding="utf-8-sig", newline="") as source: for row in csv.DictReader(source): if row["code_commune"] != "33063" or not row["date_mutation"].startswith("2025-"): raise SystemExit("Commune ou millésime inattendu") groups[(row["id_mutation"], row["numero_disposition"])].append(row) selected = with_dependance = without_dependance = 0 for rows in groups.values(): if rows[0]["nature_mutation"] != "Vente": continue if len({(row["date_mutation"], row["valeur_fonciere"]) for row in rows}) != 1: continue apartments = [row for row in rows if row["type_local"] == "Appartement"] other_built = any( row["type_local"] in ("Maison", "Local industriel. commercial ou assimilé") for row in rows ) if len(apartments) != 1 or other_built: continue try: area = float(apartments[0]["surface_reelle_bati"]) price = float(rows[0]["valeur_fonciere"]) except ValueError: continue if area <= 0 or price <= 0: continue selected += 1 if any(row["type_local"] == "Dépendance" for row in rows): with_dependance += 1 else: without_dependance += 1 assert (selected, with_dependance, without_dependance) == (3421, 2151, 1270) print(f"{selected} dispositions retenues") print(f"{with_dependance} avec au moins une ligne dépendance") print(f"{without_dependance} sans ligne dépendance") print(f"{with_dependance / selected:.1%} avec dépendance") --- Fin du code Python --- Interprétation : l'unité est la disposition, groupée par identifiant de mutation Etalab et numéro de disposition. Cette sélection exclut notamment les mutations contenant plusieurs lignes « Appartement » : le résultat ne décrit donc pas toutes les ventes d'appartements à Bordeaux. « Dépendance » n'identifie pas à elle seule sa nature (parking, cave, autre) ni sa valeur. Une ligne manquante n'est pas la preuve qu'aucune dépendance existe dans la réalité. Les actes absents du fichier ou sa couverture imparfaite échappent au calcul. Il n'est pas permis d'attribuer une fraction du prix de vente à la dépendance à partir de ce seul fichier.