{ "cells": [ { "cell_type": "markdown", "metadata": { "variables": { "foo": "foo" } }, "source": [ "# Mapping neighbourhood compost units in Amsterdam\n", "\n", "In the last year [several worm hotels popped up in Amsterdam](https://www.amsterdam.nl/wonen-leefomgeving/zelfbeheer/compost-maken-buurt/). This grassroot initiative lets the neighbourhood turn green waste into compost.\n", "\n", "Using [open data from the municipality of Amsterdam](https://data.amsterdam.nl), I will see what I can find out about these worm hotels. I will dig into the following:\n", "\n", "### Where is the nearest worm hotel to my house?\n", "\n", "* Show a map with the worm hotels and isochrones (isochrones are circles around a point that show the distance that can be traveled in a certain time)\n", "\n", "\n", "### How reachable are the worm hotels for residences in Amsterdam?\n", "\n", "* Use a routing machine to calculate the shortest walking duration and distance to the nearest worm hotel for all addresses in Amsterdam. Keep only residences (and throw out companies, schools, museums and the like).\n", "\n", "* Create a function which takes in an address or coordinates, and returns the walking duration to the nearest worm hotel, and all information about the nearest worm hotel.\n", "\n", "Then I can do things like:\n", "\n", "* Calculate the percentage of residences within a 5 minute walk of a worm hotel, show histogram.\n", "\n", "* Score neighbourhoods and boroughs on reachability. Take into account the population per neigbourhood. Show a choropleth with the scores.\n", "\n", "\n", "#### Notes\n", "\n", "* **Please note that this is a pet project and an exercise in using open data and software for data analysis. Advice about placement of worm hotels should be taken with a grain of salt: worm hotels have a limited number of participants. If you’re interested in joining a worm hotel, check [this website](https://www.amsterdam.nl/wonen-leefomgeving/zelfbeheer/compost-maken-buurt/), or use the function in this notebook to find out the nearest hotel and email address.**\n", "* This should be relatively easy to generalize with any 2 datasets that have a 'location_cleaned' column with lng/lat coordinates as a single string, with a point as decimal seperator and comma as seperator between the coordinates.\n", "* To look up the walking times for all addresses in Amsterdam, I use [OSRM](http://project-osrm.org/). I go the file for the Netherlands from [Geofabrik](http://www.geofabrik.de/), built it for the foot profile, and ran [the docker image provided by project-osrm](https://hub.docker.com/r/osrm/osrm-backend/) via [the docker application](https://www.docker.com/what-docker).\n", "* I use the free tier of [openrouteservice.org](https://openrouteservice.org/) to calculate the Isochrones around the worm hotels.\n", "* For mapping I use [Folium](https://github.com/python-visualization/folium), a Python wrapper for [Leaflet](http://leafletjs.com/).\n", "\n", "\n", "#### Possible improvements\n", "\n", "* The OSRM lookup could be much faster with duplicate detection. Pandas can then fill down the missing values.\n", "\n", "* I would like to turn the data part into an API and run a web front end on this, to lookup addresses.\n", "\n", "* I'd like to create a matrix optimization function that returns the perfect placement for a new hotel (probably inside a designated area). I think I need to cover the area in random points, and pick the one with the greatest walking distance to all nearby wormhotels. \n", "\n", "#### Datasets used\n", "\n", "* [Addresses in Amsterdam](https://data.amsterdam.nl/index.html#?dsd=bag&dsp=1&dsv=TABLE&mpb=topografie&mpz=11&mpv=52.3731081:4.8932945)\n", "* [Neighbourhood compost map and data](https://maps.amsterdam.nl/open_geodata/?LANG=en)\n", "* [Population data Amsterdam](https://data.amsterdam.nl/#?dte=catalogus%2Fapi%2F3%2Faction%2Fpackage_show%3Fid%3Db51154d8-2eca-4dd9-932d-63bca9ef0bf2&dtfs=T&dsf=groups::bevolking&mpb=topografie&mpz=11&mpv=52.3731081:4.8932945)\n", "* [GeoJSON of 'gebieden' (larger neighbourhoods) in Amsterdam](https://maps.amsterdam.nl/open_geodata/?LANG=nl) (simplified with [Mapshaper](http://mapshaper.org/))" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import requests\n", "import folium\n", "from folium.plugins import HeatMap\n", "import geojson\n", "import seaborn as sns\n", "from decimal import Decimal, ROUND_HALF_UP\n", "\n", "\n", "\n", "# set interactivity to 'all' so I can easily print more than 1 outputs in 1 cell\n", "from IPython.core.interactiveshell import InteractiveShell\n", "InteractiveShell.ast_node_interactivity = \"all\"\n", "\n", "# Supress 'SettingWithCopyWarning'\n", "pd.options.mode.chained_assignment = None # default='warn'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Nearest worm hotel to my house\n", "\n", "### 1.1 Preparing the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Load afvalcontainers from Amsterdam site\n", "df_buurtcompost_import = pd.read_csv('http://maps.amsterdam.nl/open_geodata/excel.php?KAARTLAAG=BUURTCOMPOST&THEMA=buurtcompost', encoding='latin-1', sep=\";\")\n", "df_buurtcompost = df_buurtcompost_import" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Clean up the coordinates column. I need a string formatted a coord string \n", "# with decimals points, comma seperated, formatted as '{lng},{lat}'.\n", "df_buurtcompost = df_buurtcompost_import\n", "df_buurtcompost['locatie_cleaned'] = df_buurtcompost_import['COORDS'].str.replace('POINT\\(','').str.replace('\\)','')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OBJECTNUMMERStraatnaamInitiatiefnemerEmailAantal_bewonersSoort_afvalGebruikStartjaarFotoCOORDSLNGLATUnnamed: 12locatie_cleanedlnglat
04Frans HalsstraatPeter Jan Brouweramsterdam+C001@wormenhotel.nl20GFToestemming van initiatiefnemer2015frans hals .jpegPOINT(4.888706,52.356007)4,88870652,356007NaN4.888706,52.3560074.88870652.356007
15hoek saffierstraat jozef israelkadechristien & annekeamsterdam+c002@wormenhotel.nl7GFToestemming van initiatiefnemer2016NaNPOINT(4.908527,52.349857)4,90852752,349857NaN4.908527,52.3498574.90852752.349857
26zaanstraat t/o 300soeptuinen brediuswww.soeptuinen.nl0GFTVrij inleveren2016NaNPOINT(4.871422,52.391292)4,87142252,391292NaN4.871422,52.3912924.87142252.391292
37kramatweg 51oost indisch groeninfo@oostindischgroen.nl0GFTVrij inleveren2016NaNPOINT(4.945789,52.36213)4,94578952,36213NaN4.945789,52.362134.94578952.362130
48IJpleinbuurtbak voedseltuinireen@balkonton.nl6GFToestemming van initiatiefnemer2016NaNPOINT(4.910984,52.382154)4,91098452,382154NaN4.910984,52.3821544.91098452.382154
\n", "
" ], "text/plain": [ " OBJECTNUMMER Straatnaam Initiatiefnemer \\\n", "0 4 Frans Halsstraat Peter Jan Brouwer \n", "1 5 hoek saffierstraat jozef israelkade christien & anneke \n", "2 6 zaanstraat t/o 300 soeptuinen bredius \n", "3 7 kramatweg 51 oost indisch groen \n", "4 8 IJplein buurtbak voedseltuin \n", "\n", " Email Aantal_bewoners Soort_afval \\\n", "0 amsterdam+C001@wormenhotel.nl 20 GF \n", "1 amsterdam+c002@wormenhotel.nl 7 GF \n", "2 www.soeptuinen.nl 0 GFT \n", "3 info@oostindischgroen.nl 0 GFT \n", "4 ireen@balkonton.nl 6 GF \n", "\n", " Gebruik Startjaar Foto \\\n", "0 Toestemming van initiatiefnemer 2015 frans hals .jpeg \n", "1 Toestemming van initiatiefnemer 2016 NaN \n", "2 Vrij inleveren 2016 NaN \n", "3 Vrij inleveren 2016 NaN \n", "4 Toestemming van initiatiefnemer 2016 NaN \n", "\n", " COORDS LNG LAT Unnamed: 12 \\\n", "0 POINT(4.888706,52.356007) 4,888706 52,356007 NaN \n", "1 POINT(4.908527,52.349857) 4,908527 52,349857 NaN \n", "2 POINT(4.871422,52.391292) 4,871422 52,391292 NaN \n", "3 POINT(4.945789,52.36213) 4,945789 52,36213 NaN \n", "4 POINT(4.910984,52.382154) 4,910984 52,382154 NaN \n", "\n", " locatie_cleaned lng lat \n", "0 4.888706,52.356007 4.888706 52.356007 \n", "1 4.908527,52.349857 4.908527 52.349857 \n", "2 4.871422,52.391292 4.871422 52.391292 \n", "3 4.945789,52.36213 4.945789 52.362130 \n", "4 4.910984,52.382154 4.910984 52.382154 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a function to create lng and lat float columns from 'location_cleaned' column\n", "def create_lng_lat_columns ( df ) :\n", " df['lng'] = df['LNG'].str.replace(',','.').astype(float)\n", " df['lat'] = df['LAT'].str.replace(',','.').astype(float)\n", " return df\n", "\n", "df_buurtcompost = create_lng_lat_columns(df_buurtcompost)\n", "df_buurtcompost.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 Where are these hotels?\n", "\n", "Let's do some mapping! I'll use Folium to plot all hotels, and also plot the approximate location to myet house in Amsterdam.\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Temporarily turn of showing all output for folium mapping, needs to be in seperate cell\n", "InteractiveShell.ast_node_interactivity = \"last_expr\"" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "buurtcompostlocaties_markers = list(zip(df_buurtcompost.lat.values, df_buurtcompost.lng.values, df_buurtcompost.Straatnaam))\n", "hmap = folium.Map(location=[52.3824856,4.877951499999995], zoom_start=12, tiles='stamentoner',)\n", "\n", "feature_group = folium.FeatureGroup(\"Locations\")\n", "for lat, lon, name in buurtcompostlocaties_markers:\n", " feature_group.add_child(folium.Marker(location=[lat,lon],popup=name))\n", "\n", "my_house = folium.FeatureGroup(\"Locations\")\n", "my_house.add_child(folium.Marker([52.381994, 4.876480], popup=\"My house (approx.)\", icon=folium.Icon(color='red',icon='info-sign'))) \n", " \n", "hmap.add_child(my_house)\n", "hmap.add_child(feature_group)\n", "hmap.save('01-locations.html')\n", "hmap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I can see a worm hotel is near the house (it's so closeby the red marker is obscured by it).\n", "\n", "## 2. How reachable are the worm hotels for everyone living in Amsterdam?\n", "\n", "First, let's see the how much over Amsterdam is covered within a 5 minute walk from the worm hotels by looking at some [isochrones](https://en.wikipedia.org/wiki/Isochrone_map).\n", "\n", "### 2.1 Mapping Isochrones of 5 minute walks around the worm hotels\n", "\n", "There is no way to plot Isochrones with OSRM, so I'll use the [Openrouteservice](https://openrouteservice.org/) instead. It only allows 5 calls at a time for their free tier, so this will be a bit clunky." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "InteractiveShell.ast_node_interactivity = \"all\" # Turn on all output again" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7.8" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create array with coords in format [['lat,lng'], ['lat,lng']]\n", "buurtcompostlocaties_arrays = list(df_buurtcompost.locatie_cleaned)\n", "# Divide length by 5 to see how many calls I need to make to openrouteservice.org. Shows 7.8, so 8 calls.\n", "len(buurtcompostlocaties_arrays) / 5\n", "# Put groups of 3-5 coordinates together in an array for building the API request URLs\n", "buurtcompostlocaties_arrays_5 = [buurtcompostlocaties_arrays[i:i+5] for i in range(0, len(buurtcompostlocaties_arrays), 5)]\n", "# print('Calls I need to make to openrouteservice API: ' + str(len(buurtcompostlocaties_arrays_5))) # Shows 8" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Create a function to create the GeoJSON files with isochrones\n", "def create_isochrone_json(range_seconds, filename):\n", "\n", " isochrone_features = []\n", "\n", " for i in range(len(buurtcompostlocaties_arrays_5)):\n", " coords = '|'.join(buurtcompostlocaties_arrays_5[i])\n", " requestURL = 'https://private-anon-e7e15c7342-openrouteservice.apiary-proxy.com/isochrones' + \\\n", " '?api_key=58d904a497c67e00015b45fc892c214578cd4fae9ea5f36e23e8cb2f&profile=foot-walking' + \\\n", " '&range=' + range_seconds + '&location_type=destination&locations=' + coords\n", " features = requests.get(requestURL).json()['features']\n", " isochrone_features.append(features)\n", "\n", " isochrone_featurecollection = {\n", " \"type\": \"FeatureCollection\",\n", " \"features\": []\n", " }\n", "\n", " for i in range(len(isochrone_features)):\n", " isochrone_featurecollection['features'].extend(isochrone_features[i])\n", "\n", " with open(filename, 'w') as file:\n", " geojson.dump(isochrone_featurecollection, file, indent=4, sort_keys=False)\n", "\n", "# Create isochrone GeoJSON\n", "create_isochrone_json('300', 'data/isochrone_featurecollection_300.geojson')\n", "create_isochrone_json('600', 'data/isochrone_featurecollection_600.geojson')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "InteractiveShell.ast_node_interactivity = \"last_expr\"" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "buurtcompostlocaties_markers = list(zip(df_buurtcompost.lat.values, df_buurtcompost.lng.values, df_buurtcompost.Straatnaam))\n", "hmap = folium.Map(location=[52.3824856,4.877951499999995], zoom_start=12, tiles='stamentoner',)\n", "\n", "feature_group = folium.FeatureGroup(\"Locations\")\n", "for lat, lon, name in buurtcompostlocaties_markers:\n", " feature_group.add_child(folium.Marker(location=[lat,lon],popup=name))\n", " hmap.add_child(feature_group)\n", "\n", "folium.GeoJson(open(\"data/isochrone_featurecollection_300.geojson\",encoding = \"utf-8-sig\").read(), name='geojson').add_to(hmap)\n", "# folium.GeoJson(open(\"data/isochrone_featurecollection_600.geojson\",encoding = \"utf-8-sig\").read(), name='geojson').add_to(hmap)\n", "\n", "hmap.save('02-locations-isochrones.html')\n", "hmap\n" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "InteractiveShell.ast_node_interactivity = \"all\" # Turn on all output again" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some neighbourhoods have decent coverage. It's notable that the city center does not have any hotels. Let's look at the data on all addresses in Amsterdam!\n", "\n", "\n", "\n", "### 2.2 Loading in all addresses in Amsterdam" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Naam openbare ruimteHuisnummerHuisletterHuisnummertoevoegingPostcodeWoonplaatsNaam stadsdeelCode stadsdeelNaam gebiedsgerichtwerkengebiedCode gebiedsgerichtwerkengebied...VerblijfsobjectstatusOpenbareruimte-identificatiePandidentificatieVerblijfsobjectidentificatieLigplaatsidentificatieStandplaatsidentificatieNummeraanduidingidentificatielnglatlocatie_cleaned
0Eerste Constantijn Huygensstraat15NaN11054BPNaNWestEOud West / De BaarsjesDX05...Verblijfsobject in gebruik363300000002537['0363100012159829']3.630100e+14NaNNaN3632000000070604.87440152.3649064.8744013,52.3649059
1Eerste Helmersstraat188NaN31054ELNaNWestEOud West / De BaarsjesDX05...Verblijfsobject in gebruik363300000002541['0363100012120031']3.630100e+14NaNNaN3632000000078464.86420252.3608264.8642015,52.3608257
2Eerste Anjeliersdwarsstraat1NaN21015NRNaNCentrumACentrum-WestDX01...Verblijfsobject in gebruik363300000002529['0363100012174784']3.630100e+14NaNNaN3632000000061124.88347052.3782204.8834704,52.3782196
3Eerste Constantijn Huygensstraat19NaN21054BPNaNWestEOud West / De BaarsjesDX05...Verblijfsobject in gebruik363300000002537['0363100012157570']3.630100e+14NaNNaN3632000000070664.87432952.3647984.8743292,52.3647977
4Eerste Helmersstraat190NaN31054ELNaNWestEOud West / De BaarsjesDX05...Verblijfsobject in gebruik363300000002541['0363100012120432']3.630100e+14NaNNaN3632000000078524.86409952.3608164.8640988,52.3608163
\n", "

5 rows Ă— 34 columns

\n", "
" ], "text/plain": [ " Naam openbare ruimte Huisnummer Huisletter \\\n", "0 Eerste Constantijn Huygensstraat 15 NaN \n", "1 Eerste Helmersstraat 188 NaN \n", "2 Eerste Anjeliersdwarsstraat 1 NaN \n", "3 Eerste Constantijn Huygensstraat 19 NaN \n", "4 Eerste Helmersstraat 190 NaN \n", "\n", " Huisnummertoevoeging Postcode Woonplaats Naam stadsdeel Code stadsdeel \\\n", "0 1 1054BP NaN West E \n", "1 3 1054EL NaN West E \n", "2 2 1015NR NaN Centrum A \n", "3 2 1054BP NaN West E \n", "4 3 1054EL NaN West E \n", "\n", " Naam gebiedsgerichtwerkengebied Code gebiedsgerichtwerkengebied \\\n", "0 Oud West / De Baarsjes DX05 \n", "1 Oud West / De Baarsjes DX05 \n", "2 Centrum-West DX01 \n", "3 Oud West / De Baarsjes DX05 \n", "4 Oud West / De Baarsjes DX05 \n", "\n", " ... Verblijfsobjectstatus \\\n", "0 ... Verblijfsobject in gebruik \n", "1 ... Verblijfsobject in gebruik \n", "2 ... Verblijfsobject in gebruik \n", "3 ... Verblijfsobject in gebruik \n", "4 ... Verblijfsobject in gebruik \n", "\n", " Openbareruimte-identificatie Pandidentificatie \\\n", "0 363300000002537 ['0363100012159829'] \n", "1 363300000002541 ['0363100012120031'] \n", "2 363300000002529 ['0363100012174784'] \n", "3 363300000002537 ['0363100012157570'] \n", "4 363300000002541 ['0363100012120432'] \n", "\n", " Verblijfsobjectidentificatie Ligplaatsidentificatie \\\n", "0 3.630100e+14 NaN \n", "1 3.630100e+14 NaN \n", "2 3.630100e+14 NaN \n", "3 3.630100e+14 NaN \n", "4 3.630100e+14 NaN \n", "\n", " Standplaatsidentificatie Nummeraanduidingidentificatie lng \\\n", "0 NaN 363200000007060 4.874401 \n", "1 NaN 363200000007846 4.864202 \n", "2 NaN 363200000006112 4.883470 \n", "3 NaN 363200000007066 4.874329 \n", "4 NaN 363200000007852 4.864099 \n", "\n", " lat locatie_cleaned \n", "0 52.364906 4.8744013,52.3649059 \n", "1 52.360826 4.8642015,52.3608257 \n", "2 52.378220 4.8834704,52.3782196 \n", "3 52.364798 4.8743292,52.3647977 \n", "4 52.360816 4.8640988,52.3608163 \n", "\n", "[5 rows x 34 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "count 510436\n", "unique 314880\n", "top 4.8507211,52.3574849\n", "freq 145\n", "Name: locatie_cleaned, dtype: object" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Loading from disk because file is 17mb, loading from site takes too long\n", "df_adressen = pd.read_csv('data/export_20180227_122333.zip', encoding='latin-1', sep=\";\")\n", "# Convert lat and long values to float\n", "df_adressen['lng'] = df_adressen['Longitude (WGS84)'].str.replace(',', '.').astype(float)\n", "df_adressen['lat'] = df_adressen['Latitude (WGS84)'].str.replace(',', '.').astype(float)\n", "# A few rows have NaN as longtitude or lattitude, let's remove those\n", "df_adressen = df_adressen[pd.notnull(df_adressen['lng'])]\n", "df_adressen = df_adressen[pd.notnull(df_adressen['lat'])]\n", "# Now combine the coordinates into a string\n", "df_adressen['locatie_cleaned'] = df_adressen['lng'].map(str) + \",\" + df_adressen['lat'].map(str)\n", "df_adressen.head()\n", "df_adressen['locatie_cleaned'].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 Which residences are within the 5-minute isochrones?\n", "\n", "Let's calculate who lives inside the isochrones I calculated earlier. Using [the even–odd rule](https://en.wikipedia.org/wiki/Even–odd_rule) I can determine if a point is inside a polygon or not." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Put geojson in variable\n", "with open('data/isochrone_featurecollection_300.geojson') as geojson_file: \n", " isochrones_300 = geojson.load(geojson_file)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Create even-odd rule function, see https://en.wikipedia.org/wiki/Even–odd_rule\n", "def is_point_in_path(x, y, poly):\n", " \"\"\"\n", " x, y -- x and y coordinates of point\n", " poly -- a list of tuples [(x, y), (x, y), ...]\n", " \"\"\"\n", " num = len(poly)\n", " i = 0\n", " j = num - 1\n", " c = False\n", " for i in range(num):\n", " if ((poly[i][1] > y) != (poly[j][1] > y)) and \\\n", " (x < poly[i][0] + (poly[j][0] - poly[i][0]) * (y - poly[i][1]) /\n", " (poly[j][1] - poly[i][1])):\n", " c = not c\n", " j = i\n", " return c" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# Create function that outputs an Array with the names of the nearest worm hotel, or 'Not found'\n", "def is_point_in_isochrones(isochrone_geojson,lng,lat):\n", " geos = []\n", " for i in range(len(isochrone_geojson['features'])):\n", " geos.append(list(geojson.utils.coords(isochrone_geojson['features'][i])))\n", " coordinates = []\n", " for i in range(len(geos)):\n", " if is_point_in_path(lng,lat,geos[i]):\n", " coordinates.append(df_buurtcompost.Straatnaam.iloc[i])\n", " return coordinates or [\"Not found\"]\n", "\n", "# Create a function with a single argument I can apply to the pandas dataframe\n", "def is_point_in_isochrones_300(locatie_cleaned):\n", " isochrone_geojson = isochrones_300\n", " array_string = locatie_cleaned.split(',')\n", " lng = float(array_string[0])\n", " lat = float(array_string[1])\n", " return is_point_in_isochrones(isochrone_geojson, lng, lat)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Test the function" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['hoek jacob catskade - de wittenstraat']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "['Frans Halsstraat', 'daniel stalpertstraat', 'quellijnstraat']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "['Frans Halsstraat', 'sarphatipark/sweelinckstraat']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "is_point_in_isochrones(isochrones_300, 4.876480, 52.381994) # Near my house\n", "is_point_in_isochrones(isochrones_300, 4.88718,52.357117) # Address which is within 3 polygons\n", "is_point_in_isochrones_300(df_adressen.locatie_cleaned[4433]) # Testing the function to use with Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Apply function to all addresses" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Calculate this for all residences. Warning: this will take a while (10 minutes on my computer)\n", "df_adressen['wormhotel_within_5_minutes'] = df_adressen['locatie_cleaned'].apply(\n", " np.vectorize(is_point_in_isochrones_300))\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Naam openbare ruimteHuisnummerHuisletterHuisnummertoevoegingPostcodeWoonplaatsNaam stadsdeelCode stadsdeelNaam gebiedsgerichtwerkengebiedCode gebiedsgerichtwerkengebied...Openbareruimte-identificatiePandidentificatieVerblijfsobjectidentificatieLigplaatsidentificatieStandplaatsidentificatieNummeraanduidingidentificatielnglatlocatie_cleanedwormhotel_within_5_minutes
0Eerste Constantijn Huygensstraat15NaN11054BPNaNWestEOud West / De BaarsjesDX05...363300000002537['0363100012159829']3.630100e+14NaNNaN3632000000070604.87440152.3649064.8744013,52.3649059[Not found]
1Eerste Helmersstraat188NaN31054ELNaNWestEOud West / De BaarsjesDX05...363300000002541['0363100012120031']3.630100e+14NaNNaN3632000000078464.86420252.3608264.8642015,52.3608257[Not found]
2Eerste Anjeliersdwarsstraat1NaN21015NRNaNCentrumACentrum-WestDX01...363300000002529['0363100012174784']3.630100e+14NaNNaN3632000000061124.88347052.3782204.8834704,52.3782196[Not found]
3Eerste Constantijn Huygensstraat19NaN21054BPNaNWestEOud West / De BaarsjesDX05...363300000002537['0363100012157570']3.630100e+14NaNNaN3632000000070664.87432952.3647984.8743292,52.3647977[Not found]
4Eerste Helmersstraat190NaN31054ELNaNWestEOud West / De BaarsjesDX05...363300000002541['0363100012120432']3.630100e+14NaNNaN3632000000078524.86409952.3608164.8640988,52.3608163[Not found]
\n", "

5 rows Ă— 35 columns

\n", "
" ], "text/plain": [ " Naam openbare ruimte Huisnummer Huisletter \\\n", "0 Eerste Constantijn Huygensstraat 15 NaN \n", "1 Eerste Helmersstraat 188 NaN \n", "2 Eerste Anjeliersdwarsstraat 1 NaN \n", "3 Eerste Constantijn Huygensstraat 19 NaN \n", "4 Eerste Helmersstraat 190 NaN \n", "\n", " Huisnummertoevoeging Postcode Woonplaats Naam stadsdeel Code stadsdeel \\\n", "0 1 1054BP NaN West E \n", "1 3 1054EL NaN West E \n", "2 2 1015NR NaN Centrum A \n", "3 2 1054BP NaN West E \n", "4 3 1054EL NaN West E \n", "\n", " Naam gebiedsgerichtwerkengebied Code gebiedsgerichtwerkengebied \\\n", "0 Oud West / De Baarsjes DX05 \n", "1 Oud West / De Baarsjes DX05 \n", "2 Centrum-West DX01 \n", "3 Oud West / De Baarsjes DX05 \n", "4 Oud West / De Baarsjes DX05 \n", "\n", " ... Openbareruimte-identificatie \\\n", "0 ... 363300000002537 \n", "1 ... 363300000002541 \n", "2 ... 363300000002529 \n", "3 ... 363300000002537 \n", "4 ... 363300000002541 \n", "\n", " Pandidentificatie Verblijfsobjectidentificatie Ligplaatsidentificatie \\\n", "0 ['0363100012159829'] 3.630100e+14 NaN \n", "1 ['0363100012120031'] 3.630100e+14 NaN \n", "2 ['0363100012174784'] 3.630100e+14 NaN \n", "3 ['0363100012157570'] 3.630100e+14 NaN \n", "4 ['0363100012120432'] 3.630100e+14 NaN \n", "\n", " Standplaatsidentificatie Nummeraanduidingidentificatie lng \\\n", "0 NaN 363200000007060 4.874401 \n", "1 NaN 363200000007846 4.864202 \n", "2 NaN 363200000006112 4.883470 \n", "3 NaN 363200000007066 4.874329 \n", "4 NaN 363200000007852 4.864099 \n", "\n", " lat locatie_cleaned wormhotel_within_5_minutes \n", "0 52.364906 4.8744013,52.3649059 [Not found] \n", "1 52.360826 4.8642015,52.3608257 [Not found] \n", "2 52.378220 4.8834704,52.3782196 [Not found] \n", "3 52.364798 4.8743292,52.3647977 [Not found] \n", "4 52.360816 4.8640988,52.3608163 [Not found] \n", "\n", "[5 rows x 35 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_adressen.head()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# Also create a true/false column for easy plotting\n", "def wormhotel_within_5_minutes_true_false(array):\n", " if array[0] == \"Not found\":\n", " return False\n", " else:\n", " return True\n", "\n", "df_adressen['is_wormhotel_within_5_minutes'] = df_adressen['wormhotel_within_5_minutes'].apply(wormhotel_within_5_minutes_true_false)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Plot: how many people are within a 5 minute walk according to the isochrones?\n", "\n", "We're only interested in residences (addresses where people live). Let's select those." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "df_adressen_woning = df_adressen[df_adressen['Feitelijk gebruik'].str.contains(\"woning\", na=False)]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "438028" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "False 334937\n", "True 103091\n", "Name: is_wormhotel_within_5_minutes, dtype: int64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "len(df_adressen_woning)\n", "df_adressen_woning.is_wormhotel_within_5_minutes.value_counts()\n", "p = sns.countplot(data=df_adressen_woning, x = 'is_wormhotel_within_5_minutes')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is quite surprising! 24% of all residence addresses are within a 5 minute walk of a worm hotel.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4 Calculating a route to the nearest worm hotel for all addresses with OSRM\n", "\n", "Seeing which addresses are within a 5 minute walk from a worm hotel is a nice start, but let's go deeper! I can calculate how far **every** address needs to walk to the nearest worm hotel. If I know this, I can be much more precise in \n", "\n", "To get walking distances for all addresses, I need a routing service. I installed the excellent OSRM project locally with docker via http://router.project-osrm.org/ and used the latest information for\n", "The Netherlands via http://download.geofabrik.de.\n", "\n", "OSRM lets you create a matrix that shows the walking duration for a series of points. I can create a 1 by many matrix for each address, and pick out the worm hotel with the shortest walking duration. The OSMR [doesn't return distance](https://github.com/Project-OSRM/osrm-backend/issues/1353), but since walking speed is set at 5 km/h by default and walking penalties are only given for sandy terrain and the like, I can reasonably calculate the distance in meters from the duration information.\n", "\n", "I'll first explore how to get the right information from the API, and then create a function which picks the nearest worm hotel for an address, and also prints the walking duration in minutes and distance in meters.\n", "\n", "#### First some exploration by hand\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Example of URL to send the API call with: http://0.0.0.0:5000/table/v1/foot/4.876480,52.381994;4.888706,52.356007;4.908527,52.349857;4.871422,52.391292;4.945789,52.36213;4.910984,52.382154;4.864346,52.3687925;4.926176,52.3370046;4.971355,52.37154;5.004663,52.345872;4.861766,52.376636;4.923331,52.366302;4.9177,52.351515;4.887118,52.356278;4.887075,52.35694;5.000672,52.353723;4.9758081,52.3612775;4.9457027,52.3681734;4.9939396,52.3572812;4.9520167,52.3340925;4.877403,52.313325;4.9121,52.3511739;4.8247244,52.3604001;4.8815228,52.3514622;4.9442745,52.3920048;4.9464001,52.3773338;4.8999979,52.4053634;4.9392225,52.3594959;4.7711392,52.3800813;4.9461426,52.3742948;4.8538532,52.3676329;4.8515358,52.2839112;4.9365725,52.3703089;4.8761048,52.3900331;4.8761638,52.3813059;4.8487945,52.3403283;4.8980131,52.355381;4.9840798,52.2981711;4.9370124,52.3571305;4.9071004,52.3491685?sources=0\n" ] }, { "data": { "text/plain": [ "0" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "All distances I get from the test url: [2602, 3748.6, 1119.6, 4334.4, 2271.9, 1586.6, 5376.6, 7132.4, 8087.9, 1292, 3097.4, 4021.7, 2553.4, 2505, 8017.2, 5816.8, 4204.5, 8434.5, 6620.2, 7349.9, 3681.9, 3936.7, 2952.7, 4164.8, 4094.8, 4238.1, 4239.7, 5938.3, 3923.9, 2215.6, 9138.1, 3642.4, 891.9, 59.4, 4627.8, 2997.8, 10855.8, 4395.8, 3726.4]\n", "Index of the wormhotel in the wormhotel dataset: 33\n", "Seconds I have to walk to the nearest hotel: 59.4\n" ] }, { "data": { "text/plain": [ "OBJECTNUMMER 42\n", "Straatnaam hoek jacob catskade - de wittenstraat\n", "Initiatiefnemer hilde\n", "Email amsterdam+a209@wormenhotel.nl\n", "Aantal_bewoners 15\n", "Soort_afval GF\n", "Gebruik Toestemming van initiatiefnemer\n", "Startjaar 2017\n", "Foto NaN\n", "COORDS POINT(4.8761638,52.3813059)\n", "LNG 4,8761638\n", "LAT 52,3813059\n", "Unnamed: 12 NaN\n", "locatie_cleaned 4.8761638,52.3813059\n", "lng 4.87616\n", "lat 52.3813\n", "Name: 33, dtype: object" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "close_to_my_address = \"4.877951499999995,52.3824856\"\n", "close_to_my_address = \"4.876480,52.381994\"\n", "buurtcompostlocaties = df_buurtcompost.locatie_cleaned.values\n", "buurtcompostlocaties_string = \";\".join(buurtcompostlocaties)\n", "\n", "profile = \"foot\"\n", "\n", "# URL format for a htpp API call for getting a matrix is http://0.0.0.0:5000/table/v1/walking/\n", "# 52.3548300687;4.7856975691585,52.349415837928;4.7941351619763,52.357223885252?sources=0\n", "# 'sources=0' indicates that I only want the distances from the first set of coordinates\n", "# to all the others. As a test I construct a URL that gives me the walking duration from my\n", "# address to all the worm hotels.\n", " \n", "testURL_wormhotel_distance_from_my_address = \"http://0.0.0.0:5000/table/v1/\" + profile + \"/\" \\\n", " + close_to_my_address + \";\" \\\n", " + buurtcompostlocaties_string \\\n", " + \"?sources=0\"\n", " \n", "print(\"Example of URL to send the API call with: \" + testURL_wormhotel_distance_from_my_address)\n", "\n", "\n", "# Let's run a request and only select the duration array\n", "distances_from_testURL = requests.get(testURL_wormhotel_distance_from_my_address).json()[\"durations\"][0]\n", "\n", "# This gives us a durations array. The first is 0 and the duration to my own address, so I can remove that:\n", "distances_from_testURL.pop(0)\n", "print(\"All distances I get from the test url: \" + str(distances_from_testURL))\n", "\n", "# Give us the duration and the index of the wormhotel that's closest\n", "print(\"Index of the wormhotel in the wormhotel dataset: \" + str(distances_from_testURL.index(min(distances_from_testURL))))\n", "print(\"Seconds I have to walk to the nearest hotel: \" + str(min(distances_from_testURL)))\n", "\n", "# Let's find out where the nearest wormhotel to my house is! 🎉\n", "df_buurtcompost.iloc[33]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "Turns out I only have to walk a minute to the nearest hotel!\n", "\n", "#### Creating a function\n", "\n", "Let's wrap this up in a function so I can encode the whole dataset with this information." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "39" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "buurtcompostlocaties = df_buurtcompost.locatie_cleaned.values\n", "buurtcompostlocaties_string = \";\".join(buurtcompostlocaties)\n", "\n", "len(buurtcompostlocaties)\n", "\n", "def compute_nearest_target_information(cell):\n", " current_coordinates = cell\n", " profile = \"foot\"\n", " requestURL = \"http://0.0.0.0:5000/table/v1/\" + profile + \"/\" \\\n", " + current_coordinates + \";\" \\\n", " + buurtcompostlocaties_string \\\n", " + \"?sources=0\"\n", " distances = requests.get(requestURL).json()[\"durations\"][0]\n", " distances.pop(0)\n", " seconds = min(distances)\n", " meters = seconds * 1.388888889\n", " index = distances.index(min(distances))\n", " buurtcompost_values = df_buurtcompost.iloc[index].values \n", " return (seconds, meters, index, buurtcompost_values)\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(162.2,\n", " 225.27777779579998,\n", " 33,\n", " array([42, 'hoek jacob catskade - de wittenstraat', 'hilde',\n", " 'amsterdam+a209@wormenhotel.nl', 15, 'GF',\n", " 'Toestemming van initiatiefnemer', 2017, nan,\n", " 'POINT(4.8761638,52.3813059)', '4,8761638', '52,3813059', nan,\n", " '4.8761638,52.3813059', 4.8761637999999996, 52.381305900000001], dtype=object))" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "(949.3, 1318.4722223277, 5, array([9, 'schimmelstraat 44',\n", " 'stadsboerderij zimmerhoeve, annelijn van amsterdam',\n", " 'info@zimmerhoeve.nl', 0, 'GF', 'Toestemming van initiatiefnemer',\n", " 0, nan, 'POINT(4.864346,52.3687925)', '4,864346', '52,3687925', nan,\n", " '4.864346,52.3687925', 4.8643460000000003, 52.368792499999998], dtype=object))" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Test output with my and someone else's house (or rather near it)\n", "compute_nearest_target_information(\"4.877951499999995,52.3824856\")\n", "compute_nearest_target_information(\"4.8796727,52.3712739\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Success!**\n", "\n", "#### Applying the router to all addresses in Amsterdam\n", "\n", "Neat! Now I can apply this function to the addresses in Amsterdam. First, lets apply this to small amount of people and also time it, so I can see how long our computer needs to work on the whole dataset.\n", "\n", "*Note: Because this takes a while, I ran this seperately and wrote the output to a CSV, which I'll import here instead.*" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# %%time\n", "# df_adressen.is_copy = False\n", "# df_adressen['Nearest wormhotel information'] = df_adressen['locatie_cleaned'].apply(\n", "# np.vectorize(compute_nearest_target_information))\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I now need to split the output from the function over new columns in the dataset. I also add the information from the nearest hotel as new columns to the dataset." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# # Let's split it! Value inside df_adressen['Nearest wormhotel information'] are\n", "# # 'seconds, meters, index, buurtcompost_values', and buurtcompostvalues are\n", "# # 'OBJECTNUMMER', 'Straatnaam', 'Initiatiefnemer', 'Email', 'Aantal_bewoners', 'Soort_afval',\n", "# # 'Gebruik', 'Startjaar', 'Foto', 'COORDS', 'LNG', 'LAT', 'Unnamed: 12', 'locatie_cleaned''\n", "\n", "# df_adressen['nearest_hotel_duration'], df_adressen['nearest_hotel_meters'], df_adressen[\n", "# 'nearest_hotel_index'], df_adressen['nearest_hotel_values'] = zip(*df_adressen['Nearest wormhotel information'])\n", "\n", "# df_adressen['hotel_OBJECTNUMMER'], df_adressen['hotel_Straatnaam'], df_adressen['hotel_Initiatiefnemer'], \\\n", "# df_adressen['hotel_Email'], df_adressen['hotel_Aantal_bewoners'], df_adressen['hotel_Soort_afval', ], \\\n", "# df_adressen['hotel_Gebruik'], df_adressen['hotel_Startjaar'], df_adressen['hotel_Foto'], \\\n", "# df_adressen['hotel_COORDS'], df_adressen['hotel_LNG'], df_adressen['hotel_LAT'], df_adressen['hotel_Unnamed: 12'], \\\n", "# df_adressen['hotel_locatie_cleaned'], df_adressen['hotel_lng'], df_adressen['hotel_lat'] = zip(*df_adressen['nearest_hotel_values'])\n", "\n", "# df_adressen.to_csv('data/df_adressen.csv')\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Naam openbare ruimteHuisnummerHuisletterHuisnummertoevoegingPostcodeWoonplaatsNaam stadsdeelCode stadsdeelNaam gebiedsgerichtwerkengebiedCode gebiedsgerichtwerkengebied...hotel_Fotohotel_COORDShotel_LNGhotel_LAThotel_Unnamed: 12hotel_locatie_cleanedhotel_lnghotel_latwormhotel_within_5_minutesis_wormhotel_within_5_minutes
509940Goudsbloemstraat91NaN11015JKNaNCentrumACentrum-WestDX01...NaNPOINT(4.8761638,52.3813059)4,876163852,3813059NaN4.8761638,52.38130594.87616452.381306['Not found']False
510067John Franklinstraat69NaNH1056TANaNWestEOud West / De BaarsjesDX05...magalhaens.jpegPOINT(4.8538532,52.3676329)4,853853252,3676329NaN4.8538532,52.36763294.85385352.367633['Not found']False
510117Retiefstraat22ANaN1092XDNaNOostMOud-OostDX13...NaNPOINT(4.9177,52.351515)4,917752,351515NaN4.9177,52.3515154.91770052.351515['Not found']False
510188Tweede Atjehstraat40NaN41094LHNaNOostMIndische Buurt / Oostelijk HavengebiedDX14...halma.jpegPOINT(4.9392225,52.3594959)4,939222552,3594959NaN4.9392225,52.35949594.93922252.359496['Not found']False
510354De Lairessestraat13ANaN1071NRNaNZuidKOud ZuidDX10...hartmonie.jpgPOINT(4.8815228,52.3514622)4,881522852,3514622NaN4.8815228,52.35146224.88152352.351462['Not found']False
\n", "

5 rows Ă— 57 columns

\n", "
" ], "text/plain": [ " Naam openbare ruimte Huisnummer Huisletter Huisnummertoevoeging \\\n", "509940 Goudsbloemstraat 91 NaN 1 \n", "510067 John Franklinstraat 69 NaN H \n", "510117 Retiefstraat 22 A NaN \n", "510188 Tweede Atjehstraat 40 NaN 4 \n", "510354 De Lairessestraat 13 A NaN \n", "\n", " Postcode Woonplaats Naam stadsdeel Code stadsdeel \\\n", "509940 1015JK NaN Centrum A \n", "510067 1056TA NaN West E \n", "510117 1092XD NaN Oost M \n", "510188 1094LH NaN Oost M \n", "510354 1071NR NaN Zuid K \n", "\n", " Naam gebiedsgerichtwerkengebied \\\n", "509940 Centrum-West \n", "510067 Oud West / De Baarsjes \n", "510117 Oud-Oost \n", "510188 Indische Buurt / Oostelijk Havengebied \n", "510354 Oud Zuid \n", "\n", " Code gebiedsgerichtwerkengebied ... \\\n", "509940 DX01 ... \n", "510067 DX05 ... \n", "510117 DX13 ... \n", "510188 DX14 ... \n", "510354 DX10 ... \n", "\n", " hotel_Foto hotel_COORDS hotel_LNG hotel_LAT \\\n", "509940 NaN POINT(4.8761638,52.3813059) 4,8761638 52,3813059 \n", "510067 magalhaens.jpeg POINT(4.8538532,52.3676329) 4,8538532 52,3676329 \n", "510117 NaN POINT(4.9177,52.351515) 4,9177 52,351515 \n", "510188 halma.jpeg POINT(4.9392225,52.3594959) 4,9392225 52,3594959 \n", "510354 hartmonie.jpg POINT(4.8815228,52.3514622) 4,8815228 52,3514622 \n", "\n", " hotel_Unnamed: 12 hotel_locatie_cleaned hotel_lng hotel_lat \\\n", "509940 NaN 4.8761638,52.3813059 4.876164 52.381306 \n", "510067 NaN 4.8538532,52.3676329 4.853853 52.367633 \n", "510117 NaN 4.9177,52.351515 4.917700 52.351515 \n", "510188 NaN 4.9392225,52.3594959 4.939222 52.359496 \n", "510354 NaN 4.8815228,52.3514622 4.881523 52.351462 \n", "\n", " wormhotel_within_5_minutes is_wormhotel_within_5_minutes \n", "509940 ['Not found'] False \n", "510067 ['Not found'] False \n", "510117 ['Not found'] False \n", "510188 ['Not found'] False \n", "510354 ['Not found'] False \n", "\n", "[5 rows x 57 columns]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Using zip to bypass github's filesize limit of 100mb\n", "df_adressen = pd.read_csv('data/df_adressen_schoon.zip')\n", "df_adressen_woning = df_adressen[df_adressen['Feitelijk gebruik'].str.contains(\"woning\", na=False)]\n", "df_adressen_woning.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The address dataset is complete!\n", "\n", "### 2.5 Fast lookup of worm hotel closest to address\n", "\n", "Now I can build a simple function which queries the dataset for a streetname and number, and returns information about the nearest worm hotel:\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Nearest Worm hotel name: hoek jacob catskade - de wittenstraat, Walking duration: 0.82 minutes. Contact amsterdam+a209@wormenhotel.nl for more information. Openrouteservice.org URL: https://maps.openrouteservice.org/directions?a=52.3818921,4.8763493,52.3813059,4.8761638&b=2&c=0&g1=-1&g2=0&k1=en-US&k2=km'" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'Nearest Worm hotel name: schimmelstraat 44, Walking duration: 15.83 minutes. Contact info@zimmerhoeve.nl for more information. Openrouteservice.org URL: https://maps.openrouteservice.org/directions?a=52.3711914,4.8793065,52.3687925,4.864346&b=2&c=0&g1=-1&g2=0&k1=en-US&k2=km'" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'Nothing found'" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'Nearest Worm hotel name: sarphatipark/sweelinckstraat, Walking duration: 23.79 minutes. Contact wormenhotelsweelinck@gmail.com for more information. Openrouteservice.org URL: https://maps.openrouteservice.org/directions?a=52.3695584,4.8991772,52.355381,4.8980131&b=2&c=0&g1=-1&g2=0&k1=en-US&k2=km'" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def lookup_nearest_worm_hotel(straatnaam, nummer):\n", " index = 0\n", " index = df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].nearest_hotel_index\n", " if len(index) == 0:\n", " return \"Nothing found\"\n", " else:\n", " duration = df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].nearest_hotel_duration.iloc[0]\n", " hotel_name = df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].hotel_Straatnaam.iloc[0]\n", " contact = df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].hotel_Email.iloc[0]\n", " hotel_latlong = str(df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].hotel_lat.iloc[0]) + \",\" + str(df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].hotel_lng.iloc[0])\n", " adres_latlong = str(df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].lat.iloc[0]) + \",\" + str(df_adressen_woning.loc[(df_adressen_woning['Naam openbare ruimte'] == straatnaam) & (df_adressen_woning['Huisnummer'] == nummer)].lng.iloc[0])\n", " return \"Nearest Worm hotel name: \" + hotel_name + \", Walking duration: \" + str(round(duration / 60,2)) + \" minutes. Contact \" + str(contact) + \" for more information. Openrouteservice.org URL: https://maps.openrouteservice.org/directions?a=\" + str(adres_latlong) + \",\" + str(hotel_latlong) + \"&b=2&c=0&g1=-1&g2=0&k1=en-US&k2=km\"\n", " # return \"Nearest Worm hotel name: \" + hotel_name + \", Walking duration: \" + str(round(duration / 60,2)) + \" minutes. Contact \" + str(contact) + \" for more information. Google maps URL: http://maps.google.com/maps?q=\" + str(hotel_latlong) + \" .\"\n", "\n", "lookup_nearest_worm_hotel(\"De Wittenstraat\",174)\n", "lookup_nearest_worm_hotel(\"Lauriergracht\",112)\n", "lookup_nearest_worm_hotel(\"The Wittenstraat\",172) # Intentionally incorrect streetname to test error handling\n", "lookup_nearest_worm_hotel(\"Groenburgwal\", 1)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.6 Comparison of the OSRM and Openrouteservice calculations\n", "\n", "Let's see if the numbers from the isochrones compare to the information I have now." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "438028" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "False 334765\n", "True 103263\n", "Name: is_wormhotel_within_5_minutes, dtype: int64" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "len(df_adressen_woning)\n", "df_adressen_woning.is_wormhotel_within_5_minutes.value_counts()\n", "isochrones = sns.countplot(data=df_adressen_woning, x = 'is_wormhotel_within_5_minutes')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "438028" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "False 386897\n", "True 51131\n", "Name: nearest_hotel_duration_under_300, dtype: int64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_adressen_woning['nearest_hotel_duration_under_300'] = df_adressen_woning['nearest_hotel_duration'].transform(lambda x: x < 300.5)\n", "len(df_adressen_woning)\n", "df_adressen_woning.nearest_hotel_duration_under_300.value_counts()\n", "\n", "p = sns.countplot(data=df_adressen_woning, x = 'nearest_hotel_duration_under_300')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "They don't! According to our routing through OSRM, only 12% of the residence addresses are within a 5 minute walk of a worm hotel, as opposed to the 24% I calculated with openrouteservice.org. Your mileage may vary!\n", "\n", "Digging into the data generated by OSRM a bit more, I noticed that OSRM missed a few nearby worm hotels for a few neighbourhoods. When I tested the route between an address and a nearby worm hotel in IJburg, the frontend gave me this:\n", "\n", "![](osrm-mishap.png)\n", "\n", "The route is completely off, so the results get skewed here. I don't know how to solve this, and it's strange that openrouteservice.org gives a different result with the isochrones, but also gives a weird (and different!) route when routing addresses in IJburg:\n", "\n", "![](ors-mishap.png)\n", "\n", "Google Maps does work, and shows this:\n", "\n", "![](maps-success.png)\n", "\n", "I notified Openstreetmap of this error.\n", "\n", "I can also see this when I plot a histogram of the nearest times calculated by OSRM. Look at the tail over 10000 seconds (a 2.8 hour walk!):\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = sns.distplot(df_adressen_woning['nearest_hotel_duration'], kde=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ideally this would be addressed at openstreetmap and temporarily solved by using as the crow flies for IJburg, but for the purpose of the analysis of the whole city, I'll exclude IJburg for now. Luckily IJburg is already nicely covered with 3 worm hotels." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "df_adressen_woning_not_ijburg = df_adressen_woning[df_adressen_woning['Naam Wijk'].str.contains('IJburg') == False]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also, openrouteservice.org seems to give much shorter times when calculating an isochrone than when using the router option. For example 'Amaliastraat 10' in Amsterdam is supposed to be less than 300 seconds away from the nearest hotel according to our earlier isochrone calculations, but according to their own router, it's a 480 second walk. That's a good explanation why the OSRM calculation shows much less worm hotels within a 5 minute walk radius.\n", "\n", "If I expand the radius of the OSRM calculation to 500 seconds, I get about the same distribution as I got from the isochrone calculation. I think 500 seconds is a good upper maximum: an 8 minute walk is doable for early adopters, and by bike it's even faster." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "429179" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "False 321889\n", "True 107290\n", "Name: nearest_hotel_duration_under_500, dtype: int64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "len(df_adressen_woning_not_ijburg)\n", "df_adressen_woning_not_ijburg['nearest_hotel_duration_under_500'] = df_adressen_woning_not_ijburg['nearest_hotel_duration'].transform(lambda x: x < 500.5)\n", "df_adressen_woning_not_ijburg.nearest_hotel_duration_under_500.value_counts()\n", "p = sns.countplot(data=df_adressen_woning_not_ijburg, x = 'nearest_hotel_duration_under_500')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 2.7 Percentages, histograms, and bins\n", "\n", "The percentage of the number of hotels within a 500 second radius according to OSRM is 33.3%:\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'33.3%'" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str(int((df_adressen_woning_not_ijburg.nearest_hotel_duration_under_500.value_counts()[1] / df_adressen_woning_not_ijburg.nearest_hotel_duration_under_500.value_counts()[0]) * 1000) / 10) + \"%\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the histogram, I see a lot of times below 1000 seconds (16.7 minutes)." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAELCAYAAAAybErdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAGnVJREFUeJzt3X+0XeVd5/H3Z6BQRGmCBFZMwFDNVLHLUshAatVhioaAjmFmwIF2JEVccTHotKMuC+paVGrXascZq8woGttI6LSlWFvJ6gRjhoI/ZgolFMqPUswtpXAFIRpKsR1bqd/5Yz+3nGafm3vuTci5yX2/1jrr7P3dz97n2WdDPnf/OHunqpAkadA/G3cHJEnzj+EgSeoxHCRJPYaDJKnHcJAk9RgOkqQew0GS1DNjOCR5RZJ7B15fTPLmJMcm2Z5kZ3tf3NonybVJJpLcl+S0gWWtb+13Jlk/UD89yf1tnmuT5MVZXUnSKGYMh6p6uKpOrapTgdOBLwMfAa4Ebq2qlcCtbRzgXGBle20ArgNIcixwNXAmcAZw9VSgtDYbBuZbu1/WTpI0J4fPsv3ZwGer6vNJ1gFntfpm4HbgLcA64Ibqfnp9R5JFSZa2tturajdAku3A2iS3A8dU1cdb/QbgfOCWvXXkuOOOqxUrVsyy+5K0cN19991/W1VLRmk723C4CPhAGz6hqp4EqKonkxzf6suAxwfmmWy1vdUnh9R7kmyg28PgpJNOYseOHbPsviQtXEk+P2rbkU9IJzkC+DHgD2dqOqRWc6j3i1Ubq2pVVa1asmSk8JMkzcFsrlY6F/hkVT3Vxp9qh4to70+3+iRw4sB8y4EnZqgvH1KXJI3JbMLhYl44pASwBZi64mg9cPNA/ZJ21dJq4Nl2+GkbsCbJ4nYieg2wrU17LsnqdpXSJQPLkiSNwUjnHJJ8E/DDwE8PlN8B3JTkMuAx4MJW3wqcB0zQXdl0KUBV7U7yNuCu1u6aqZPTwOXA9cBRdCei93oyWpL04srB+jyHVatWlSekJWl0Se6uqlWjtPUX0pKkHsNBktRjOEiSegwHSVLPbH8hvSC9/87HhtZff+ZJB7gnknRguOcgSeoxHCRJPYaDJKnHcJAk9RgOkqQew0GS1GM4SJJ6DAdJUo/hIEnqMRwkST2GgySpx3CQJPUYDpKkHsNBktRjOEiSegwHSVKP4SBJ6hnpSXBJFgHvBl4JFPCTwMPAB4EVwKPAj1fVM0kC/BZwHvBl4I1V9cm2nPXAr7TF/lpVbW7104HrgaOArcCbqqr2ffVeXD4hTtKhatQ9h98C/qSqvgt4FfAQcCVwa1WtBG5t4wDnAivbawNwHUCSY4GrgTOBM4Crkyxu81zX2k7Nt3bfVkuStC9m3HNIcgzwg8AbAarqq8BXk6wDzmrNNgO3A28B1gE3tL/870iyKMnS1nZ7Ve1uy90OrE1yO3BMVX281W8Azgdu2S9rOAvT7QlI0kIzyp7Dy4FdwB8kuSfJu5McDZxQVU8CtPfjW/tlwOMD80+22t7qk0PqPUk2JNmRZMeuXbtG6LokaS5GCYfDgdOA66rq1cCXeOEQ0jAZUqs51PvFqo1VtaqqVi1ZsmTvvZYkzdko4TAJTFbVnW38Q3Rh8VQ7XER7f3qg/YkD8y8HnpihvnxIXZI0JjOGQ1X9DfB4kle00tnAp4EtwPpWWw/c3Ia3AJeksxp4th122gasSbK4nYheA2xr055Lsrpd6XTJwLIkSWMw0qWswM8C70tyBPAIcCldsNyU5DLgMeDC1nYr3WWsE3SXsl4KUFW7k7wNuKu1u2bq5DRwOS9cynoLYzgZLUl6wUjhUFX3AquGTDp7SNsCrphmOZuATUPqO+h+QyFJmgf8hbQkqcdwkCT1GA6SpB7DQZLUYzhIknoMB0lSj+EgSeoxHCRJPYaDJKnHcJAk9RgOkqQew0GS1GM4SJJ6DAdJUo/hIEnqMRwkST2GgySpx3CQJPUYDpKkHsNBktRjOEiSeg4fdwcORe+/87Gh9defedIB7okkzc1Iew5JHk1yf5J7k+xotWOTbE+ys70vbvUkuTbJRJL7kpw2sJz1rf3OJOsH6qe35U+0ebO/V1SSNLrZHFb6V1V1alWtauNXArdW1Urg1jYOcC6wsr02ANdBFybA1cCZwBnA1VOB0tpsGJhv7ZzXSJK0z/blnMM6YHMb3gycP1C/oTp3AIuSLAXOAbZX1e6qegbYDqxt046pqo9XVQE3DCxLkjQGo4ZDAX+a5O4kG1rthKp6EqC9H9/qy4DHB+adbLW91SeH1HuSbEiyI8mOXbt2jdh1SdJsjXpC+rVV9USS44HtST6zl7bDzhfUHOr9YtVGYCPAqlWrhraRJO27kfYcquqJ9v408BG6cwZPtUNCtPenW/NJ4MSB2ZcDT8xQXz6kLkkakxnDIcnRSb5lahhYAzwAbAGmrjhaD9zchrcAl7SrllYDz7bDTtuANUkWtxPRa4BtbdpzSVa3q5QuGViWJGkMRjmsdALwkXZ16eHA+6vqT5LcBdyU5DLgMeDC1n4rcB4wAXwZuBSgqnYneRtwV2t3TVXtbsOXA9cDRwG3tJckaUxmDIeqegR41ZD63wFnD6kXcMU0y9oEbBpS3wG8coT+SpIOAG+fIUnqMRwkST2GgySpx3CQJPUYDpKkHsNBktRjOEiSegwHSVKP4SBJ6jEcJEk9hoMkqcdwkCT1GA6SpB7DQZLUYzhIknoMB0lSj+EgSeoxHCRJPYaDJKnHcJAk9RgOkqSekcMhyWFJ7kny0TZ+cpI7k+xM8sEkR7T6kW18ok1fMbCMq1r94STnDNTXttpEkiv33+pJkuZiNnsObwIeGhh/J/CuqloJPANc1uqXAc9U1XcC72rtSHIKcBHwPcBa4Hda4BwG/DZwLnAKcHFrK0kak5HCIcly4EeAd7fxAK8DPtSabAbOb8Pr2jht+tmt/Trgxqr6SlV9DpgAzmiviap6pKq+CtzY2kqSxmTUPYffBH4R+Kc2/q3AF6rq+TY+CSxrw8uAxwHa9Gdb+6/X95hnurokaUxmDIckPwo8XVV3D5aHNK0Zps22PqwvG5LsSLJj165de+m1JGlfjLLn8Frgx5I8SnfI53V0exKLkhze2iwHnmjDk8CJAG36y4Ddg/U95pmu3lNVG6tqVVWtWrJkyQhdlyTNxYzhUFVXVdXyqlpBd0L5Y1X1BuA24ILWbD1wcxve0sZp0z9WVdXqF7WrmU4GVgKfAO4CVrarn45on7Flv6ydJGlODp+5ybTeAtyY5NeAe4D3tPp7gPcmmaDbY7gIoKoeTHIT8GngeeCKqvoaQJKfAbYBhwGbqurBfeiXJGkfzSocqup24PY2/AjdlUZ7tvkH4MJp5n878PYh9a3A1tn0RZL04vEX0pKkHsNBktRjOEiSegwHSVKP4SBJ6jEcJEk9hoMkqWdffgSnWXr/nY8Nrb/+zJMOcE8kae/cc5Ak9RgOkqQew0GS1GM4SJJ6DAdJUo/hIEnq8VLWecBLXCXNN+45SJJ6DAdJUo/hIEnqMRwkST2GgySpx3CQJPUYDpKknhnDIclLk3wiyaeSPJjkV1v95CR3JtmZ5INJjmj1I9v4RJu+YmBZV7X6w0nOGaivbbWJJFfu/9WUJM3GKHsOXwFeV1WvAk4F1iZZDbwTeFdVrQSeAS5r7S8Dnqmq7wTe1dqR5BTgIuB7gLXA7yQ5LMlhwG8D5wKnABe3tpKkMZkxHKrz9230Je1VwOuAD7X6ZuD8NryujdOmn50krX5jVX2lqj4HTABntNdEVT1SVV8FbmxtJUljMtI5h/YX/r3A08B24LPAF6rq+dZkEljWhpcBjwO06c8C3zpY32Oe6eqSpDEZKRyq6mtVdSqwnO4v/e8e1qy9Z5pps633JNmQZEeSHbt27Zq545KkOZnV1UpV9QXgdmA1sCjJ1I37lgNPtOFJ4ESANv1lwO7B+h7zTFcf9vkbq2pVVa1asmTJbLouSZqFUa5WWpJkURs+Cvgh4CHgNuCC1mw9cHMb3tLGadM/VlXV6he1q5lOBlYCnwDuAla2q5+OoDtpvWV/rJwkaW5GuWX3UmBzu6ronwE3VdVHk3wauDHJrwH3AO9p7d8DvDfJBN0ew0UAVfVgkpuATwPPA1dU1dcAkvwMsA04DNhUVQ/utzWUJM3ajOFQVfcBrx5Sf4Tu/MOe9X8ALpxmWW8H3j6kvhXYOkJ/JUkHgL+QliT1GA6SpB7DQZLUYzhIknoMB0lSj+EgSeoZ5XcOh5z33/nYuLsgSfOaew6SpB7DQZLUYzhIknoMB0lSj+EgSeoxHCRJPYaDJKnHcJAk9RgOkqQew0GS1GM4SJJ6DAdJUo/hIEnqMRwkST0L8pbdB4vpbi3++jNPOsA9kbTQzLjnkOTEJLcleSjJg0ne1OrHJtmeZGd7X9zqSXJtkokk9yU5bWBZ61v7nUnWD9RPT3J/m+faJHkxVlaSNJpRDis9D/x8VX03sBq4IskpwJXArVW1Eri1jQOcC6xsrw3AddCFCXA1cCZwBnD1VKC0NhsG5lu776smSZqrGcOhqp6sqk+24eeAh4BlwDpgc2u2GTi/Da8DbqjOHcCiJEuBc4DtVbW7qp4BtgNr27RjqurjVVXADQPLkiSNwaxOSCdZAbwauBM4oaqehC5AgONbs2XA4wOzTbba3uqTQ+qSpDEZ+YR0km8G/gh4c1V9cS+nBYZNqDnUh/VhA93hJ046aeGelN3bM7A9WS1pfxhpzyHJS+iC4X1V9eFWfqodEqK9P93qk8CJA7MvB56Yob58SL2nqjZW1aqqWrVkyZJRui5JmoNRrlYK8B7goar6jYFJW4CpK47WAzcP1C9pVy2tBp5th522AWuSLG4notcA29q055Ksbp91ycCyJEljMMphpdcCPwHcn+TeVvsl4B3ATUkuAx4DLmzTtgLnARPAl4FLAapqd5K3AXe1dtdU1e42fDlwPXAUcEt7SZLGZMZwqKq/ZPh5AYCzh7Qv4IpplrUJ2DSkvgN45Ux9kSQdGN4+Q5LUYzhIknoMB0lSj+EgSeoxHCRJPYaDJKnHcJAk9RgOkqQew0GS1GM4SJJ6DAdJUo/hIEnqGflhPzo4TPcgIB8CJGk23HOQJPUYDpKkHsNBktRjOEiSegwHSVKP4SBJ6jEcJEk9/s5hgfD3D5Jmwz0HSVLPjOGQZFOSp5M8MFA7Nsn2JDvb++JWT5Jrk0wkuS/JaQPzrG/tdyZZP1A/Pcn9bZ5rk2R/r6QkaXZG2XO4Hli7R+1K4NaqWgnc2sYBzgVWttcG4DrowgS4GjgTOAO4eipQWpsNA/Pt+VmSpANsxnCoqj8Hdu9RXgdsbsObgfMH6jdU5w5gUZKlwDnA9qraXVXPANuBtW3aMVX18aoq4IaBZUmSxmSu5xxOqKonAdr78a2+DHh8oN1kq+2tPjmkLkkao/19QnrY+YKaQ334wpMNSXYk2bFr1645dlGSNJO5hsNT7ZAQ7f3pVp8EThxotxx4Yob68iH1oapqY1WtqqpVS5YsmWPXJUkzmWs4bAGmrjhaD9w8UL+kXbW0Gni2HXbaBqxJsridiF4DbGvTnkuyul2ldMnAsiRJYzLjj+CSfAA4CzguySTdVUfvAG5KchnwGHBha74VOA+YAL4MXApQVbuTvA24q7W7pqqmTnJfTndF1FHALe0lSRqjGcOhqi6eZtLZQ9oWcMU0y9kEbBpS3wG8cqZ+SJIOHH8hLUnqMRwkST2GgySpx3CQJPV4y+4Fzlt5SxrGPQdJUo/hIEnqMRwkST2GgySpx3CQJPUYDpKkHsNBktRjOEiSevwRnIbaXz+O80d20sHJPQdJUo/hIEnq8bCS9ovpDh9JOjgZDpoVQ0BaGDysJEnqMRwkST2GgySpx3MOGgt//yDNb/NmzyHJ2iQPJ5lIcuW4+yNJC9m82HNIchjw28APA5PAXUm2VNWnx9szHWjuUUjzw3zZczgDmKiqR6rqq8CNwLox90mSFqx5secALAMeHxifBM4cU180D7lHIR1Y8yUcMqRWvUbJBmBDG/37JA/P8fOOA/52jvMeDBbM+r1hzB15kSyY7XcIm6/r+O2jNpwv4TAJnDgwvhx4Ys9GVbUR2LivH5ZkR1Wt2tflzFeu38HN9Tv4HQrrOF/OOdwFrExycpIjgIuALWPukyQtWPNiz6Gqnk/yM8A24DBgU1U9OOZuSdKCNS/CAaCqtgJbD9DH7fOhqXnO9Tu4uX4Hv4N+HVPVO+8rSVrg5ss5B0nSPLKgwuFgvUVHkhOT3JbkoSQPJnlTqx+bZHuSne19casnybVtPe9LctrAsta39juTrB/XOg2T5LAk9yT5aBs/Ocmdra8fbBcrkOTINj7Rpq8YWMZVrf5wknPGsyZ9SRYl+VCSz7Tt+JpDcPv95/bf5wNJPpDkpQfzNkyyKcnTSR4YqO23bZbk9CT3t3muTTLskv7xqaoF8aI70f1Z4OXAEcCngFPG3a8R+74UOK0NfwvwV8ApwH8Brmz1K4F3tuHzgFvofj+yGriz1Y8FHmnvi9vw4nGv38B6/hzwfuCjbfwm4KI2/LvA5W34PwK/24YvAj7Yhk9p2/VI4OS2vQ8b93q1vm0GfqoNHwEsOpS2H90PWT8HHDWw7d54MG9D4AeB04AHBmr7bZsBnwBe0+a5BTh33NvxG9Z/3B04gBv6NcC2gfGrgKvG3a85rsvNdPehehhY2mpLgYfb8O8BFw+0f7hNvxj4vYH6N7Qb8zotB24FXgd8tP0P87fA4XtuP7qr2l7Thg9v7bLnNh1sN+Z1O6b9w5k96ofS9pu6y8GxbZt8FDjnYN+GwIo9wmG/bLM27TMD9W9oNx9eC+mw0rBbdCwbU1/mrO1+vxq4Ezihqp4EaO/Ht2bTret8/g5+E/hF4J/a+LcCX6iq59v4YF+/vh5t+rOt/Xxdv5cDu4A/aIfN3p3kaA6h7VdVfw38V+Ax4Em6bXI3h842nLK/ttmyNrxnfd5YSOEw0i065rMk3wz8EfDmqvri3poOqdVe6mOV5EeBp6vq7sHykKY1w7R5uX50fxmfBlxXVa8GvkR3SGI6B9v60Y69r6M7FPRtwNHAuUOaHqzbcCazXZ95v54LKRxGukXHfJXkJXTB8L6q+nArP5VkaZu+FHi61adb1/n6HbwW+LEkj9Ldkfd1dHsSi5JM/RZnsK9fX482/WXAbubv+k0Ck1V1Zxv/EF1YHCrbD+CHgM9V1a6q+kfgw8D3cehswyn7a5tNtuE96/PGQgqHg/YWHe0qhvcAD1XVbwxM2gJMXf2wnu5cxFT9knYFxWrg2bYLvA1Yk2Rx+0tvTauNVVVdVVXLq2oF3Xb5WFW9AbgNuKA123P9ptb7gta+Wv2idiXMycBKupN+Y1VVfwM8nuQVrXQ28GkOke3XPAasTvJN7b/XqXU8JLbhgP2yzdq055Ksbt/XJQPLmh/GfdLjQL7orij4K7orIH553P2ZRb+/n26X8z7g3vY6j+4Y7a3AzvZ+bGsfuocnfRa4H1g1sKyfBCba69Jxr9uQdT2LF65WejndPwwTwB8CR7b6S9v4RJv+8oH5f7mt98PMo6s/gFOBHW0b/jHdlSuH1PYDfhX4DPAA8F66K44O2m0IfIDu/Mk/0v2lf9n+3GbAqvZdfRb4H+xxwcK4X/5CWpLUs5AOK0mSRmQ4SJJ6DAdJUo/hIEnqMRwkST2GgySpx3DQgpTkl2aYvmLwVs0jLvONSb5thHbXJ7lgpnat7VlptzDfH5K8Ock3DYxvTbJofy1fhw7DQQe9gdszzMZew2GO3kh3X6Gxab/Q3dv/128Gvh4OVXVeVX3hxe+ZDjaGgw6o9hf5Q0l+vz0Y5k+THJXkO5L8SZK7k/xFku9q7f91exjMPUn+d5ITWv2tSTYm+VPghnQPCvr1JHe1h638dGu3NMmfJ7k33UNofiDJO4CjWu19e+nuYXv2sy3z1CR3tM/5SLs1wgV0v3h9X1vuUe1hLn/W1mnb1D15RviO1qZ7KNBfAv92oP7WJL8wMP5A+z6nvtPfAT4JnJjkuiQ7Wt9/tbX/T3ThdVuS21rt0STHteGfa8t8IMmb97a9RlkPHeTG/RNtXwvrRXd//OeBU9v4TcB/oLsVwcpWO5PuXjvQ3WZi6pf8PwX8tzb8VrpbQk89XGYD8Ctt+Ei6W1WcDPw87VYpdA98+pY2/Pdz6Wcbvg/4l234GuA32/DttNsmAC8B/i+wpI3/e2BTG74euGCaz30p3S2eV9LdkuEmXridyFuBXxho+0Dr5wq6W52vHph27MA63w58bxt/FDhuoN2jwHHA6XS3fTga+GbgQbpbw0/7Pfg6tF9z2R2X9tXnqureNnw33T9A3wf8YV54UuKR7X058MH2V/cRdA/NmbKlqv5fG14DfO/AsfyX0f0DexewKd1dbf944HPn1M8kLwMWVdWftfpmunsE7ekVwCuB7W2dDqO7T89Mvqt97k6AJP+TLvhm8vmqumNg/MeTbKC7XfhSuies3beX+b8f+EhVfal97oeBH6C7odyw7aVDnOGgcfjKwPDXgBPoHgpz6pC2/x34jarakuQsur+ep3xpYDjAz1ZV7y6lSX4Q+BHgvUl+vapumGM/Z3M4JcCDVfWaWcwzZbobnj3PNx4KfunA8Ne/i3Y3018A/kVVPZPk+j3aDrO35xfvy/egg5TnHDQffBH4XJIL4esnVV/Vpr0M+Os2vH7YzM024PK2h0CSf57k6CTfTvcgod+nu+351IPf/3Gq7WxU1bPAM0l+oJV+Apjai3iO7hnf0N1RdEmS17T+vCTJ94zwEZ8BTk7yHW384oFpj071P90D7E+eZhnH0IXFs+0czeBDdwb7OOjPgfPT3XL7aODfAH8xQn91iDIcNF+8Abgsyafojneva/W30h1u+gu65wxP5910zw/4ZLpLUH+Pbs/4LODeJPcA/w74rdZ+I3DfDCekp7Me+PUk99HdivuaVr8e+N0k99IdRroAeGdbp3vpDp3tVVX9A91hpP/VTkh/fmDyHwHHtuVfTnf7+WHL+BRwD933uAn4PwOTNwK3TJ2QHpjnk63/n6B7BO27q+qemfqrQ5e37JYk9bjnIEnq8YS0FrQkU0/22tPZVfV3L/Jnf4T+eYO3DDupLh1oHlaSJPV4WEmS1GM4SJJ6DAdJUo/hIEnqMRwkST3/H878GW4w/SO1AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = sns.distplot(df_adressen_woning_not_ijburg['nearest_hotel_duration'], kde=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's zoom in on the most comon durations:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "woning_not_ijburg_durations_below_3000 = df_adressen_woning_not_ijburg['nearest_hotel_duration'][df_adressen_woning_not_ijburg['nearest_hotel_duration'] < 3000]" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = sns.distplot(woning_not_ijburg_durations_below_3000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And use our own bins:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = sns.distplot(woning_ijburg_durations_below_3000, bins=[0, 500, 1000, 1500, 2000,3000])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "### 2.7 Mapping the OSRM output: creating a chloropleth per neighbourhood\n", "\n", "Let's compute the average duration per (larger) neighbourhood, normalize that into a score, and create a cloropleth map. I used the so called 'gebiedsgerichtwerkengebied', a larger neighbourhood, instead of 'normal' neighbourhoods, because [the address data of the municipality](https://data.amsterdam.nl/#?dsd=bag&dsp=1&dsv=TABLE&mpb=topografie&mpz=11&mpv=52.3731081:4.8932945) is out of date with [the 'new' neighbourhood borders of 2015](https://www.ois.amsterdam.nl/nieuwsarchief/2015/nieuwe-gebiedsindeling-voor-amsterdam).\n", "\n", "#### Pivot table\n", "\n", "First, I'll create a pivot table of the neigbourhoods and mean walking duration in seconds:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nearest_hotel_duration
Naam gebiedsgerichtwerkengebied
Indische Buurt / Oostelijk Havengebied395.445561
Westerpark434.300928
De Pijp / Rivierenbuurt494.153409
Oud-Oost516.719633
Oud West / De Baarsjes562.601836
Ijburg / Eiland Zeeburg676.957284
Oud-Noord793.821163
Centrum-Oost798.746384
Watergraafsmeer804.365915
Bos en Lommer848.735375
Oud Zuid902.842803
Slotervaart925.571860
Centrum-West937.145351
Oost1169.752248
Gaasperdam / Driemond1290.230570
West1538.622201
Buitenveldert / Zuidas1627.046032
Osdorp1775.954414
Geuzenveld-Slotermeer-Sloterdijken1885.094372
Bijlmer Centrum2109.461601
De Aker, Sloten en Nieuw Sloten2264.087821
Bijlmer Oost3200.194357
\n", "
" ], "text/plain": [ " nearest_hotel_duration\n", "Naam gebiedsgerichtwerkengebied \n", "Indische Buurt / Oostelijk Havengebied 395.445561\n", "Westerpark 434.300928\n", "De Pijp / Rivierenbuurt 494.153409\n", "Oud-Oost 516.719633\n", "Oud West / De Baarsjes 562.601836\n", "Ijburg / Eiland Zeeburg 676.957284\n", "Oud-Noord 793.821163\n", "Centrum-Oost 798.746384\n", "Watergraafsmeer 804.365915\n", "Bos en Lommer 848.735375\n", "Oud Zuid 902.842803\n", "Slotervaart 925.571860\n", "Centrum-West 937.145351\n", "Oost 1169.752248\n", "Gaasperdam / Driemond 1290.230570\n", "West 1538.622201\n", "Buitenveldert / Zuidas 1627.046032\n", "Osdorp 1775.954414\n", "Geuzenveld-Slotermeer-Sloterdijken 1885.094372\n", "Bijlmer Centrum 2109.461601\n", "De Aker, Sloten en Nieuw Sloten 2264.087821\n", "Bijlmer Oost 3200.194357" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "22" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_neighbourhood_nearest_hotel_duration = df_adressen_woning_not_ijburg.pivot_table( \\\n", " columns='Naam gebiedsgerichtwerkengebied', values='nearest_hotel_duration').transpose()\n", "df_neighbourhood_nearest_hotel_duration.sort_values(by=\"nearest_hotel_duration\")\n", "len(df_neighbourhood_nearest_hotel_duration.sort_values(by=\"nearest_hotel_duration\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Plotting mean neighbourhoods with a mean duration of < 500 seconds\n", "\n", "Now I can also see the percentage of neighbourhoods where the mean walking time for residence addresses is less than 500 seconds (13.6%, or 3 out of 19)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "22" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "False 19\n", "True 3\n", "Name: nearest_hotel_duration_under_500, dtype: int64" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "'Percentage neighbourhoods under 500 second walk: 13.6363636364%'" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_neighbourhood_nearest_hotel_duration['nearest_hotel_duration_under_500'] = \\\n", "df_neighbourhood_nearest_hotel_duration['nearest_hotel_duration'].transform(lambda x: x < 500.5)\n", "len(df_neighbourhood_nearest_hotel_duration)\n", "df_neighbourhood_nearest_hotel_duration.nearest_hotel_duration_under_500.value_counts()\n", "\n", "\"Percentage neighbourhoods under 500 second walk: \" + str(df_neighbourhood_nearest_hotel_duration.nearest_hotel_duration_under_500.value_counts()[1] / len(df_neighbourhood_nearest_hotel_duration) * 100) + \"%\" \n", "\n", "\n", "\n", "p = sns.countplot(data=df_neighbourhood_nearest_hotel_duration, x = 'nearest_hotel_duration_under_500')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Normalizing the duration data\n", "\n", "To make the cloropleth useful, I'll normalize the data to an inversed score, so that a shorter mean duration translates to a higher score." ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nearest_hotel_durationnearest_hotel_duration_under_500nearest_hotel_duration_normalized
Naam gebiedsgerichtwerkengebied
Indische Buurt / Oostelijk Havengebied395.445561True1.000000
Westerpark434.300928True0.986147
De Pijp / Rivierenbuurt494.153409True0.964807
Oud-Oost516.719633False0.956761
Oud West / De Baarsjes562.601836False0.940402
Ijburg / Eiland Zeeburg676.957284False0.899630
Oud-Noord793.821163False0.857964
Centrum-Oost798.746384False0.856208
Watergraafsmeer804.365915False0.854204
Bos en Lommer848.735375False0.838385
Oud Zuid902.842803False0.819094
Slotervaart925.571860False0.810990
Centrum-West937.145351False0.806863
Oost1169.752248False0.723930
Gaasperdam / Driemond1290.230570False0.680975
West1538.622201False0.592414
Buitenveldert / Zuidas1627.046032False0.560887
Osdorp1775.954414False0.507796
Geuzenveld-Slotermeer-Sloterdijken1885.094372False0.468883
Bijlmer Centrum2109.461601False0.388888
De Aker, Sloten en Nieuw Sloten2264.087821False0.333758
Bijlmer Oost3200.194357False0.000000
\n", "
" ], "text/plain": [ " nearest_hotel_duration \\\n", "Naam gebiedsgerichtwerkengebied \n", "Indische Buurt / Oostelijk Havengebied 395.445561 \n", "Westerpark 434.300928 \n", "De Pijp / Rivierenbuurt 494.153409 \n", "Oud-Oost 516.719633 \n", "Oud West / De Baarsjes 562.601836 \n", "Ijburg / Eiland Zeeburg 676.957284 \n", "Oud-Noord 793.821163 \n", "Centrum-Oost 798.746384 \n", "Watergraafsmeer 804.365915 \n", "Bos en Lommer 848.735375 \n", "Oud Zuid 902.842803 \n", "Slotervaart 925.571860 \n", "Centrum-West 937.145351 \n", "Oost 1169.752248 \n", "Gaasperdam / Driemond 1290.230570 \n", "West 1538.622201 \n", "Buitenveldert / Zuidas 1627.046032 \n", "Osdorp 1775.954414 \n", "Geuzenveld-Slotermeer-Sloterdijken 1885.094372 \n", "Bijlmer Centrum 2109.461601 \n", "De Aker, Sloten en Nieuw Sloten 2264.087821 \n", "Bijlmer Oost 3200.194357 \n", "\n", " nearest_hotel_duration_under_500 \\\n", "Naam gebiedsgerichtwerkengebied \n", "Indische Buurt / Oostelijk Havengebied True \n", "Westerpark True \n", "De Pijp / Rivierenbuurt True \n", "Oud-Oost False \n", "Oud West / De Baarsjes False \n", "Ijburg / Eiland Zeeburg False \n", "Oud-Noord False \n", "Centrum-Oost False \n", "Watergraafsmeer False \n", "Bos en Lommer False \n", "Oud Zuid False \n", "Slotervaart False \n", "Centrum-West False \n", "Oost False \n", "Gaasperdam / Driemond False \n", "West False \n", "Buitenveldert / Zuidas False \n", "Osdorp False \n", "Geuzenveld-Slotermeer-Sloterdijken False \n", "Bijlmer Centrum False \n", "De Aker, Sloten en Nieuw Sloten False \n", "Bijlmer Oost False \n", "\n", " nearest_hotel_duration_normalized \n", "Naam gebiedsgerichtwerkengebied \n", "Indische Buurt / Oostelijk Havengebied 1.000000 \n", "Westerpark 0.986147 \n", "De Pijp / Rivierenbuurt 0.964807 \n", "Oud-Oost 0.956761 \n", "Oud West / De Baarsjes 0.940402 \n", "Ijburg / Eiland Zeeburg 0.899630 \n", "Oud-Noord 0.857964 \n", "Centrum-Oost 0.856208 \n", "Watergraafsmeer 0.854204 \n", "Bos en Lommer 0.838385 \n", "Oud Zuid 0.819094 \n", "Slotervaart 0.810990 \n", "Centrum-West 0.806863 \n", "Oost 0.723930 \n", "Gaasperdam / Driemond 0.680975 \n", "West 0.592414 \n", "Buitenveldert / Zuidas 0.560887 \n", "Osdorp 0.507796 \n", "Geuzenveld-Slotermeer-Sloterdijken 0.468883 \n", "Bijlmer Centrum 0.388888 \n", "De Aker, Sloten en Nieuw Sloten 0.333758 \n", "Bijlmer Oost 0.000000 " ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_neighbourhood_nearest_hotel_duration['nearest_hotel_duration_normalized'] = \\\n", " df_neighbourhood_nearest_hotel_duration['nearest_hotel_duration'].transform(\n", " lambda x: 1 - (x - x.min()) / (x.max() - x.min()))\n", "df_neighbourhood_nearest_hotel_duration.sort_values(by=\"nearest_hotel_duration_normalized\", ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's set up a color scale, colormap function, and import the neighbourhood geojson." ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#005a32\n" ] }, { "data": { "text/html": [ "0.01.0" ], "text/plain": [ "" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from branca.colormap import linear\n", "\n", "colormap = linear.YlGn.scale(\n", " df_neighbourhood_nearest_hotel_duration.nearest_hotel_duration_normalized.min(),\n", " df_neighbourhood_nearest_hotel_duration.nearest_hotel_duration_normalized.max())\n", "\n", "print(colormap(5.0))\n", "\n", "colormap" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "InteractiveShell.ast_node_interactivity = \"last_expr\"" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = folium.Map(location=[52.3824856,4.877951499999995], zoom_start=11, tiles='stamentoner',)\n", "\n", "\n", "# folium.GeoJson(open(\"data/amsterdam-buurten-simplified-removed.geojson\",encoding = \"utf-8-sig\").read(), name='geojson',\n", "folium.GeoJson(open(\"data/amsterdam-gebiedsgerichtwerken.geojson\",encoding = \"utf-8-sig\").read(), name='geojson',\n", " style_function=lambda feature: {\n", " 'fillColor': colormap(df_neighbourhood_nearest_hotel_duration.loc[str(feature['properties']['titel'])]['nearest_hotel_duration_normalized']),\n", " 'color': 'black',\n", " 'weight': 1,\n", " 'dashArray': '5, 5',\n", " 'fillOpacity': 0.9,\n", " }\n", ").add_to(m)\n", "\n", "m.save('03-choropleth-mean-duration.html')\n", "m" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "InteractiveShell.ast_node_interactivity = \"all\" # Turn on all output again" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.8 Taking population into account\n", "\n", "Let's create a score that takes the population of each neighbourhood into account. By multiplying the average duration with the population, I have another number that can instruct us where to put a new hotel. I'll create a new cloropleth and combine it with the isochrones to further help to figure out the best placement. I'll also create mouseovers to the map.\n", "\n", "I used [this data from the municipality](https://data.amsterdam.nl/#?dte=catalogus%2Fapi%2F3%2Faction%2Fpackage_show%3Fid%3Db51154d8-2eca-4dd9-932d-63bca9ef0bf2&dtfs=T&dsf=groups::bevolking&mpb=topografie&mpz=11&mpv=52.3731081:4.8932945)." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "# Add the gebiedsgerichtwerkengebied code to the table\n", "gebiedsgerichtwerkengebied_keys = df_adressen['Naam gebiedsgerichtwerkengebied'].unique()\n", "gebiedsgerichtwerkengebied_values = df_adressen['Code gebiedsgerichtwerkengebied'].unique()\n", "gebiedsgerichtwerkengebied_code_dict = dict(zip(gebiedsgerichtwerkengebied_keys, gebiedsgerichtwerkengebied_values))\n", "df_neighbourhood_nearest_hotel_duration['Code gebied'] = \\\n", " df_neighbourhood_nearest_hotel_duration.index.map(lambda x: gebiedsgerichtwerkengebied_code_dict[x])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/jurian/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2728: DtypeWarning: Columns (1) have mixed types. Specify dtype option on import or set low_memory=False.\n", " interactivity=interactivity, compiler=compiler, result=result)\n" ] } ], "source": [ "# Import the population excel\n", "df_population = pd.read_csv('data/goisbasisbestandenbasisstatistiekbestandnu-op-de-ois-sitedata.amsterdambbga_latest_and_greatest.zip', sep=\";\")\n", "df_population_2018_gebieds = df_population[(df_population['jaar'] == 2018) & (df_population['variabele'] == 'BEVTOTAAL')]" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "# Add the population to the table\n", "bevolking_keys = df_population_2018_gebieds.gebiedcode15.values\n", "bevolking_values = df_population_2018_gebieds.waarde.values\n", "bevolking_dict = dict(zip(bevolking_keys, bevolking_values))\n", "df_neighbourhood_nearest_hotel_duration['Population'] = \\\n", " df_neighbourhood_nearest_hotel_duration['Code gebied'].apply(lambda x: bevolking_dict[x])" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "df_neighbourhood_nearest_hotel_duration['Total seconds'] = \\\n", " df_neighbourhood_nearest_hotel_duration['nearest_hotel_duration'] * \\\n", " df_neighbourhood_nearest_hotel_duration['Population']" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "# Add normalized score\n", "df_neighbourhood_nearest_hotel_duration['Total seconds normalized'] = \\\n", " df_neighbourhood_nearest_hotel_duration['Total seconds'].transform(\n", " lambda x: 1 - (x - x.min()) / (x.max() - x.min()))\n", "\n", " # Add rank according to scores\n", "df_neighbourhood_nearest_hotel_duration['Rank - Duration'] = pd.to_numeric(df_neighbourhood_nearest_hotel_duration['nearest_hotel_duration_normalized'].rank(ascending=False),downcast='integer')\n", "df_neighbourhood_nearest_hotel_duration['Rank - Total Seconds'] = pd.to_numeric(df_neighbourhood_nearest_hotel_duration['Total seconds normalized'].rank(ascending=False),downcast='integer')\n", "\n", "# Housekeeping\n", "df_ranks = df_neighbourhood_nearest_hotel_duration.rename(columns={'nearest_hotel_duration': 'Mean duration', \"nearest_hotel_duration_under_500\": 'Mean duration < 500', \"nearest_hotel_duration_normalized\": \"Mean duration normalized\"})\n", "df_ranks.drop(columns=['Mean duration < 500', 'Code gebied'], inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Tables with ranks\n", "\n", "As I can see, there are some notable shifts when I take population size into account. For example: even though 'Oud West / De Baarsjes' has a relatively small average walking duration to the nearest worm hotel, they still rank low in terms of total seconds to be walked, because so many people live there." ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "# Qgrid is nice a nice table display, but doesn't render in nbviewer, so I'll skip it here\n", "\n", "# # import qgrid\n", "# # # qgrid.QgridWidget(df=None, grid_options={'filterable': False}, precision=None, show_toolbar=None)\n", "# # qgrid = qgrid.show_grid(df_ranks.sort_values('Rank - Total Seconds', ascending=False), grid_options={'filterable': False, 'maxVisibleRows': 23})\n", "# # qgrid" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Mean durationMean duration normalizedPopulationTotal secondsTotal seconds normalizedRank - DurationRank - Total Seconds
Naam gebiedsgerichtwerkengebied
Bijlmer Oost3200.1943570.00000028848.09.231921e+070.0000002222
Geuzenveld-Slotermeer-Sloterdijken1885.0943720.46888345940.08.660124e+070.0746011921
Osdorp1775.9544140.50779639312.06.981632e+070.2935881820
De Aker, Sloten en Nieuw Sloten2264.0878210.33375828541.06.461933e+070.3613912119
West1538.6222010.59241437851.05.823839e+070.4446411618
Bijlmer Centrum2109.4616010.38888825008.05.275342e+070.5162022017
Oud Zuid902.8428030.81909454235.04.896568e+070.5656191116
Gaasperdam / Driemond1290.2305700.68097534143.04.405234e+070.6297221515
Buitenveldert / Zuidas1627.0460320.56088726280.04.275877e+070.6465991714
Oud West / De Baarsjes562.6018360.94040273117.04.113576e+070.667774513
Centrum-West937.1453510.80686343386.04.065899e+070.6739941312
Slotervaart925.5718600.81099041988.03.886291e+070.6974271211
Centrum-Oost798.7463840.85620843465.03.471751e+070.751510810
Oost1169.7522480.72393029365.03.434977e+070.756308149
De Pijp / Rivierenbuurt494.1534090.96480765033.03.213628e+070.78518738
Bos en Lommer848.7353750.83838535009.02.971338e+070.816798107
Watergraafsmeer804.3659150.85420434119.02.744416e+070.84640496
Oud-Noord793.8211630.85796429059.02.306765e+070.90350275
Oud-Oost516.7196330.95676135846.01.852233e+070.96280444
Ijburg / Eiland Zeeburg676.9572840.89963026062.01.764286e+070.97427863
Indische Buurt / Oostelijk Havengebied395.4455611.00000041427.01.638212e+070.99072612
Westerpark434.3009280.98614736084.01.567131e+071.00000021
\n", "
" ], "text/plain": [ " Mean duration \\\n", "Naam gebiedsgerichtwerkengebied \n", "Bijlmer Oost 3200.194357 \n", "Geuzenveld-Slotermeer-Sloterdijken 1885.094372 \n", "Osdorp 1775.954414 \n", "De Aker, Sloten en Nieuw Sloten 2264.087821 \n", "West 1538.622201 \n", "Bijlmer Centrum 2109.461601 \n", "Oud Zuid 902.842803 \n", "Gaasperdam / Driemond 1290.230570 \n", "Buitenveldert / Zuidas 1627.046032 \n", "Oud West / De Baarsjes 562.601836 \n", "Centrum-West 937.145351 \n", "Slotervaart 925.571860 \n", "Centrum-Oost 798.746384 \n", "Oost 1169.752248 \n", "De Pijp / Rivierenbuurt 494.153409 \n", "Bos en Lommer 848.735375 \n", "Watergraafsmeer 804.365915 \n", "Oud-Noord 793.821163 \n", "Oud-Oost 516.719633 \n", "Ijburg / Eiland Zeeburg 676.957284 \n", "Indische Buurt / Oostelijk Havengebied 395.445561 \n", "Westerpark 434.300928 \n", "\n", " Mean duration normalized Population \\\n", "Naam gebiedsgerichtwerkengebied \n", "Bijlmer Oost 0.000000 28848.0 \n", "Geuzenveld-Slotermeer-Sloterdijken 0.468883 45940.0 \n", "Osdorp 0.507796 39312.0 \n", "De Aker, Sloten en Nieuw Sloten 0.333758 28541.0 \n", "West 0.592414 37851.0 \n", "Bijlmer Centrum 0.388888 25008.0 \n", "Oud Zuid 0.819094 54235.0 \n", "Gaasperdam / Driemond 0.680975 34143.0 \n", "Buitenveldert / Zuidas 0.560887 26280.0 \n", "Oud West / De Baarsjes 0.940402 73117.0 \n", "Centrum-West 0.806863 43386.0 \n", "Slotervaart 0.810990 41988.0 \n", "Centrum-Oost 0.856208 43465.0 \n", "Oost 0.723930 29365.0 \n", "De Pijp / Rivierenbuurt 0.964807 65033.0 \n", "Bos en Lommer 0.838385 35009.0 \n", "Watergraafsmeer 0.854204 34119.0 \n", "Oud-Noord 0.857964 29059.0 \n", "Oud-Oost 0.956761 35846.0 \n", "Ijburg / Eiland Zeeburg 0.899630 26062.0 \n", "Indische Buurt / Oostelijk Havengebied 1.000000 41427.0 \n", "Westerpark 0.986147 36084.0 \n", "\n", " Total seconds \\\n", "Naam gebiedsgerichtwerkengebied \n", "Bijlmer Oost 9.231921e+07 \n", "Geuzenveld-Slotermeer-Sloterdijken 8.660124e+07 \n", "Osdorp 6.981632e+07 \n", "De Aker, Sloten en Nieuw Sloten 6.461933e+07 \n", "West 5.823839e+07 \n", "Bijlmer Centrum 5.275342e+07 \n", "Oud Zuid 4.896568e+07 \n", "Gaasperdam / Driemond 4.405234e+07 \n", "Buitenveldert / Zuidas 4.275877e+07 \n", "Oud West / De Baarsjes 4.113576e+07 \n", "Centrum-West 4.065899e+07 \n", "Slotervaart 3.886291e+07 \n", "Centrum-Oost 3.471751e+07 \n", "Oost 3.434977e+07 \n", "De Pijp / Rivierenbuurt 3.213628e+07 \n", "Bos en Lommer 2.971338e+07 \n", "Watergraafsmeer 2.744416e+07 \n", "Oud-Noord 2.306765e+07 \n", "Oud-Oost 1.852233e+07 \n", "Ijburg / Eiland Zeeburg 1.764286e+07 \n", "Indische Buurt / Oostelijk Havengebied 1.638212e+07 \n", "Westerpark 1.567131e+07 \n", "\n", " Total seconds normalized \\\n", "Naam gebiedsgerichtwerkengebied \n", "Bijlmer Oost 0.000000 \n", "Geuzenveld-Slotermeer-Sloterdijken 0.074601 \n", "Osdorp 0.293588 \n", "De Aker, Sloten en Nieuw Sloten 0.361391 \n", "West 0.444641 \n", "Bijlmer Centrum 0.516202 \n", "Oud Zuid 0.565619 \n", "Gaasperdam / Driemond 0.629722 \n", "Buitenveldert / Zuidas 0.646599 \n", "Oud West / De Baarsjes 0.667774 \n", "Centrum-West 0.673994 \n", "Slotervaart 0.697427 \n", "Centrum-Oost 0.751510 \n", "Oost 0.756308 \n", "De Pijp / Rivierenbuurt 0.785187 \n", "Bos en Lommer 0.816798 \n", "Watergraafsmeer 0.846404 \n", "Oud-Noord 0.903502 \n", "Oud-Oost 0.962804 \n", "Ijburg / Eiland Zeeburg 0.974278 \n", "Indische Buurt / Oostelijk Havengebied 0.990726 \n", "Westerpark 1.000000 \n", "\n", " Rank - Duration Rank - Total Seconds \n", "Naam gebiedsgerichtwerkengebied \n", "Bijlmer Oost 22 22 \n", "Geuzenveld-Slotermeer-Sloterdijken 19 21 \n", "Osdorp 18 20 \n", "De Aker, Sloten en Nieuw Sloten 21 19 \n", "West 16 18 \n", "Bijlmer Centrum 20 17 \n", "Oud Zuid 11 16 \n", "Gaasperdam / Driemond 15 15 \n", "Buitenveldert / Zuidas 17 14 \n", "Oud West / De Baarsjes 5 13 \n", "Centrum-West 13 12 \n", "Slotervaart 12 11 \n", "Centrum-Oost 8 10 \n", "Oost 14 9 \n", "De Pijp / Rivierenbuurt 3 8 \n", "Bos en Lommer 10 7 \n", "Watergraafsmeer 9 6 \n", "Oud-Noord 7 5 \n", "Oud-Oost 4 4 \n", "Ijburg / Eiland Zeeburg 6 3 \n", "Indische Buurt / Oostelijk Havengebied 1 2 \n", "Westerpark 2 1 " ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ranks.sort_values('Rank - Total Seconds', ascending=False)\n", "df_ranks.round(decimals=2).sort_values('Rank - Total Seconds', ascending=False).to_clipboard()" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "InteractiveShell.ast_node_interactivity = \"last_expr\"" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#005a32\n" ] }, { "data": { "text/html": [ "0.01.0" ], "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import branca.colormap\n", "\n", "colormap = linear.YlGn.scale(\n", " df_ranks['Total seconds normalized'].min(),\n", " df_ranks['Total seconds normalized'].max())\n", "\n", "print(colormap(5.0))\n", "\n", "colormap\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": false }, "outputs": [ { "ename": "NameError", "evalue": "name 'folium' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfolium\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mMap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m52.3824856\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4.877951499999995\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzoom_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m11\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtiles\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'stamentoner'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mtotalsecondslayer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfolium\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFeatureGroup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"By Total Seconds\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m totalsecondslayer.add_child(folium.GeoJson(open(\"data/amsterdam-gebiedsgerichtwerken.geojson\",encoding = \"utf-8-sig\").read(), name='geojson',\n", "\u001b[0;31mNameError\u001b[0m: name 'folium' is not defined" ] } ], "source": [ "m = folium.Map(location=[52.3824856,4.877951499999995], zoom_start=11, tiles='stamentoner',)\n", "\n", "totalsecondslayer = folium.FeatureGroup(name=\"By Total Seconds\")\n", "\n", "totalsecondslayer.add_child(folium.GeoJson(open(\"data/amsterdam-gebiedsgerichtwerken.geojson\",encoding = \"utf-8-sig\").read(), name='geojson',\n", " style_function=lambda feature: {\n", " 'fillColor': colormap(df_ranks.loc[str(feature['properties']['titel'])]['Total seconds normalized']),\n", " 'color': 'black',\n", " 'weight': 1,\n", "# 'dashArray': '5, 5',\n", " 'fillOpacity': 0.9,\n", " },\n", "# highlight_function =lambda feature: { 'name': feature['properties']['titel']}\n", "))\n", "\n", "m.add_child(totalsecondslayer)\n", "m.save('04-choropleth-total-seconds.html')\n", "m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Complex Leaflet maps don't run in Jupyter, but [here is a map showing both layers](wormhotelmap.html) with popups.\n", "\n", "And here is a screenshot of the maps side by side:\n", "\n", "![](cloropleths-side-by-side.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "Right now, the worm hotels are placed on neighbourhood initiative, and it's apparent that some neighbourhoods get left out this way. My recommendation would be to promote the possibility of a worm hotel to people in the neighbourhoods with the highest score in the 'Mean duration' column, but to also take the 'Total seconds' column into account.\n", "\n", "Feel free to email me at jurian [at] jurb dot me for details." ] }, { "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" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }