# Imports des modules nécessaires à l'execution du notebook import requests import pandas as pd import plotly.express as px import folium import plotly.io as pio pio.renderers.default = "notebook" BASE_URL_API = "https://apidf-preprod.cerema.fr" def apidf(url_endpoint, token=None): HEADERS = { "Content-Type": "application/json", } if token: HEADERS["Authorization"] = "Token " + token response = requests.get( url_endpoint, headers=HEADERS, ) if response.status_code == 200: return response.json() return None # Paramétrage du endpoint code_insee, nom = "59512", "Roubaix" url = BASE_URL_API + f"/indicateurs/dv3f/communes/annuel/{code_insee}" # Interrogation de l'API et récupération d'un dataframe response = apidf(url) indicateurs = pd.DataFrame.from_dict(response["results"]) # Edition du graphique fig = px.bar(indicateurs, x='annee', y=['nbtrans_cod111', 'nbtrans_cod121'], title = f"Evolution annuelle du nombre de ventes de logements individuels à {nom}", labels={"annee" : "Année de mutation", "value" : "Nombre de ventes",}, ) noms={"nbtrans_cod111": "Maison individuelle", "nbtrans_cod121": "Appartement individuel"} fig.update_layout(legend_title_text="Nombre de ventes") fig.for_each_trace(lambda t: t.update(hovertemplate = t.hovertemplate.replace(t.name, noms[t.name]), name=noms[t.name])) fig.show() # Paramétrage du endpoint code_insee, nom = "243300316", "Bordeaux Métropole" url = BASE_URL_API + f"/indicateurs/dv3f/epci/annuel/{code_insee}" # Interrogation de l'API et récupération d'un dataframe response = apidf(url) indicateurs = pd.DataFrame.from_dict(response["results"]) # Edition du graphique fig = px.line(indicateurs, x='annee', y=['pxm2_median_mmx', 'pxm2_median_amx'], title = f"Evolution annuelle du prix médian des logements sur {nom}", range_y=[0, 5500], labels={"annee" : "Année de mutation", "value" : "Prix en €/m2",}, ) noms={"pxm2_median_mmx": "Maison moyenne (entre 90 et 130 m2)", "pxm2_median_amx": "Appartement ancien (T3 et T4)"} fig.update_layout(legend_title_text="Prix médian au mètre carré") fig.for_each_trace(lambda t: t.update(hovertemplate = t.hovertemplate.replace(t.name, noms[t.name]), name=noms[t.name])) fig.show() # Paramétrage du endpoint code_insee, nom = "76540", "Rouen" url = BASE_URL_API + f"/indicateurs/conso_espace/communes/{code_insee}" # Interrogation de l'API et récupération d'un dataframe response = apidf(url) indicateurs = pd.DataFrame.from_dict(response["results"]) # Edition du graphique fig = px.bar(indicateurs, x='annee', y=['naf_arti', "conso_hab", "conso_act",], title = f"Evolution annuelle de la consommation d'espaces à {nom}", labels={"annee" : "Année", "value" : "Surface (m2)",}, barmode = "group", ) noms={"naf_arti": "totale", "conso_act": "liée à l'activité", "conso_hab": "liée à l'habitat"} fig.update_layout(legend_title_text="Consommation d'espaces") fig.for_each_trace(lambda t: t.update(hovertemplate = t.hovertemplate.replace(t.name, noms[t.name]), name=noms[t.name])) fig.show() # centre de la carte et x, y = -0.31569, 49.2853 delta_x, delta_y = 0.007, 0.007 # définition de la bbox x1 = x - delta_x y1 = y - delta_y x2 = x + delta_x y2 = y + delta_y # creation de la carte m = folium.Map(location=[y, x], zoom_start=16) url = BASE_URL_API + f"/dvf_opendata/geomutations/?in_bbox={x1},{y1},{x2},{y2}&page_size=1000" # ajout d'une couche geojson pour chaque page de données while True: response = apidf(url) folium.GeoJson(response, name="mutations", popup=folium.GeoJsonPopup(fields=["libtypbien", "datemut", "valeurfonc", "sbati", "sterr"]),).add_to(m) if not response["next"]: break url = response["next"] m # Paramétrage du endpoint code_insee, nom = "59646", "Wasquehal" url = BASE_URL_API + f"/dvf_opendata/mutations/?code_insee={code_insee}&page_size=1000&anneemut_min=2018&codtypbien=111" # Interrogation de l'API pour récupérer les pages de mutations pages = [] while True: response = apidf(url) mutations = pd.DataFrame.from_dict(response["results"]) pages.append(mutations) if not response["next"]: break url = response["next"] # concaténation des pages et affichage graphique mutations = pd.concat(pages) mutations["valeurfonc"] = mutations["valeurfonc"].astype(float) fig = px.violin(mutations, y="valeurfonc", x="anneemut", color="anneemut", box=True, title = f"Distribution annuelle des prix des ventes de maison à partir de 2018 à {nom}", labels={"annee" : "Année", "valeurfonc" : "Prix en €",},) fig.update_layout(legend_title_text="Année de mutation") fig.show()