Exemples sur DVF+ open-data¶
In [1]:
Copied!
import plotly.io as pio
import plotly.express as px
import folium
from folium.plugins import HeatMap
from apifoncier import ApiFoncierClient
pio.renderers.default = "notebook"
import plotly.io as pio
import plotly.express as px
import folium
from folium.plugins import HeatMap
from apifoncier import ApiFoncierClient
pio.renderers.default = "notebook"
Distribution des ventes de maison sur une commune¶
In [3]:
Copied!
# Interroger les mutations de DVF pour les maisons (codtypbien=111)
# à partir de 2017 dans la commune de Wasquehal (59646)
client = ApiFoncierClient(
{"progress_bar": False, "base_url": "https://apidf.k8-dev.cerema.fr"}
)
mutations = client.dvf_opendata.mutations(
code_insee="59646", anneemut_min=2020, codtypbien="111", valeurfonc_max=1000000
)
mutations["valeurfonc"] = mutations["valeurfonc"].astype(float)
# Graphique de la distribution annuelle des prix
fig = px.violin(
mutations,
y="valeurfonc",
x="anneemut",
color="anneemut",
box=True,
title=f"Distribution annuelle des prix des ventes de maison à partir de 2017",
labels={
"annee": "Année",
"valeurfonc": "Prix en €",
},
)
fig.update_layout(legend_title_text="Année de mutation")
fig.show()
# Interroger les mutations de DVF pour les maisons (codtypbien=111)
# à partir de 2017 dans la commune de Wasquehal (59646)
client = ApiFoncierClient(
{"progress_bar": False, "base_url": "https://apidf.k8-dev.cerema.fr"}
)
mutations = client.dvf_opendata.mutations(
code_insee="59646", anneemut_min=2020, codtypbien="111", valeurfonc_max=1000000
)
mutations["valeurfonc"] = mutations["valeurfonc"].astype(float)
# Graphique de la distribution annuelle des prix
fig = px.violin(
mutations,
y="valeurfonc",
x="anneemut",
color="anneemut",
box=True,
title=f"Distribution annuelle des prix des ventes de maison à partir de 2017",
labels={
"annee": "Année",
"valeurfonc": "Prix en €",
},
)
fig.update_layout(legend_title_text="Année de mutation")
fig.show()
Carte de chaleur des ventes de maisons¶
In [3]:
Copied!
# On sélectionne les ventes de maisons après 2017
geomutations = client.dvf_opendata.geomutations(
codes_insee=["62826", "62261"], codtypbien="111", anneemut_min=2017
)
# On sélectionne les ventes de maisons après 2017
geomutations = client.dvf_opendata.geomutations(
codes_insee=["62826", "62261"], codtypbien="111", anneemut_min=2017
)
In [4]:
Copied!
geomutations["centroid"] = geomutations["geometry"].centroid
geomutations["lon"] = geomutations["centroid"].x
geomutations["lat"] = geomutations["centroid"].y
geomutations["centroid"] = geomutations["geometry"].centroid
geomutations["lon"] = geomutations["centroid"].x
geomutations["lat"] = geomutations["centroid"].y
In [5]:
Copied!
heat_df = geomutations.loc[:, ["lat", "lon", "valeurfonc"]]
heat_df = heat_df.dropna()
heat_df["valeurfonc"] = heat_df["valeurfonc"].astype(float)
heat_data = heat_df.values.tolist()
map = folium.Map(location=[50.5335, 1.60724], zoom_start=13)
HeatMap(heat_data, radius=14, max_zoom=15).add_to(map)
map
heat_df = geomutations.loc[:, ["lat", "lon", "valeurfonc"]]
heat_df = heat_df.dropna()
heat_df["valeurfonc"] = heat_df["valeurfonc"].astype(float)
heat_data = heat_df.values.tolist()
map = folium.Map(location=[50.5335, 1.60724], zoom_start=13)
HeatMap(heat_data, radius=14, max_zoom=15).add_to(map)
map
Out[5]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Mutations de foncier nu¶
In [6]:
Copied!
# On récupère les mutations de foncier nu de plus de 1ha sur Lille
gdf = client.dvf_opendata.geomutations(
code_insee="59350", codtypbien="2", sterr_min=10000
)
map = folium.Map(location=[50.63, 3.075], zoom_start=13)
folium.GeoJson(
gdf.to_json(),
popup=folium.GeoJsonPopup(
fields=("sterr", "valeurfonc"), aliases=("Surface (m2)", "Valeur foncière (€)")
),
).add_to(map)
map
# On récupère les mutations de foncier nu de plus de 1ha sur Lille
gdf = client.dvf_opendata.geomutations(
code_insee="59350", codtypbien="2", sterr_min=10000
)
map = folium.Map(location=[50.63, 3.075], zoom_start=13)
folium.GeoJson(
gdf.to_json(),
popup=folium.GeoJsonPopup(
fields=("sterr", "valeurfonc"), aliases=("Surface (m2)", "Valeur foncière (€)")
),
).add_to(map)
map
Out[6]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Distribution des prix de logements¶
In [33]:
Copied!
# On récupère les mutations de maison et d'appartement en 2024 à Lille
# avec une valeur foncière inférieure à 1M€
df = client.dvf_opendata.mutations(
code_insee="59350", codtypbien="111,121", anneemut=2024, valeurfonc_max=1000000
)
df["valeurfonc"] = df["valeurfonc"].astype(float)
df["sbati"] = df["sbati"].astype(float)
df["prix_m2"] = df["valeurfonc"] / df["sbati"]
df = df[(df["prix_m2"] < 9000) & (df["prix_m2"] > 500)]
fig = px.histogram(
df,
x="prix_m2",
title="Distribution des valeurs au m² des ventes de maison et d'appartement à Lille en 2024",
color="libtypbien",
nbins=100,
opacity=0.7,
labels={"prix_m2": "Prix au m² (€/m²)", "count": "Nombre de ventes"},
marginal="box",
)
fig.update_layout(legend_title_text="Type de bien")
fig.show()
# On récupère les mutations de maison et d'appartement en 2024 à Lille
# avec une valeur foncière inférieure à 1M€
df = client.dvf_opendata.mutations(
code_insee="59350", codtypbien="111,121", anneemut=2024, valeurfonc_max=1000000
)
df["valeurfonc"] = df["valeurfonc"].astype(float)
df["sbati"] = df["sbati"].astype(float)
df["prix_m2"] = df["valeurfonc"] / df["sbati"]
df = df[(df["prix_m2"] < 9000) & (df["prix_m2"] > 500)]
fig = px.histogram(
df,
x="prix_m2",
title="Distribution des valeurs au m² des ventes de maison et d'appartement à Lille en 2024",
color="libtypbien",
nbins=100,
opacity=0.7,
labels={"prix_m2": "Prix au m² (€/m²)", "count": "Nombre de ventes"},
marginal="box",
)
fig.update_layout(legend_title_text="Type de bien")
fig.show()