Skip to content

Instantly share code, notes, and snippets.

@zhik
Created June 23, 2022 14:46
Show Gist options
  • Save zhik/3f1602678026834c6f54470bdd8fcb16 to your computer and use it in GitHub Desktop.
Save zhik/3f1602678026834c6f54470bdd8fcb16 to your computer and use it in GitHub Desktop.
Open Streets Collision Summary.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Open Streets Collision Summary.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/zhik/3f1602678026834c6f54470bdd8fcb16/open-streets-collision-summary.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "tP7894NRG8-v",
"outputId": "af58a0e1-7c79-4b68-dc5f-1ef51cdd2392"
},
"source": [
"!pip install pandas geopandas seaborn mapclassify folium"
],
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (1.1.5)\n",
"Requirement already satisfied: geopandas in /usr/local/lib/python3.7/dist-packages (0.10.2)\n",
"Requirement already satisfied: seaborn in /usr/local/lib/python3.7/dist-packages (0.11.2)\n",
"Requirement already satisfied: mapclassify in /usr/local/lib/python3.7/dist-packages (2.4.3)\n",
"Requirement already satisfied: folium in /usr/local/lib/python3.7/dist-packages (0.8.3)\n",
"Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas) (2.8.2)\n",
"Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas) (2018.9)\n",
"Requirement already satisfied: numpy>=1.15.4 in /usr/local/lib/python3.7/dist-packages (from pandas) (1.19.5)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)\n",
"Requirement already satisfied: pyproj>=2.2.0 in /usr/local/lib/python3.7/dist-packages (from geopandas) (3.2.1)\n",
"Requirement already satisfied: shapely>=1.6 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.7.1)\n",
"Requirement already satisfied: fiona>=1.8 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.8.20)\n",
"Requirement already satisfied: click>=4.0 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (7.1.2)\n",
"Requirement already satisfied: cligj>=0.5 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (0.7.2)\n",
"Requirement already satisfied: click-plugins>=1.0 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (1.1.1)\n",
"Requirement already satisfied: attrs>=17 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (21.2.0)\n",
"Requirement already satisfied: munch in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (2.5.0)\n",
"Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (57.4.0)\n",
"Requirement already satisfied: certifi in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (2021.5.30)\n",
"Requirement already satisfied: matplotlib>=2.2 in /usr/local/lib/python3.7/dist-packages (from seaborn) (3.2.2)\n",
"Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.7/dist-packages (from seaborn) (1.4.1)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn) (1.3.2)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn) (0.10.0)\n",
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=2.2->seaborn) (2.4.7)\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from mapclassify) (0.22.2.post1)\n",
"Requirement already satisfied: networkx in /usr/local/lib/python3.7/dist-packages (from mapclassify) (2.6.3)\n",
"Requirement already satisfied: branca>=0.3.0 in /usr/local/lib/python3.7/dist-packages (from folium) (0.4.2)\n",
"Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from folium) (2.23.0)\n",
"Requirement already satisfied: jinja2 in /usr/local/lib/python3.7/dist-packages (from folium) (2.11.3)\n",
"Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from jinja2->folium) (2.0.1)\n",
"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->folium) (2.10)\n",
"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->folium) (3.0.4)\n",
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->folium) (1.24.3)\n",
"Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->mapclassify) (1.0.1)\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "g_b_49QvEEb9",
"outputId": "5f072417-d64b-409c-fc46-20be2c68efa6"
},
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "izZDQwKnHWMK"
},
"source": [
"import pandas as pd\n",
"import geopandas as gpd\n",
"import seaborn as sns\n",
"from pathlib import Path\n",
"from datetime import datetime, timedelta\n",
"from matplotlib.patches import Rectangle\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.dates as mdates"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Krj3cG40Xopc"
},
"source": [
"## Import Our Datasets\n",
"\n",
"- [Open Streets Locations](https://data.cityofnewyork.us/Health/Open-Streets-Locations/uiay-nctu/data) - geocoded\n",
"- [Motor Vehicle Collisions-Crashes](https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Crashes/h9gi-nx95/data)\n",
"- [Motor Vehicle Collisions-Vehicles](https://data.cityofnewyork.us/Public-Safety/Motor-Vehicle-Collisions-Vehicles/bm4k-52h4) (one to many on Crashes dataset)"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 366
},
"id": "UHVyAAtsHZts",
"outputId": "4c94ea15-573b-4611-aaa4-c7dcb8155376"
},
"source": [
"#set a basePath to my google drive\n",
"basePath = Path('/content/drive/MyDrive/Colab Data/Open Streets (10 2021)')\n",
"\n",
"#read and sample open streets\n",
"open_streets = gpd.read_file(basePath / './open-streets.shp')\n",
"open_streets.sample(3)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Location</th>\n",
" <th>Borough</th>\n",
" <th>On_Stree</th>\n",
" <th>From_Str</th>\n",
" <th>To_Stree</th>\n",
" <th>Type</th>\n",
" <th>Open_Dat</th>\n",
" <th>Monday_S</th>\n",
" <th>Monday_E</th>\n",
" <th>Tuesday_</th>\n",
" <th>Wednesda</th>\n",
" <th>Thursday</th>\n",
" <th>Friday_S</th>\n",
" <th>Friday_E</th>\n",
" <th>Saturday</th>\n",
" <th>Sunday_S</th>\n",
" <th>Sunday_E</th>\n",
" <th>Day_of_W</th>\n",
" <th>Cool_Str</th>\n",
" <th>error</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>194</th>\n",
" <td>Concrete Safaris</td>\n",
" <td>Manhattan</td>\n",
" <td>East 115th Street</td>\n",
" <td>Park Avenue</td>\n",
" <td>3rd Avenue</td>\n",
" <td>Temporary Limited Local Access</td>\n",
" <td>43965.0</td>\n",
" <td>2:00PM</td>\n",
" <td>5:30PM</td>\n",
" <td>5:30PM</td>\n",
" <td>5:30PM</td>\n",
" <td>5:30PM</td>\n",
" <td>2:00PM</td>\n",
" <td>5:30PM</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>M,T,W,R,F</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>LINESTRING (-73.94212 40.79794, -73.94052 40.7...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>318</th>\n",
" <td>Kesher Bridging Communities</td>\n",
" <td>Queens</td>\n",
" <td>Reads Lane</td>\n",
" <td>Empire Avenue</td>\n",
" <td>Jarvis Avenue</td>\n",
" <td>Temporary Limited Local Access</td>\n",
" <td>44007.0</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>12:00PM</td>\n",
" <td>9:00PM</td>\n",
" <td>8:00PM</td>\n",
" <td>12:00PM</td>\n",
" <td>8:00PM</td>\n",
" <td>F,S,U</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>LINESTRING (-73.73858 40.59968, -73.73915 40.6...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>576</th>\n",
" <td>Rodeph Sholom School</td>\n",
" <td>Manhattan</td>\n",
" <td>West 78th Street</td>\n",
" <td>Columbus Avenue</td>\n",
" <td>Amsterdam Avenue</td>\n",
" <td>Temporary Full Closure</td>\n",
" <td>44455.0</td>\n",
" <td>10:00AM</td>\n",
" <td>2:45PM</td>\n",
" <td>2:45PM</td>\n",
" <td>2:45PM</td>\n",
" <td>2:45PM</td>\n",
" <td>10:00AM</td>\n",
" <td>2:45PM</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>N/A</td>\n",
" <td>M,T,W,R,F</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>LINESTRING (-73.97599 40.78127, -73.97882 40.7...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Location ... geometry\n",
"194 Concrete Safaris ... LINESTRING (-73.94212 40.79794, -73.94052 40.7...\n",
"318 Kesher Bridging Communities ... LINESTRING (-73.73858 40.59968, -73.73915 40.6...\n",
"576 Rodeph Sholom School ... LINESTRING (-73.97599 40.78127, -73.97882 40.7...\n",
"\n",
"[3 rows x 21 columns]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 286
},
"id": "zqaB62KKW_rD",
"outputId": "83eeb9fe-0c82-4752-e434-38c77a6ccf59"
},
"source": [
"open_streets.plot()"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f2f7bb4ce50>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OFj4cFusYUxN",
"outputId": "d90e64dc-73ed-4c50-8fb2-2303d755b2ba"
},
"source": [
"collision_vech = pd.read_csv( basePath / './Motor_Vehicle_Collisions_-_Vehicles.csv')\n",
"\n",
"#read and convert to GeoDataFrame\n",
"_df1 = pd.read_csv( basePath / './Motor_Vehicle_Collisions_-_Crashes.csv')\n",
"collision_crashes = gpd.GeoDataFrame(_df1, geometry=gpd.points_from_xy(_df1.LONGITUDE, _df1.LATITUDE), crs = 'EPSG:4326')\n",
"del _df1"
],
"execution_count": null,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (8) have mixed types.Specify dtype option on import or set low_memory=False.\n",
" interactivity=interactivity, compiler=compiler, result=result)\n",
"/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (3) have mixed types.Specify dtype option on import or set low_memory=False.\n",
" interactivity=interactivity, compiler=compiler, result=result)\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "fO8joLeAYk9J"
},
"source": [
"#reproject\n",
"collision_crashes = collision_crashes.to_crs(\"EPSG:2263\")"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "mV3EO7H4ZRUy",
"outputId": "9fee77f8-f129-4946-f0b1-6821559b2566"
},
"source": [
"collision_crashes.sample(3).transpose()"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>646649</th>\n",
" <th>1637284</th>\n",
" <th>1645160</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>CRASH DATE</th>\n",
" <td>12/20/2017</td>\n",
" <td>06/17/2013</td>\n",
" <td>05/22/2013</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CRASH TIME</th>\n",
" <td>11:40</td>\n",
" <td>10:45</td>\n",
" <td>21:12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BOROUGH</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>BRONX</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ZIP CODE</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>10466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>LATITUDE</th>\n",
" <td>40.6775</td>\n",
" <td>NaN</td>\n",
" <td>40.8891</td>\n",
" </tr>\n",
" <tr>\n",
" <th>LONGITUDE</th>\n",
" <td>-73.7309</td>\n",
" <td>NaN</td>\n",
" <td>-73.8355</td>\n",
" </tr>\n",
" <tr>\n",
" <th>LOCATION</th>\n",
" <td>(40.67753, -73.73085)</td>\n",
" <td>NaN</td>\n",
" <td>(40.8891337, -73.835548)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ON STREET NAME</th>\n",
" <td>LAURELTON PARKWAY</td>\n",
" <td>NaN</td>\n",
" <td>AMUNDSON AVENUE</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CROSS STREET NAME</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>EAST 233 STREET</td>\n",
" </tr>\n",
" <tr>\n",
" <th>OFF STREET NAME</th>\n",
" <td>NaN</td>\n",
" <td>P/L OF 1150 SOUTH AVE</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF PERSONS INJURED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF PERSONS KILLED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF PEDESTRIANS INJURED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF PEDESTRIANS KILLED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF CYCLIST INJURED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF CYCLIST KILLED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF MOTORIST INJURED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NUMBER OF MOTORIST KILLED</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 1</th>\n",
" <td>Tire Failure/Inadequate</td>\n",
" <td>Backing Unsafely</td>\n",
" <td>Unspecified</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 2</th>\n",
" <td>Other Vehicular</td>\n",
" <td>NaN</td>\n",
" <td>Unspecified</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 3</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 4</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 5</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>COLLISION_ID</th>\n",
" <td>3814602</td>\n",
" <td>298559</td>\n",
" <td>97504</td>\n",
" </tr>\n",
" <tr>\n",
" <th>VEHICLE TYPE CODE 1</th>\n",
" <td>Station Wagon/Sport Utility Vehicle</td>\n",
" <td>SPORT UTILITY / STATION WAGON</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" </tr>\n",
" <tr>\n",
" <th>VEHICLE TYPE CODE 2</th>\n",
" <td>Sedan</td>\n",
" <td>NaN</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" </tr>\n",
" <tr>\n",
" <th>VEHICLE TYPE CODE 3</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>VEHICLE TYPE CODE 4</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>VEHICLE TYPE CODE 5</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>geometry</th>\n",
" <td>POINT (1058905.171008306 186233.5535885742)</td>\n",
" <td>POINT (nan nan)</td>\n",
" <td>POINT (1029719.994521396 263256.0132912833)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 646649 ... 1645160\n",
"CRASH DATE 12/20/2017 ... 05/22/2013\n",
"CRASH TIME 11:40 ... 21:12\n",
"BOROUGH NaN ... BRONX\n",
"ZIP CODE NaN ... 10466\n",
"LATITUDE 40.6775 ... 40.8891\n",
"LONGITUDE -73.7309 ... -73.8355\n",
"LOCATION (40.67753, -73.73085) ... (40.8891337, -73.835548)\n",
"ON STREET NAME LAURELTON PARKWAY ... AMUNDSON AVENUE \n",
"CROSS STREET NAME NaN ... EAST 233 STREET \n",
"OFF STREET NAME NaN ... NaN\n",
"NUMBER OF PERSONS INJURED 0 ... 0\n",
"NUMBER OF PERSONS KILLED 0 ... 0\n",
"NUMBER OF PEDESTRIANS INJURED 0 ... 0\n",
"NUMBER OF PEDESTRIANS KILLED 0 ... 0\n",
"NUMBER OF CYCLIST INJURED 0 ... 0\n",
"NUMBER OF CYCLIST KILLED 0 ... 0\n",
"NUMBER OF MOTORIST INJURED 0 ... 0\n",
"NUMBER OF MOTORIST KILLED 0 ... 0\n",
"CONTRIBUTING FACTOR VEHICLE 1 Tire Failure/Inadequate ... Unspecified\n",
"CONTRIBUTING FACTOR VEHICLE 2 Other Vehicular ... Unspecified\n",
"CONTRIBUTING FACTOR VEHICLE 3 NaN ... NaN\n",
"CONTRIBUTING FACTOR VEHICLE 4 NaN ... NaN\n",
"CONTRIBUTING FACTOR VEHICLE 5 NaN ... NaN\n",
"COLLISION_ID 3814602 ... 97504\n",
"VEHICLE TYPE CODE 1 Station Wagon/Sport Utility Vehicle ... PASSENGER VEHICLE\n",
"VEHICLE TYPE CODE 2 Sedan ... PASSENGER VEHICLE\n",
"VEHICLE TYPE CODE 3 NaN ... NaN\n",
"VEHICLE TYPE CODE 4 NaN ... NaN\n",
"VEHICLE TYPE CODE 5 NaN ... NaN\n",
"geometry POINT (1058905.171008306 186233.5535885742) ... POINT (1029719.994521396 263256.0132912833)\n",
"\n",
"[30 rows x 3 columns]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9z3cGVX7gJkf"
},
"source": [
"## Filter and Summarize data"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "-H8djphifCBg",
"outputId": "ae27ca9f-093e-43b1-eca0-66d5ef5d243e"
},
"source": [
"#find some coalitions\n",
"open_streets[open_streets['Location'].str.contains('Coalition')]['Location'].value_counts()"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"North Brooklyn Open Streets Community Coalition 29\n",
"34th Ave Open Streets Coalition 26\n",
"Loisaida Open Streets Community Coalition 8\n",
"West 103rd St Open Streets Community Coalition 2\n",
"St Marks Business Coalition 1\n",
"Name: Location, dtype: int64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "zJPBsjArjB5r",
"outputId": "a346ee61-3c70-4cab-ecca-98f9f39d1fd6"
},
"source": [
"#find some coalitions\n",
"open_streets[open_streets['On_Stree'].str.contains('34')]['On_Stree'].value_counts()"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"34th Avenue 28\n",
"Name: On_Stree, dtype: int64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "s2-Du1ytZRyW"
},
"source": [
"#select a street\n",
"open_street_name = '34th Avenue'\n",
"filter = (open_streets['On_Stree'] == open_street_name) & (open_streets['Borough'] == 'Queens')\n",
"# filter = (open_streets['Location'] == 'North Brooklyn Open Streets Community Coalition')\n",
"\n",
"#filter and convert to 2263 so we can use feet calcuations\n",
"openstr = open_streets[filter].to_crs(\"EPSG:2263\").copy()\n",
"\n",
"#buffer the street by the standard 60 feet\n",
"openstr.geometry = openstr.buffer(60)\n",
"onstr_poly = openstr.dissolve(by='On_Stree')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "vYjxyiR9ZX95"
},
"source": [
"#buffer to get the 'near' open street polygon\n",
"nearstr_poly = onstr_poly.buffer(260)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "gAKKglQ0h5Hy",
"outputId": "6ce5b6b1-061f-40f2-f46b-db3d71a61d2c"
},
"source": [
"nearstr_poly.plot()"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f2f45000090>"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "lRARWtIugiuP",
"outputId": "6b3f9903-04fe-4eb2-eb5b-0f7ac03fadc4"
},
"source": [
"#get collisions on the open street\n",
"onstr_points = collision_crashes[collision_crashes.within(onstr_poly.geometry[0])].copy()\n",
"\n",
"onstr_points.tail()"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>CRASH DATE</th>\n",
" <th>CRASH TIME</th>\n",
" <th>BOROUGH</th>\n",
" <th>ZIP CODE</th>\n",
" <th>LATITUDE</th>\n",
" <th>LONGITUDE</th>\n",
" <th>LOCATION</th>\n",
" <th>ON STREET NAME</th>\n",
" <th>CROSS STREET NAME</th>\n",
" <th>OFF STREET NAME</th>\n",
" <th>NUMBER OF PERSONS INJURED</th>\n",
" <th>NUMBER OF PERSONS KILLED</th>\n",
" <th>NUMBER OF PEDESTRIANS INJURED</th>\n",
" <th>NUMBER OF PEDESTRIANS KILLED</th>\n",
" <th>NUMBER OF CYCLIST INJURED</th>\n",
" <th>NUMBER OF CYCLIST KILLED</th>\n",
" <th>NUMBER OF MOTORIST INJURED</th>\n",
" <th>NUMBER OF MOTORIST KILLED</th>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 1</th>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 2</th>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 3</th>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 4</th>\n",
" <th>CONTRIBUTING FACTOR VEHICLE 5</th>\n",
" <th>COLLISION_ID</th>\n",
" <th>VEHICLE TYPE CODE 1</th>\n",
" <th>VEHICLE TYPE CODE 2</th>\n",
" <th>VEHICLE TYPE CODE 3</th>\n",
" <th>VEHICLE TYPE CODE 4</th>\n",
" <th>VEHICLE TYPE CODE 5</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1826110</th>\n",
" <td>07/03/2012</td>\n",
" <td>18:30</td>\n",
" <td>QUEENS</td>\n",
" <td>11372</td>\n",
" <td>40.753731</td>\n",
" <td>-73.885038</td>\n",
" <td>(40.7537307, -73.8850382)</td>\n",
" <td>82 STREET</td>\n",
" <td>34 AVENUE</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Unspecified</td>\n",
" <td>Unspecified</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>279659</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>SPORT UTILITY / STATION WAGON</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>POINT (1016101.003 213902.002)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1826735</th>\n",
" <td>07/07/2012</td>\n",
" <td>9:07</td>\n",
" <td>QUEENS</td>\n",
" <td>11372</td>\n",
" <td>40.752656</td>\n",
" <td>-73.895258</td>\n",
" <td>(40.7526563, -73.895258)</td>\n",
" <td>34 AVENUE</td>\n",
" <td>71 STREET</td>\n",
" <td>NaN</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Unspecified</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>279695</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>POINT (1013270.002 213507.012)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1827324</th>\n",
" <td>07/01/2012</td>\n",
" <td>20:45</td>\n",
" <td>QUEENS</td>\n",
" <td>11372</td>\n",
" <td>40.754416</td>\n",
" <td>-73.878529</td>\n",
" <td>(40.7544157, -73.8785293)</td>\n",
" <td>89 STREET</td>\n",
" <td>34 AVENUE</td>\n",
" <td>NaN</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>Unspecified</td>\n",
" <td>Unspecified</td>\n",
" <td>Unspecified</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>279644</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>POINT (1017903.994 214154.003)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1827673</th>\n",
" <td>07/09/2012</td>\n",
" <td>9:05</td>\n",
" <td>QUEENS</td>\n",
" <td>11372</td>\n",
" <td>40.753339</td>\n",
" <td>-73.888756</td>\n",
" <td>(40.7533391, -73.8887565)</td>\n",
" <td>34 AVENUE</td>\n",
" <td>78 STREET</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Unspecified</td>\n",
" <td>Unspecified</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>279708</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>POINT (1015071.003 213757.999)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1829067</th>\n",
" <td>07/01/2012</td>\n",
" <td>18:00</td>\n",
" <td>QUEENS</td>\n",
" <td>11372</td>\n",
" <td>40.753731</td>\n",
" <td>-73.885038</td>\n",
" <td>(40.7537307, -73.8850382)</td>\n",
" <td>82 STREET</td>\n",
" <td>34 AVENUE</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>Unspecified</td>\n",
" <td>Unspecified</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>279643</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>PASSENGER VEHICLE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>POINT (1016101.003 213902.002)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" CRASH DATE ... geometry\n",
"1826110 07/03/2012 ... POINT (1016101.003 213902.002)\n",
"1826735 07/07/2012 ... POINT (1013270.002 213507.012)\n",
"1827324 07/01/2012 ... POINT (1017903.994 214154.003)\n",
"1827673 07/09/2012 ... POINT (1015071.003 213757.999)\n",
"1829067 07/01/2012 ... POINT (1016101.003 213902.002)\n",
"\n",
"[5 rows x 30 columns]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "sCX6AMY4jopE",
"outputId": "5ec9f696-8489-408a-d0e9-b9441db0c701"
},
"source": [
"#get number of crashes after \n",
"onstr_points['DATE'] = pd.to_datetime(onstr_points['CRASH DATE'], format= \"%m/%d/%Y\") #.dt.to_period('M')\n",
"len(onstr_points[onstr_points['DATE'] > datetime(2020, 4 ,1)])"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"93"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ABgs-3qcjwUW"
},
"source": [
"#join with collision vech\n",
"t = pd.merge(onstr_points, collision_vech, on = 'COLLISION_ID', how = 'left')\n",
"\n",
"t['Year'] = t['DATE'].dt.year\n",
"t['DATE'] = pd.to_datetime(t['DATE'])\n",
"\n",
"#get summary for each year\n",
"for year in (2018,2019,2020,2021):\n",
" t2 = t[t['DATE'].dt.year == year]\n",
" print('Yearly Collisions:',len(t2), '-', year)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "8WA_GBzIGDYo"
},
"source": [
"### Bar Cart"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JOQAMT3ulryv"
},
"source": [
"#melt table\n",
"keep_cols = ['UNIQUE_ID','Year','NUMBER OF MOTORIST INJURED','NUMBER OF CYCLIST INJURED','NUMBER OF PEDESTRIANS INJURED']\n",
"\n",
"table_2 = t[t.Year >=2018][keep_cols].melt(id_vars=['UNIQUE_ID','Year'], \n",
" var_name=\"Type\", \n",
" value_name=\"Count\")\n",
"\n",
"table_2.sample(5)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ZUXVoGW6j8mI"
},
"source": [
"f, ax = plt.subplots(figsize=(15, 8))\n",
"sns.set_theme(style=\"whitegrid\")\n",
"\n",
"sns.barplot(x = 'Count', \n",
" y='Year', \n",
" hue='Type', \n",
" data=table_2 , \n",
" estimator=sum , \n",
" ci = None, \n",
" palette='tab20c',\n",
" orient = 'h').set_title('*2021 contains data up to Oct 8th', loc = 'right')\n",
"\n",
"f.suptitle(f'Injuries from crashes on {open_street_name}')\n",
"\n",
"#add labels to each bar\n",
"for p in ax.patches:\n",
" ax.annotate(f'{p.get_width():.0f}', (p.get_x() + p.get_width() + 0.3 , p.get_y() + p.get_height() / 1.2),\n",
" ha='center', va='center', fontsize=10, color='black', xytext=(0, 5),\n",
" textcoords='offset points')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "NL-ATNeYXE82"
},
"source": [
"#agg to see number of different groups INJURED\n",
"p = t[t.Year >= 2018].groupby('Year').agg({\n",
" 'NUMBER OF MOTORIST INJURED': sum,\n",
" 'NUMBER OF CYCLIST INJURED': sum,\n",
" 'NUMBER OF PEDESTRIANS INJURED': sum,\n",
"})\n",
"p "
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "YoiBw01GXHLz"
},
"source": [
"t[t.Year >= 2018].groupby('Year').agg({\n",
" 'NUMBER OF PEDESTRIANS KILLED': sum,\n",
" 'NUMBER OF CYCLIST KILLED': sum,\n",
" 'NUMBER OF MOTORIST KILLED': sum\n",
"})"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "AAOUtBmbGLcd"
},
"source": [
"## Area time series chart"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6pqW1V6wGJqW"
},
"source": [
"#query for near street points, and create columns for date and year\n",
"nearstr_points = collision_crashes[collision_crashes.within(nearstr_poly.geometry[0])].copy()\n",
"nearstr_points['DATE'] = pd.to_datetime(nearstr_points['CRASH DATE'], format= \"%m/%d/%Y\") \n",
"nearstr_points['Year'] = nearstr_points['DATE'].dt.year\n",
"\n",
"onstr_points['DATE'] = pd.to_datetime(onstr_points['CRASH DATE'], format= \"%m/%d/%Y\") \n",
"onstr_points['Year'] = onstr_points['DATE'].dt.year"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "AR_NnthGGbtU",
"outputId": "d55a39c2-087b-453d-d21e-4ea114805be0"
},
"source": [
"#filter for after 2018\n",
"onstr_table = onstr_points[onstr_points['Year'] >= 2017]\n",
"nearstr_table = nearstr_points[nearstr_points['Year'] >= 2017]\n",
"\n",
"#create tables\n",
"onstr_monthly_count= pd.DataFrame(onstr_table.groupby(onstr_table[\"DATE\"].dt.to_period('M').dt.to_timestamp()).count()['COLLISION_ID']).reset_index().rename(columns = {'COLLISION_ID': 'On Street'})\n",
"nearstr_monthly_count = pd.DataFrame(nearstr_table.groupby(nearstr_table[\"DATE\"].dt.to_period('M').dt.to_timestamp()).count()['COLLISION_ID']).reset_index().rename(columns = {'COLLISION_ID': 'On/Near Street'})\n",
"\n",
"merged_counts = pd.merge(onstr_monthly_count, nearstr_monthly_count, on = 'DATE')\n",
"\n",
"#subtract to get only near street counts \n",
"merged_counts['Near Street'] = merged_counts['On/Near Street'] - merged_counts['On Street']\n",
"\n",
"merged_counts.sample(5)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE</th>\n",
" <th>On Street</th>\n",
" <th>On/Near Street</th>\n",
" <th>Near Street</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2017-02-01</td>\n",
" <td>9</td>\n",
" <td>12</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>2018-10-01</td>\n",
" <td>12</td>\n",
" <td>16</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>2020-01-01</td>\n",
" <td>6</td>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>2018-07-01</td>\n",
" <td>8</td>\n",
" <td>12</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>2021-02-01</td>\n",
" <td>4</td>\n",
" <td>6</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" DATE On Street On/Near Street Near Street\n",
"1 2017-02-01 9 12 3\n",
"21 2018-10-01 12 16 4\n",
"36 2020-01-01 6 8 2\n",
"18 2018-07-01 8 12 4\n",
"49 2021-02-01 4 6 2"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"background_save": true
},
"id": "NBEOr7RPGrSo",
"outputId": "a62ef000-ab14-41b2-b1c6-84cda5f6b406"
},
"source": [
"#create chart and labels\n",
"f, ax = plt.subplots(figsize=(15, 8))\n",
"sns.set_style(style=\"whitegrid\")\n",
"\n",
"#add stackplot\n",
"color_map = [\"#3182bd\", \"#9ecae1\"]\n",
"chart = plt.stackplot(merged_counts['DATE'], merged_counts['On Street'], merged_counts['Near Street'], \n",
" step = 'pre', colors = color_map)\n",
"\n",
"\n",
"\n",
"#y axis formating\n",
"plt.locator_params(axis=\"y\", integer=True, tight=True)\n",
"max = merged_counts['On/Near Street'].max() + 2\n",
"ax.set_ylim([0, max])\n",
"\n",
"#title and legend\n",
"plt.legend(loc=\"upper left\")\n",
"ax.set( xlabel='Month', title = f'Crashes on {open_street_name}')\n",
"\n",
"p1 = Rectangle((0, 0), 1, 1, fc=color_map[0])\n",
"p2 = Rectangle((0, 0), 1, 1, fc=color_map[1])\n",
"plt.legend([p1, p2], ['On Open Street', 'Near Open Street'])\n",
"\n",
"#add background fill for when the openstreet started\n",
"def floatHourToTime(fh):\n",
" hours, hourSeconds = divmod(fh, 1)\n",
"\n",
" return datetime.fromordinal(datetime(1900, 1, 1).toordinal() + int(hours) - 2)\n",
" \n",
"start_open_date = openstr['Open_Dat'].apply(floatHourToTime).min()\n",
"# start_open_date = datetime(2021,8,1)Vanderbilt\n",
"\n",
"\n",
"x_width = ax.get_xlim()[1] - ax.get_xlim()[0]\n",
"rectangle = Rectangle((mdates.date2num(start_open_date), 0), x_width, max, facecolor=(0.5,0.5,0.5,0.2))\n",
"ax.add_patch(rectangle)\n",
"\n",
"#https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.Rectangle.html\n",
"x_width2 = mdates.date2num(start_open_date) - mdates.date2num(datetime(2020,3,14))\n",
"rectangle2 = Rectangle((mdates.date2num(datetime(2020,3,14)), 0), x_width2, \n",
" max, facecolor=(0.9,0.2,0.2,0.2), linewidth = None)\n",
"ax.add_patch(rectangle2)\n",
"\n",
"#add label for open date\n",
"ax.annotate(f'Open Date \\n {start_open_date.strftime (\"%m-%d\")}', (mdates.date2num(start_open_date) + 10, max * .75),\n",
" ha='left', va='center', fontsize=10, color='black', xytext=(0, 5),\n",
" textcoords='offset points')\n",
"#add label for covid shutdown\n",
"ax.annotate('Shutdown starts', (mdates.date2num(datetime(2020,3,14)) + 10, max * .85),\n",
" ha='left', va='center', fontsize=10, color='black', xytext=(0, 5),\n",
" textcoords='offset points')\n",
"#set order\n",
"ax.set_zorder(1)\n",
"chart[0].set_zorder(2)\n",
"chart[1].set_zorder(2)\n",
"\n",
"#opacity\n",
"chart[0].set_alpha(0.9)\n",
"chart[1].set_alpha(0.9)"
],
"execution_count": null,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"No handles with labels found to put in legend.\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAAH1CAYAAACHhA20AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3wUdf7H8fe2JEgntBzFgpRAKEkA6UooIkU4IIKiKIoKJwJyiKL0eiigAgqiAuohKiVAQkcsSJUgQjQIcigCofcEyLbfHxz7M0eA7JLsTsLr+XjweLAz853vZ2a+meS9MztrcrvdbgEAAAAADMMc6AIAAAAAABkR1AAAAADAYAhqAAAAAGAwBDUAAAAAMBiCGgAAAAAYDEENAAAAAAyGoAYAyBavvvqq3nrrrUCXETBPPPGE5s+fH+gyAAB5BEENAPK4+Ph4dezYUZGRkWrUqJF69uypbdu2BbqsgJszZ46aNWumqKgoNWrUSOPGjZPD4bhmua1bt6py5coZQujUqVM1cODAW67hzz//VJUqVTR8+PBbXhcAIG8hqAFAHjZ79myNGzdOvXr10oYNG/T111/rscce01dffZXp8pkFlbwqJiZGcXFx2r59uxISErR79259+umnGZax2+0aO3asatasmSM1LFmyRIULF9aKFSuUnp6eI30AAHInghoA5FHnz5/XlClTNGzYMLVs2VJ33HGHbDabYmJi9Morr0i6cmWob9++GjhwoKKiohQXF6edO3eqS5cuql27tho1aqRRo0Z5QoTb7da4ceNUv359RUVFqV27dtqzZ4+nz3Pnzum5555TZGSkYmNjdeDAAc+8ffv2qUePHqpbt64efPBBLV++3DPv22+/VevWrRUZGanGjRvro48+ynSbXC6X3nvvPTVt2lT169fXoEGDdP78eUnSwYMHVblyZcXFxemBBx7Qfffdp+nTp193/5QvX16FChXybJfZbNYff/yRYZnZs2erYcOGuueeezzTvvvuO73//vtasWKFIiMj9fDDD3vmHTp0SF27dlVkZKSefvppnTp16rr9u91uLV68WP369ZPVatW6deskScuXL1fHjh0zLDtnzhz16tVLkpSenq4JEybogQceUIMGDTRs2DBdunRJkrRlyxY1adJEs2bNUv369dWoUSMtXLjQs57/vT1z0aJFevTRRz2vb3SMAAD+RVADgDzqxx9/1OXLl9WiRYsbLvfVV1+pVatW2rZtm9q1ayez2azBgwdr8+bN+vzzz7Vp0yZ99tlnkqTvv/9e27Zt06pVq5SYmKi3335bRYoU8axr+fLl6tOnj3744QeVL1/ec7tgWlqann76abVt21YbN27UW2+9pZEjR+q3336TJL3++usaNWqUfvzxRyUkJKhevXqZ1rpo0SLFxcXpk08+0dq1a5WWlqZRo0ZlWCYxMVErV67Uxx9/rHfffVf79u277rbHx8crKipK9erV0+7du9W1a1fPvEOHDmnhwoV64YUXMrRp0qSJnn/+eT300EP68ccftXTpUs+8hIQEjR8/Xps2bZLdbtesWbOu23diYqKOHDmiNm3a6KGHHtLixYslSU2bNtX+/fv1+++/Z6izXbt2kqSJEydq//79Wrx4sVavXq1jx47p3Xff9Sx74sQJnT9/Xt99953Gjh2rUaNG6ezZs9et46qbHSMAgH8R1AAgjzpz5oyKFi0qq9V6w+Vq1aql5s2by2w2KyQkRBEREapVq5asVqvKli2rLl266IcffpAkWa1Wpaam6j//+Y/cbrcqVKigkiVLetbVvHlz1ahRQ1arVQ8//LCSk5MlSd98843KlCmjTp06yWq1qmrVqnrwwQe1cuVKz3p/++03XbhwQYULF1a1atUyrTU+Pl5PPfWUypUrp/z582vAgAFavnx5hls2+/Tpo5CQEFWpUkVVqlTR7t27r7vt7dq10/bt27Vq1Sp17dpVoaGhnnljxoxRv379lD9//pvs6f/XsWNH3X333QoJCVGrVq0825+ZuLg4NWnSRIULF1bbtm21fv16nTx5Uvny5VOzZs2UkJAgSfr999/1n//8RzExMXK73fryyy/12muvqUiRIipQoICef/55LVu2zLNeq9WqF154QTabTffff7/uuOMO7d+//6a13+wYAQD8i6AGAHlUkSJFdPr06Zt+7qx06dIZXu/fv1/PP/+8GjZsqKioKL311ls6ffq0JKl+/frq1q2bRo0apfr162vo0KG6cOGCp23x4sU9/w8JCVFaWpqkK1endu7cqdq1a3v+xcfH6/jx45KkKVOm6Ntvv1XTpk31+OOP68cff8y01mPHjqlMmTKe12XKlJHD4dDJkyczrSFfvnyeGm7krrvuUsWKFTVy5EhJ0rp165SamqrWrVvftO1flShRIkt9X7p0SStXrvRcJYuMjFRYWJji4+MlXQmQV8NXQkKCmjdvrnz58unUqVO6ePGiOnbs6NmPPXv29Bwf6cpx/2s4z+o+uNkxAgD4143fZgUA5FqRkZEKCgrS2rVr1apVq+suZzKZMrweMWKEqlatqkmTJqlAgQKaM2eOVq1a5ZnfvXt3de/eXSdPnlT//v314Ycfqn///jesJSwsTHXq1NHs2bMznV+jRg1Nnz5ddrtdc+fOVf/+/fXtt99es1zJkiV16NAhz+vDhw/LarUqNDRUR44cuWENN+NwODyfqdu0aZOSkpLUsGFDSVc+72exWLRnzx5Nnz79mn3mrTVr1ujChQsaOXKkxowZI+nK5/sWL16sp556Sg0aNNCpU6eUnJyshIQEDR48WJJUtGhRhYSEaNmyZSpVqpTX/ebLl08XL170vD5x4oTn/zc7RgAA/+KKGgDkUQULFlTfvn01atQorV27VhcvXpTdbte3336rN95447rtUlNTlT9/fuXPn1/79u3TvHnzPPN27typn376SXa7Xfny5VNQUJDM5pv/KnnggQf0+++/a/HixbLb7bLb7dq5c6f27dun9PR0LV26VOfPn5fNZlP+/Pmvu862bdvq448/1p9//qnU1FS99dZbeuihh256e2dm5s+f77kS99tvv2nmzJmqX7++JKlfv35atWqVFi9erMWLFysmJkaxsbEaP368JCk0NFSHDh2Sy+Xyul9JWrx4sTp16qT4+HhPH/PmzdPu3bv166+/ymazqVWrVnrjjTd09uxZT2A0m82KjY3VuHHjPLUfPXpU69evz1K/4eHhWrNmjS5evKg//vhDCxYs8My70TECAPgfQQ0A8rCnn35ar776qt577z3Vr19fDzzwgObOnavmzZtft80rr7yihIQERUVFaejQoRlu/0tNTdWQIUNUt25dNW3aVEWKFNEzzzxz0zoKFCigjz76SMuXL1fjxo3VqFEjTZw40fM0ySVLligmJkZRUVH6/PPP9eabb2a6nk6dOunhhx/W448/rmbNmikoKEhDhw71cq9csX37drVr1061atXSc889pyZNmmjAgAGeekuUKOH5FxISonz58nkenHL1CuV9992nv//97171e/ToUW3atElPPvlkhj4iIiLUuHFjz0NF2rVrp40bN6pVq1YZ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S7Lb7YqKilKNGjVuWF/9+vU1a9YsPfzww6pbty6fUwMAAABuwuTO6gexstnly5eVlJSkiIiIDLftJScnKzw8PBAleaSmpl5zy58/bNmyRRMmTNCiRYv83nduYoQx4i+JiYmKjo4OdBkAYxGGYYSxaE9OzrF128LDdfjw4RxbP7LP7fT3CHKOw+HQ8ePHr8lEErc+AgAAAIDhENQM5L777uNqGgAAAACCGgAAAAAYDUENAAAAAAyGoAYAAAAABkNQAwAAAACDyRVBzeHKmW8QyKn1AgAAAMCtyBVfeG01mzT7hwPZvt4edcrfdJmYmBjdcccdWrp0qcxms2fajBkzVKlSpWyv6ar09HRNnjxZa9euldVqVUhIiPr06aPmzZvnWJ//a8WKFXr//ffldrt1+fJlVatWzfNF2FOnTtXzzz+voKCgbO1zy5YtstvtatSoUbauFwAAAMhNckVQC7S0tDQtWbJEf//733Nk/Q6HQ1ZrxkMxYsQIpaWladmyZQoODtaePXvUs2dPFS5cWHXq1MmROv7q2LFjGjlypOLi4hQWFia3263kv3zB57Rp0/T0009nGtQy256s2rp1q9LS0ghqAAAAuK0R1LKgT58+mjZtmtq0aXNNMDl27JjGjBmjw4cP6/Lly2rTpo169eolSZowYYK2bt0qu92uokWLaty4cSpTpowOHjyoTp06qWPHjtq8ebMeeeQRPfroo551Hjp0SCtWrNDXX3/t+YbySpUqqVevXpo2bZo+/vhjLVq0SPHx8QoODtaBAwdUvHhxvfnmmypVqpQkaebMmVq9erWcTqdKlSql0aNHq0SJEpo6dar279+v8+fP688//1T58uX1zjvvKF++fBm268SJE7JarSpSpIgkyWQyqWrVqpKkkSNHSpK6du0qs9msTz/9VOPGjZPFYtH+/fuVmpqqJUuWKC4uTp999pmcTqcKFCigESNG6J577rlufadOndLnn38ul8uljRs3qk2bNnruueey+3ACAAAAhpcrPqMWaBEREapWrZrmzZt3zbxXXnlFTzzxhBYsWKCFCxfqu+++04YNGyRJzz77rBYuXKilS5eqbdu2mjhxoqfdmTNnVL16dcXFxWUIaZK0Z88elS9f3hOSrqpVq5Z2797teZ2YmKhBgwZp+fLlqlu3rsaOHStJWrJkif788099+eWXiouLU5MmTfSvf/3L0y4pKUmTJk3SihUr5HA4FB8ff812ValSRTVq1NADDzygvn37as6cOTp9+rQkafjw4ZKkzz//XEuWLFGhQoUkScnJyfrwww+1ZMkSbdu2TStWrNDcuXO1aNEiPfPMM3rttdduWF/lypXVtWtXdejQQUuWLCGkAQAA4LbFFbUs6t+/v7p3767OnTt7pqWlpWnr1q06deqUZ1pqaqr27dunhg0b6rvvvtNnn32mtLQ0ORyODOsLDg7WQw89lGlfbnfWHnISHR3tuUIVGxurdu3aSZLWrVunpKQkz62aV69oXdWoUSNPuKpRo4YOHLj2839ms1nvvfee9uzZox9++EFr167VRx99pPj4+GsC5FWtWrXSHXfc4alh9+7dio2N9WzTuXPnslQfAAAAcLsjqGXRPffco/vvv1+zZ8/2THO5XDKZTFqwYIFsNluG5Q8dOqTx48drwYIFKleunLZv366BAwd65ufLl08mkynTvipVqqQDBw7ozJkzGULRjh07VLly5ZvW6na71bt37wyh8q+u3k4pSRaLRZcvX77uuipVqqRKlSqpW7duat26tbZu3aqWLVtmuuzVkHa1hk6dOqlfv35e1wcAAADc7rj10QsvvviiPvvsM6WmpkqSChQooOjoaM2cOdOzTEpKio4fP64LFy7IZrOpRIkScrlc+vzzz7PcT9myZdWqVSuNGDHCE6L27NmjGTNmqE+fPp7ltm/frt9//12StHDhQtWrV0/SladSfvbZZzp79qykK0+Q/Ostk1lx9OhR/fjjj57XR44c0alTp1S2bFlJUv78+XXhwoXrto+JidGSJUt05MgRSVeumiUlJd20vgIFCuj8+fNe1QoAAADkNbniiprD5c7So/R9Wa/VnPlVrcyULl1a7du316xZszzTJk6cqPHjx3tuO8yfP7/Gjh2rypUrq1WrVmrdurWKFi2q+++/X9u2bctyX8OHD9fkyZPVunVr2Ww2BQcH6/XXX1fdunU9y0RFRWnChAn6448/PA8TkaQOHTrozJkzevzxxyVduYL16KOPqkqVKlnu3+FwaOrUqTp06JBCQkLkcrnUv39/zwNFnn76aXXv3l0hISH69NNPr2lfp04d9e/fX71795bT6ZTdblerVq0UERFxw/qaN2+uxYsXq3379jxMBAAAALctkzurH4jKZpcvX1ZSUpIiIiIy3IqX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PvzwQ7322mt6++235Xa7FRMTo1dffdWzTK1atfTss896HiZSs2ZNSdKgQYP06KOPyu12y2q1auzYsSpbtmyW+166dKm2bt2qixcvqnz58vrggw88T3x8+eWX1bZtW4WGhioyMlIXLlyQJLVv314vv/yyPvroI82cOVPTpk3T4MGD9c4778jhcKh9+/aqVq1aNu4hIG8iqAEAABhcmTJl9PHHH193flhYmGbNmnXN9Pbt26t9+/bXTN+7d6/n/23btlXbtm2vWaZLly6eJ01m5sknn9STTz55zfQ6derom2++yTAtqw8rAfD/uPURAAAAAAyGK2oAAAC52M2ufAHInbiiBgAAAAAGQ1ADAADIRXbu3KlmzZqpYcOGGjp0qOe7zSZNmqTo6Gi1aNFCLVq00FdffZVp+9OnT6tr165q2LChunbtqjNnzkiSpk+f7mkbExOjcuXK6fTp037bLgAZEdQAAABykcGDB+uNN97Q999/r/379+vrr7/2zHv22We1Zs0arVmzRs2aNcu0/bvvvqtGjRppw4YNatSokd59911JUu/evT1tX331VdWrV09Fixb1yzYBuBZBDQAAIJc4evSozp8/r+joaJlMJnXu3FkrV670ah2rVq1SbGysJCk2NjbT9kuWLFGHDh2ypWYAviGoAQAA5BJHjhxRWFiY53VYWJiOHDnieT179mw1b95cAwYM8NzS+L9OnDihUqVKSZJKlizp+ULsqy5evKhvvvlGrVu3zoEtAJBVBDUAAIA8oHv37tq4caNWr16tkiVLatSoUTdtYzKZZDKZMkxbvXq1ateuzW2PQIAR1AAAAHKJ0qVLKyUlxfM6JSVFpUuXliSVKFFCFotFZrNZ3bp1044dOyRJL730klq0aKEnnnhCklS8eHEdPXpU0pVbKUNDQzP0sXTpUm57BAyAoAYAAJBLlCpVSgULFlRiYqLcbrcWLFigBx98UJI84UuSVqxYocqVK0uS3nrrLa1Zs0affvqpJKlly5aaP3++JGn+/Pme9pJ07tw5bd68OcM0AIHBF14DAADkIuPGjdNLL72kS5cuqWnTpoqJiZEkjRkzRr/88otMJpPKli2rCRMmZNr+hRdeUK9evTRv3jyVLVtWM2bM8MxbsWKFmjRpojvuuMMv2wLg+ghqAPzK4XTJ7UM7kySrhZsAAKBmzZpat27dNdOnTp2a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X5+VK1dmzJgxlWNdcMEFef755/PKK69U1l122WVHtyFqVjVnEaphTDHC75N66aWXsnDhwpx66qmVr+5taWnJ2rVrs23btixbtuwdX7f6t8+b3XjjjXnuueeye/fuTJ06NTNmzMgPf/jDJH+9D/m8887L/fffnzPOOGPYeqO2DMUsrlu3Lvfff3/Gjh2bcePGpbW11dfz876GYhavv/76dHR0pLe3N5dffnluuumm1NWNinOBDMJAZnHz5s35yle+khkzZlRm7OMf/3jlM7qbNm3KnXfemf7+/sycOTOrVq3KhAkThq1HasNQzOLixYuze/fuyk85XXDBBVm5cuWw9UjtGfFBDQAAoNY43QkAAFAyghoAAEDJCGoAAAAlI6gBAACUjKAGAABQMoIaABymM888M6+++upwlwHAKCCoAVCTFixYkFmzZmXPnj3v2H7VVVflzDPPzOuvvz6o43/+85/PAw88MKhjAMBACWoA1Kzp06fnkUceqTz+3e9+l7/85S/DWBEAVIegBkDNWrRoUTZs2FB5vGHDhlx11VWVx/v27cstt9ySc845J5/61Kfy/e9/P/39/UmSBx98MJ/73OeyevXqnH322VmwYEGeeOKJJMmaNWvyzDPPZPny5ZkzZ06WL19eOeZTTz2Viy++OHPnzs0dd9yRoiiOUrcAjCaCGgA1a/bs2enp6cnLL7+cvr6+PPLII7nyyisrz69YsSL79u3Lpk2b8uMf/zgPPfRQ1q9fX3n+ueeey2mnnZatW7fm+uuvz9e//vUURZGlS5dm7ty5aWtry29+85u0tbVV1mzevDnt7e15+OGH89hjj+XJJ588qj0DMDoIagDUtL9dVduyZUvOOOOMTJs2LUnS39+fRx99NDfffHMmTpyYlpaWfPGLX8zDDz9cWdvc3Jxrrrkm9fX1ufrqq9PV1ZU333zzPV/vy1/+co477rg0Nzdn3rx5eeGFF4a0PwBGp4bhLgAABmPRokW57rrr8vrrr2fRokWV7Xv37k1vb2+am5sr25qbm7N79+7K4ylTplT+Hj9+fJLkrbfees/XO+mkk96xZv/+/YPuAQD+kStqANS06dOnp6WlJU888UQuvvjiyvYTTjghY8eOTUdHR2VbZ2dn5YobAJSZoAZAzVu5cmXuueeeTJgwobKtrq4ul156adasWZOenp688cYbWbdu3Ts+w/ZepkyZkl27dg1VyQDwngQ1AGreKaeckrPOOuuftt9+++0ZP358LrrooixZsiQLFy7M4sWLD+uYX/jCF/L444/n7LPPzje+8Y1qlwwA72lM4XuFAQAASsUVNQAAgJIR1AAAAEpGUAMAACgZQQ0AAKBkBDUAAICSEdQAAABKRlADAAAoGUENAACgZP4Pl/QtIRnfN8UAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1080x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "BH0Rs2_nZMN4"
},
"source": [
""
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IDBSWisUGH-s"
},
"source": [
"## Crash Factors"
]
},
{
"cell_type": "code",
"metadata": {
"id": "IvI_xs5v036K"
},
"source": [
"#get max value for year groupings\n",
"x_max = 0\n",
"for year in (2018,2019,2020,2021):\n",
" precrash_year_select = t[t.Year == year]['PRE_CRASH']\n",
" c = precrash_year_select.value_counts()\n",
" if x_max < c[0]:\n",
" x_max = c[0]\n",
"\n",
"round_value = 25\n",
"x_max_round = round((x_max+round_value)/round_value)*round_value\n",
"\n",
"#create charts\n",
"fig, ax = plt.subplots(1,4,figsize=(15, 6), sharey=True)\n",
"sns.set_theme(style=\"whitegrid\")\n",
"\n",
"\n",
"for i, l in enumerate([(2018, '#08519c'),(2019, '#3182bd'),(2020, '#6baed6'),(2021, '#bdd7e7')]):\n",
" year, color = l\n",
" precrash_year_select = t[t.Year == year]['PRE_CRASH']\n",
" sns.countplot(\n",
" y=precrash_year_select.index, \n",
" data=precrash_year_select,\n",
" color=color,\n",
" ax = ax[i]\n",
" ).set(xlim=[0,x_max_round])\n",
" if year == 2021:\n",
" ax[i].set(ylabel=None, xlabel=None, title = '2021(Jan - Oct 8)')\n",
" else:\n",
" ax[i].set(ylabel=None, xlabel=None, title = year)\n",
"\n",
"fig.suptitle(f'Crash Factors on {open_street_name}', fontsize=20)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "TH3SNn13CalA"
},
"source": [
"# Test some charts using Operational dataset"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Cq0ndGhn5k3P"
},
"source": [
"ta_table = pd.read_csv(basePath / 'TA-CrossTab.csv')\n",
"ta_table['Active vs Non-Operational'].value_counts()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "qM4tgr6nD5lH"
},
"source": [
"\n",
"#create unique key from Borough and On Street\n",
"ta_table['Key'] = ta_table.apply(lambda r: r['Borough'] + '-' + r['On Street'], axis = 1)\n",
"open_streets['Key'] = open_streets.apply(lambda r: r['Borough'] + '-' + r['On_Stree'], axis = 1)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3a76mfSUDcml",
"outputId": "ae6186d8-b522-44b3-a244-b39cfc10234f"
},
"source": [
"# --- get monthly counts for all open streets\n",
"def getMontlyCounts(row):\n",
" key = row['Key']\n",
" print(key)\n",
" filter = open_streets['Key'] == key\n",
"\n",
" #buffer\n",
" street = open_streets[filter].to_crs(\"EPSG:2263\").copy()\n",
" street.geometry = street.buffer(60)\n",
" filter_polygon = street.dissolve(by='On_Stree')\n",
"\n",
" #get collisions on the open street\n",
" if len(filter_polygon.geometry):\n",
" points = collision_crashes[collision_crashes.within(filter_polygon.geometry[0])].copy()\n",
" points['DATE'] = pd.to_datetime(points['CRASH DATE'], format= \"%m/%d/%Y\") \n",
" points['Year'] = points['DATE'].dt.year\n",
" points['Month'] = points[\"DATE\"].dt.to_period('M').dt.to_timestamp()\n",
"\n",
" points_after2017 = points[points['Year'] >= 2017]\n",
"\n",
" counts = pd.DataFrame(points.groupby('Month').count()['COLLISION_ID']).reset_index().rename(columns = {'COLLISION_ID': 'Count'})\n",
"\n",
" return dict(counts)\n",
" else:\n",
" return None\n",
"\n",
"\n",
"ta_table['Montly_Counts'] = ta_table.apply(getMontlyCounts, axis = 1)"
],
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bronx-Alexander Avenue\n",
"Bronx-Arthur Avenue\n",
"Bronx-Boston Road\n",
"Bronx-Bronx Park South\n",
"Bronx-Cedar Avenue\n",
"Bronx-Creston Avenue\n",
"Bronx-Crotona Parkway\n",
"Bronx-East 140th Street\n",
"Bronx-East 144th Street\n",
"Bronx-East 169th Street\n",
"Bronx-Field Place\n",
"Bronx-Findlay Avenue\n",
"Bronx-Forest Avenue\n",
"Bronx-Grant Avenue\n",
"Bronx-Holland Avenue\n",
"Bronx-Jackson Avenue\n",
"Bronx-Jennings Street\n",
"Bronx-McClellan St/Cromwell Ave\n",
"Bronx-Nelson Avenue\n",
"Bronx-Oak Tree Place\n",
"Bronx-Randall Avenue\n",
"Bronx-Reservoir Oval East and West\n",
"Bronx-Rockwood Street\n",
"Bronx-Stickball Boulevard\n",
"Bronx-Tibbett Avenue\n",
"Bronx-Trinity Avenue\n",
"Bronx-West 236th Street\n",
"Bronx-West 238th Street\n",
"Bronx-Yates Avenue\n",
"Bronx-Willis Avenue\n",
"Brooklyn-1st Place\n",
"Brooklyn-21st Street\n",
"Brooklyn-2nd Street\n",
"Brooklyn-Third Avenue\n",
"Brooklyn-38th Street\n",
"Brooklyn-4th Place\n",
"Brooklyn-4th Street\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-5th Avenue\n",
"Brooklyn-61st Street\n",
"Brooklyn-6th Avenue\n",
"Brooklyn-6th Avenue\n",
"Brooklyn-Arlington Place\n",
"Brooklyn-Berry Street\n",
"Brooklyn-Blake Avenue\n",
"Brooklyn-Blake Avenue\n",
"Brooklyn-Bragg Street\n",
"Brooklyn-Cadman Plaza East\n",
"Brooklyn-Calder Place\n",
"Brooklyn-Carroll Street\n",
"Brooklyn-Chester Avenue\n",
"Brooklyn-Columbia Place\n",
"Brooklyn-Congress Street\n",
"Brooklyn-Decatur Street\n",
"Brooklyn-Driggs Avenue\n",
"Brooklyn-Dumont Avenue\n",
"Brooklyn-East 16th Street\n",
"Brooklyn-East 18th Street\n",
"Brooklyn-East 32nd Street\n",
"Brooklyn-Ellery Street\n",
"Brooklyn-Graham Avenue\n",
"Brooklyn-Grand Street\n",
"Brooklyn-Grattan Street\n",
"Brooklyn-Hall Street\n",
"Brooklyn-Henry Street\n",
"Brooklyn-Hoyt Street\n",
"Brooklyn-Humboldt Street\n",
"Brooklyn-Jefferson Avenue\n",
"Brooklyn-Joralemon Street\n",
"Brooklyn-Lawrence Street\n",
"Brooklyn-Leonard Street\n",
"Brooklyn-Lincoln Place\n",
"Brooklyn-Livonia Avenue\n",
"Brooklyn-Macon Street\n",
"Brooklyn-Main Street\n",
"Brooklyn-Montague Street\n",
"Brooklyn-Moore Street\n",
"Brooklyn-North 3rd Street\n",
"Brooklyn-Nassau Avenue\n",
"Brooklyn-Newkirk Avenue\n",
"Brooklyn-Noll Street\n",
"Brooklyn-North Elliott Place\n",
"Brooklyn-Pacific Street\n",
"Brooklyn-Park Place\n",
"Brooklyn-Prospect Place\n",
"Brooklyn-Randolph Street\n",
"Brooklyn-Rapelye Street\n",
"Brooklyn-Reed Street\n",
"Brooklyn-Rockwell Place\n",
"Brooklyn-Russell Street\n",
"Brooklyn-Schenectady Avenue\n",
"Brooklyn-Sharon Street\n",
"Brooklyn-Somers Street\n",
"Brooklyn-South 9th Street\n",
"Brooklyn-South Portland Avenue\n",
"Brooklyn-St. Marks Place\n",
"Brooklyn-Stanley Avenue\n",
"Brooklyn-Stanley Avenue\n",
"Brooklyn-State Street\n",
"Brooklyn-State Street\n",
"Brooklyn-Suydam Street\n",
"Brooklyn-Tompkins Avenue\n",
"Brooklyn-Troutman Street\n",
"Brooklyn-Underhill Avenue\n",
"Brooklyn-Van Siclen Avenue\n",
"Brooklyn-Vanderbilt Avenue\n",
"Brooklyn-Washington Street\n",
"Brooklyn-West 9th Street\n",
"Brooklyn-Williams Avenue\n",
"Brooklyn-Willoughby Avenue\n",
"Brooklyn-Willow Place\n",
"Brooklyn-Willoughby Street\n",
"Brooklyn-Willow Street\n",
"Brooklyn-Wolcott Street\n",
"Brooklyn-Wyckoff Street\n",
"Manhattan-9th Avenue\n",
"Manhattan-Academy Street\n",
"Manhattan-Amsterdam Avenue\n",
"Manhattan-Ann Street\n",
"Manhattan-Avenue B\n",
"Manhattan-Bleecker Street\n",
"Manhattan-Bond Street\n",
"Manhattan-Broadway\n",
"Manhattan-Broadway\n",
"Manhattan-Broadway\n",
"Manhattan-Broadway\n",
"Manhattan-Broadway\n",
"Manhattan-Broadway\n",
"Manhattan-Broome Street\n",
"Manhattan-Broome Street\n",
"Manhattan-Canal Street\n",
"Manhattan-Christopher Street\n",
"Manhattan-Columbus Avenue\n",
"Manhattan-Cornelia Street\n",
"Manhattan-Dominick Street\n",
"Manhattan-Doyers Street\n",
"Manhattan-Duane Street\n",
"Manhattan-Dyckman Street\n",
"Manhattan-East 101st Street\n",
"Manhattan-East 104th Street\n",
"Manhattan-East 115th Street\n",
"Manhattan-East 16th Street\n",
"Manhattan-East 18th Street\n",
"Manhattan-East 19th Street\n",
"Manhattan-East 20th Street\n",
"Manhattan-East 28th Street\n",
"Manhattan-East 32nd Street\n",
"Manhattan-East 4th Street\n",
"Manhattan-East 6th Street\n",
"Manhattan-East 7th Street\n",
"Manhattan-East 90th Street\n",
"Manhattan-East End Avenue\n",
"Manhattan-Edgecombe Avenue\n",
"Manhattan-Elizabeth Street\n",
"Manhattan-Frederick Douglass Boulevard\n",
"Manhattan-Front Street\n",
"Manhattan-Gansevoort Street\n",
"Manhattan-Greenwich Street\n",
"Manhattan-Hester Street\n",
"Manhattan-Hudson Blvd East\n",
"Manhattan-Hudson Blvd West\n",
"Manhattan-Irving Place\n",
"Manhattan-Jane Street\n",
"Manhattan-Jefferson Street\n",
"Manhattan-Jones Street\n",
"Manhattan-King Street\n",
"Manhattan-Lafayette Street\n",
"Manhattan-Laurel Hill Terrace\n",
"Manhattan-Little 6th Avenue\n",
"Manhattan-Little West 12th Street\n",
"Manhattan-Ludlow Street\n",
"Manhattan-MacDougal Street\n",
"Manhattan-Montgomery Street\n",
"Manhattan-Morningside Avenue\n",
"Manhattan-Morton Street\n",
"Manhattan-Mulberry Street\n",
"Manhattan-Orchard Street\n",
"Manhattan-Pearl Street\n",
"Manhattan-Pell Street\n",
"Manhattan-Pine Street\n",
"Manhattan-Pleasant Avenue\n",
"Manhattan-Rivington Street\n",
"Manhattan-Rivington Street\n",
"Manhattan-Rivington Street\n",
"Manhattan-Rivington Street\n",
"Manhattan-Rivington Street\n",
"Manhattan-Rutherford Place\n",
"Manhattan-Spring Street\n",
"Manhattan-Spring Street\n",
"Manhattan-St Marks Place\n",
"Manhattan-St Marks Place\n",
"Manhattan-Stanton Street\n",
"Manhattan-Staple Street\n",
"Manhattan-Thompson Street\n",
"Manhattan-University Place\n",
"Manhattan-Washington Place\n",
"Manhattan-Waverly Place\n",
"Manhattan-West 103rd Street\n",
"Manhattan-West 114th Street\n",
"Manhattan-West 117th Street\n",
"Manhattan-West 120th Street\n",
"Manhattan-West 129th Street\n",
"Manhattan-West 138th Street\n",
"Manhattan-West 13th Street\n",
"Manhattan-West 143rd Street\n",
"Manhattan-West 150th Street\n",
"Manhattan-West 159th Street\n",
"Manhattan-West 161st Street\n",
"Manhattan-West 164th Street\n",
"Manhattan-West 21st Street\n",
"Manhattan-West 22nd Street\n",
"Manhattan-West 22nd Street\n",
"Manhattan-West 25th Street\n",
"Manhattan-West 46th Street\n",
"Manhattan-West 46th Street\n",
"Manhattan-West 92nd Street\n",
"Queens-107th Avenue\n",
"Queens-108th Avenue\n",
"Queens-109th Avenue\n",
"Queens-120th Street\n",
"Queens-155th Street\n",
"Queens-159th Street\n",
"Queens-165th Street\n",
"Queens-169th Street\n",
"Queens-31st Avenue\n",
"Queens-34th Avenue\n",
"Queens-35th Avenue\n",
"Queens-37th Street\n",
"Queens-39th Avenue\n",
"Queens-41st Avenue\n",
"Queens-60th Street\n",
"Queens-60th Street\n",
"Queens-66th Road\n",
"Queens-68th Road\n",
"Queens-77th Street\n",
"Queens-99th Street\n",
"Queens-Barron Street\n",
"Queens-Barton Avenue\n",
"Queens-Beach 12th Street\n",
"Queens-Bell Boulevard\n",
"Queens-Court Square West\n",
"Queens-Dieterle Crescent\n",
"Queens-Ditmars Boulevard\n",
"Queens-East Main Drive\n",
"Queens-Freedom Drive\n",
"Queens-122nd Avenue/Lakeview Ln/Lakeview Blvd\n",
"Queens-Meadow Lake Drive\n",
"Queens-Newtown Avenue\n",
"Queens-Onderdonk Avenue\n",
"Queens-Peck Avenue\n",
"Queens-Reads Lane\n",
"Queens-Rockaway Freeway\n",
"Queens-Roosevelt Avenue\n",
"Queens-Shore Boulevard\n",
"Queens-Skillman Avenue\n",
"Queens-West Main Drive\n",
"Queens-Woodside Avenue\n",
"Staten Island-9th Street\n",
"Staten Island-Bank Street\n",
"Staten Island-Canal Street\n",
"Staten Island-Henderson Avenue\n",
"Staten Island-Hill Street\n",
"Staten Island-Minthorne Street\n",
"Staten Island-New Street\n",
"Staten Island-Silver Lake Park Road\n",
"Staten Island-Van Duzer Street\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ksqQvmI0SRm3"
},
"source": [
"#generate line chart "
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment