-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmapping_tool.py
More file actions
118 lines (104 loc) · 4.44 KB
/
mapping_tool.py
File metadata and controls
118 lines (104 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import geopandas as gpd
import pandas as pd
import numpy as np
import folium
from folium.plugins import MarkerCluster
import webbrowser
import os
# build dataframe from api
print('Reading 2019 Crime Incidents data from OpenDataDC...')
url_crime = 'https://opendata.arcgis.com/datasets/f08294e5286141c293e9202fcd3e8b57_1.geojson'
df_crime = gpd.read_file(url_crime)
# change date format
df_crime.START_DATE = pd.to_datetime(df_crime.START_DATE, format='%Y/%m/%d %H:%M:%S')
# create time of day column
hours = df_crime['START_DATE'].dt.hour
bins = [-1, 4, 9, 17, 21]
labels = ['night', 'morning', 'afternoon', 'evening', 'night']
df_crime['time_of_day'] = np.array(labels)[np.array(bins).searchsorted(hours)-1]
# create new column for violent crimes and property crimes where:
# violent = ASSAULT W/DANGEROUS WEAPON, HOMICIDE, ROBBERY, SEX ABUSE
# property: other = THEFT/OTHER
# property: vehicle = MOTOR VEHICLE THEFT, THEFT F/AUTO
# property: home = BURGLARY, ARSON
# define function to map values for new column
def set_value(row_number, assigned_value):
return assigned_value[row_number]
# create dictionary of offenses
offense_dictionary = {'ASSAULT W/DANGEROUS WEAPON': 'violent', 'HOMICIDE': 'violent', 'ROBBERY': 'violent',
'SEX ABUSE': 'violent', 'THEFT/OTHER': 'property: other', 'THEFT F/AUTO': 'property: vehicle',
'MOTOR VEHICLE THEFT': 'property: vehicle', 'BURGLARY': 'property: home',
'ARSON': 'property: home'}
# add new column to dataframe for offense grouping
df_crime['OFFENSE_GROUP'] = df_crime['OFFENSE'].apply(set_value, args=(offense_dictionary, ))
# define function to filter time of day
def time_of_day():
time = input("Enter time of day (morning, afternoon, evening, night): ")
time = str(time)
m = df_crime['time_of_day'] == 'morning'
a = df_crime['time_of_day'] == 'afternoon'
e = df_crime['time_of_day'] == 'evening'
n = df_crime['time_of_day'] == 'night'
crime_m = df_crime[m]
crime_a = df_crime[a]
crime_e = df_crime[e]
crime_n = df_crime[n]
if time == 'morning':
return crime_m
elif time == 'afternoon':
return crime_a
elif time == 'evening':
return crime_e
elif time == 'night':
return crime_n
else:
print('ERROR: Input must be either "morning", "afternoon", "evening", "night" (case sensitive)')
return
df_crime = time_of_day()
# define function to filter offense type
def type_of_offense():
offense = input("Enter offense type (all, violent, property: home, property: vehicle): ")
offense = str(offense)
v = df_crime['OFFENSE_GROUP'] == 'violent'
ph = df_crime['OFFENSE_GROUP'] == 'property: home'
pv = df_crime['OFFENSE_GROUP'] == 'property: vehicle'
crime_v = df_crime[v]
crime_ph = df_crime[ph]
crime_pv = df_crime[pv]
if offense == 'violent':
return crime_v
elif offense == 'property: home':
return crime_ph
elif offense == 'property: vehicle':
return crime_pv
elif offense == 'all':
return df_crime
else:
print('ERROR: Input must be either "all", "violent", "property: home", or "property: vehicle" (case sensitive)')
return
df_crime = type_of_offense()
# define dc coordinates for blank map
dc_coordinates = (38.9072, -77.0369)
# create map zoomed in on DC
map = folium.Map(location=dc_coordinates, zoom_start=12)
# add marker clusters to map
mc = MarkerCluster().add_to(map)
# change data type of date column to string
df_crime.START_DATE = df_crime.START_DATE.apply(lambda x: x.strftime('%m/%d/%Y %H:%M'))
# add latitude/longitude to markers
for each in df_crime.iterrows():
folium.Marker([each[1]['LATITUDE'], each[1]['LONGITUDE']],
# add offense and time (start date) to marker popups
popup=each[1]['OFFENSE'] + ", " + each[1]['START_DATE']).add_to(mc)
# save map as html file
map.save('map_clustered.html')
# change path to reflect file location and format for webbrowser
filename = 'file:///' + os.getcwd() + '/' + 'map_clustered.html'
# -----------------------------------------------------------------------------------------
# to open the map in a new tab in Google Chrome, use the code below for your respective OS:
# Windows
# webbrowser.open_new_tab(filename)
# Mac
cmd = 'open -a /Applications/Google\ Chrome.app %s'
webbrowser.get(cmd).open_new_tab(filename)
# -----------------------------------------------------------------------------------------