Exploring the Züri Wie Neu Data Set - TWIST Hackdays 2018

!pip install geopandas
Collecting geopandas
  Downloading https://files.pythonhosted.org/packages/59/39/de0263d511d4fc35a640cf00d02e497eb60698315a22936bedbdd904d7f7/geopandas-0.6.1-py2.py3-none-any.whl (918kB)
    100% |████████████████████████████████| 921kB 260kB/s eta 0:00:01
Requirement already satisfied: pandas>=0.23.0 in /srv/paws/lib/python3.6/site-packages (from geopandas)
Collecting shapely (from geopandas)
  Downloading https://files.pythonhosted.org/packages/38/b6/b53f19062afd49bb5abd049aeed36f13bf8d57ef8f3fa07a5203531a0252/Shapely-1.6.4.post2-cp36-cp36m-manylinux1_x86_64.whl (1.5MB)
    100% |████████████████████████████████| 1.5MB 175kB/s eta 0:00:01
Collecting pyproj (from geopandas)
  Downloading https://files.pythonhosted.org/packages/7a/b1/ab67ad924770e1c1432fa0953a665b8ea193b60c7494457b69da052d6e83/pyproj-2.4.0-cp36-cp36m-manylinux1_x86_64.whl (10.1MB)
    100% |████████████████████████████████| 10.1MB 31kB/s  eta 0:00:01   44% |██████████████▏                 | 4.5MB 14.2MB/s eta 0:00:01    69% |██████████████████████▎         | 7.0MB 12.2MB/s eta 0:00:01    90% |█████████████████████████████   | 9.1MB 22.6MB/s eta 0:00:01
Collecting fiona (from geopandas)
  Downloading https://files.pythonhosted.org/packages/19/80/09aa6ba5e4ed3f07ddbd2204634b119cb50ae613aa182c6ee7daff3adc9b/Fiona-1.8.9.post2-cp36-cp36m-manylinux1_x86_64.whl (11.9MB)
    100% |████████████████████████████████| 11.9MB 27kB/s  eta 0:00:01  9% |███                             | 1.1MB 13.5MB/s eta 0:00:01    19% |██████▍                         | 2.4MB 15.8MB/s eta 0:00:01��█████▉              | 6.6MB 13.5MB/s eta 0:00:01
Requirement already satisfied: numpy>=1.12.0 in /srv/paws/lib/python3.6/site-packages (from pandas>=0.23.0->geopandas)
Requirement already satisfied: pytz>=2011k in /srv/paws/lib/python3.6/site-packages (from pandas>=0.23.0->geopandas)
Requirement already satisfied: python-dateutil>=2.5.0 in /srv/paws/lib/python3.6/site-packages (from pandas>=0.23.0->geopandas)
Requirement already satisfied: click<8,>=4.0 in /srv/paws/lib/python3.6/site-packages (from fiona->geopandas)
Collecting cligj>=0.5 (from fiona->geopandas)
  Downloading https://files.pythonhosted.org/packages/e4/be/30a58b4b0733850280d01f8bd132591b4668ed5c7046761098d665ac2174/cligj-0.5.0-py3-none-any.whl
Requirement already satisfied: six>=1.7 in /srv/paws/lib/python3.6/site-packages (from fiona->geopandas)
Requirement already satisfied: attrs>=17 in /srv/paws/lib/python3.6/site-packages (from fiona->geopandas)
Collecting munch (from fiona->geopandas)
  Downloading https://files.pythonhosted.org/packages/68/f4/260ec98ea840757a0da09e0ed8135333d59b8dfebe9752a365b04857660a/munch-2.3.2.tar.gz
Collecting click-plugins>=1.0 (from fiona->geopandas)
  Downloading https://files.pythonhosted.org/packages/e9/da/824b92d9942f4e472702488857914bdd50f73021efea15b4cad9aca8ecef/click_plugins-1.1.1-py2.py3-none-any.whl
Building wheels for collected packages: munch
  Running setup.py bdist_wheel for munch ... error
  Complete output from command /srv/paws/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-i9lene_u/munch/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpcz84c4iqpip-wheel- --python-tag cp36:
  usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
     or: -c --help [cmd1 cmd2 ...]
     or: -c --help-commands
     or: -c cmd --help
  
  error: invalid command 'bdist_wheel'
  
  ----------------------------------------
  Failed building wheel for munch
  Running setup.py clean for munch
Failed to build munch
Installing collected packages: shapely, pyproj, cligj, munch, click-plugins, fiona, geopandas
  Running setup.py install for munch ... done
Successfully installed click-plugins-1.1.1 cligj-0.5.0 fiona-1.8.9.post2 geopandas-0.6.1 munch-2.3.2 pyproj-2.4.0 shapely-1.6.4.post2
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import numpy as np
import pymysql
from sqlalchemy import create_engine
%matplotlib inline
import requests
import geopandas

Reading the raw data

zuriwieneu = geopandas.read_file('https://data.stadt-zuerich.ch/dataset/zueriwieneu_meldungen/resource/2fee5562-1842-4ccc-a390-c52c9dade90d/download/zueriwieneu_meldungen.json')
quartiere = geopandas.read_file('https://data.stadt-zuerich.ch/dataset/statistisches_quartier/resource/c837926e-035d-48b9-8656-03f1b13c323b/download/statistische_quartiere.json');
zuriwieneu.head()
service_request_id e n service_code status detail media_url interface_used requested_datetime agency_sent_datetime updated_datetime service_notice title description service_name geometry
0 1 2678968 1247548 Strasse/Trottoir/Platz fixed - council Auf dem Asphalt des Bürgersteigs hat es eine E... Web interface 20130314151615 20130404072505 None Diese Reparatur wird von uns in den kommenden ... Unebener Bürgersteig Unebener Bürgersteig: Auf dem Asphalt des Bürg... Strasse/Trottoir/Platz MULTIPOINT (8.48423 47.37404)
1 2 2680746 1249916 Strasse/Trottoir/Platz fixed - council Vermessungspunkt ist nicht mehr bündig mit dem... Web interface 20130314151757 20130326140505 None Diese Reparatur wird von uns in den kommenden ... Vermessungspunkt Vermessungspunkt : Vermessungspunkt ist nicht ... Strasse/Trottoir/Platz MULTIPOINT (8.50819 47.39512)
2 4 2684605 1251431 Strasse/Trottoir/Platz fixed - council Beim Trottoir sind einige Randsteine defekt un... https://www.zueriwieneu.ch/photo/4.0.jpeg?bfbb... Web interface 20130315091416 20130315095505 None Diese Reparatur wird von uns in den kommenden ... defekte Randsteine defekte Randsteine: Beim Trottoir sind einige ... Strasse/Trottoir/Platz MULTIPOINT (8.55959 47.40826)
3 5 2681754 1250376 Strasse/Trottoir/Platz fixed - council Auf dem Parkplatz beim Waidspital sind einige ... https://www.zueriwieneu.ch/photo/5.0.jpeg?e309... Web interface 20130315091715 20130320100505 None Diese Reparatur wird von uns in den kommenden ... Löcher im Belag Löcher im Belag: Auf dem Parkplatz beim Waidsp... Strasse/Trottoir/Platz MULTIPOINT (8.52163 47.39913)
4 6 2683094 1247762 Abfall/Sammelstelle fixed - council Arbeitskiste ist rund herum verschmiert https://www.zueriwieneu.ch/photo/6.0.jpeg?8e65... Web interface 20130315103653 20130422182505 None Dieses Graffiti wird von uns in den kommenden ... Graffiti Graffiti: Arbeitskiste ist rund herum verschmiert Abfall/Sammelstelle MULTIPOINT (8.53889 47.37545)
quartiere.head()
qnr qname knr kname geometry
0 92 Altstetten 9 Kreis 9 MULTIPOLYGON (((8.47024 47.37395, 8.47034 47.3...
1 101 Höngg 10 Kreis 10 MULTIPOLYGON (((8.50543 47.39495, 8.50536 47.3...
2 111 Affoltern 11 Kreis 11 MULTIPOLYGON (((8.52768 47.43266, 8.52768 47.4...
3 21 Wollishofen 2 Kreis 2 MULTIPOLYGON (((8.52478 47.35367, 8.52507 47.3...
4 33 Friesenberg 3 Kreis 3 MULTIPOLYGON (((8.48343 47.35802, 8.48386 47.3...
print(len(zuriwieneu))
20418
print(str(type(zuriwieneu['geometry'])))
print(str(type(quartiere['geometry'])))
<class 'geopandas.geoseries.GeoSeries'>
<class 'geopandas.geoseries.GeoSeries'>
zuriwieneu['clean_geometry'] = zuriwieneu['geometry'].loc[zuriwieneu['geometry'].is_valid] 
quartiere['clean_geometry'] = quartiere['geometry'].loc[quartiere['geometry'].is_valid] 
zuriwieneu_joint = geopandas.sjoin(quartiere, zuriwieneu, how="left", op="intersects");
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-5336de14b923> in <module>
      1 zuriwieneu['clean_geometry'] = zuriwieneu['geometry'].loc[zuriwieneu['geometry'].is_valid]
      2 quartiere['clean_geometry'] = quartiere['geometry'].loc[quartiere['geometry'].is_valid]
----> 3 zuriwieneu_joint = geopandas.sjoin(quartiere, zuriwieneu, how="left", op="intersects");

/srv/paws/lib/python3.6/site-packages/geopandas/tools/sjoin.py in sjoin(left_df, right_df, how, op, lsuffix, rsuffix)
    107     if tree_idx_right:
    108         idxmatch = left_df.geometry.apply(lambda x: x.bounds).apply(
--> 109             lambda x: list(tree_idx.intersection(x)) if not x == () else []
    110         )
    111         idxmatch = idxmatch[idxmatch.apply(len) > 0]

/srv/paws/lib/python3.6/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   3589             else:
   3590                 values = self.astype(object).values
-> 3591                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3592 
   3593         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

/srv/paws/lib/python3.6/site-packages/geopandas/tools/sjoin.py in <lambda>(x)
    107     if tree_idx_right:
    108         idxmatch = left_df.geometry.apply(lambda x: x.bounds).apply(
--> 109             lambda x: list(tree_idx.intersection(x)) if not x == () else []
    110         )
    111         idxmatch = idxmatch[idxmatch.apply(len) > 0]

AttributeError: 'NoneType' object has no attribute 'intersection'
zuriwieneu_joint.head()
qnr qname knr kname geometry index_right service_request_id e n service_code ... detail media_url interface_used requested_datetime agency_sent_datetime updated_datetime service_notice title description service_name
0 92 Altstetten 9 Kreis 9 (POLYGON ((8.470236386719071 47.3739506414208,... 4156 4652 2678720 1250712 Grünflächen/Spielplätze ... Vor einiger Zeit wurden die Limmatauen mit seh... Web interface 20140730111906 20140805115005 None Ab einem Abfluss von 200m3/s fliesst das Limma... Vor einiger Zeit wurden d Vor einiger Zeit wurden d: Vor einiger Zeit wu... Grünflächen/Spielplätze
0 92 Altstetten 9 Kreis 9 (POLYGON ((8.470236386719071 47.3739506414208,... 4305 4809 2677753 1250704 Strasse/Trottoir/Platz ... Dieses Teil auf dem Foto ragt ziemlich weit ra... https://www.zueriwieneu.ch/photo/4809.0.jpeg?2... Android 20140820225111 20140821162507 None Diese Reparatur wird von uns in den kommenden ... Stolperfalle Stolperfalle: Dieses Teil auf dem Foto ragt zi... Strasse/Trottoir/Platz
0 92 Altstetten 9 Kreis 9 (POLYGON ((8.470236386719071 47.3739506414208,... 10707 11716 2678713 1250723 Grünflächen/Spielplätze ... Loch im Holzweg https://www.zueriwieneu.ch/photo/11716.0.jpeg?... iOS 20170709143414 20170710133304 None Besten Dank für Ihre Meldung. Wir werden den S... Loch im Holzweg Loch im Holzweg: Loch im Holzweg Grünflächen/Spielplätze
0 92 Altstetten 9 Kreis 9 (POLYGON ((8.470236386719071 47.3739506414208,... 310 367 2677881 1250716 Strasse/Trottoir/Platz ... Auf der anderen Seite der Limmat ist die Umlei... https://www.zueriwieneu.ch/photo/367.0.jpeg?93... Web interface 20130423125215 20130423142007 None Dieser Schaden wird im Rahmen des anstehenden ... Fussgängerweg Fussgängerweg: Auf der anderen Seite der Limma... Strasse/Trottoir/Platz
0 92 Altstetten 9 Kreis 9 (POLYGON ((8.470236386719071 47.3739506414208,... 14133 15481 2678303 1250723 Grünflächen/Spielplätze ... Vorkommen von Schmalblättrigem Greiskraut am F... Web interface 20180726123247 20180731143202 None Besten Dank für Ihre Meldung. Wir gehen der Sa... Vorkommen Vorkommen: Vorkommen von Schmalblättrigem Grei... Grünflächen/Spielplätze

5 rows × 21 columns

Exploring the data

%matplotlib inline 
import seaborn as sns
ax = zuriwieneu_joint['qname'].value_counts().plot(kind='bar')
#ax.set_xticklabels(c['Quartier'],rotation=90)
#zuriwieneu_joint['qname'].value_counts()
#sns.distplot(zuriwieneu_joint['qname'].value_counts(), kde=False, rug=True);
zuriwieneu_joint.service_code.unique()
array(['Grünflächen/Spielplätze', 'Strasse/Trottoir/Platz',
       'Abfall/Sammelstelle', 'Signalisation/Lichtsignal',
       'Brunnen/Hydranten', 'Graffiti', 'Beleuchtung/Uhren', 'VBZ/ÖV'], dtype=object)
c =zuriwieneu_joint.groupby(by=['qname'])['service_code'].value_counts()
#ax = c.plot(kind='bar')
## My data
g = zuriwieneu_joint[['qname','service_code']]
c = g.groupby(by=['qname','service_code']).size()
c
qname         service_code             
Affoltern     Abfall/Sammelstelle          149
              Beleuchtung/Uhren             71
              Brunnen/Hydranten              8
              Graffiti                      18
              Grünflächen/Spielplätze       56
              Signalisation/Lichtsignal     37
              Strasse/Trottoir/Platz       136
              VBZ/ÖV                        10
Albisrieden   Abfall/Sammelstelle          117
              Beleuchtung/Uhren             31
              Brunnen/Hydranten             11
              Graffiti                       7
              Grünflächen/Spielplätze       28
              Signalisation/Lichtsignal     49
              Strasse/Trottoir/Platz       136
              VBZ/ÖV                         5
Alt-Wiedikon  Abfall/Sammelstelle          244
              Beleuchtung/Uhren             65
              Brunnen/Hydranten              8
              Graffiti                       3
              Grünflächen/Spielplätze       35
              Signalisation/Lichtsignal    104
              Strasse/Trottoir/Platz       122
              VBZ/ÖV                         3
Altstetten    Abfall/Sammelstelle          194
              Beleuchtung/Uhren             64
              Brunnen/Hydranten             13
              Graffiti                      52
              Grünflächen/Spielplätze       63
              Signalisation/Lichtsignal    149
                                          ... 
Werd          Brunnen/Hydranten              5
              Graffiti                      16
              Grünflächen/Spielplätze        8
              Signalisation/Lichtsignal     35
              Strasse/Trottoir/Platz        65
              VBZ/ÖV                         9
Wipkingen     Abfall/Sammelstelle          266
              Beleuchtung/Uhren             60
              Brunnen/Hydranten              9
              Graffiti                      54
              Grünflächen/Spielplätze       91
              Signalisation/Lichtsignal    142
              Strasse/Trottoir/Platz       232
              VBZ/ÖV                         5
Witikon       Abfall/Sammelstelle           41
              Beleuchtung/Uhren             34
              Brunnen/Hydranten              3
              Graffiti                       7
              Grünflächen/Spielplätze       59
              Signalisation/Lichtsignal     46
              Strasse/Trottoir/Platz        59
              VBZ/ÖV                         8
Wollishofen   Abfall/Sammelstelle          142
              Beleuchtung/Uhren             51
              Brunnen/Hydranten              3
              Graffiti                      23
              Grünflächen/Spielplätze       75
              Signalisation/Lichtsignal     90
              Strasse/Trottoir/Platz       120
              VBZ/ÖV                         2
Length: 269, dtype: int64
zuriwieneu_joint['qname'].value_counts().to_csv('zuriwienew_requests.csv')
data = zuriwieneu_joint['qname'].value_counts().index
print(type(data))
<class 'method'>
print(type(c))
c.columns =['Quartier','requests']
c.to_csv("zuriewineu_indicator.csv")
    
    
 
### Column
 
 
 
 
 
#TODO create a general boxplot / histogram that focusing on one concrete feature (column in the CSV file) gives the plot
 
 
 
# For the team
 
 
 
 

------------------------------------------------------

-- PLOTS
 
 
data_culture = pd.read_csv('/Users/sarasua/Downloads/Amenities_Per_Living_Area_final.v01.csv')
data_culture.head()
Unnamed: 0 qnr kindergarten_nr kunstimstadtraum_nr parke_nr brunnen_nr kinderhort_nr spielplatzte_nr denkmalschutzobjekt_nr volksschule_nr kinderkrippe_nr sporthalle_nr qname knr kname areaKm2
0 0 11 3.644 54.665 7.289 131.195 0.000 7.289 54.665 0.000 0.000 0.0 Rathaus 1 Kreis 1 0.2744
1 1 12 2.176 30.461 10.879 100.087 4.352 2.176 30.461 2.176 6.527 0.0 Hochschulen 1 Kreis 1 0.4596
2 2 13 0.000 52.533 11.257 120.075 0.000 7.505 52.533 0.000 0.000 0.0 Lindenhof 1 Kreis 1 0.2665
3 3 14 3.644 40.080 7.287 65.586 1.822 1.822 40.080 1.822 14.575 0.0 City 1 Kreis 1 0.5489
4 4 21 4.573 5.717 1.715 19.436 6.860 2.001 5.717 2.001 4.002 0.0 Wollishofen 2 Kreis 2 3.4986
c1 = data_culture[['qname','denkmalschutzobjekt_nr']]
cc1 = c1.sort_values(by=['denkmalschutzobjekt_nr'],ascending=False)
ax = cc1.plot(x='qname',y='denkmalschutzobjekt_nr',kind='bar')
ax.set_title("Listed Objects per Neighbourhood")
ax.set_xlabel("Quartier")
#ax.set_ylabel("Number of Fountains")
fig = ax.get_figure()
#fig.savefig('/Users/sarasua/Desktop/culture/brunnen.jpg')
c2 = data_culture[['qname','brunnen_nr']]
cc2 = c2.sort_values(by=['brunnen_nr'],ascending=False)
ax = cc2.plot(x='qname',y='brunnen_nr',kind='bar')
ax.set_title("Number of Fountains per Neighbourhood")
ax.set_xlabel("Quartier")
fig = ax.get_figure()
c3 = data_culture[['qname','kunstimstadtraum_nr']]
cc3 = c3.sort_values(by=['kunstimstadtraum_nr'],ascending=False)
ax = cc3.plot(x='qname',y='kunstimstadtraum_nr',kind='bar')
ax.set_title("Public Art Pieces per Neighbourhood")
ax.set_xlabel("Quartier")
#ax.set_ylabel("Number of Fountains")
fig = ax.get_figure()
#fig.savefig('/Users/sarasua/Desktop/culture/brunnen.jpg')
import csv
population = pd.read_csv('/Users/sarasua/Downloads/density.csv',sep=',', quoting=csv.QUOTE_ALL)
population.head()
spaceLabel year peoplePerKm2 Unnamed: 3
0 Mühlebach 2017-12-31 9664.471621 NaN
1 Weinegg 2017-12-31 3331.640427 NaN
2 Seefeld 2017-12-31 7649.515287 NaN
3 Altstetten 2017-12-31 5765.952179 NaN
4 Albisrieden 2017-12-31 8147.152015 NaN
population.columns
Index([' spaceLabel', 'year', 'peoplePerKm2 ', 'Unnamed: 3'], dtype='object')
e1 = population[[' spaceLabel','peoplePerKm2 ']]
ee1 = e1.sort_values(by=['peoplePerKm2 '])
ax = ee1.plot(x=' spaceLabel',y='peoplePerKm2 ',kind='bar')
ax.set_title("Population Density per Neighbourhood")
ax.set_xlabel("Quartier")
#ax.set_ylabel("Number of Fountains")
fig = ax.get_figure()
#fig.savefig('/Users/sarasua/Desktop/culture/brunnen.jpg')
landuse = pd.read_csv('/Users/sarasua/Downloads/landuse.csv',sep=',', quoting=csv.QUOTE_ALL)
landuse.head()
spaceLabel year greenAreaRatio Unnamed: 3
0 Affoltern 2017-12-31 45.199292 NaN
1 Albisrieden 2017-12-31 50.000000 NaN
2 Alt-Wiedikon 2017-12-31 6.824628 NaN
3 Altstetten 2017-12-31 33.595332 NaN
4 City 2017-12-31 6.419089 NaN
landuse.columns
Index([' spaceLabel', 'year', 'greenAreaRatio ', 'Unnamed: 3'], dtype='object')
e2 = landuse[[' spaceLabel','greenAreaRatio ']]

ee2 = e2.sort_values(by=['greenAreaRatio '])
ax = ee2.plot(x=' spaceLabel',y='greenAreaRatio ',kind='bar')
ax.set_title("Land Use per Neighbourhood")
ax.set_xlabel("Quartier")

fig = ax.get_figure()
import csv
pollution = pd.read_csv('/Users/sarasua/Downloads/pollutionraw_my.csv',sep=',', quoting=csv.QUOTE_ALL)
pollution.head()
Quartier Code AVG
0 Albisrieden http://qweb.cs.aau.dk/airbase/schema/PM10 18.200000
1 Albisrieden http://qweb.cs.aau.dk/airbase/schema/NOX 76.211000
2 Albisrieden http://qweb.cs.aau.dk/airbase/schema/CO 0.453667
3 Alt-Wiedikon http://qweb.cs.aau.dk/airbase/schema/PM10 18.200000
4 Alt-Wiedikon http://qweb.cs.aau.dk/airbase/schema/NOX 76.211000
pollution.columns
Index(['Quartier', 'Code', 'AVG'], dtype='object')
pollution.Code.unique()
array(['http://qweb.cs.aau.dk/airbase/schema/PM10',
       'http://qweb.cs.aau.dk/airbase/schema/NOX',
       'http://qweb.cs.aau.dk/airbase/schema/CO',
       ' http://qweb.cs.aau.dk/airbase/schema/NOX',
       ' http://qweb.cs.aau.dk/airbase/schema/CO',
       ' http://qweb.cs.aau.dk/airbase/schema/PM10'], dtype=object)
g = pollution.loc[pollution['Code']=='http://qweb.cs.aau.dk/airbase/schema/CO']
g.head()
Quartier Code AVG
2 Albisrieden http://qweb.cs.aau.dk/airbase/schema/CO 0.453667
5 Alt-Wiedikon http://qweb.cs.aau.dk/airbase/schema/CO 0.453667
8 Altstetten http://qweb.cs.aau.dk/airbase/schema/CO 0.453667
9 City http://qweb.cs.aau.dk/airbase/schema/CO 0.311000
12 Escher Wyss http://qweb.cs.aau.dk/airbase/schema/CO 0.311000
ee3a.head()
Quartier AVG
66 Saatlen 28.5855
60 Rathaus 28.5855
35 Hirzenbach 28.5855
1 Werd 33.9185
65 Rathaus 33.9185
 
e3a = g[['Quartier','AVG']]

ee3 = e3a.sort_values(by=['AVG'])

ax = ee3.plot(x='Quartier',y='AVG',kind='bar')
ax.set_title("Pollution per Neighbourhood (CO2)")
ax.set_xlabel("Quartier")
#ax.set_ylabel("")
fig = ax.get_figure()
#fig.savefig('/Users/sarasua/Desktop/culture/brunnen.jpg')