{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyse de l'épidémie de choléra à Londres en 1854"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Contexte historique"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En 1854, le quartier de Soho à Londres a vécu [une des pires épidémies de choléra du Royaume-Uni](https://fr.wikipedia.org/wiki/%C3%89pid%C3%A9mie_de_chol%C3%A9ra_de_Broad_Street), avec 616 morts. Cette épidémie est devenue célèbre à cause de l'analyse détaillée de ses causes réalisée par le médecin [John Snow](https://johnsnowsociety.org/). Ce dernier a notamment montré que le choléra est transmis par l'eau plutôt que par l'air, ce qui était la théorie dominante de l'époque."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Analyse reproductible"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Récupération des données numériques\n",
"Tout d'abord récupérons les données numériques mis à notre disposition sur ce [blog](http://blog.rtwilson.com/john-snows-cholera-data-in-more-formats/). Nous pouvons retrouver sur ce site deux archives **SnowGIS_SHP.zip** et **SnowGIS_KML.zip** contenant des formats de fichiers différents. Le site mettait aussi à disposition des liens google où les données étaient directement accessible mais malheureusement ces liens ne sont plus fonctionnel. Nous utiliserons donc les données d'une des archives téléchargé et importé afin de garantir la pérénité et l'accessibilité à ces données. \n",
"\n",
"Nous avons 4 informations à notre disposition dans ces archives : \n",
"- Emplacements des décès dus au choléra (vecteur) avec le nombre de décès à chaque point\n",
"- Emplacements des pompes (vecteur)\n",
"- La carte originale de John Snow géoréférencée sur la grille nationale de l'Ordnance Survey (raster)\n",
"- Cartes actuelles de l'Ordnance Survey de la zone (à partir de celles publiées sous OS OpenData; Contient les données de l'Ordnance Survey © Copyright de la Couronne et droit de la base de données 2013; Raster)\n",
"\n",
"Étant donné que nous utiliserons la bibliothèque [folium](https://python-visualization.github.io/folium/) pour l'affichage de la carte, seules les deux premières nous seront utiles. Si la bibliothèque n'est pas présente dans l'environnement, il faudra l'installer avec la commande `pip install folium`.\n",
"\n",
"La première archive **SnowGIS_SHP** contient des fichiers SHP (Shapefiles) qui sont interpretable par la bibliothèque [geopandas](https://geopandas.org/index.html). Nous ne nous sera pas necessaire d'utiliser l'autre archive avec les fichiers KML.\n",
"\n",
"Nous utiliserons la bibliothèque [geopandas](https://geopandas.org/index.html) pour l'importation des données au format `.shp`. \n",
"Si la bibliothèque geopandas n'est pas présente dans l'environnement, il faudra l'installer avec la commande `pip install geopandas`."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: geopandas in /opt/conda/lib/python3.6/site-packages (0.8.1)\n",
"Requirement already satisfied: shapely in /opt/conda/lib/python3.6/site-packages (from geopandas) (1.7.1)\n",
"Requirement already satisfied: pandas>=0.23.0 in /opt/conda/lib/python3.6/site-packages (from geopandas) (1.1.1)\n",
"Requirement already satisfied: pyproj>=2.2.0 in /opt/conda/lib/python3.6/site-packages (from geopandas) (2.6.1.post1)\n",
"Requirement already satisfied: fiona in /opt/conda/lib/python3.6/site-packages (from geopandas) (1.8.13.post1)\n",
"Requirement already satisfied: python-dateutil>=2.7.3 in /opt/conda/lib/python3.6/site-packages (from pandas>=0.23.0->geopandas) (2.8.1)\n",
"Requirement already satisfied: numpy>=1.15.4 in /opt/conda/lib/python3.6/site-packages (from pandas>=0.23.0->geopandas) (1.19.1)\n",
"Requirement already satisfied: pytz>=2017.2 in /opt/conda/lib/python3.6/site-packages (from pandas>=0.23.0->geopandas) (2019.3)\n",
"Requirement already satisfied: click<8,>=4.0 in /opt/conda/lib/python3.6/site-packages (from fiona->geopandas) (7.1.2)\n",
"Requirement already satisfied: six>=1.7 in /opt/conda/lib/python3.6/site-packages (from fiona->geopandas) (1.14.0)\n",
"Requirement already satisfied: cligj>=0.5 in /opt/conda/lib/python3.6/site-packages (from fiona->geopandas) (0.5.0)\n",
"Requirement already satisfied: click-plugins>=1.0 in /opt/conda/lib/python3.6/site-packages (from fiona->geopandas) (1.1.1)\n",
"Requirement already satisfied: munch in /opt/conda/lib/python3.6/site-packages (from fiona->geopandas) (2.5.0)\n",
"Requirement already satisfied: attrs>=17 in /opt/conda/lib/python3.6/site-packages (from fiona->geopandas) (19.3.0)\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"pip install geopandas"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import geopandas as gpd\n",
"death_cholera_location = gpd.read_file(\"Cholera_Deaths.shp\", crs={\"init\": \"epsg:4326\"})\n",
"pumps_location = gpd.read_file(\"Pumps.shp\", crs={\"init\": \"epsg:4326\"})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualisation et traitement des données\n",
"Visualisons les données que nous avons concernant les décès dû au choléra. Comme il était indiqué, nous avons le nombre (*count*) et la localisation (*geometry*) des décès."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Id \n",
" Count \n",
" geometry \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 3 \n",
" POINT (529308.741 181031.352) \n",
" \n",
" \n",
" 1 \n",
" 0 \n",
" 2 \n",
" POINT (529312.164 181025.172) \n",
" \n",
" \n",
" 2 \n",
" 0 \n",
" 1 \n",
" POINT (529314.382 181020.294) \n",
" \n",
" \n",
" 3 \n",
" 0 \n",
" 1 \n",
" POINT (529317.380 181014.259) \n",
" \n",
" \n",
" 4 \n",
" 0 \n",
" 4 \n",
" POINT (529320.675 181007.872) \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 245 \n",
" 0 \n",
" 3 \n",
" POINT (529362.665 181156.058) \n",
" \n",
" \n",
" 246 \n",
" 0 \n",
" 2 \n",
" POINT (529365.152 181176.129) \n",
" \n",
" \n",
" 247 \n",
" 0 \n",
" 1 \n",
" POINT (529274.165 180907.313) \n",
" \n",
" \n",
" 248 \n",
" 0 \n",
" 1 \n",
" POINT (529299.361 180873.185) \n",
" \n",
" \n",
" 249 \n",
" 0 \n",
" 1 \n",
" POINT (529324.815 180857.949) \n",
" \n",
" \n",
"
\n",
"
250 rows × 3 columns
\n",
"
"
],
"text/plain": [
" Id Count geometry\n",
"0 0 3 POINT (529308.741 181031.352)\n",
"1 0 2 POINT (529312.164 181025.172)\n",
"2 0 1 POINT (529314.382 181020.294)\n",
"3 0 1 POINT (529317.380 181014.259)\n",
"4 0 4 POINT (529320.675 181007.872)\n",
".. .. ... ...\n",
"245 0 3 POINT (529362.665 181156.058)\n",
"246 0 2 POINT (529365.152 181176.129)\n",
"247 0 1 POINT (529274.165 180907.313)\n",
"248 0 1 POINT (529299.361 180873.185)\n",
"249 0 1 POINT (529324.815 180857.949)\n",
"\n",
"[250 rows x 3 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"death_cholera_location"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vérifions d'abord s'il n'y a pas de données manquantes."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"death_cholera_location.isna().any().any()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bonne nouvelle, il n'y pas de données manquantes.\n",
"\n",
"Nous pouvons d'ors et déjà remarquer que les points sont des coordonnées X/Y et non latidude/longitude car les valeurs de celles-ci doivent être comprises entre +90°/-90° et +180°/-180°. Or la bibliothèque **folium** prend en compte ces valeurs pour le positionnement de point. Il sera donc necessaire d'effectuer une conversion. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"death_cholera_location = death_cholera_location.to_crs(epsg=4326) #Conversion au bon format"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Regardons si la conversion a bien été faites."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Id \n",
" Count \n",
" geometry \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" 3 \n",
" POINT (-0.13793 51.51342) \n",
" \n",
" \n",
" 1 \n",
" 0 \n",
" 2 \n",
" POINT (-0.13788 51.51336) \n",
" \n",
" \n",
" 2 \n",
" 0 \n",
" 1 \n",
" POINT (-0.13785 51.51332) \n",
" \n",
" \n",
" 3 \n",
" 0 \n",
" 1 \n",
" POINT (-0.13781 51.51326) \n",
" \n",
" \n",
" 4 \n",
" 0 \n",
" 4 \n",
" POINT (-0.13777 51.51320) \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 245 \n",
" 0 \n",
" 3 \n",
" POINT (-0.13711 51.51453) \n",
" \n",
" \n",
" 246 \n",
" 0 \n",
" 2 \n",
" POINT (-0.13706 51.51471) \n",
" \n",
" \n",
" 247 \n",
" 0 \n",
" 1 \n",
" POINT (-0.13847 51.51231) \n",
" \n",
" \n",
" 248 \n",
" 0 \n",
" 1 \n",
" POINT (-0.13812 51.51200) \n",
" \n",
" \n",
" 249 \n",
" 0 \n",
" 1 \n",
" POINT (-0.13776 51.51186) \n",
" \n",
" \n",
"
\n",
"
250 rows × 3 columns
\n",
"
"
],
"text/plain": [
" Id Count geometry\n",
"0 0 3 POINT (-0.13793 51.51342)\n",
"1 0 2 POINT (-0.13788 51.51336)\n",
"2 0 1 POINT (-0.13785 51.51332)\n",
"3 0 1 POINT (-0.13781 51.51326)\n",
"4 0 4 POINT (-0.13777 51.51320)\n",
".. .. ... ...\n",
"245 0 3 POINT (-0.13711 51.51453)\n",
"246 0 2 POINT (-0.13706 51.51471)\n",
"247 0 1 POINT (-0.13847 51.51231)\n",
"248 0 1 POINT (-0.13812 51.51200)\n",
"249 0 1 POINT (-0.13776 51.51186)\n",
"\n",
"[250 rows x 3 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"death_cholera_location"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les coordonnées ressemble déjà plus à ce que l'on recherche. Fesont une vérification rapide sur la carte de la localisation avec les premières coordonnées."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: folium in /opt/conda/lib/python3.6/site-packages (0.11.0)\n",
"Requirement already satisfied: numpy in /opt/conda/lib/python3.6/site-packages (from folium) (1.19.1)\n",
"Requirement already satisfied: jinja2>=2.9 in /opt/conda/lib/python3.6/site-packages (from folium) (2.11.0)\n",
"Requirement already satisfied: requests in /opt/conda/lib/python3.6/site-packages (from folium) (2.23.0)\n",
"Requirement already satisfied: branca>=0.3.0 in /opt/conda/lib/python3.6/site-packages (from folium) (0.4.1)\n",
"Requirement already satisfied: MarkupSafe>=0.23 in /opt/conda/lib/python3.6/site-packages (from jinja2>=2.9->folium) (1.1.1)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.6/site-packages (from requests->folium) (2020.4.5.1)\n",
"Requirement already satisfied: chardet<4,>=3.0.2 in /opt/conda/lib/python3.6/site-packages (from requests->folium) (3.0.4)\n",
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/lib/python3.6/site-packages (from requests->folium) (1.25.7)\n",
"Requirement already satisfied: idna<3,>=2.5 in /opt/conda/lib/python3.6/site-packages (from requests->folium) (2.9)\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"pip install folium"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium as fl\n",
"m = fl.Map(location=[-0.13793, 51.51342],zoom_start=5)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Il semblerait que les coordonnées soient mauvaises. Après vérification sur la documentation de **geopandas**, POINT = (Longitude, Latitude). Et pour folium, nous rentrons `location=[Latitude, Longitude]`. \n",
"\n",
"Essayons d'inverser les valeurs et revérifions."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = fl.Map(location=[51.51342, -0.13793],zoom_start=10)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nous sommes bien à Londre, les coordonnées semblent donc être correct.\n",
"\n",
"Maintenant que nous nous sommes assuré de la conformité des données, réitérons la même chose pour la liste des pompes :"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Id \n",
" geometry \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0 \n",
" POINT (-0.13667 51.51334) \n",
" \n",
" \n",
" 1 \n",
" 0 \n",
" POINT (-0.13959 51.51388) \n",
" \n",
" \n",
" 2 \n",
" 0 \n",
" POINT (-0.13967 51.51491) \n",
" \n",
" \n",
" 3 \n",
" 0 \n",
" POINT (-0.13163 51.51235) \n",
" \n",
" \n",
" 4 \n",
" 0 \n",
" POINT (-0.13359 51.51214) \n",
" \n",
" \n",
" 5 \n",
" 0 \n",
" POINT (-0.13592 51.51154) \n",
" \n",
" \n",
" 6 \n",
" 0 \n",
" POINT (-0.13396 51.51002) \n",
" \n",
" \n",
" 7 \n",
" 0 \n",
" POINT (-0.13820 51.51130) \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Id geometry\n",
"0 0 POINT (-0.13667 51.51334)\n",
"1 0 POINT (-0.13959 51.51388)\n",
"2 0 POINT (-0.13967 51.51491)\n",
"3 0 POINT (-0.13163 51.51235)\n",
"4 0 POINT (-0.13359 51.51214)\n",
"5 0 POINT (-0.13592 51.51154)\n",
"6 0 POINT (-0.13396 51.51002)\n",
"7 0 POINT (-0.13820 51.51130)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pumps_location = pumps_location.to_crs(epsg=4326) #Conversion au bon format\n",
"pumps_location"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Représentation des données sur la carte\n",
"Essayons maintenant d'afficher des cercles de circonférence proportionnelle au nombre du décès et des symboles pour la localisation des pompes.\n",
"\n",
"Reprenons notre carte précedente avec un zoom plus important."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"m = fl.Map(location=[51.51342, -0.13793, ],zoom_start=16.5)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for index, death_row in death_cholera_location.iterrows():\n",
" death_count = death_row['Count']\n",
" point_geometry = death_cholera_location.geometry[index]\n",
" fl.Circle(\n",
" radius=death_count,\n",
" location=[point_geometry.centroid.y,point_geometry.centroid.x], #Ne pas oublier que longitude et latitude sont inversées.\n",
" tooltip=death_count,\n",
" color='crimson',\n",
" fill=True,\n",
" ).add_to(m)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Voilà pour la localisation des décès, le radius du cercle correspondant au nombre de décès. \n",
"\n",
"Ajoutons maintenant les pompes."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for index, pump_row in pumps_location.iterrows():\n",
" point_geometry = pumps_location.geometry[index]\n",
" fl.Marker([point_geometry.centroid.y,point_geometry.centroid.x], popup='Pompes '+str(index)+' ').add_to(m) #Ne pas oublier que longitude et latitude sont inversées.\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nous pouvons en effet remarquer qu'une pompe se trouve au centre de ces décès et proche d'une zone ayant eu un grand nombre de décès. Il s'agit de la pompe se trouvant dans la rue **Broadwick Street**. Il s'agit de la pompe 0, soit la première de la liste fournit. \n",
"\n",
"### Une autre approche autour de la pompe de Broadwick Street\n",
"#### Nombre de décès suivant la distance des pompes\n",
"\n",
"Enfin de mettre en évidence la pompe de Broadwick Street comme ayant eu un impact dans l'épidémie de choléra, nous pouvons également comparé le nombre de décès autour de chacune des pompes. Pour cela, nous utiliserons la librairie `haversine` pour le calcule de distance entre deux coordonnées."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: haversine in /opt/conda/lib/python3.6/site-packages (2.2.0)\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"pip install haversine"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"Avec p"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Nb décès cumulé \n",
" Latitude \n",
" Longitude \n",
" Distance de la pompe \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 4.0 \n",
" 51.513300 \n",
" -0.136705 \n",
" 5.251047 \n",
" \n",
" \n",
" 1 \n",
" 7.0 \n",
" 51.513271 \n",
" -0.136778 \n",
" 10.866257 \n",
" \n",
" \n",
" 2 \n",
" 8.0 \n",
" 51.513429 \n",
" -0.136764 \n",
" 11.852628 \n",
" \n",
" \n",
" 3 \n",
" 12.0 \n",
" 51.513458 \n",
" -0.136675 \n",
" 13.030076 \n",
" \n",
" \n",
" 4 \n",
" 15.0 \n",
" 51.513404 \n",
" -0.136877 \n",
" 16.082748 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 245 \n",
" 484.0 \n",
" 51.514594 \n",
" -0.133563 \n",
" 256.031164 \n",
" \n",
" \n",
" 246 \n",
" 485.0 \n",
" 51.513258 \n",
" -0.132933 \n",
" 258.585684 \n",
" \n",
" \n",
" 247 \n",
" 487.0 \n",
" 51.514581 \n",
" -0.133467 \n",
" 260.935078 \n",
" \n",
" \n",
" 248 \n",
" 488.0 \n",
" 51.514606 \n",
" -0.133393 \n",
" 266.696537 \n",
" \n",
" \n",
" 249 \n",
" 489.0 \n",
" 51.515834 \n",
" -0.134474 \n",
" 316.088437 \n",
" \n",
" \n",
"
\n",
"
250 rows × 4 columns
\n",
"
"
],
"text/plain": [
" Nb décès cumulé Latitude Longitude Distance de la pompe\n",
"0 4.0 51.513300 -0.136705 5.251047\n",
"1 7.0 51.513271 -0.136778 10.866257\n",
"2 8.0 51.513429 -0.136764 11.852628\n",
"3 12.0 51.513458 -0.136675 13.030076\n",
"4 15.0 51.513404 -0.136877 16.082748\n",
".. ... ... ... ...\n",
"245 484.0 51.514594 -0.133563 256.031164\n",
"246 485.0 51.513258 -0.132933 258.585684\n",
"247 487.0 51.514581 -0.133467 260.935078\n",
"248 488.0 51.514606 -0.133393 266.696537\n",
"249 489.0 51.515834 -0.134474 316.088437\n",
"\n",
"[250 rows x 4 columns]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
" %matplotlib inline\n",
"import pandas as pd\n",
"import haversine as hs\n",
"from haversine import Unit\n",
"Broadwick_Pump = pumps_location.iloc[0]\n",
"df = pd.DataFrame(columns=['Nb décès', 'Latitude', 'Longitude', 'Distance de la pompe'])\n",
"for index, death_row in death_cholera_location.iterrows():\n",
" death_count = death_row['Count']\n",
" point_geometry = death_cholera_location.geometry[index]\n",
" Distance = hs.haversine((point_geometry.centroid.y,point_geometry.centroid.x),(Broadwick_Pump.geometry.centroid.y,Broadwick_Pump.geometry.centroid.x), unit=Unit.METERS)\n",
" df = df.append({'Nb décès': death_count, 'Latitude': point_geometry.centroid.y, 'Longitude': point_geometry.centroid.x, 'Distance de la pompe': Distance}, ignore_index=True)\n",
"df_sorted = df.sort_values(by='Distance de la pompe')\n",
"df = pd.DataFrame(columns=['Nb décès cumulé', 'Latitude', 'Longitude', 'Distance de la pompe'])\n",
"death_count = 0\n",
"for index, death_row in df_sorted.iterrows():\n",
" death_count += death_row['Nb décès']\n",
" df = df.append({'Nb décès cumulé': death_count, 'Latitude': death_row['Latitude'], 'Longitude': death_row['Longitude'], 'Distance de la pompe': death_row['Distance de la pompe']}, ignore_index=True)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.plot(x='Distance de la pompe', y='Nb décès cumulé')"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Pompe Index \n",
" Latitude \n",
" Longitude \n",
" Nombre de décès dans un rayon de 300m \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 0.0 \n",
" 51.513341 \n",
" -0.136668 \n",
" 488.0 \n",
" \n",
" \n",
" 1 \n",
" 1.0 \n",
" 51.513876 \n",
" -0.139586 \n",
" 346.0 \n",
" \n",
" \n",
" 2 \n",
" 2.0 \n",
" 51.514906 \n",
" -0.139671 \n",
" 263.0 \n",
" \n",
" \n",
" 3 \n",
" 3.0 \n",
" 51.512354 \n",
" -0.131630 \n",
" 139.0 \n",
" \n",
" \n",
" 4 \n",
" 4.0 \n",
" 51.512139 \n",
" -0.133594 \n",
" 334.0 \n",
" \n",
" \n",
" 5 \n",
" 5.0 \n",
" 51.511542 \n",
" -0.135919 \n",
" 392.0 \n",
" \n",
" \n",
" 6 \n",
" 6.0 \n",
" 51.510019 \n",
" -0.133962 \n",
" 42.0 \n",
" \n",
" \n",
" 7 \n",
" 7.0 \n",
" 51.511295 \n",
" -0.138199 \n",
" 300.0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Pompe Index Latitude Longitude Nombre de décès dans un rayon de 300m\n",
"0 0.0 51.513341 -0.136668 488.0\n",
"1 1.0 51.513876 -0.139586 346.0\n",
"2 2.0 51.514906 -0.139671 263.0\n",
"3 3.0 51.512354 -0.131630 139.0\n",
"4 4.0 51.512139 -0.133594 334.0\n",
"5 5.0 51.511542 -0.135919 392.0\n",
"6 6.0 51.510019 -0.133962 42.0\n",
"7 7.0 51.511295 -0.138199 300.0"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"max_dist = 300\n",
"df_pump_death = pd.DataFrame(columns=['Pompe Index', 'Latitude', 'Longitude', 'Nombre de décès dans un rayon de 300m'])\n",
"for index_pump, pump_row in pumps_location.iterrows():\n",
" death_count = 0\n",
" pump_point_geometry = pumps_location.geometry[index_pump]\n",
" for index, death_row in death_cholera_location.iterrows():\n",
" death_point_geometry = death_cholera_location.geometry[index]\n",
" Distance = hs.haversine((death_point_geometry.centroid.y,death_point_geometry.centroid.x),(pump_point_geometry.centroid.y,pump_point_geometry.centroid.x), unit=Unit.METERS)\n",
" if Distance < max_dist:\n",
" death_count += death_row['Count']\n",
" \n",
" df_pump_death = df_pump_death.append({'Pompe Index': index_pump, 'Latitude': pump_point_geometry.centroid.y, 'Longitude': pump_point_geometry.centroid.x, 'Nombre de décès dans un rayon de 300m': death_count}, ignore_index=True)\n",
"df_pump_death"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "Location should consist of two numerical values, but 0 -0.136668\n1 -0.139586\n2 -0.139671\n3 -0.131630\n4 -0.133594\n5 -0.135919\n6 -0.133962\n7 -0.138199\nName: Longitude, dtype: float64 of type is not convertible to float.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/folium/utilities.py\u001b[0m in \u001b[0;36mvalidate_location\u001b[0;34m(location)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 59\u001b[0;31m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoord\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 60\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mTypeError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mconverter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 129\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"cannot convert the series to {converter}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 130\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: cannot convert the series to ",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mtooltip\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdf_pump_death\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Nombre de décès dans un rayon de 300m'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'crimson'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mfill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m ).add_to(m)\n\u001b[1;32m 10\u001b[0m \u001b[0mfl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mMarker\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf_pump_death\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Latitude'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdf_pump_death\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Longitude'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpopup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Pompes '\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;34m' '\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_to\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#Ne pas oublier que longitude et latitude sont inversées.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/folium/vector_layers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, location, radius, popup, tooltip, **kwargs)\u001b[0m\n\u001b[1;32m 265\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 266\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mradius\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpopup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtooltip\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 267\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCircle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpopup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpopup\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtooltip\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtooltip\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 268\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'circle'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 269\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpath_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mradius\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mradius\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/folium/map.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, location, popup, tooltip, icon, draggable, **kwargs)\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mMarker\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 276\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Marker'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 277\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlocation\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalidate_location\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 278\u001b[0m self.options = parse_options(\n\u001b[1;32m 279\u001b[0m \u001b[0mdraggable\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdraggable\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/folium/utilities.py\u001b[0m in \u001b[0;36mvalidate_location\u001b[0;34m(location)\u001b[0m\n\u001b[1;32m 61\u001b[0m raise ValueError('Location should consist of two numerical values, '\n\u001b[1;32m 62\u001b[0m \u001b[0;34m'but {!r} of type {} is not convertible to float.'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 63\u001b[0;31m .format(coord, type(coord)))\n\u001b[0m\u001b[1;32m 64\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoord\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Location values cannot contain NaNs.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: Location should consist of two numerical values, but 0 -0.136668\n1 -0.139586\n2 -0.139671\n3 -0.131630\n4 -0.133594\n5 -0.135919\n6 -0.133962\n7 -0.138199\nName: Longitude, dtype: float64 of type is not convertible to float."
]
}
],
"source": [
"m = fl.Map(location=[51.51342, -0.13793, ],zoom_start=16.5)\n",
"for index, pump_row in df_pump_death.iterrows():\n",
" fl.Circle(\n",
" radius=300,\n",
" location=[df_pump_death['Longitude'],df_pump_death['Latitude']], #Ne pas oublier que longitude et latitude sont inversées.\n",
" tooltip=df_pump_death['Nombre de décès dans un rayon de 300m'],\n",
" color='crimson',\n",
" fill=True,\n",
" ).add_to(m)\n",
" fl.Marker([df_pump_death['Latitude'],df_pump_death['Longitude']], popup='Pompes '+str(index)+' ').add_to(m) #Ne pas oublier que longitude et latitude sont inversées.\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from folium.plugins import HeatMap\n",
"m = fl.Map(location=[51.51334, -0.13667],zoom_start=16.5)\n",
"HeatMap(data=df_pump_death[['Latitude', 'Longitude', 'Nombre de décès dans un rayon de 300m']].groupby(['Latitude', 'Longitude']).sum().reset_index().values.tolist(), radius=13).add_to(m)\n",
"fl.Marker([51.51334,-0.13667], popup='Pompes de ').add_to(m) #Ne pas oublier que longitude et latitude sont inversées.\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}