{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Link to notebook - http://esriurl.com/hubBikeAnalysis\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Diagnosing bike street accidents of DC" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The purpose of this notebook is to delve deeper to gain a deeper understanding of the nature of bike crashes, using the `Crashes In DC` and `Crash Details Table` datasets of DC. Here, we'll see\n", "\n", "> 1. A map highlighting the __magnitude of bike accidents__ in DC\n", "\n", "> 2. Assessing if all these __accidents happen on dedicated bike lanes__\n", "\n", "> 3. Learning some more about the __nature of these bike crashes__ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### _But why should I care?_\n", "\n", "> * According to the American Community Survey, about __13,000 D.C. residents bike to work each day__, with an increase of 1,200 new cyclists each year.\n", "\n", "\n", "> * In 2015, __bicyclists had the largest increase of fatalities (over 800, ie 12%)__ among all the roadway user groups, including drivers and pedestrian\n", "\n", "\n", "> * Only __53% of all fatal bike crashes get reported in newspapers__, and usually as only one story about the fatal crash itself. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The crash data for DC is collected in two separate tables\n", "\n", "> 1. __`Crashes in DC`__ - providing location and injury data for the crashes\n", "\n", "> 2. __`Crash Details Table`__ providing supplementary data about the people and vehicles involved in the crash\n", "\n", "\n", "Datasets used here can be found on [opendata.dc.gov](http://opendata.dc.gov/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reading in the DC crash dataset" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(140773, 49)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Reading 'Crashes in DC'\n", "crash = pd.read_csv('D:\\Data\\Crashes_In_DC\\Crashes_in_DC.csv', low_memory=False)\n", "crash.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now explore the various fields in the `crash` table" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 140773 entries, 0 to 140772\n", "Data columns (total 49 columns):\n", "X 140106 non-null float64\n", "Y 140106 non-null float64\n", "OBJECTID 140773 non-null int64\n", "CRIMEID 140773 non-null int64\n", "CCN 140773 non-null object\n", "REPORTDATE 139736 non-null object\n", "ROUTEID 140144 non-null object\n", "MEASURE 140144 non-null float64\n", "OFFSET 140144 non-null float64\n", "STREETSEGID 140144 non-null float64\n", "ROADWAYSEGID 140144 non-null float64\n", "FROMDATE 140773 non-null object\n", "TODATE 0 non-null float64\n", "MARID 140773 non-null int64\n", "ADDRESS 140745 non-null object\n", "LATITUDE 140773 non-null float64\n", "LONGITUDE 140773 non-null float64\n", "XCOORD 140773 non-null float64\n", "YCOORD 140773 non-null float64\n", "WARD 140772 non-null object\n", "EVENTID 140773 non-null object\n", "MAR_ADDRESS 135852 non-null object\n", "MAR_SCORE 140773 non-null float64\n", "MAJORINJURIES_BICYCLIST 140751 non-null float64\n", "MINORINJURIES_BICYCLIST 140751 non-null float64\n", "UNKNOWNINJURIES_BICYCLIST 140751 non-null float64\n", "FATAL_BICYCLIST 140773 non-null int64\n", "MAJORINJURIES_DRIVER 140751 non-null float64\n", "MINORINJURIES_DRIVER 140751 non-null float64\n", "UNKNOWNINJURIES_DRIVER 140751 non-null float64\n", "FATAL_DRIVER 140773 non-null int64\n", "MAJORINJURIES_PEDESTRIAN 140751 non-null float64\n", "MINORINJURIES_PEDESTRIAN 140751 non-null float64\n", "UNKNOWNINJURIES_PEDESTRIAN 140751 non-null float64\n", "FATAL_PEDESTRIAN 140773 non-null int64\n", "TOTAL_VEHICLES 140751 non-null float64\n", "TOTAL_BICYCLES 140773 non-null int64\n", "TOTAL_PEDESTRIANS 140751 non-null float64\n", "PEDESTRIANSIMPAIRED 140773 non-null int64\n", "BICYCLISTSIMPAIRED 140773 non-null int64\n", "DRIVERSIMPAIRED 140773 non-null int64\n", "TOTAL_TAXIS 140751 non-null float64\n", "TOTAL_GOVERNMENT 140751 non-null float64\n", "SPEEDING_INVOLVED 140751 non-null float64\n", "NEARESTINTROUTEID 133240 non-null object\n", "NEARESTINTSTREETNAME 133136 non-null object\n", "OFFINTERSECTION 140144 non-null float64\n", "INTAPPROACHDIRECTION 133240 non-null object\n", "LOCERROR 0 non-null float64\n", "dtypes: float64(28), int64(10), object(11)\n", "memory usage: 52.6+ MB\n" ] } ], "source": [ "crash.info()" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
XYOBJECTIDCRIMEIDCCNREPORTDATEROUTEIDMEASUREOFFSETSTREETSEGID...BICYCLISTSIMPAIREDDRIVERSIMPAIREDTOTAL_TAXISTOTAL_GOVERNMENTSPEEDING_INVOLVEDNEARESTINTROUTEIDNEARESTINTSTREETNAMEOFFINTERSECTIONINTAPPROACHDIRECTIONLOCERROR
0-77.01215238.9197101833571026614138110241412011-02-22T05:00:00.000Z110001023151.6320.010744.0...000.00.00.011009032ADAMS ST NW58.541660SouthNaN
1-77.01215838.9157321833571126614272110209332011-02-16T05:00:00.000Z110001022709.9770.04878.0...000.00.00.011075462RHODE ISLAND AVE NW0.076475NortheastNaN
2-77.01214538.9262891833571227266870170542672017-04-04T00:50:44.000Z110001023881.9330.011579.0...000.01.00.011060582MICHIGAN AVE NW0.034064SouthNaN
3-77.01217738.9018741833571325171264141652952014-10-25T05:00:00.000Z110001021171.6510.01268.0...000.00.00.011047772I ST NW60.933379NorthNaN
4-77.01217438.9003911833571425143825140524112014-04-16T05:00:00.000Z110001021006.1450.015414.0...000.00.00.011042442H ST NW20.706903NorthNaN
\n", "

5 rows × 49 columns

\n", "
" ], "text/plain": [ " X Y OBJECTID CRIMEID CCN \\\n", "0 -77.012152 38.919710 18335710 26614138 11024141 \n", "1 -77.012158 38.915732 18335711 26614272 11020933 \n", "2 -77.012145 38.926289 18335712 27266870 17054267 \n", "3 -77.012177 38.901874 18335713 25171264 14165295 \n", "4 -77.012174 38.900391 18335714 25143825 14052411 \n", "\n", " REPORTDATE ROUTEID MEASURE OFFSET STREETSEGID ... \\\n", "0 2011-02-22T05:00:00.000Z 11000102 3151.632 0.0 10744.0 ... \n", "1 2011-02-16T05:00:00.000Z 11000102 2709.977 0.0 4878.0 ... \n", "2 2017-04-04T00:50:44.000Z 11000102 3881.933 0.0 11579.0 ... \n", "3 2014-10-25T05:00:00.000Z 11000102 1171.651 0.0 1268.0 ... \n", "4 2014-04-16T05:00:00.000Z 11000102 1006.145 0.0 15414.0 ... \n", "\n", " BICYCLISTSIMPAIRED DRIVERSIMPAIRED TOTAL_TAXIS TOTAL_GOVERNMENT \\\n", "0 0 0 0.0 0.0 \n", "1 0 0 0.0 0.0 \n", "2 0 0 0.0 1.0 \n", "3 0 0 0.0 0.0 \n", "4 0 0 0.0 0.0 \n", "\n", " SPEEDING_INVOLVED NEARESTINTROUTEID NEARESTINTSTREETNAME OFFINTERSECTION \\\n", "0 0.0 11009032 ADAMS ST NW 58.541660 \n", "1 0.0 11075462 RHODE ISLAND AVE NW 0.076475 \n", "2 0.0 11060582 MICHIGAN AVE NW 0.034064 \n", "3 0.0 11047772 I ST NW 60.933379 \n", "4 0.0 11042442 H ST NW 20.706903 \n", "\n", " INTAPPROACHDIRECTION LOCERROR \n", "0 South NaN \n", "1 Northeast NaN \n", "2 South NaN \n", "3 North NaN \n", "4 North NaN \n", "\n", "[5 rows x 49 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crash.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. A map highlighting the magnitude of bike accidents in DC\n", "\n", "The dataset records around __140k__ crashes, mostly from 2015 through September 2017. With an alarming number like that, let's see how frequent bike accidents are. \n", "\n", "Here, we'll plot a heatmap using the Python package Bokeh, to qualitatively gauge the frequency of bike crashes in DC." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\manu9321\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\odo\\backends\\pandas.py:102: FutureWarning: pandas.tslib is deprecated and will be removed in a future version.\n", "You can access NaTType as type(pandas.NaT)\n", " @convert.register((pd.Timestamp, pd.Timedelta), (pd.tslib.NaTType, type(None)))\n" ] } ], "source": [ "#Importing necessary packages\n", "from bokeh.models import BoxZoomTool\n", "from bokeh.plotting import figure, output_notebook, show\n", "import datashader as ds\n", "from datashader.bokeh_ext import InteractiveImage\n", "from functools import partial\n", "from datashader.utils import export_image\n", "from datashader import transfer_functions as tf\n", "from datashader.colors import colormap_select, Greys9, Hot, inferno\n", "Greys9_r = list(reversed(Greys9))[:-2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by creating an empty plot container" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(global) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", " window._bokeh_onload_callbacks = [];\n", " window._bokeh_is_loading = undefined;\n", " }\n", "\n", "\n", " \n", " if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n", " window._bokeh_timeout = Date.now() + 5000;\n", " window._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " if (window.Bokeh !== undefined) {\n", " document.getElementById(\"786acbf1-5e6d-45f8-a9e4-fd66bcbd1843\").textContent = \"BokehJS successfully loaded.\";\n", " } else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", " delete window._bokeh_onload_callbacks\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " window._bokeh_onload_callbacks.push(callback);\n", " if (window._bokeh_is_loading > 0) {\n", " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " window._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " window._bokeh_is_loading--;\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"786acbf1-5e6d-45f8-a9e4-fd66bcbd1843\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '786acbf1-5e6d-45f8-a9e4-fd66bcbd1843' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.js\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " document.getElementById(\"786acbf1-5e6d-45f8-a9e4-fd66bcbd1843\").textContent = \"BokehJS is loading...\";\n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((window.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i](window.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!window._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " window._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"786acbf1-5e6d-45f8-a9e4-fd66bcbd1843\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(this));" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "output_notebook()\n", "\n", "DC = x_range, y_range = ((-77.113633,-76.910012), (38.812061,38.993699))\n", "\n", "plot_width = int(750)\n", "plot_height = int(plot_width//1.2)\n", "\n", "def base_plot(tools='pan,wheel_zoom,reset',plot_width=plot_width, plot_height=plot_height, **plot_args):\n", " p = figure(tools=tools, plot_width=plot_width, plot_height=plot_height,\n", " x_range=x_range, y_range=y_range, outline_line_color=None,\n", " min_border=0, min_border_left=0, min_border_right=0,\n", " min_border_top=0, min_border_bottom=0, **plot_args)\n", " \n", " p.axis.visible = False\n", " p.xgrid.grid_line_color = None\n", " p.ygrid.grid_line_color = None\n", " \n", " p.add_tools(BoxZoomTool(match_aspect=True))\n", " \n", " return p\n", " \n", "options = dict(line_color=None, fill_color='blue', size=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now create a column in the table, `BIKE_TOTAL`, that records all the bike injuries/fatalities." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "crash['BIKE_TOTAL'] = crash['MAJORINJURIES_BICYCLIST'] + crash['MINORINJURIES_BICYCLIST'] + crash['UNKNOWNINJURIES_BICYCLIST'] + crash['FATAL_BICYCLIST'] + crash['BICYCLISTSIMPAIRED']" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "background = \"black\"\n", "export = partial(export_image, export_path=\"export\", background=background)\n", "cm = partial(colormap_select, reverse=(background==\"black\"))\n", "\n", "def create_image(x_range, y_range, w=plot_width, h=plot_height):\n", " cvs = ds.Canvas(plot_width=w, plot_height=h, x_range=x_range, y_range=y_range)\n", " agg = cvs.points(crash, 'X', 'Y', ds.count('BIKE_TOTAL'))\n", " img = tf.shade(agg, cmap=Hot, how='eq_hist')\n", " return tf.dynspread(img, threshold=0.5, max_px=4)\n", "\n", "p = base_plot(background_fill_color=background)\n", "export(create_image(*DC),\"DC_bikeCrashes\")\n", "InteractiveImage(p, create_image)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![dc_bikecrashes](https://user-images.githubusercontent.com/13968196/36805091-75524684-1c8a-11e8-8ce5-6c60ae1b053f.png)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "This map indicates a high volume of bike crashes occuring in DC, much more than imagined!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Assessing if all these accidents happen on dedicated bike lanes" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from arcgis.gis import *\n", "gis = GIS(\"http://dcdev.maps.arcgis.com/\", \"username\", \"password\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The image below shows a representation of 1000 crashes (of all kinds), overlaying the bike lanes. We also notice a large number of crashes in SE DC that do not overlay a bike lane.\n", "\n", "Are these car crashes, or bike crashes occuring on non bike-lanes? Let's verify..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![bike_and_crash](https://user-images.githubusercontent.com/13968196/36805089-752ab948-1c8a-11e8-8ebd-d6c6b4e6f462.PNG)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's filter the crashes dataset to contain only bike accidents" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1210, 50)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bike_accidents = crash.loc[crash['TOTAL_BICYCLES'] != 0]\n", "bike_accidents.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1 Publishing a feature layer from a Pandas Dataframe" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "We will now publish a layer of only accidents involving bikes to Online.\n", "\n", "We start by creating a column containing the `SHAPE` of the geometry" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\manu9321\\AppData\\Local\\Programs\\ArcGIS\\Pro\\bin\\Python\\envs\\arcgispro-py3\\lib\\site-packages\\ipykernel_launcher.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] } ], "source": [ "bike_accidents['SHAPE'] = bike_accidents.apply(lambda row : arcgis.geometry.Geometry({'x': row['X'], 'y': row['Y']}), axis=1 )" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Importing package\n", "from arcgis import SpatialDataFrame" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1210, 50)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bike_sdf = SpatialDataFrame(bike_accidents)\n", "bike_sdf.set_geometry('SHAPE', inplace=True, sr=4326)\n", "bike_sdf['SHAPE'] = bike_sdf.geometry.project_as(4326)\n", "bike_sdf.shape" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "The following rows could not be written to the table: 2777,2805,140098\n" ] } ], "source": [ "#Publish the data\n", "bikeCrash_layer = gis.content.import_data(bike_sdf, title='bikeCrashes_1', target_sr=4326, capabilities=\"Query,Editing\")" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
\n", " \n", " \n", " \n", "
\n", "\n", "
\n", " bikeCrashes_1\n", " \n", "
Feature Layer Collection by mmajumdar_dcdev\n", "
Last Modified: November 17, 2017\n", "
0 comments, 0 views\n", "
\n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bikeCrash_layer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2 Publishing a feature layer from a Shapefile" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data = \"Bicycle_Lanes.zip\"\n", "shpfile = gis.content.add({}, data)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
\n", " \n", " \n", " \n", "
\n", "\n", "
\n", " Bicycle_Lanes\n", " \n", "
Feature Layer Collection by mmajumdar_dcdev\n", "
Last Modified: November 17, 2017\n", "
0 comments, 0 views\n", "
\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "published_service = shpfile.publish()\n", "display(published_service)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "
\n", " \n", " \n", " \n", "
\n", "\n", "
\n", " BikeCrashes_WithLanes\n", " \n", "
Web Map by mmajumdar_dcdev\n", "
Last Modified: November 17, 2017\n", "
0 comments, 0 views\n", "
\n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Viewing the map\n", "search_result = gis.content.search(\"BikeCrashes_WithLanes\")\n", "search_result[0]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 3. Learning some more about the nature of these bike crashes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we'll look at the `Crash_Details_Table` that contains other details about crashes" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(316682, 15)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crash_details = pd.read_csv('D:\\Data\\Crashes_In_DC\\Crash_Details_Table.csv', low_memory=False)\n", "crash_details.shape" ] }, { "cell_type": "code", "execution_count": 10, "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", "
OBJECTIDCRIMEIDCCNPERSONIDPERSONTYPEAGEFATALMAJORINJURYMINORINJURYVEHICLEIDINVEHICLETYPETICKETISSUEDLICENSEPLATESTATEIMPAIREDSPEEDING
036004281252983531509513385048959DriverNaNNNY976484Passenger Car/automobileNDCNN
136004282253000741509712484722776Driver34.0NNN976548Passenger Car/automobileNMDNN
236004283253000741509712484588227DriverNaNNNN976548Passenger Car/automobileNMDNN
336004284253010941509839184851675DriverNaNNNN976614Passenger Car/automobileNVANN
436004285250586951410491484895614Driver43.0NNN976649Pickup TruckNMDNN
\n", "
" ], "text/plain": [ " OBJECTID CRIMEID CCN PERSONID PERSONTYPE AGE FATAL MAJORINJURY \\\n", "0 36004281 25298353 15095133 85048959 Driver NaN N N \n", "1 36004282 25300074 15097124 84722776 Driver 34.0 N N \n", "2 36004283 25300074 15097124 84588227 Driver NaN N N \n", "3 36004284 25301094 15098391 84851675 Driver NaN N N \n", "4 36004285 25058695 14104914 84895614 Driver 43.0 N N \n", "\n", " MINORINJURY VEHICLEID INVEHICLETYPE TICKETISSUED \\\n", "0 Y 976484 Passenger Car/automobile N \n", "1 N 976548 Passenger Car/automobile N \n", "2 N 976548 Passenger Car/automobile N \n", "3 N 976614 Passenger Car/automobile N \n", "4 N 976649 Pickup Truck N \n", "\n", " LICENSEPLATESTATE IMPAIRED SPEEDING \n", "0 DC N N \n", "1 MD N N \n", "2 MD N N \n", "3 VA N N \n", "4 MD N N " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crash_details.head()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Let's filter it to contain only bike crashes" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1043, 15)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bike_crash_details = crash_details.loc[(crash_details['PERSONTYPE']=='Bicyclist') | ((crash_details['PERSONTYPE']=='Pedestrian') & (len(crash_details['LICENSEPLATESTATE'] != 2)))]\n", "bike_crash_details.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now create a chart to see the distribution of bicyclists that have crashed, based on age of the bicyclists" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Importing visualization packages of Python\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "sns.set(color_codes=True)\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def calculate_age_bin(x):\n", " '''Function that creates an appropriate bin value for each age'''\n", " try:\n", " return int(x/10)\n", " except:\n", " return int(0)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\manu9321\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] }, { "data": { "text/plain": [ "14358 5\n", "77815 2\n", "122008 3\n", "122009 6\n", "122010 2\n", "Name: age_counts, dtype: int64" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bike_crash_details['age_counts'] = bike_crash_details['AGE'].apply(calculate_age_bin)\n", "bike_crash_details['age_counts'].head()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0,0.5,'Frequency')" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10,10))\n", "n, bins, patches = plt.hist(bike_crash_details['age_counts'], bins=[0,1,2,3,4,5,6,7,8], facecolor='blue', alpha=0.5)\n", "\n", "plt.title(\"Distribution of age of bicyclists that crash more often\", fontsize=16)\n", "plt.xlabel(\"Age (multiply by factor of 10)\", fontsize=16)\n", "plt.ylabel(\"Frequency\", fontsize=16)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on this chart we observe that most bicyclists that have met with accidents are within the age range of 20-40 years.\n", "\n", "The frequency generated for riders under the age of 10, could also indicate some missing values, defaulting to 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What next?\n", "\n", "> * Combine this with the Hub Vision Zero intitiative and High Injury Network analysis.\n", "\n", "\n", "> * Perform deeper analysis with other datasets and propose new bikelane routes to DC Department of Transportation\n", "\n", " \n", "> * Report a crash to [waba.org](http://www.waba.org)\n", "\n", "\n", "> * As a bicyclist, ensuring that the bike has bells, lights and that you wear a helmet.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }