Prétraitement des données IRIS.
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Les données carrroyées sont disponibles à l'adresse suivante Données carroyées à 200m sur la population sous la forme de shapefile. On suppose que les données ont été téléchargées et décompressées. Le code suivant montre comme les lire. Ces données ne contiennent que les données de populations de 2010.
import pandas
carr = pandas.read_csv("c:/temp/insee/carroyage_insee_metro.csv")
carr.head()
WKT | idINSPIRE | id | idk | ind_c | nbcar | men | men_surf | men_occ5 | men_coll | ... | ind_age2 | ind_age3 | ind_age4 | ind_age5 | ind_age6 | ind_age7 | i_age7 | ind_age8 | i_age8 | ind_srf | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | POLYGON((2.6529953850426 46.440123156379,2.655... | CRS3035RES200mN2619600E3756800 | LAEA200M_N13098E18784 | N13090E18781-N13103E18788 | 4.0 | 13 | 24 | 2353 | 19 | 0 | ... | 3.0 | 2.0 | 1.0 | 2.5 | 45.0 | 11.0 | 0 | 9.0 | 0 | 1083644 |
1 | POLYGON((6.679135345427 46.191522591301,6.6817... | CRS3035RES200mN2569800E4064400 | LAEA200M_N12849E20322 | N12849E20321-N12849E20324 | 1.0 | 4 | 15 | 1162 | 5 | 7 | ... | 0.0 | 2.0 | 1.0 | 2.5 | 28.0 | 3.0 | 0 | 3.0 | 0 | 725512 |
2 | POLYGON((-1.9122518974954 48.142412902797,-1.9... | CRS3035RES200mN2852200E3438400 | LAEA200M_N14261E17192 | N14258E17191-N14261E17194 | 8.0 | 5 | 26 | 2866 | 19 | 0 | ... | 2.0 | 2.0 | 3.0 | 4.5 | 47.0 | 13.0 | 0 | 5.0 | 0 | 1384589 |
3 | POLYGON((3.2312378220814 46.926350456766,3.233... | CRS3035RES200mN2669200E3805800 | LAEA200M_N13346E19029 | N13345E19029-N13347E19031 | 6.0 | 5 | 28 | 2427 | 15 | 4 | ... | 1.0 | 2.0 | 3.0 | 8.5 | 49.0 | 12.0 | 0 | 7.0 | 0 | 1308697 |
4 | POLYGON((6.6327096470269 47.992073373622,6.635... | CRS3035RES200mN2769800E4069600 | LAEA200M_N13849E20348 | N13845E20348-N13849E20351 | 32.5 | 8 | 28 | 3244 | 17 | 5 | ... | 1.0 | 3.0 | 2.0 | 1.5 | 46.0 | 13.0 | 0 | 5.0 | 0 | 1517997 |
5 rows × 29 columns
On convertit le dataframe en geodataframe.
import geopandas as gpd
import shapely.wkt
geometry = carr['WKT'].map(shapely.wkt.loads)
carr = carr.drop('WKT', axis=1)
crs = {'init': 'epsg:4326'}
gcarr = gpd.GeoDataFrame(carr, crs=crs, geometry=geometry)
gcarr.head().T
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
idINSPIRE | CRS3035RES200mN2619600E3756800 | CRS3035RES200mN2569800E4064400 | CRS3035RES200mN2852200E3438400 | CRS3035RES200mN2669200E3805800 | CRS3035RES200mN2769800E4069600 |
id | LAEA200M_N13098E18784 | LAEA200M_N12849E20322 | LAEA200M_N14261E17192 | LAEA200M_N13346E19029 | LAEA200M_N13849E20348 |
idk | N13090E18781-N13103E18788 | N12849E20321-N12849E20324 | N14258E17191-N14261E17194 | N13345E19029-N13347E19031 | N13845E20348-N13849E20351 |
ind_c | 4 | 1 | 8 | 6 | 32.5 |
nbcar | 13 | 4 | 5 | 5 | 8 |
men | 24 | 15 | 26 | 28 | 28 |
men_surf | 2353 | 1162 | 2866 | 2427 | 3244 |
men_occ5 | 19 | 5 | 19 | 15 | 17 |
men_coll | 0 | 7 | 0 | 4 | 5 |
men_5ind | 0 | 1 | 1 | 2 | 1 |
men_1ind | 4 | 3 | 5 | 6 | 6 |
i_1ind | 0 | 0 | 0 | 0 | 0 |
men_prop | 19 | 8 | 20 | 22 | 21 |
i_prop | 1 | 0 | 1 | 1 | 0 |
men_basr | 5 | 4 | 2 | 2 | 1 |
i_basr | 0 | 0 | 0 | 0 | 0 |
ind_r | 62.5 | 39.5 | 66.5 | 72.5 | 67.5 |
ind_age1 | 3 | 3 | 2 | 3 | 4 |
ind_age2 | 3 | 0 | 2 | 1 | 1 |
ind_age3 | 2 | 2 | 2 | 2 | 3 |
ind_age4 | 1 | 1 | 3 | 3 | 2 |
ind_age5 | 2.5 | 2.5 | 4.5 | 8.5 | 1.5 |
ind_age6 | 45 | 28 | 47 | 49 | 46 |
ind_age7 | 11 | 3 | 13 | 12 | 13 |
i_age7 | 0 | 0 | 0 | 0 | 0 |
ind_age8 | 9 | 3 | 5 | 7 | 5 |
i_age8 | 0 | 0 | 0 | 0 | 0 |
ind_srf | 1083644 | 725512 | 1384589 | 1308697 | 1517997 |
geometry | POLYGON ((2.6529953850426 46.440123156379, 2.6... | POLYGON ((6.679135345427 46.191522591301, 6.68... | POLYGON ((-1.9122518974954 48.142412902797, -1... | POLYGON ((3.2312378220814 46.926350456766, 3.2... | POLYGON ((6.6327096470269 47.992073373622, 6.6... |
Les données IRIS fournissent d'autres informations sur un quadrillage plus gros du territoire français :
import os
os.listdir("C:/temp/insee/iris_evol_pop_2013")
['iris-2013-01-01.dbf', 'iris-2013-01-01.prj', 'iris-2013-01-01.shp', 'iris-2013-01-01.shx']
import geopandas
geoiris = geopandas.read_file("c:/temp/insee/iris_evol_pop_2013/iris-2013-01-01.shp")
geoiris.head()
DEPCOM | NOM_COM | IRIS | DCOMIRIS | NOM_IRIS | TYP_IRIS | ORIGINE | geometry | |
---|---|---|---|---|---|---|---|---|
0 | 97201 | L' AJOUPA-BOUILLON | 0000 | 972010000 | L'AJOUPA-BOUILLON | Z | POLYGON ((-61.09797143533286 14.83121003588694... | |
1 | 97202 | LES ANSES-D'ARLET | 0000 | 972020000 | LES ANSES-D'ARLET | Z | POLYGON ((-61.07379117657102 14.54040539807739... | |
2 | 97203 | BASSE-POINTE | 0000 | 972030000 | BASSE-POINTE | Z | POLYGON ((-61.08307142985399 14.85248314985411... | |
3 | 97204 | LE CARBET | 0000 | 972040000 | LE CARBET | Z | POLYGON ((-61.15649300614872 14.73308036750109... | |
4 | 97205 | CASE-PILOTE | 0000 | 972050000 | CASE-PILOTE | Z | POLYGON ((-61.12423374731185 14.69020654340677... |
import pandas
var = pandas.read_excel("c:/temp/insee/beneficiaires_CAF_31-12-2016.xls",
skiprows=5, sheet_name="Variables")
var.head(n=15)
VAR_ID | VAR_LIB | VAR_LIB_LONG | |
---|---|---|---|
0 | CODGEO | Code géographique | Code du quartier prioritaire, de l'Iris, de la... |
1 | LIBGEO | Libellé géographique | Nom du quartier prioritaire, de l'Iris, de la ... |
2 | EPCI1 | Code EPCI au 1er janvier 2015 | Code EPCI au 1er janvier 2015 |
3 | EPCI2 | Code EPCI au 1er janvier 2015 | Code EPCI au 1er janvier 2015 pour les QPV loc... |
4 | EPCI | Code EPCI au 1er janvier 2015 | Code EPCI au 1er janvier 2015 pour les commune... |
5 | UU | Code de l'unité urbaine | Code de l'unité urbaine |
6 | REG | Code région | Code région (nouvelles régions au 1er janvier ... |
7 | REG2 | Code région | Code région (nouvelles régions au 1er janvier ... |
8 | DEPCOM | Code commune | Code la commune (pour la table Iris) |
9 | LIBCOM | Libellé de la commune | Libellé de la commune (pour la table Iris) |
10 | NOTE | Note de diffusion | Note de diffusion (voir documentation) |
11 | A | Nombre total d'allocataires | Nombre total de foyers allocataires percevant ... |
12 | PERCOU | Personnes couvertes | Nombre de personnes couvertes par au moins une... |
13 | AI | Allocataires isolés sans enfant | Nombre d'allocataires isolés sans enfant |
14 | AM | Allocataires mono-parent | Nombre de familles monoparentales (allocataire... |
caf = pandas.read_excel("c:/temp/insee/beneficiaires_CAF_31-12-2016.xls",
skiprows=5, sheet_name="IRIS")
caf.head().T.head(n=15)
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
CODGEO | 010040101 | 010040102 | 010040201 | 010040202 | 010330101 |
LIBGEO | Les Perouses-Triangle d'Activite | Longeray-Gare | Centre-St Germain-Vareilles | Tiret-Les Allymes | Coupy-Vanchy |
DEPCOM | 01004 | 01004 | 01004 | 01004 | 01033 |
LIBCOM | Ambérieu-en-Bugey | Ambérieu-en-Bugey | Ambérieu-en-Bugey | Ambérieu-en-Bugey | Bellegarde-sur-Valserine |
EPCI | 2.40101e+08 | 2.40101e+08 | 2.40101e+08 | 2.40101e+08 | 2.40101e+08 |
REG | 84 | 84 | 84 | 84 | 84 |
NOTE | 0 | 0 | 0 | 0 | 0 |
A | 397 | 929 | 883 | 740 | 221 |
PERCOU | 983 | 2256 | 2252 | 2358 | 584 |
AI | 174 | 371 | 317 | 146 | 77 |
AM | 52 | 174 | 187 | 107 | 22 |
ACSSENF | 26 | 71 | 55 | 25 | 28 |
ACAVENF | 145 | 313 | 324 | 462 | 94 |
AC3ENF | 55 | 97 | 92 | 115 | 25 |
ENF | 419 | 950 | 1005 | 1143 | 242 |
records = [
dict(lieu='Paris', Lat=48.866667, Lon=2.333333),
dict(lieu='Charleville', Lat=49.76208500000001, Lon=4.726095999999984),
]
df = pandas.DataFrame(records)
df
Lat | Lon | lieu | |
---|---|---|---|
0 | 48.866667 | 2.333333 | Paris |
1 | 49.762085 | 4.726096 | Charleville |
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)]
df = df.drop(['Lon', 'Lat'], axis=1)
crs = {'init': 'epsg:4326'}
gdf = geopandas.GeoDataFrame(df, crs=crs, geometry=geometry)
gdf
lieu | geometry | |
---|---|---|
0 | Paris | POINT (2.333333 48.866667) |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) |
fusion = geopandas.sjoin(gdf, geoiris)
fusion
lieu | geometry | index_right | DEPCOM | NOM_COM | IRIS | DCOMIRIS | NOM_IRIS | TYP_IRIS | ORIGINE | |
---|---|---|---|---|---|---|---|---|---|---|
0 | Paris | POINT (2.333333 48.866667) | 400244 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 451142 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 145754 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 349346 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 502040 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 196652 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 298448 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 94856 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 43958 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
0 | Paris | POINT (2.333333 48.866667) | 247550 | 75101 | PARIS 1ER ARRONDISSEMENT | 0301 | 751010301 | PALAIS ROYAL 1 | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 419050 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 368152 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 317254 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 469948 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 164560 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 113662 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 266356 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 62764 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 215458 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H | |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 11866 | 08105 | CHARLEVILLE-MEZIERES | 0502 | 081050502 | LES FAUBOURGS-SUD | H |
Même chose avec les données carroyées. Ca prend un petit peu de temps.
fusion = geopandas.sjoin(gdf, gcarr)
fusion
lieu | geometry | index_right | idINSPIRE | id | idk | ind_c | nbcar | men | men_surf | ... | ind_age2 | ind_age3 | ind_age4 | ind_age5 | ind_age6 | ind_age7 | i_age7 | ind_age8 | i_age8 | ind_srf | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Paris | POINT (2.333333 48.866667) | 2139268 | CRS3035RES200mN2890600E3759400 | LAEA200M_N14453E18797 | N14453E18797-N14453E18797 | 543.0 | 1 | 285 | 16016 | ... | 6.0 | 18.0 | 17.0 | 21.0 | 420.0 | 99.0 | 0 | 55.0 | 0 | 13526488 |
1 | Charleville | POINT (4.726095999999984 49.76208500000001) | 1355467 | CRS3035RES200mN2974600E3941200 | LAEA200M_N14873E19706 | N14873E19705-N14873E19706 | 1.0 | 2 | 167 | 12657 | ... | 4.0 | 14.5 | 12.5 | 6.0 | 216.0 | 65.0 | 0 | 36.0 | 0 | 4826513 |
2 rows × 31 columns