Exemples sur Indicateurs de marché¶
In [ ]:
Copied!
import requests
import pandas as pd
import plotly.io as pio
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
import folium
import branca
from apifoncier import ApiFoncierClient
pio.renderers.default = "notebook"
client = ApiFoncierClient(
{"progress_bar": False, "base_url": "https://apidf.k8-dev.cerema.fr/"}
)
import requests
import pandas as pd
import plotly.io as pio
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
import folium
import branca
from apifoncier import ApiFoncierClient
pio.renderers.default = "notebook"
client = ApiFoncierClient(
{"progress_bar": False, "base_url": "https://apidf.k8-dev.cerema.fr/"}
)
Evolution des prix et des volumes de transactions¶
In [ ]:
Copied!
df = client.indicateurs.prix(codes="59646", echelle="communes")
fig = make_subplots(specs=[[{"secondary_y": True}]])
palette = ["indianred", "lightsalmon"]
# Ajout des barres de nombre de transaction
fig.add_trace(
go.Bar(
x=df["annee"],
y=df["nbtrans_cod1113"],
name="Maisons anciennes",
marker_color=palette[0],
opacity=0.7,
),
secondary_y=False,
)
fig.add_trace(
go.Bar(
x=df["annee"],
y=df["nbtrans_cod1213"],
name="Appartements anciens",
marker_color=palette[1],
opacity=0.7,
),
secondary_y=False,
)
# Ajout des courbes de prix médian
fig.add_trace(
go.Scatter(
x=df["annee"],
y=df["pxm2_median_cod1113"],
mode="lines",
name="Maisons anciennes",
line=dict(color=palette[0]),
),
secondary_y=True,
)
fig.add_trace(
go.Scatter(
x=df["annee"],
y=df["pxm2_median_cod1213"],
mode="lines",
name="Appartements anciens",
line=dict(color=palette[1]),
),
secondary_y=True,
)
# Mise à jour de la mise en page du graphique
fig.update_layout(
title="Évolution annuelle des prix médian et du nombre de transaction (Wasquehal)",
xaxis_title="Année",
yaxis_title="Nombre de ventes",
yaxis2=dict(title="Prix médian au m2", overlaying="y", side="right"),
)
fig.show()
df = client.indicateurs.prix(codes="59646", echelle="communes")
fig = make_subplots(specs=[[{"secondary_y": True}]])
palette = ["indianred", "lightsalmon"]
# Ajout des barres de nombre de transaction
fig.add_trace(
go.Bar(
x=df["annee"],
y=df["nbtrans_cod1113"],
name="Maisons anciennes",
marker_color=palette[0],
opacity=0.7,
),
secondary_y=False,
)
fig.add_trace(
go.Bar(
x=df["annee"],
y=df["nbtrans_cod1213"],
name="Appartements anciens",
marker_color=palette[1],
opacity=0.7,
),
secondary_y=False,
)
# Ajout des courbes de prix médian
fig.add_trace(
go.Scatter(
x=df["annee"],
y=df["pxm2_median_cod1113"],
mode="lines",
name="Maisons anciennes",
line=dict(color=palette[0]),
),
secondary_y=True,
)
fig.add_trace(
go.Scatter(
x=df["annee"],
y=df["pxm2_median_cod1213"],
mode="lines",
name="Appartements anciens",
line=dict(color=palette[1]),
),
secondary_y=True,
)
# Mise à jour de la mise en page du graphique
fig.update_layout(
title="Évolution annuelle des prix médian et du nombre de transaction (Wasquehal)",
xaxis_title="Année",
yaxis_title="Nombre de ventes",
yaxis2=dict(title="Prix médian au m2", overlaying="y", side="right"),
)
fig.show()
Carte communale à l'échelle d'un EPCI¶
In [111]:
Copied!
# On définit l'EPCI et on récupère les contours des communes qui la compose
EPCI = "243500139"
communes = requests.get(
f"https://geo.api.gouv.fr/epcis/{EPCI}/communes/?format=geojson&geometry=contour"
).json()
# On choisit un indicateur de prix
indicateur, titre = "valeurfonc_median_mmx", "Maisons - surface entre 90 et 130 m2 "
mini, maxi = 99999999, 0
# Ajout de l'indicateur pour chaque contour de communes
for i, comm in enumerate(communes["features"]):
code = comm["properties"]["code"]
nom = comm["properties"]["nom"]
# print(nom, str(i + 1) + "/" + str(len(communes["features"])))
response = client.indicateurs.prix(
codes=code, echelle="communes", type_prix="triennal", annee="2019"
)
if not response.empty:
value = response[indicateur].values[0] or 0
comm["properties"][indicateur] = value
if value > 0:
if value < mini:
mini = value
if value > maxi:
maxi = value
centre_x, centre_y = (
comm["geometry"]["coordinates"][0][0][0],
comm["geometry"]["coordinates"][0][0][1],
)
# Génération de la carte
colorscale = branca.colormap.linear.YlOrRd_09.scale(mini, maxi)
colorscale.caption = "Prix médian (€) communal entre 2019 et 2021"
def style_function(feature):
value = feature["properties"][indicateur]
return {
"fillOpacity": 0.8,
"weight": 1,
"fillColor": colorscale(int(value)) if value > 0 else "lightgray",
"color": "darkgray",
}
m = folium.Map(location=[centre_y, centre_x], zoom_start=9)
folium.GeoJson(
communes,
name=titre,
style_function=style_function,
popup=folium.GeoJsonPopup(
fields=["nom", indicateur], aliases=["nom", "Prix median"]
),
).add_to(m)
colorscale.add_to(m)
m
# On définit l'EPCI et on récupère les contours des communes qui la compose
EPCI = "243500139"
communes = requests.get(
f"https://geo.api.gouv.fr/epcis/{EPCI}/communes/?format=geojson&geometry=contour"
).json()
# On choisit un indicateur de prix
indicateur, titre = "valeurfonc_median_mmx", "Maisons - surface entre 90 et 130 m2 "
mini, maxi = 99999999, 0
# Ajout de l'indicateur pour chaque contour de communes
for i, comm in enumerate(communes["features"]):
code = comm["properties"]["code"]
nom = comm["properties"]["nom"]
# print(nom, str(i + 1) + "/" + str(len(communes["features"])))
response = client.indicateurs.prix(
codes=code, echelle="communes", type_prix="triennal", annee="2019"
)
if not response.empty:
value = response[indicateur].values[0] or 0
comm["properties"][indicateur] = value
if value > 0:
if value < mini:
mini = value
if value > maxi:
maxi = value
centre_x, centre_y = (
comm["geometry"]["coordinates"][0][0][0],
comm["geometry"]["coordinates"][0][0][1],
)
# Génération de la carte
colorscale = branca.colormap.linear.YlOrRd_09.scale(mini, maxi)
colorscale.caption = "Prix médian (€) communal entre 2019 et 2021"
def style_function(feature):
value = feature["properties"][indicateur]
return {
"fillOpacity": 0.8,
"weight": 1,
"fillColor": colorscale(int(value)) if value > 0 else "lightgray",
"color": "darkgray",
}
m = folium.Map(location=[centre_y, centre_x], zoom_start=9)
folium.GeoJson(
communes,
name=titre,
style_function=style_function,
popup=folium.GeoJsonPopup(
fields=["nom", indicateur], aliases=["nom", "Prix median"]
),
).add_to(m)
colorscale.add_to(m)
m
Out[111]:
Make this Notebook Trusted to load map: File -> Trust Notebook
Accessibilité financière¶
In [ ]:
Copied!
dfs = []
for aav in ["002", "003", "004", "005", "006", "008", "012"]:
df = client.indicateurs.accessibilite(codes_aav=aav, annee="2023")
df = df[["libelle", "codgeo", "libgeo", "d5_cod1113", "d5"]].astype(
{"d5_cod1113": "float", "d5": "float"}
)
dfs.append(df[["libelle", "codgeo", "libgeo", "d5_cod1113", "d5"]])
result = pd.concat(dfs, ignore_index=True)
palette = [
"rgba(93, 164, 214, 0.5)", # bleu
"rgba(255, 144, 14, 0.5)", # orange
"rgba(44, 160, 101, 0.5)", # vert
"rgba(255, 65, 54, 0.5)", # rouge
"rgba(207, 114, 255, 0.5)", # violet
"rgba(127, 96, 0, 0.5)", # brun
"rgba(100, 100, 100, 0.5)", # gris
]
fig = go.Figure()
for (libelle, subset), color in zip(result.groupby("libelle"), palette):
fig.add_trace(
go.Box(
y=subset["d5_cod1113"],
name=libelle,
boxpoints="all",
jitter=0.5,
whiskerwidth=0.2,
fillcolor=color,
marker=dict(size=3, opacity=0.7),
line=dict(width=1),
hovertext=subset["libgeo"],
hoverinfo="text+y",
)
)
fig.update_layout(
title=dict(text="Année de revenu nécessaires pour acheter une maison ancienne"),
yaxis=dict(
title="Années de revenu nécessaires",
autorange=True,
showgrid=True,
zeroline=True,
dtick=5,
gridcolor="rgb(255, 255, 255)",
gridwidth=1,
zerolinecolor="rgb(255, 255, 255)",
zerolinewidth=2,
),
xaxis=dict(title="Aire d'Attraction de la Ville (AAV)"),
margin=dict(l=40, r=30, b=80, t=100),
paper_bgcolor="rgb(243, 243, 243)",
plot_bgcolor="rgb(243, 243, 243)",
showlegend=False,
)
fig.show()
dfs = []
for aav in ["002", "003", "004", "005", "006", "008", "012"]:
df = client.indicateurs.accessibilite(codes_aav=aav, annee="2023")
df = df[["libelle", "codgeo", "libgeo", "d5_cod1113", "d5"]].astype(
{"d5_cod1113": "float", "d5": "float"}
)
dfs.append(df[["libelle", "codgeo", "libgeo", "d5_cod1113", "d5"]])
result = pd.concat(dfs, ignore_index=True)
palette = [
"rgba(93, 164, 214, 0.5)", # bleu
"rgba(255, 144, 14, 0.5)", # orange
"rgba(44, 160, 101, 0.5)", # vert
"rgba(255, 65, 54, 0.5)", # rouge
"rgba(207, 114, 255, 0.5)", # violet
"rgba(127, 96, 0, 0.5)", # brun
"rgba(100, 100, 100, 0.5)", # gris
]
fig = go.Figure()
for (libelle, subset), color in zip(result.groupby("libelle"), palette):
fig.add_trace(
go.Box(
y=subset["d5_cod1113"],
name=libelle,
boxpoints="all",
jitter=0.5,
whiskerwidth=0.2,
fillcolor=color,
marker=dict(size=3, opacity=0.7),
line=dict(width=1),
hovertext=subset["libgeo"],
hoverinfo="text+y",
)
)
fig.update_layout(
title=dict(text="Année de revenu nécessaires pour acheter une maison ancienne"),
yaxis=dict(
title="Années de revenu nécessaires",
autorange=True,
showgrid=True,
zeroline=True,
dtick=5,
gridcolor="rgb(255, 255, 255)",
gridwidth=1,
zerolinecolor="rgb(255, 255, 255)",
zerolinewidth=2,
),
xaxis=dict(title="Aire d'Attraction de la Ville (AAV)"),
margin=dict(l=40, r=30, b=80, t=100),
paper_bgcolor="rgb(243, 243, 243)",
plot_bgcolor="rgb(243, 243, 243)",
showlegend=False,
)
fig.show()
C:\Users\antoine.herman\Documents\dev\apifoncier\apifoncier\endpoints\base.py:158: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.