Ajout 8/1/22 : Contours départements, mise à jour des espaces France Services, mise à jour CNFS
import geopandas as gpd
import pandas as pd
import folium
import os
# Lecture des données de score
dfS = pd.read_csv('./scores_bonus.csv', sep='\t')
print(len(dfS), "données d'indice de fragilité numérique")
display(dfS.head(5))
#Lecture contours de départements
filename = '../data/Contourgeocode/departements.geojson'
geodfDep = gpd.read_file(filename)
geodfDep = geodfDep[geodfDep["code"].isin(["44","72","49", "53", "85"])]
# Lecture des contours de communes
filename = '../data/Contourgeocode/a_com2020_PDL_geojson.json'
geodf = gpd.read_file(filename)
geodf['codgeo'] = geodf['codgeo'].astype('int')
print(len(geodf), "données géographiques de communes")
display(geodf.head(5))
cols = [['p_75+', '+', 'Score +75 ans', 3],
['p_60_74', '+', 'Score 60-74 ans', 2],
['p_15_29', '+', 'Score 15-29ans', 2],
['p_0dipl', '+', 'Score aucun diplome', 3],
['p_faibldipl', '+', 'Score faible dipl', 2],
['MED17', '-', 'Score revenus median faible', 1],
['p_foyer1pers', '+', 'Score familles monoparentales & foyer 1 pers', 2],
['p_ind', '+', "Score d'independants", 1],
['p_empl', '+', "Score d'employés", 1],
['p_ouv', '+', "Score d'ouvriers", 3]]
1238 données d'indice de fragilité numérique
CODGEO | Commune | Département | Environnement Démographique | score | France Services | score_FS | Lieu Mediation | score_LieuMed | score_DoubleBonus | score_60_74 | score_75+ | score_15_29 | score_0dipl | score_faibldipl | score_revmed | score_foyer1 | score_ind | score_empl | score_ouv | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 44001 | Abbaretz | 44 | Bassin Résidentiel | 59.6 | False | 59.6 | True | 54.6 | 54.6 | 28.0 | 30.5 | 29.5 | 40.8 | 37.0 | 78.9 | 46.1 | 13.8 | 34.2 | 38.5 |
1 | 44002 | Aigrefeuille-sur-Maine | 44 | Bassin Urbain | 28.4 | False | 28.4 | False | 28.4 | 28.4 | 25.6 | 17.9 | 27.6 | 24.7 | 30.4 | 44.8 | 38.0 | 13.0 | 42.5 | 29.3 |
2 | 44003 | Ancenis-Saint-Géréon | 44 | Bassin Industriel | 57.9 | True | 47.9 | True | 52.9 | 42.9 | 35.4 | 32.9 | 29.2 | 38.9 | 28.5 | 59.5 | 70.1 | 18.7 | 29.5 | 26.4 |
3 | 44005 | Chaumes-en-Retz | 44 | Bassin Résidentiel | 51.9 | False | 51.9 | False | 51.9 | 51.9 | 26.7 | 24.3 | 30.4 | 27.7 | 41.3 | 62.5 | 48.8 | 28.7 | 34.9 | 39.0 |
4 | 44006 | Assérac | 44 | Bassin Résidentiel | 52.3 | False | 52.3 | True | 47.3 | 47.3 | 41.8 | 25.2 | 17.1 | 26.9 | 42.3 | 70.2 | 55.0 | 49.9 | 35.6 | 24.0 |
1238 données géographiques de communes
codgeo | libgeo | dep | reg | xcl3857 | ycl3857 | xcl4326 | ycl4326 | geometry | |
---|---|---|---|---|---|---|---|---|---|
0 | 44001 | Abbaretz | 44 | 52 | -170515.0 | 6032915 | -1.531762 | 47.553639 | POLYGON ((-1.50351 47.51883, -1.49456 47.51889... |
1 | 44002 | Aigrefeuille-sur-Maine | 44 | 52 | -155646.0 | 5954467 | -1.398192 | 47.075871 | POLYGON ((-1.40422 47.09380, -1.40457 47.09521... |
2 | 44003 | Ancenis-Saint-Géréon | 44 | 52 | -131057.0 | 6001943 | -1.177305 | 47.365528 | POLYGON ((-1.11412 47.36757, -1.10563 47.36987... |
3 | 44005 | Chaumes-en-Retz | 44 | 52 | -216209.0 | 5961041 | -1.942238 | 47.116074 | POLYGON ((-1.99700 47.19757, -1.99383 47.19840... |
4 | 44006 | Assérac | 44 | 52 | -266309.0 | 6012106 | -2.392294 | 47.427328 | POLYGON ((-2.43437 47.41111, -2.42936 47.40980... |
dfS['France Services'].sum()
66
#Réalise carto score global
# Réalise la carte du score de précarité numérique
def choroplethScore():
# Réalise une carte pour une variable
folium.Choropleth(
geo_data=geodf,
name='Score précarité numérique',
data=dfS,
columns=['CODGEO', 'score'],
key_on='feature.properties.codgeo',
fill_color='RdYlBu_r',
fill_opacity=0.8,
line_opacity=0.2,
legend_name='Score précarité numérique',
smooth_factor=0
).add_to(m)
style = {'fillColor': '#00000000', 'color': '#696969', 'weight':1.4}
folium.GeoJson(geodfDep, name="Départements",style_function=lambda x:style).add_to(m)
dfT=dfS[['CODGEO', 'score']]
geodfT=geodf.merge(dfT, left_on='codgeo', right_on='CODGEO')
style_function = lambda x: {'fillColor': '#ffffff', 'color':'#000000', 'fillOpacity': 0.1, 'weight': 0.1}
highlight_function = lambda x: {'fillColor': '#000000', 'color':'#000000', 'fillOpacity': 0.50, 'weight': 0.1}
tooltips = folium.features.GeoJson(
geodfT,
style_function=style_function,
control=False,
highlight_function=highlight_function,
tooltip=folium.features.GeoJsonTooltip(
fields=['libgeo', 'score'],
aliases=['','score' + ":"],
style=("background-color: white; color: #333333; font-family: arial; font-size: 12px; padding: 10px;")
)
)
m.add_child(tooltips)
m.keep_in_front(tooltips)
#folium.LayerControl().add_to(m)
return(m)
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choroplethScore()
ms.save('./maps/score.html')
ms
def choropleth1var(m, variable, legend):
# Réalise une carte pour une variable
folium.Choropleth(
geo_data=geodf,
name=legend,
data=dfS,
columns=['CODGEO', variable],
key_on='feature.properties.codgeo',
fill_color='RdYlBu_r',
fill_opacity=0.8,
line_opacity=0.2,
legend_name=legend,
smooth_factor=0
).add_to(m)
style = {'fillColor': '#00000000', 'color': '#696969', 'weight':1.4}
folium.GeoJson(geodfDep, name="Départements",style_function=lambda x:style).add_to(m)
dfT=dfS[['CODGEO', variable]]
geodfT=geodf.merge(dfT, left_on='codgeo', right_on='CODGEO')
style_function = lambda x: {'fillColor': '#ffffff', 'color':'#000000', 'fillOpacity': 0.1, 'weight': 0.1}
highlight_function = lambda x: {'fillColor': '#000000', 'color':'#000000', 'fillOpacity': 0.50, 'weight': 0.1}
tooltips = folium.features.GeoJson(
geodfT,
style_function=style_function,
control=False,
highlight_function=highlight_function,
tooltip=folium.features.GeoJsonTooltip(
fields=['libgeo', variable],
aliases=['',variable + ":"],
style=("background-color: white; color: #333333; font-family: arial; font-size: 12px; padding: 10px;")
)
)
m.add_child(tooltips)
m.keep_in_front(tooltips)
#folium.LayerControl().add_to(m)
return(m)
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score_ouv', 'Score ')
#ms
# Réalise une carte pour chacun des facteurs
for col in cols:
variable = col[0].replace('p_', 'score_')
if variable == 'MED17':
variable = 'score_revmed'
if variable == 'score_foyer1pers':
variable = 'score_foyer1'
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, variable, col[2].replace("d'", ""))
print(variable, col[2])
ms.save('./maps/map_' + variable.replace('score_', '') + '.html')
score_75+ Score +75 ans score_60_74 Score 60-74 ans score_15_29 Score 15-29ans score_0dipl Score aucun diplome score_faibldipl Score faible dipl score_revmed Score revenus median faible score_foyer1 Score familles monoparentales & foyer 1 pers score_ind Score d'independants score_empl Score d'employés score_ouv Score d'ouvriers
filename = "../data/FranceServices/france_services_add21.07.geojson"
#filename = "../data/FranceServices/france_services.geojson"
geodfFS = gpd.read_file(filename)
len(geodfFS)
#geodfFS
68
from folium.plugins import MarkerCluster
from folium import FeatureGroup, LayerControl, Map, Marker
def addFS(m):
#Ajoute à une carte les clusters de lieu France service
#WARNING: toujours mettre un e
# ajouter les données de carto du hub sur une carte préexistante
filename = "../data/FranceServices/france_services_add21.07.geojson"
geodfFS = gpd.read_file(filename)
feature_group = FeatureGroup(name="Espaces France Services", show=True)
def escape(x):
# Pour affichage du popup
raw = str(x.encode('raw_unicode_escape'))[2:-1]
return raw
icon = folium.features.CustomIcon(icon_image='./template/maisonFS.png',icon_size=(14, 14))
#geodfFS.apply(lambda row:folium.Marker(location=[row["LATITUDE"], row["LONGITUDE"]], icon=folium.Icon( icon_size=(204, 240),color='cadetblue', icon='home', prefix='fa') ,popup=escape(row['lib_france_services'])).add_to(feature_group), axis=1)
#geodfFS.apply(lambda row:folium.Marker(location=[row["LATITUDE"], row["LONGITUDE"]], icon=icon ,popup=escape(row['lib_france_services'])).add_to(feature_group), axis=1)
#Parcours les maison FS
for index, row in geodfFS.iterrows():
icon = folium.features.CustomIcon(icon_image='./template/maisonFS.png',icon_size=(14, 14))
folium.Marker(location=[row["LATITUDE"], row["LONGITUDE"]], icon=icon ,popup=escape(row['lib_france_services'])).add_to(feature_group)
feature_group.add_to(m)
return(m)
# Calcule une carte de score avec les points france service indiqués
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score', u'score precarité numérique')
t = ms
mss = addFS(t)
folium.LayerControl(collapse=False).add_to(mss)
mss.save('./maps/score_fs.html')
mss
#Calcule une carte de score avec bonus france service
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score_FS', u'score precarité numérique bonus France Services')
t = ms
mss = addFS(t)
folium.LayerControl(collapse=False).add_to(mss)
mss.save('./maps/score_bonus_fs.html')
mss
from folium.plugins import MarkerCluster
def addClusterMed(m):
#Ajoute à une carte les clusters de lieu de médiation numérique
#WARNING: toujours mettre un e
# ajouter les données de carto du hub sur une carte préexistante
dfHub = pd.read_csv("../data/CartoHub/Carto HUB-V2.geocoded - export_solidata-210114b.csv")
dfHub = dfHub.dropna(subset=['latitude','longitude'])
#filtrage des coordonnées hors région
#dfHub = dfHub[(dfHub["lat"]<48.5) & (dfHub["lat"]>46.3) & (dfHub['lon']<0.76) & (dfHub['lon']>-2.5)]
marker_cluster = folium.plugins.MarkerCluster(name='Lieux avec médiation numérique').add_to(m)
def escape(x):
# Pour affichage du popup
raw = str(x.encode('raw_unicode_escape'))[2:-1]
return raw
dfHub.apply(lambda row:folium.Marker(location=[row["latitude"], row["longitude"]], popup=escape(row['Nom lieu'])).add_to(marker_cluster), axis=1)
return(m)
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score', u'score precarité numérique')
t = ms
mss = addClusterMed(t)
folium.LayerControl(collapse=False).add_to(mss)
mss.save('./maps/score_lieumed.html')
mss
ms = choropleth1var(m, 'score_LieuMed', u'score precarité numérique bonus Lieu Médiation')
t = ms
mss = addClusterMed(t)
folium.LayerControl(collapse=False).add_to(mss)
mss.save('./maps/score_bonus_lieumed.html')
mss
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score', u'score precarite numerique')
t = ms
mss = addClusterMed(t)
mss = addFS(mss)
folium.LayerControl(collapse=False).add_to(mss)
mss.save('./maps/score_FS_LieuMed.html')
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score_DoubleBonus', u'score precarite numerique bonus Lieu Mediation & France Services')
t = ms
mss = addClusterMed(t)
mss = addFS(mss)
folium.LayerControl(collapse=False).add_to(mss)
mss.save('./maps/score_doublebonus.html')
Fichier donné par le Hub, ce fichier a été modifié manuellement pour ajouter les code communes qui n'étaient pas renseignés https://public.opendatasoft.com/explore/dataset/correspondance-code-insee-code-postal/table/?flg=fr&q=49170
# NoOuvelle version mise à jour en décembre 2021 fichier 20211206_CNFS validés par le coselec.ods" extraction de la première feuille au format csv utf8
dfCNFS = pd.read_csv("../data/FranceServices/20211206_CNFS.csv")
dfCNFS = dfCNFS.groupby('Code commune')['Nombre de conseillers validés par le COSELEC'].sum().to_frame()
dfCNFS= dfCNFS[dfCNFS['Nombre de conseillers validés par le COSELEC'] != 0]
dfCNFS.columns = ['Nombre de Conseillers numérique France Service']
# création d'un geodf avec les centroid des codegeo
tmp = geodf.copy()
tmp.geometry = tmp.geometry.centroid
geodfCNFS = dfCNFS.merge(tmp, left_on='Code commune', right_on='codgeo')
geodfCNFS
m = folium.Map(location=[47.4791129516, -0.814151724722], zoom_start=8, tiles='OpenStreetMap', max_bounds=True)
ms = choropleth1var(m, 'score', u'score precarite numerique')
t = ms
for _, r in geodfCNFS.iterrows():
lat = r['geometry'].y
lon = r['geometry'].x
folium.CircleMarker(location=[lat, lon], radius=12, color='grey', opacity=0.5).add_to(t)
dizaine = r['Nombre de Conseillers numérique France Service']/10.0
if dizaine < 1:
folium.Marker(location=[lat, lon],icon=folium.DivIcon( icon_anchor=(5,12),html='<div style="font-size: 12pt; color : black">{}</div>'.format(r['Nombre de Conseillers numérique France Service']))).add_to(t)
else:
folium.Marker(location=[lat, lon],icon=folium.DivIcon( icon_anchor=(10,12),html='<div style="font-size: 12pt; color : black">{}</div>'.format(r['Nombre de Conseillers numérique France Service']))).add_to(t)
t.save('./maps/score_CNFS.html')
t