Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import osmnx as ox, matplotlib.pyplot as plt\n",
"ox.config(log_console=True, use_cache=True)\n",
"\n",
"import pandas as pd\n",
"import networkx as nx\n",
"\n",
"from io import BytesIO\n",
"from zipfile import ZipFile\n",
"import urllib.request\n",
"\n",
"# use for later, when comparing to region\n",
"BBOX_G = (-74.05663,40.551042,-73.833365,40.739446)\n",
"\n",
"sdmts_gtfs_zip_loc = 'http://web.mta.info/developers/data/nyct/bus/google_transit_brooklyn.zip'\n",
"url = urllib.request.urlopen(sdmts_gtfs_zip_loc)\n",
"\n",
"gtfs_dfs = {\n",
" 'calendar': None,\n",
" 'stops': None,\n",
" 'stop_times': None,\n",
" 'routes': None,\n",
" 'trips': None,\n",
" 'shapes': None}\n",
"\n",
"with ZipFile(BytesIO(url.read())) as zipfile:\n",
" for contained_file in zipfile.namelist():\n",
" name = contained_file.split('.')[0]\n",
" if name in gtfs_dfs.keys():\n",
" gtfs_dfs[name] = pd.read_csv(zipfile.open(contained_file))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>direction_id</th>\n",
" <th>route_id</th>\n",
" <th>service_id</th>\n",
" <th>shape_id</th>\n",
" <th>trip_headsign</th>\n",
" <th>trip_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>Q24</td>\n",
" <td>EN_C7-Weekday</td>\n",
" <td>Q240084</td>\n",
" <td>JAMAICA 168 ST via ATLANTIC</td>\n",
" <td>EN_C7-Weekday-007000_Q24_401</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>Q56</td>\n",
" <td>EN_C7-Weekday</td>\n",
" <td>Q560039</td>\n",
" <td>BWAY JCT VN SNDRN AV</td>\n",
" <td>EN_C7-Weekday-012000_Q24_401</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>Q56</td>\n",
" <td>EN_C7-Weekday</td>\n",
" <td>Q560038</td>\n",
" <td>JAMAICA 170 ST</td>\n",
" <td>EN_C7-Weekday-016000_Q24_401</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>Q24</td>\n",
" <td>EN_C7-Weekday</td>\n",
" <td>Q240080</td>\n",
" <td>LFYTT ST PTCHN AV via ATLNTC AV via BDWY</td>\n",
" <td>EN_C7-Weekday-020000_Q24_401</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>Q24</td>\n",
" <td>EN_C7-Weekday</td>\n",
" <td>Q240084</td>\n",
" <td>JAMAICA 168 ST via ATLANTIC</td>\n",
" <td>EN_C7-Weekday-024500_Q24_401</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" direction_id route_id service_id shape_id \\\n",
"0 0 Q24 EN_C7-Weekday Q240084 \n",
"1 1 Q56 EN_C7-Weekday Q560039 \n",
"2 0 Q56 EN_C7-Weekday Q560038 \n",
"3 1 Q24 EN_C7-Weekday Q240080 \n",
"4 0 Q24 EN_C7-Weekday Q240084 \n",
"\n",
" trip_headsign trip_id \n",
"0 JAMAICA 168 ST via ATLANTIC EN_C7-Weekday-007000_Q24_401 \n",
"1 BWAY JCT VN SNDRN AV EN_C7-Weekday-012000_Q24_401 \n",
"2 JAMAICA 170 ST EN_C7-Weekday-016000_Q24_401 \n",
"3 LFYTT ST PTCHN AV via ATLNTC AV via BDWY EN_C7-Weekday-020000_Q24_401 \n",
"4 JAMAICA 168 ST via ATLANTIC EN_C7-Weekday-024500_Q24_401 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gtfs_dfs['trips'].head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"import time, datetime\n",
"\n",
"def clean_time(t):\n",
" t = str(t)\n",
" parts = t.split(':')\n",
" hr = int(parts[0])\n",
" if hr >= 24:\n",
" hr = hr - 24\n",
" parts[0] = str(hr)\n",
" return ':'.join(parts)\n",
"\n",
"def convert_time(t):\n",
" t = clean_time(t)\n",
" x = time.strptime(t,'%H:%M:%S')\n",
" return int(datetime.timedelta(hours=x.tm_hour,\n",
" minutes=x.tm_min,\n",
" seconds=x.tm_sec).total_seconds())\n",
"\n",
"gtfs_dfs['stop_times']['arrival_time_sec'] = gtfs_dfs['stop_times']['arrival_time'].apply(convert_time)\n",
"gtfs_dfs['stop_times']['departure_time_sec'] = gtfs_dfs['stop_times']['departure_time'].apply(convert_time)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>trip_id</th>\n",
" <th>arrival_time</th>\n",
" <th>departure_time</th>\n",
" <th>stop_id</th>\n",
" <th>stop_sequence</th>\n",
" <th>pickup_type</th>\n",
" <th>drop_off_type</th>\n",
" <th>arrival_time_sec</th>\n",
" <th>departure_time_sec</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>EN_C7-Weekday-007000_Q24_401</td>\n",
" <td>01:10:00</td>\n",
" <td>01:10:00</td>\n",
" <td>302058</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4200</td>\n",
" <td>4200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>EN_C7-Weekday-007000_Q24_401</td>\n",
" <td>01:10:19</td>\n",
" <td>01:10:19</td>\n",
" <td>307228</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4219</td>\n",
" <td>4219</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>EN_C7-Weekday-007000_Q24_401</td>\n",
" <td>01:11:10</td>\n",
" <td>01:11:10</td>\n",
" <td>302059</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4270</td>\n",
" <td>4270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>EN_C7-Weekday-007000_Q24_401</td>\n",
" <td>01:12:04</td>\n",
" <td>01:12:04</td>\n",
" <td>307154</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4324</td>\n",
" <td>4324</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>EN_C7-Weekday-007000_Q24_401</td>\n",
" <td>01:13:24</td>\n",
" <td>01:13:24</td>\n",
" <td>307155</td>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4404</td>\n",
" <td>4404</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" trip_id arrival_time departure_time stop_id \\\n",
"0 EN_C7-Weekday-007000_Q24_401 01:10:00 01:10:00 302058 \n",
"1 EN_C7-Weekday-007000_Q24_401 01:10:19 01:10:19 307228 \n",
"2 EN_C7-Weekday-007000_Q24_401 01:11:10 01:11:10 302059 \n",
"3 EN_C7-Weekday-007000_Q24_401 01:12:04 01:12:04 307154 \n",
"4 EN_C7-Weekday-007000_Q24_401 01:13:24 01:13:24 307155 \n",
"\n",
" stop_sequence pickup_type drop_off_type arrival_time_sec \\\n",
"0 1 0 0 4200 \n",
"1 2 0 0 4219 \n",
"2 3 0 0 4270 \n",
"3 4 0 0 4324 \n",
"4 5 0 0 4404 \n",
"\n",
" departure_time_sec \n",
"0 4200 \n",
"1 4219 \n",
"2 4270 \n",
"3 4324 \n",
"4 4404 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gtfs_dfs['stop_times'].head()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"from itertools import groupby\n",
"import math\n",
"import numpy as np\n",
"from operator import itemgetter\n",
"from scipy import stats\n",
"\n",
"def unique_justseen(iterable, key=None):\n",
" return map(next, map(itemgetter(1), groupby(iterable, key)))\n",
"\n",
"\n",
"def get_peaks_count(headways, block_size=5):\n",
" # arrange in order\n",
" np_hwy = np.array(sorted(headways))\n",
" # let's work in terms of minutes, headways originally in seconds\n",
" np_hwy = np_hwy/60\n",
" \n",
" # these could be dynamic but for now\n",
" # we will work in 60 minute blocks\n",
" min_hw = 0\n",
" max_hw = 59\n",
" time_frame = 60\n",
" \n",
" floating_counts = []\n",
" for tb in range(round(time_frame/5)):\n",
" m = tb * 5 + min_hw\n",
" start_time = m - block_size\n",
" end_time = m + block_size\n",
"\n",
" if start_time <= min_hw:\n",
" start_time = min_hw\n",
"\n",
" if end_time >= max_hw:\n",
" end_time = max_hw\n",
"\n",
" s = np_hwy[(np_hwy >= start_time) & (np_hwy <= end_time)].size\n",
" floating_counts.append((m, s))\n",
"\n",
" counts = list(map(lambda x: x[1], floating_counts))\n",
" booleaned = list(map(lambda x: 1 if x >= 1 else 0, counts))\n",
" \n",
" unique_peaks = np.array(list(unique_justseen(booleaned))).sum()\n",
"\n",
" return unique_peaks"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Beginning cumulative headways-by-hour analysis...\n",
"Analyzing route 1/239 (B1)\n",
"Analyzing route 2/239 (B11)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:61: RuntimeWarning: Mean of empty slice.\n",
"/usr/local/lib/python3.6/site-packages/numpy/core/_methods.py:80: RuntimeWarning: invalid value encountered in double_scalars\n",
" ret = ret.dtype.type(ret / rcount)\n",
"/usr/local/lib/python3.6/site-packages/numpy/core/fromnumeric.py:2889: RuntimeWarning: Mean of empty slice.\n",
" out=out, **kwargs)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Analyzing route 3/239 (B12)\n",
"Analyzing route 4/239 (B13)\n",
"Analyzing route 5/239 (B14)\n",
"Analyzing route 6/239 (B15)\n",
"Analyzing route 7/239 (B16)\n",
"Analyzing route 8/239 (B17)\n",
"Analyzing route 9/239 (B2)\n",
"Analyzing route 10/239 (B20)\n",
"Analyzing route 11/239 (B24)\n",
"Analyzing route 12/239 (B25)\n",
"Analyzing route 13/239 (B26)\n",
"Analyzing route 14/239 (B3)\n",
"Analyzing route 15/239 (B31)\n",
"Analyzing route 16/239 (B32)\n",
"Analyzing route 17/239 (B35)\n",
"Analyzing route 18/239 (B36)\n",
"Analyzing route 19/239 (B37)\n",
"Analyzing route 20/239 (B38)\n",
"Analyzing route 21/239 (B39)\n",
"Analyzing route 22/239 (B4)\n",
"Analyzing route 23/239 (B41)\n",
"Analyzing route 24/239 (B42)\n",
"Analyzing route 25/239 (B43)\n",
"Analyzing route 26/239 (B44)\n",
"Analyzing route 27/239 (B44+)\n",
"Analyzing route 28/239 (B45)\n",
"Analyzing route 29/239 (B46)\n",
"Analyzing route 30/239 (B46+)\n",
"Analyzing route 31/239 (B47)\n",
"Analyzing route 32/239 (B48)\n",
"Analyzing route 33/239 (B49)\n",
"Analyzing route 34/239 (B52)\n",
"Analyzing route 35/239 (B54)\n",
"Analyzing route 36/239 (B57)\n",
"Analyzing route 37/239 (B6)\n",
"Analyzing route 38/239 (B60)\n",
"Analyzing route 39/239 (B61)\n",
"Analyzing route 40/239 (B62)\n",
"Analyzing route 41/239 (B63)\n",
"Analyzing route 42/239 (B64)\n",
"Analyzing route 43/239 (B65)\n",
"Analyzing route 44/239 (B67)\n",
"Analyzing route 45/239 (B68)\n",
"Analyzing route 46/239 (B69)\n",
"Analyzing route 47/239 (B7)\n",
"Analyzing route 48/239 (B70)\n",
"Analyzing route 49/239 (B74)\n",
"Analyzing route 50/239 (B8)\n",
"Analyzing route 51/239 (B82)\n",
"Analyzing route 52/239 (B83)\n",
"Analyzing route 53/239 (B84)\n",
"Analyzing route 54/239 (B9)\n",
"Analyzing route 55/239 (BX3)\n",
"Analyzing route 56/239 (BX4)\n",
"Analyzing route 57/239 (BX4A)\n",
"Analyzing route 58/239 (BX5)\n",
"Analyzing route 59/239 (BX6)\n",
"Analyzing route 60/239 (BX7)\n",
"Analyzing route 61/239 (BX8)\n",
"Analyzing route 62/239 (BX9)\n",
"Analyzing route 63/239 (BX1)\n",
"Analyzing route 64/239 (BX10)\n",
"Analyzing route 65/239 (BX11)\n",
"Analyzing route 66/239 (BX12)\n",
"Analyzing route 67/239 (BX12+)\n",
"Analyzing route 68/239 (BX13)\n",
"Analyzing route 69/239 (BX15)\n",
"Analyzing route 70/239 (BX16)\n",
"Analyzing route 71/239 (BX17)\n",
"Analyzing route 72/239 (BX18)\n",
"Analyzing route 73/239 (BX19)\n",
"Analyzing route 74/239 (BX2)\n",
"Analyzing route 75/239 (BX20)\n",
"Analyzing route 76/239 (BX21)\n",
"Analyzing route 77/239 (BX22)\n",
"Analyzing route 78/239 (BX24)\n",
"Analyzing route 79/239 (BX26)\n",
"Analyzing route 80/239 (BX27)\n",
"Analyzing route 81/239 (BX28)\n",
"Analyzing route 82/239 (BX29)\n",
"Analyzing route 83/239 (BX30)\n",
"Analyzing route 84/239 (BX31)\n",
"Analyzing route 85/239 (BX32)\n",
"Analyzing route 86/239 (BX33)\n",
"Analyzing route 87/239 (BX34)\n",
"Analyzing route 88/239 (BX35)\n",
"Analyzing route 89/239 (BX36)\n",
"Analyzing route 90/239 (BX38)\n",
"Analyzing route 91/239 (BX39)\n",
"Analyzing route 92/239 (BX40)\n",
"Analyzing route 93/239 (BX41)\n",
"Analyzing route 94/239 (BX41+)\n",
"Analyzing route 95/239 (BX42)\n",
"Analyzing route 96/239 (BX46)\n",
"Analyzing route 97/239 (M1)\n",
"Analyzing route 98/239 (M2)\n",
"Analyzing route 99/239 (M3)\n",
"Analyzing route 100/239 (M4)\n",
"Analyzing route 101/239 (M5)\n",
"Analyzing route 102/239 (M7)\n",
"Analyzing route 103/239 (M8)\n",
"Analyzing route 104/239 (M9)\n",
"Analyzing route 105/239 (M10)\n",
"Analyzing route 106/239 (M100)\n",
"Analyzing route 107/239 (M101)\n",
"Analyzing route 108/239 (M102)\n",
"Analyzing route 109/239 (M103)\n",
"Analyzing route 110/239 (M104)\n",
"Analyzing route 111/239 (M106)\n",
"Analyzing route 112/239 (M11)\n",
"Analyzing route 113/239 (M116)\n",
"Analyzing route 114/239 (M12)\n",
"Analyzing route 115/239 (M14A)\n",
"Analyzing route 116/239 (M14D)\n",
"Analyzing route 117/239 (M15)\n",
"Analyzing route 118/239 (M15+)\n",
"Analyzing route 119/239 (M20)\n",
"Analyzing route 120/239 (M21)\n",
"Analyzing route 121/239 (M22)\n",
"Analyzing route 122/239 (M23+)\n",
"Analyzing route 123/239 (M31)\n",
"Analyzing route 124/239 (M34+)\n",
"Analyzing route 125/239 (M34A+)\n",
"Analyzing route 126/239 (M35)\n",
"Analyzing route 127/239 (M42)\n",
"Analyzing route 128/239 (M50)\n",
"Analyzing route 129/239 (M55)\n",
"Analyzing route 130/239 (M57)\n",
"Analyzing route 131/239 (M60+)\n",
"Analyzing route 132/239 (M66)\n",
"Analyzing route 133/239 (M72)\n",
"Analyzing route 134/239 (M79+)\n",
"Analyzing route 135/239 (M86+)\n",
"Analyzing route 136/239 (M96)\n",
"Analyzing route 137/239 (M98)\n",
"Analyzing route 138/239 (METJE)\n",
"Analyzing route 139/239 (Q1)\n",
"Analyzing route 140/239 (Q2)\n",
"Analyzing route 141/239 (Q3)\n",
"Analyzing route 142/239 (Q4)\n",
"Analyzing route 143/239 (Q5)\n",
"Analyzing route 144/239 (Q12)\n",
"Analyzing route 145/239 (Q13)\n",
"Analyzing route 146/239 (Q15)\n",
"Analyzing route 147/239 (Q15A)\n",
"Analyzing route 148/239 (Q16)\n",
"Analyzing route 149/239 (Q17)\n",
"Analyzing route 150/239 (Q20A)\n",
"Analyzing route 151/239 (Q20B)\n",
"Analyzing route 152/239 (Q24)\n",
"Analyzing route 153/239 (Q26)\n",
"Analyzing route 154/239 (Q27)\n",
"Analyzing route 155/239 (Q28)\n",
"Analyzing route 156/239 (Q30)\n",
"Analyzing route 157/239 (Q31)\n",
"Analyzing route 158/239 (Q32)\n",
"Analyzing route 159/239 (Q36)\n",
"Analyzing route 160/239 (Q42)\n",
"Analyzing route 161/239 (Q43)\n",
"Analyzing route 162/239 (Q44+)\n",
"Analyzing route 163/239 (Q46)\n",
"Analyzing route 164/239 (Q48)\n",
"Analyzing route 165/239 (Q54)\n",
"Analyzing route 166/239 (Q55)\n",
"Analyzing route 167/239 (Q56)\n",
"Analyzing route 168/239 (Q58)\n",
"Analyzing route 169/239 (Q59)\n",
"Analyzing route 170/239 (Q76)\n",
"Analyzing route 171/239 (Q77)\n",
"Analyzing route 172/239 (Q83)\n",
"Analyzing route 173/239 (Q84)\n",
"Analyzing route 174/239 (Q85)\n",
"Analyzing route 175/239 (Q88)\n",
"Analyzing route 176/239 (S40)\n",
"Analyzing route 177/239 (S42)\n",
"Analyzing route 178/239 (S44)\n",
"Analyzing route 179/239 (S46)\n",
"Analyzing route 180/239 (S48)\n",
"Analyzing route 181/239 (S51)\n",
"Analyzing route 182/239 (S52)\n",
"Analyzing route 183/239 (S53)\n",
"Analyzing route 184/239 (S54)\n",
"Analyzing route 185/239 (S55)\n",
"Analyzing route 186/239 (S56)\n",
"Analyzing route 187/239 (S57)\n",
"Analyzing route 188/239 (S59)\n",
"Analyzing route 189/239 (S61)\n",
"Analyzing route 190/239 (S62)\n",
"Analyzing route 191/239 (S66)\n",
"Analyzing route 192/239 (S74)\n",
"Analyzing route 193/239 (S76)\n",
"Analyzing route 194/239 (S78)\n",
"Analyzing route 195/239 (S79+)\n",
"Analyzing route 196/239 (S81)\n",
"Analyzing route 197/239 (S84)\n",
"Analyzing route 198/239 (S86)\n",
"Analyzing route 199/239 (S89)\n",
"Analyzing route 200/239 (S90)\n",
"Analyzing route 201/239 (S91)\n",
"Analyzing route 202/239 (S92)\n",
"Analyzing route 203/239 (S93)\n",
"Analyzing route 204/239 (S94)\n",
"Analyzing route 205/239 (S96)\n",
"Analyzing route 206/239 (S98)\n",
"Analyzing route 207/239 (X1)\n",
"Analyzing route 208/239 (X10B)\n",
"Analyzing route 209/239 (X10)\n",
"Analyzing route 210/239 (X11)\n",
"Analyzing route 211/239 (X12)\n",
"Analyzing route 212/239 (X14)\n",
"Analyzing route 213/239 (X15)\n",
"Analyzing route 214/239 (X17)\n",
"Analyzing route 215/239 (X17A)\n",
"Analyzing route 216/239 (X17J)\n",
"Analyzing route 217/239 (X19)\n",
"Analyzing route 218/239 (X2)\n",
"Analyzing route 219/239 (X21)\n",
"Analyzing route 220/239 (X22)\n",
"Analyzing route 221/239 (X22A)\n",
"Analyzing route 222/239 (X27)\n",
"Analyzing route 223/239 (X28)\n",
"Analyzing route 224/239 (X3)\n",
"Analyzing route 225/239 (X30)\n",
"Analyzing route 226/239 (X31)\n",
"Analyzing route 227/239 (X37)\n",
"Analyzing route 228/239 (X38)\n",
"Analyzing route 229/239 (X4)\n",
"Analyzing route 230/239 (X42)\n",
"Analyzing route 231/239 (X5)\n",
"Analyzing route 232/239 (X63)\n",
"Analyzing route 233/239 (X64)\n",
"Analyzing route 234/239 (X68)\n",
"Analyzing route 235/239 (X7)\n",
"Analyzing route 236/239 (X8)\n",
"Analyzing route 237/239 (X9)\n",
"Analyzing route 238/239 (MS1)\n",
"Analyzing route 239/239 (MS2)\n"
]
}
],
"source": [
"from datetime import datetime\n",
"import math\n",
"import numpy as np\n",
"\n",
"cumulative_results_df = None\n",
"\n",
"unique_routes = gtfs_dfs['routes']['route_id'].values\n",
"\n",
"print('Beginning cumulative headways-by-hour analysis...')\n",
"for current_route_i in range(len(unique_routes)):\n",
" current_route = unique_routes[current_route_i]\n",
" print('Analyzing route {}/{} ({})'.format((current_route_i + 1), (len(unique_routes)), current_route))\n",
" \n",
" route_trips = gtfs_dfs['trips'][gtfs_dfs['trips']['route_id'] == current_route]\n",
" route_trips_directions = list(set(route_trips['direction_id'].values))\n",
"\n",
" for current_direction_i in range(len(route_trips_directions)):\n",
" current_direction = route_trips_directions[current_direction_i]\n",
" \n",
" route_service_ids = list(set(route_trips['service_id'].values))\n",
"\n",
" for current_service_id in route_service_ids:\n",
" dir_const = route_trips['direction_id'] == current_direction\n",
" serv_cons = route_trips['service_id'] == current_service_id\n",
" route_trips_ids = route_trips[(dir_const & serv_cons)]['trip_id'].values\n",
"\n",
" route_st_times = gtfs_dfs['stop_times'][gtfs_dfs['stop_times']['trip_id'].isin(route_trips_ids)]\n",
" route_st_ids = list(set(route_st_times['stop_id'].values))\n",
"\n",
" for route_st_id in route_st_ids:\n",
" single_stop_route = gtfs_dfs['stop_times'][gtfs_dfs['stop_times']['stop_id'] == route_st_id]\n",
"\n",
" single_stop_route_sorted = single_stop_route.sort_values(by='departure_time_sec', ascending=True)\n",
"\n",
" # results will contain a tuple (departure_time, preceding_headway)\n",
" deps = list(single_stop_route_sorted['departure_time_sec'].values)\n",
" \n",
" # get the last departure time of the day and make it the first\n",
" # in the list to be compared against arrivals\n",
" dep_last = deps[-1]\n",
"\n",
" # TODO: improve this hack\n",
" # handle if last departure was before midnight\n",
" if dep_last > 80000:\n",
" dep_last = dep_last - 86400\n",
" deps = [dep_last] + deps[:-1]\n",
" \n",
" arrs = single_stop_route_sorted['arrival_time_sec'].values\n",
" \n",
" headways = arrs - deps\n",
" overall_mean = headways.mean()\n",
" overall_median = np.median(headways)\n",
"\n",
" secs_in_hr = (60.0 * 60.0)\n",
" hrs = np.array(list(map(lambda x: math.floor(x/secs_in_hr), deps)))\n",
"\n",
" bucketed = []\n",
" for hr in range(24):\n",
" subset = headways[hrs == hr]\n",
" count = len(subset)\n",
" mean = subset.mean()\n",
" med = np.median(subset)\n",
" \n",
" # handle when log(0) would be called\n",
" abs_diff = abs(mean - med)\n",
" if count > 0 and abs_diff > 1:\n",
" log_diff = round(math.log(abs_diff), 3)\n",
" else:\n",
" log_diff = 0\n",
" \n",
" # calculate the number of peaks in the hour\n",
" if count > 0:\n",
" cumulative_hwys = [subset[0]]\n",
" for hwy in subset[1:]:\n",
" cumulative_hwys.append(cumulative_hwys[-1] + (hwy))\n",
" peaks_count = get_peaks_count(cumulative_hwys)\n",
" else:\n",
" peaks_count = 0\n",
" \n",
" res = (hr, count, mean, med, log_diff, peaks_count)\n",
" bucketed.append(res)\n",
"\n",
" bucketed_df = pd.DataFrame(bucketed, columns=['hour', 'count', 'mean', 'median', 'log_diff', 'peaks_count'])\n",
"\n",
" if cumulative_results_df is None:\n",
" cumulative_results_df = bucketed_df\n",
" else:\n",
" cumulative_results_df = cumulative_results_df.append(bucketed_df)"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:20: MatplotlibDeprecationWarning: The set_axis_bgcolor function was deprecated in version 2.0. Use set_facecolor instead.\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7faa05d8b940>"
]
},
"execution_count": 122,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABPIAAAJhCAYAAADL3J7iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8TPfi//H3JEESS2SzNNSSWBKUIiiKyrS1tNVFbQ9L\n0aKLrRvVFtXStK61VUWL6kZdrfbW0nZoSykG9Y1EEHsXvfYUjSXJ5/eHn7kdSZiQ5GR4PR8Pj0fm\nzJlz3ufMnEnz7uecYzPGGAEAAAAAAAAo1HysDgAAAAAAAADgyijyAAAAAAAAAC9AkQcAAAAAAAB4\nAYo8AAAAAAAAwAtQ5AEAAAAAAABegCIPAAAAAAAA8AIUeQBgsdGjRysqKsrqGHlu3759stls+umn\nn6yOIpvNpo8++sjqGAXuhRdeUNmyZWWz2TR37lyr41zWI488IrvdbnWMG84PP/wgm82m3377zbIM\nlStX1muvvWbZ+j0VFhamyZMnWx3juuXJ/m3YsKGGDBlSIHkSExNls9m0ZcuWAlkfAACeosgDgHzy\n3//+VwMHDlTlypVVtGhRhYeH66GHHrou/yiIiorS6NGj3aZVrFhRBw8eVOPGja0JVQBatWqlRx99\nNMv0wlBirl+/XvHx8Zo5c6YOHjyozp075+ny586dKz8/v2yfy2m/XM6UKVO0cOHCvIiWJ1q1aiWb\nzSabzaYiRYqocuXKGjhwoE6cOJHn6/rtt99ks9n0ww8/5MnyLpZzNptNPj4+KlmypGJiYtS/f38l\nJia6zdu0aVMdPHhQN910U56s+3IeffRRtWrVKst0p9OpoUOH5uu609PTXfskp39X+h8q27ZtU79+\n/fIky7hx4xQdHa3AwEAFBwfr1ltv1dixY13zDB8+XLVr177mdeXGuXPnNGHCBDVo0EAlSpRQ6dKl\n1aBBA7355ptKTU0t0Cw5+eabb/Tqq6/m+XLLlSunf/3rX27TatasqYMHDxb4+wAAwJVk/1/gAIBr\n8uuvv6pp06YqU6aMpk+frlq1aunPP//UpEmT1KRJEy1evFht2rSxNOO5c+dUtGjRfFu+r6+vypUr\nl2/LxwXnz59XkSJFskxPSUmRj4+POnTocE3Lz+/PyUVBQUH5vo7c6tatmyZMmKD09HQlJiaqb9++\nOnr0qD755BOro3lk8+bNKl++vP7++29t27ZN06dPV/369fXRRx+pU6dOkqSiRYte8TjN6TOWV8LD\nw/Nt2Rf5+fnp4MGDrserV69Wp06dlJCQ4Fp/TsX0xWOgTJkyeZJl+PDhmjdvnt566y3Fxsbq77//\nVkJCghISEvJk+VfjzJkzuuuuu7R161aNHj1azZs3V2hoqBISEjRt2jSFhITkupzPD6GhoQW2Lj8/\nP36HAQAKJwMAyHP33nuvKVu2rElNTc3yXNu2bU3ZsmXN33//bYwxZtSoUSYyMtJ8/PHHpkqVKqZY\nsWLGbrebvXv3ul7z66+/mgcffNCEhoaaYsWKmSpVqpg333zT9fy5c+fMqFGjTOXKlU2xYsVMTEyM\neffdd93WK8lMmTLFdO3a1ZQqVcp06tTJNG3a1Dz22GNZMtasWdO8+OKLxhhjNm3aZNq0aWPCw8NN\n8eLFTcOGDc2yZctc87Zs2dJIcvu3d+9es3fvXiPJrF692jXv9u3bTbt27Uzx4sVN8eLFzT333GNS\nUlJcz8+ZM8f4+vqan376ydx6660mICDA1K9f32zYsMFtW4cOHWoiIiJM0aJFTbly5Uznzp0v+35I\nMpMnTzYPPvigCQwMNDfddJOZPHmy6/levXqZO++8M8vr7rjjDtOnT58cl9uyZUvTt2/fLNOvZdv/\n6ddffzWSzPfff2+MMeb77783kszXX39tmjVrZooVK2beeeedLOvv1atXlvfEGGMyMzPN+PHjTZUq\nVUyRIkVM1apVzaRJk9xeW6lSJfPiiy+axx9/3ISEhJhGjRplu+3Z5c1pv1SqVMm8/PLLZtCgQSY4\nONiUKVPGDBkyxJw/f94tc1xcnOtxRkaGeemll1yfu06dOpmJEye6rfPisfNPq1evdn0GL9q4caO5\n8847TfHixU1YWJh54IEHzL59+7LNntM2GGPM008/bUJCQtym/fHHH6Zz584mKCjI+Pv7m5YtWxqn\n0+l6/uJ79uuvv7q9ztfX18yZM8cYY7K8V5UqVXLN9+2335qmTZsaf39/c9NNN5lHHnnEHDly5LLZ\nc1qnMcZ06tTJBAUFmRMnTmQ77+U+Y57sx++++840b97cBAQEmFKlSpkWLVqYXbt2mVGjRmXZzovb\nX6lSJfPqq6+6lvHXX3+Zfv36mbCwMFO0aFHToEED880337iev3h8LViwwLRv394EBASYKlWquJbn\nie+++85IMgcPHszyXGhoqHn11VdN3759TXBwsGndurVr+j+Pl4vz9ejRw5QoUcKEh4ebV1555Yrr\n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\nv0aNGh4vs3fv3mrTpo2WL1+u77//Xm3bttUDDzygjz76SJmZmZKktWvXKjAw0O11l/6xXrx48SzL\n7tmzpx544AEdPnxYa9as0alTp9SlSxfX84888ogOHDigN998U1WqVFFAQIC6dOniUXl2NXx8fOTr\n65tlGy5uZ7169bR371599913+v777zV48GC9/PLLWrdundsfWLnVo0cPDRs2TEuWLFFmZqZSU1PV\nvXv3K76uVKlSWe52mdNF8y/Hxyfr/1vL6Y/X7N7HvOTJ8oOCgpSRkaHTp09nmf/EiRPy9/d3m3bp\nDTNsNpvrPb1aPj4+WQqIS/dZZmamevTooeHDh2d5/ZUunP/P93bmzJlq3ry5Xn/9db344ou5yijJ\nLWdGRoZH256Zmalhw4apR48eWZ4rV66c/P393e6C7cnn/+L3T9WqVS8736Xv6bXsx/xyuc/UgAED\nXDf0kKSIiIhcLTsvjrHOnTurdevWrsfly5d3/ezj46PY2FjFxsZq8ODBWr58udq2bauvvvpKDz30\n0DWvOzf8/PwUGRnpKlFz4mnhJynLzVEu3v350mnX+h0gXfm7pUuXLjp16pQmTZqkSpUqyd/fX/fe\ne2++/Q7Lbjsl5cm2AgAgSYzIA4A8FhISonbt2untt9/WX3/9leX5119/XWXLltWdd97pmnb48GHt\n3r3b9Xjnzp06cuSI20if8uXLq3fv3po3b57ef/99ffzxx/rrr7/UoEEDSdKBAwcUFRXl9i8yMvKK\nee+++26FhIRo/vz5mjdvnu655x4FBwe7nl+1apWeeOIJ3XfffapTp47Kly+vPXv2uC2jaNGiysjI\nuOx6atWqpW3btunIkSOuaf/973+1Y8cO1a5d+4o5/6lEiRJ64IEHNHXqVG3cuFHJycn68ccfL/ua\ndevWuT1eu3at2/4tVaqUunTpolmzZmnWrFl6+OGHVbp06Vzlyokn216mTBllZGS4jdrYvHlznqxf\nurB9FSpUcBvNKUk//vijqlSpkqUEvpKaNWtKkjZs2OA2/fjx40pJSXE9f7VZIyIitHbtWrfpa9as\ncXtcpkwZHTp0yO2zd+k+a9iwoRISEhQZGZnl+Pjn59wTr7zyisaOHavff/9d0oX39ejRo24FyNmz\nZ7V+/Xq391WS/vjjD9c8W7ZscStELhYRlx5DDRs2VFJSUpbcUVFRKlGihPz8/NymeXJX1fHjx6t0\n6dKy2+252nZP9mODBg307bff5rgMT78nJGX5nK5atSpX3xMhISFuGQMCAjx+bW5k970SFRWlIkWK\nKCgoyC3D5crB6OhoSXKNUMtuX9WqVUsZGRlux0VmZqZ++umnLPvm0lw///yz2/fdpbp3766vv/5a\n//d//5ft8ydOnJCPj4+io6Oz/Q4JCgpShQoVcly+py63P69GRkaG1qxZoyFDhqh9+/aqXbu2QkND\ndeDAAbf5PP1sbtmyxe33+oEDB7Rv375c/w4DAOBaUOQBQD6YNm2a/Pz81Lp1ay1fvly//vqrnE6n\nunXrppUrV2ru3Lluf1gGBgaqd+/e2rhxozZu3KhevXqpXr16iouLkyQ99dRTWrp0qXbv3q2kpCR9\n/vnnqlixokqWLKmoqCj16dNHjz32mD788EPt2rVL//d//6fZs2frjTfeuGJWPz8/devWTdOnT9eS\nJUvUq1cvt+dr1Kihjz/+WFu3btWWLVvUtWvXLH/wVKlSRWvWrNGBAwd05MiRbEcedOvWTeHh4erc\nubM2b96sTZs2qUuXLoqIiFDnzp093rfjx4/Xxx9/rKSkJO3du1ezZ8+Wr6+v26lM2fn666/19ttv\nKyUlRW+99ZYWLFigZ555xm2e/v37a9myZfrmm2/Ur18/jzNdiSfb3qhRI5UsWVLDhw9XSkqKli9f\nrjFjxuRZBkl64YUX9NZbb2nWrFlKSUnRjBkzNH36dI0YMSLXy4qOjlb79u3Vv39/ff3119q7d69+\n/vlndenSRSVLllS3bt2uKeszzzyjKVOm6MMPP1RKSoomTJggh8PhNs8dd9yhv//+WyNHjtTu3bu1\ncOFCTZs2zW2eESNGKDk5Wd27d9eGDRu0d+9e10jOSwvpK4mLi1PNmjVd70vr1q3VqFEjdevWTWvW\nrFFiYqJ69uypM2fO6PHHH5d0YYRupUqVNHr0aG3fvl0//fSThg4d6jZaNiwsTCVKlNC3336rP//8\nU8ePH5ckjRkzRl9++aWefvppbdmyRbt379by5cvVt29fpaWlXTHv4cOH9eeff2rPnj1asmSJ2rdv\nry+++EIzZ85UUFBQrrbdk/348ssva9myZRoyZIgSEhK0Y8cOzZ07Vzt27JB04Xti+/btSkpK0pEj\nR3T27Nks64mMjNTDDz+sJ554Qt988422b9+uwYMHKzExUc8991yuMheENWvWKD4+XikpKZozZ45m\nzpyZ5XvlUvfcc4+mTJmi9evXa//+/Vq9erX69OmjgIAAtWnTRtKFfbV//35t3rxZR44cUVpamurW\nrau2bdvq0Ucf1cqVK7Vt2zYNGDBA+/fv19NPP+22jmnTpunf//63du7cqeeee06JiYkaPHhwjpmG\nDx+uJk2aqFWrVpo6dao2b96sffv2acmSJWrbtq3+/e9/S7rwHfLhhx9q0qRJSklJ0UcffaT4+Hi9\n8MILVzxd2xNXsz8vx9fXV1FRUfrggw+0bds2bdq0SZ07d3Yb9S1d2N+rV6/Wb7/9piNHjmQ78rBP\nnz7y9/dXt27dtGXLFm3YsEFdunRRdHS07rvvvqvOCABAblHkAUA+qFSpkjZt2qTGjRurf//+ioyM\nVNu2bXX27Fn9/PPPrj/WLipfvrz69eunjh07qnnz5goMDNTnn3/u+sPIGKMhQ4aodu3aatGihU6f\nPq1ly5a5np85c6aGDh2qsWPHKiYmRnFxcfrggw+uePrcRb169VJycrKCgoLUtm1bt+fmzJmjzMxM\nNWrUSPfff7/atGmj2NhYt3leeeUVnThxQjVq1FB4eHiW0Q6SFBAQoG+//VbFihVTixYt1LJlSxUv\nXlzLly/PcmrU5ZQqVUoTJ07Ubbfdpjp16uiLL77QokWLrniq8siRI+VwOFS3bl2NGzdOb775ZpZT\nn2NjY1WnTh3VqFFDzZo18zjTlXiy7SEhIfr000+1bt063XLLLXr11Vf15ptv5lkGSXr88cc1ZswY\njRs3TjExMXrjjTcUHx+vvn37XtXyPv30Uz344IN69tlnVatWLXXp0kXh4eFav369QkJCrinr4MGD\nNWjQIA0dOlT16tXTzz//rJEjR7rNU6NGDc2aNUuffvqpateurdmzZ2vcuHFu80RHR2vt2rU6deqU\n7r77bsXExOixxx5TWlraVY24fPbZZzV79mzt2rVLNptNixcvVs2aNdW+fXvFxsbqzz//1Hfffee6\nHqKfn58WLFigQ4cO6dZbb9WTTz6psWPHup1K7ePjo2nTpumzzz5ThQoVdOutt0q6UFSuXLlSCQkJ\nuv3223XLLbdo6NChKlmypEcjlOrXr6/y5curTp06evbZZ1WhQgVt3rxZDz/8cK6325P9eNddd2np\n0qVav369GjdurEaNGumDDz5wZe3bt69iY2PVtGlThYeH69NPP812Xe+9957uvvtude/eXXXr1tWa\n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\n6Ze//KXWrl2rjIwM1a9fv9xXa99//32FhoYqOTlZAQEBGj16tIYPH65Vq1apfv36WrBggfLz8zVx\n4kSdPXu2uD6WmJioAQMG6Oc//7kGDhyoZ599VkuWLFH79u01YcIE7d+/XzNnztTbb78tScrJyVFQ\nUFCJ8fPz8xUeHl7mv0eFK/JWr16t4cOHF39ftGiRAgICNG7cOG3dulUrVqwo9Y8CAAAAAAAAeIKv\nr6969eqlXr166dSpU0pJSdEdd9yh9957Tx07dtTMmTPdftbs2bOVkJBQvP9dRX7xi1/Ix8dHUVFR\nmjJlij755BN9+eWX6tevnyTpypUr6ty5syRp586dSk9P18WLF3X27Fm1b99eP//5zyVJEydO1IAB\nAzRhwgRJ0k9+8hN98803mjJlih544AHFxsZW6t+jwkLed999p1tuuUXSDxXCL774QhkZGQoJCVGb\nNm00adIktwbJyMhQZmamgoKClJaWJkl66623tGfPHhmGoaCgICUmJiokJKRS4QEAAAAAAHBjO3/+\nvNavX6+33npLdevW1bx584q3g6vMirzMzEz95S9/0QsvvKCcnBz5+Pjopptu0pNPPlnq/qt75F1l\nmqa6d++uxYsXl+h36dIlTZ48WR988IHCw8P18ssv69KlS8XXY2JitHPnTo0aNUo33XSTGjVqpG3b\ntmnbtm364x//qA0bNmj+fPdXeFZYyPvx+7xffvmlmjRpUlxsa9CgQYlgFYmNjVXv3r2Vnp5e3Na/\nf389+uijkn54P/ntt9/WiBEj3A4OAAAAAACAG9uoUaO0Z88e9e/fX+np6YqIiChxvTIr8t59993i\nzy+//LLq169fZhGvLJ06dVJycrL++c9/KiIiQv/+97/13XffKSwsTJIUEhKivLw8/eUvfyletSdJ\nQ4YM0a5du/Sb3/xGS5cuVU5OjurWrauHHnpIbdq0UWJiotv5pWsU8m655RZt2rRJPXr00Icfflji\nuNzvv/9eDRo0cGuQqKgoZWdnl2j78aaCly9fvu7NCgEAAAAAAHBjGTBggP7whz/Iz6/CEla1CwsL\n04IFC5SQkKDLly9LkqZMmaJbbrlFjz/+uO677z41adKkRO3sqlGjRun8+fMaPXq0kpKSNG7cOBUV\nFUmSnn322UrlqPCwi2+//VazZs1Sdna2mjVrpunTpxevyFuzZo1OnjxZ5qaAZcnOztasWbOKX62V\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7faa05d8b710>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib\n",
"matplotlib.style.use('ggplot')\n",
"\n",
"def summary_counts(df):\n",
" len_all = len(df)\n",
" len_0 = len(df[df.peaks_count == 0])\n",
" len_1 = len(df[df.peaks_count == 1])\n",
" len_2 = len(df[df.peaks_count == 2])\n",
" len_3 = len(df[df.peaks_count == 3])\n",
" len_4 = len(df[df.peaks_count >= 4])\n",
" return pd.Series([len_all, len_0, len_1, len_2, len_3, len_4],\n",
" index=['total_count', 'No Service', '1 Peak', '2 Peaks', '3 Peaks', '>= 4 Peaks'])\n",
"\n",
"e = cumulative_results_df.groupby('hour').apply(summary_counts).iloc[::-1]\n",
"ax = (e[['No Service', '1 Peak', '2 Peaks', '3 Peaks', '>= 4 Peaks']].plot.barh(stacked=True,\n",
" figsize=(20,10),\n",
" legend=True,\n",
" cmap='Set3'))\n",
"\n",
"ax.set_axis_bgcolor('black')\n",
"ax.set_title(\"Observations by Hour for Unique Route-Direction-Trip-Stop Combination\")\n",
"ax.set_xlabel(\"Counts\")\n",
"ax.set_ylabel(\"Hour of Standard Weekday\")\n",
"\n",
"plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:5: MatplotlibDeprecationWarning: The set_axis_bgcolor function was deprecated in version 2.0. Use set_facecolor instead.\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7faa05ff3668>"
]
},
"execution_count": 121,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABPEAAAJjCAYAAABtI4TqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd0FPX+//HXsqQHQiChhRYIhlCUKkWaCF4F9QdcpHe4\nKEURFWkiCIIIhy6iFxAUECkqXK8C0kFBiYQgEDoCAgm9hSIln98ffLM3m8YGkjCrz8c5OYed+ezM\ne2ZnZpfXfnY+NmOMEQAAAAAAAADLyvGwCwAAAAAAAACQPkI8AAAAAAAAwOII8QAAAAAAAACLI8QD\nAAAAAAAALI4QDwAAAAAAALA4QjwAAAAAAADA4gjxANy3EiVK6L333nvg5cyZM0c5c+bMhIr+3hYv\nXqxSpUrJbrerc+fOD7ucv6zMPF5tNpvmzZuXKcvKqCNHjshms+nHH390+TmZfa527txZDRs2zLTl\nJZW81qy+zgwfPlxhYWFZtvyMWL9+vcqXLy8PDw/Vr1//YZeTrvXr18tms+n48eMPu5S/ncx6D79f\nVjpn0vPmm2+qYsWKD7uMvyxX9u+HH36oPHnyZFNFUtWqVfXaa69l2/oAICMI8YC/mc6dO8tms8lm\ns8lut6tIkSLq2LGjTpw4keXrPn78uGw2m9avX+80vVWrVtmy/kTz5s1T3bp1FRAQID8/P5UvX15v\nvfVWttaQtBabzfbAy7lz5466du2qli1b6tixY5o8eXImVOcs8bj5z3/+k2Jes2bNZLPZ1L1790xf\nrzuqX7++Y3/ZbDblzZtXTz31lLZs2eLULjY2Vi1atHhIVWaNpNcYDw8PBQUFqXbt2ho7dqyuXr3q\n1Hby5MlavHixy8vOmTOn5syZ41LbrLqu/Pjjj7LZbDpy5IjT9DfffFM///xzpq/vfvTs2VOVK1fW\n4cOH9fXXX2f68tMKn+8nKK1Vq5ZiY2NVuHDhzCrvgcyZM8fp3A0ODlajRo2y7LVt2LBhpn7pUqJE\nCUftXl5eCgkJUZMmTbRgwQIZY5zaRkZGql+/fpm27rQ87HOmffv2Tq9pan/pfZkxbNgwrVmzJlNq\nWbt2rRo0aKCgoCD5+PgoNDRUrVq1UmxsrCRp7969stls+vXXXzNlfa7asGGDnn/+eQUHB8vb21ul\nS5dWly5dtHPnzmytIy1du3bV/v37M325AwcOVPny5VNMX7lypUaOHJnp6wOAzECIB/wN1alTR7Gx\nsTp27Ji++OILbd++XS+++OJDq8fHx0cFChTIlnV169ZN3bp1U926dbV8+XLFxMRoypQpiouL0/jx\n47OlhqwQGxur+Ph4NW7cWCEhIQoICLiv5dy6dSvd+cWKFdPMmTOdpp08eVLfffedihYtel/r/Ktq\n27atYmNjFRsbq3Xr1ilv3rx69tlnFR8f72hTsGBBeXt7P8Qqs0biNebo0aNat26d2rVrpw8//FCV\nK1fWqVOnHO0CAgIUGBiYqes2xujWrVvZel2RJH9/fwUFBWXb+tJz4MABNWrUSEWLFlXevHnvaxkJ\nCQm6c+dOJleWkqenpwoWLKgcOazzkdRutzvO3TVr1ihPnjx69tlndfr06YddmksGDBig2NhYHTp0\nSF9//bUqV66srl27qkWLFk6vaXBwsPz8/NJczs2bN7O0zuw6Z6ZNm+Z4PWNjY1WoUCENGTLEaVr1\n6tVTPO/OnTtKSEhQrly5lC9fvgeuIyoqSs8884wqVaqkdevWKSYmRjNnzlShQoVSfMGRnaZNm6YG\nDRoob968Wrhwofbu3av58+crf/78euONNx5aXUn5+voqf/782ba+fPnyKVeuXNm2PgDIEAPgb6VT\np07mqaeecpo2ZcoUI8lcunTJMe3mzZtm2LBhpkSJEsbLy8uULVvWfPzxx07PK168uBk5cqTj8fz5\n883jjz9ucufObfLly2caN25s9u3b55gvyemvePHixhhjZs+ebex2uzHGmEuXLhkfHx8zf/58p3Wd\nOHHC2O12s2rVKpfrS27JkiVGklmwYEGq88+fP+/493fffWcqV65sPD09TXBwsOnZs6eJj49Pdz/O\nnTvXJL2sDhs2zJQqVcosXbrUhIeHG19fX1OvXj2zf/9+Y4wx69atS7FPOnXqZIwxZtOmTaZWrVrG\n39/f+Pv7m0cffdSsWLEi1bpnz56dYjnr1q3L0HZMmTLFFC9e3NhsNnPt2rVU1yPJDB8+3Hh4eJjj\nx487po8cOdI0aNDA1KtXz3Tr1s0x/ebNm2bAgAGmcOHCxsPDw0RERKR4XSWZadOmmfbt2xt/f38T\nEhJiRo8e7dTm8uXLpkePHiYoKMh4enqaKlWqmJUrV6ZaY6LDhw+bZs2amUKFChkfHx9Tvnx58/nn\nnzu1Sax3xIgRpkCBAiYwMNB06NDBXLlyxdHmzp075u233zbBwcHGz8/PtGzZ0kyYMMFxvKYl+b4w\nxpjffvvNSDJRUVFO2z937lynx1OmTDEtW7Y0vr6+pmjRombx4sXm4sWLpm3btsbf39+EhoaaJUuW\nOC177969pnHjxsbPz8/4+fmZ5557zhw4cMCpzcKFC02pUqWMl5eXqVmzplm2bJmRZDZt2mSMMSYh\nIcF0797dlCxZ0nh7e5vQ0FAzaNAgc+PGDccykp6raUnt3DDGmOPHj5vAwEDTuXPnNNvu2rXLPP30\n0yYgIMD4+vqaMmXKOF634sWLpzjOk9a0du1aU7FiRePh4WG+//77FLUmPl61apUpW7as8fLyMo8/\n/rjZvn17utv3xx9/OM6p33//PUUN9erVM8b873xPas6cOSYiIsJ4eHiYkJAQM2TIEHPr1i3HfFeO\nwfT2SXKpXVNmz55tjDFmy5Ytpk6dOsbb29vkyZPHtGnTxpw6dcrx3MT6v/zySxMeHm7sdruJiYlJ\ndT3Jj9u09t+9roFJa/7jjz8c09auXWsqVKhgvLy8TIUKFczatWud1pn4OiQeu4lKlSplhg0b5nh8\n5coV8+qrr5rChQsbHx8fU7FiRfPVV1+luk1pbYMx/zt3//Of/zimJSQkmHHjxpnQ0FDj4eFhSpYs\naSZOnOj0vOTvkcYY061bN8cx06lTpzSv3XFxcaZTp04mKCjI+Pv7m1q1apkNGzakW3ta6zTm7nuB\nJDNnzpw02xYvXtwMGTLE9OzZ0+TNm9c8/vjjxhjX9uOpU6dM586dTf78+Y2Xl5d55JFHzKxZsx7K\nOXMvISEh5v33308x/Y033jCPPfaYmTNnjgkLCzM5cuQwx44dc0xP3m7mzJmmWLFixtvb2zRu3Nic\nOHEi3fWOHDnS8bknNVeuXEmxr8qVK+eY//HHH5vSpUsbDw8PU7RoUTNixAhz584dx/wqVaqY3r17\nm759+5rAwEATEBBg+vTpY27evJnmOg8ePGhy5sxp3njjjVTnJ/1c9Ntvv5lGjRoZX19fkytXLtOs\nWTNz9OhRx/ypU6eagIAAs3z5chMREWG8vb1No0aNzOnTp80PP/xgKlSoYPz8/MwzzzzjdO1xZX8m\nLjv54zVr1pgKFSoYHx8fU716dRMdHe1oc+PGDdOlSxdTokQJ4+3tbUqVKmWGDx/uOJ6mTp2aYn+P\nGzfOsS/79u3rWNb169fNa6+9ZgoWLGg8PT1NhQoVnM6BxNdu1qxZpmXLlsbPz88UK1YsxTUBADKD\ndb72BPBQnDx5UkuWLJHdbpfdbndM/9e//qWvv/5an3zyifbs2aN33nlHAwYM0KxZs9Jc1p9//qm3\n335bUVFRWrVqlex2u5o0aeL4Nj8qKkqS9NVXXyk2NlaRkZEplpE7d241bdpUc+fOdZo+b948FSpU\nSA0aNLjv+ubOnauwsDC1bt061fmJPYJ+++03vfDCC6pbt6527Nihzz77TP/973/18ssvp7nstMTG\nxmr69OmaP3++Nm/erCtXrqhr166S7v6M7MMPP3S0i42N1eTJk3X79m298MILql69uqKiohQVFaXh\nw4fL19c31XW0atVKW7dulSQtW7ZMsbGxqlWrlsvbsXXrVq1du1bLli3Tjh075Onpmeb2lCpVSnXr\n1tXs2bMl3e2tM2vWLP3rX/9K0Xbw4MGaMWOGJk2apF27dql9+/Zq3759ip8lvfvuu6pbt66io6M1\naNAgDR482KlN165dtXLlSs2bN0/R0dF64okn9Nxzz2nv3r1p1hkfH68GDRpo+fLl2rlzp3r06KEu\nXbpo3bp1Tu2WLFmi8+fPa/369fryyy/13//+Vx988IFj/tSpUzVhwgSNGzdOUVFRqlKlit599900\n15uWa9euac6cOQoKClLp0qXTbTtq1Cg1btxYO3bs0HPPPacOHTqodevWatSokbZv364mTZqoY8eO\nOnfunCTp+vXrevrpp3Xjxg1t2LBBGzZsUHx8vJ555hnHubd9+3a1adNGL774onbs2KE333xTffv2\ndVqvMUb58+fXF198oT179mjSpEmaPXu2Ro8eneHtTU1ISIjatWunr7/+WgkJCam2adOmjfLly6fN\nmzdr586dmjBhguO8jIyMlN1u16RJkxznS6KEhAQNGDBAEyZM0N69e1W1atVUl5+QkKC33npLH330\nkbZu3arg4GA1adJE169fd2kbihYtqmXLlkm6e97Exsam+XPV7777Tl27dlWHDh20a9cujR8/XtOm\nTUtx/NzrGExvnySX+NNU6e49pGJjY9WqVSvFxcXp6aefVpEiRbR161Z9++232rVrV4qfcp88eVIf\nffSRPvvsM8XExKhIkSIu7Zf0pHcNTM3Jkyf13HPPqUqVKoqKitL48eNTHKuuMMbo+eef144dO7Rw\n4ULt2rVLPXv2VOvWrTP008irV6/q008/lSSna+NHH32koUOHauDAgdq9e7f69++vgQMHpvselNzk\nyZNVp04dtWzZ0nFM16pVS9evX9eTTz6pK1euaPny5dq+fbsaN26sRo0aac+ePa7vhCQaN26s8uXL\n3/Pn61OmTFH+/Pm1ZcsWzZ4926X9eP36ddWrV087duzQ/PnzFRMTo6lTp8rX1/ehnDMP4uDBg5o3\nb54WLFig3bt3p9kD7+DBg5o/f76WLl2qdevW6cSJE2rVqlW6yy5UqJDi4uJSvA8l8vPz06ZNmyRJ\nK1asUGxsrDZs2CBJWrhwofr06aOePXtq9+7dGjVqlMaOHatx48Y5LePzzz9XQkKCNm/erE8//VTz\n58/XiBEj0qxpwYIFun37tt5+++1U5ydeay5fvqxGjRrJw8NDP/30k1avXq3Y2Fg1adLEqXfntWvX\nNG7cOM2dO1cbNmzQvn371LJlS40ZM0azZs3S+vXrtXfvXg0aNOiB9+e1a9c0cuRIffLJJ/r111/l\n7e2ttm3bOn42fvv2bRUrVkyLFi3Snj179MEHH2jKlCmaOHGipLufLfr06aPw8HDH+derV69U19Wv\nXz998cUXmj59un777Tc1bdpULVq0SPFz8KFDhzrev/v06aN+/frpl19+SXc7ACDDHm6GCCC7derU\nydjtduPn52d8fHwc3z4m/Rb28OHDxmazmT179jg9991333X6Njqtb/wTnTt3zkgyP/74ozHGuUdL\nUsl7PixfvtzY7XYTGxvrmFa+fHkzcODADNWXXEREhHn++efTnJ+offv2plq1ak7Tli5damw2mzly\n5IgxxvWeeHa73Zw+fdox7csvvzQ2m81cv3491ecYc/eb79T2U3pS65ni6nYEBAS41ItB/9cTZuHC\nhaZEiRImISHBLF++3AQFBZk///zTqffZ1atXjaenp5k2bZrTMpo2bWqefPJJp2W+8sorTm3KlCnj\neK0PHDhgJJnvvvvOqU2lSpVMly5d7llzUi+88ILp3r2743G9evXMo48+6tTm5ZdfNjVq1HA8DgkJ\nMYMHD3Zq889//tOlnng5c+Z09IyTZIKCghznQqLEfZr0cdJv/0+fPm0kmT59+jimJR4f3377rTHG\nmJkzZxofHx9z5swZR5u4uDjj7e1tPvvsM2OMMe3atTO1atVyWndiL4TkvZmSmjBhggkLC3M8fpCe\neMYYM336dCPJ0QsjedvcuXM7eo6lxm63p5if2BN148aNKaYn74knyaxevdox7fz588bPz8/MnDkz\n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\nR6zOrPev1NYl/e/aMnv2bPXv31/jxo1TrVq1lCtXLn322WeaNGnSA687LVn5mQIAEtETD4CGDx+u\n2bNn69dff5V0N2yQ7n6jHRYW5vRXqlSpVJexZ88enTlzRqNGjVL9+vUVERGhCxcuOH3wTPxw48qI\nh506ddKOHTu0fft2LViwwNEL737rk6T27dvr4MGD+vLLL1Odf+HCBUl3g8eNGzc6zduwYYNsNpvK\nlSsnScqfP79Onjzp1OZ+esikt0/Kly+v119/XcuXL1e3bt3073//O0PLdmU77lePHj20adMm1ahR\nQ2XKlEkxPywsTF5eXqmuv3z58i6vJ7HO5MvZuHFjusvZuHGj2rVrp5YtW+qxxx5TyZIltX//fpfX\nK939z19ISIg2b97sNP2nn37K0HIS2Ww25ciRI8P/8b6XcuXKKSYmRmfPnnVMO3XqlPbt2+fYR2XL\nlr3ndmzcuFGVKlXS66+/ripVqqh06dI6cuRIptV54sQJzZ8/X82bN093JNKSJUuqV69eWrJkiUaM\nGKHp06c75nl6ej7wiKlJ72F08eJF7dmzR2XLlpV097y+c+eOU8+J5Oe1q9extM4/Hx+fdK9TqUlv\nn7iiXLly+vnnn52+UNmxY4cuXbqUofMxUZkyZRz34Uxq69atqV4PMqJs2bLaunWr0/5Nfqwm9uxL\neg0+ffq0Tpw44XhctWpVXbx4UTdu3EjxPpHR3oZdu3bVtWvXHPcwzZ07t4oUKZLq6xsaGuoI2lJ7\nn9i+fbvT49SO6apVq+rw4cOOLwKS/iX2NgoJCXGafi/ff/+9du/eneGR6F3Zj1WqVFFMTIxTj7Dk\n2yhlzzmTM2dOpxqzakTTY8eOOb2227dv1/Xr11W2bFnZbDanGgoVKpTmcnx9fVW8eHFHz7TU9lWO\nHDkUERGR6r4JCAhw6gGZvEff5s2b5efnp+LFi6e6/tatW8tut2vUqFGpzk/6uSg6OlqXL1922gdH\njhy5r2tIcuntz/u1ceNG1apVS3369FHlypVVunRpHT582KmNK+8p4eHhstvtD/x5BgAyCyEeAJUu\nXVrPP/+8o8dNWFiYunbtqn/961+aO3euDh48qB07dujTTz9N8+bRxYsXl5eXl6ZOnapDhw5pzZo1\n6tu3r1PPuKCgIPn7++uHH35QXFyc48NhasqXL69KlSqpa9euunjxotq0aeOYdz/1SVKLFi3UsWNH\nderUSUOHDtWWLVt07NgxbdiwQV26dNHIkSMl3e3FFRUVpX79+mnv3r1asWKFXnnlFbVr187xn5aG\nDRtq7969mjZtmg4dOqQZM2Zo0aJFru/0/xMaGipJ+s9//qMzZ84oPj5eBw8e1IABA/Tjjz/q6NGj\n2rJlizZt2pThD7OubMf9CgsL09mzZ7VixYpU5/v6+urVV1/V0KFDtXjxYu3fv1+jR4/WsmXLNHjw\nYJfXU6pUKb344ovq1auXVq5cqb1796pv377atWuX+vfvn+bzwsPDtWzZMm3dulUxMTHq0aNHiv9M\nu+KNN97Q5MmTNXfuXB04cEDjx4/X6tWrXXru9evXFRcXp7i4OMXExOiVV17R1atX9cILL2S4jvS0\nbdtWwcHBatWqlaKiorRt2za1bt1aISEhjhuD9+vXT1u2bNGQIUO0f/9+ffPNNxo/frzTcsLDw7Vz\n504tW7ZMhw4d0uTJk9O8Af293Lx5U3FxcTp58qR27typ6dOnq2bNmsqfP7/ef//9VJ8THx+v3r17\na+3atfr999+1fft2rVixwum4Dw0N1bp163Ty5Emn0NJVNptNb731ljZu3KidO3eqY8eOypUrl9q2\nbSvp7k8Jc+XKpYEDB+rAgQNasWJFipvCFy9eXDly5ND333+v06dPp9ojTZIGDRqkr776SmPGjNH+\n/fu1aNEiDR8+XG+88YbLPZhc2Seu6NOnjy5fvqzOnTtr165d+vHHH9WhQwfVqVNHderUydCypLvX\nli+++EJjx45VTEyMYmJiNGbMGC1atEj9+vXL8PKS6tmzp86cOaMePXpoz549WrNmTYreoD4+Pnri\niSc0duxY7dixQ9u2bVPHjh3l5eXlaNOgQQM1bNhQzZs319KlS3X48GFt27ZNU6dOdfQ6d5Xdbtdr\nr72m999/X1euXJF09/VNXNaBAwf0ySefaPr06U7Xt4YNG2rhwoX64YcftG/fPvXr1y/FT/lCQ0O1\nbds2HTp0SGfPntWtW7fUrl07hYaGqkmTJvrhhx905MgR/fLLL3r//fe1dOnSe9YbHx+vuLg4HT9+\nXFu3btU777yjFi1aqHnz5mrXrl2Gtt2V/dimTRsVL15cL7zwglavXq3ff/9da9as0cKFCyVl7zmT\nXby9vdWxY0dt375dv/zyi7p27apatWqpRo0aaT5n4sSJ6tOnj1atWqVDhw4pJiZGI0aM0IYNG9Ss\n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\nv7/8/f316KOPKjo6WhcuXND169f1yCOPyGazqW7duo5lAQAAAAAAAO4uW35Om9Tp06f1+++/Kyws\nTJcuXVJgYKAkKU+ePLp06ZIk6fz58woKCnI8J1++fDp//rzOnz+vfPnyOabnzZs31emJ7VOzevVq\nrV69WpI0ZsyYLAv7IiIi3DJIdNe6Jfet3V3rlty3dnetW3Lf2q1U90bdzlB7K9WeEe5at+S+tVup\nbnc+zjNSu7vWLblv7e5at+S+tbtr3ZLFavfOwD4PtU7dGWWlfZ4R7lq35L61u2vdf3fZGuLduHFD\n48ePV+fOneXr6+s0z2azZcs97Bo2bKiGDRs6HlerVi1L1hMZGZlly85K7lq35L61u2vdkvvW7q51\nS+5bu5XqHr9zS4ba79mzxzK1Z4SV9nlGuWvtVqrbnY/zjNTurnVL7lu7u9YtuW/t7lq35L61W6nu\njLLSe1FGuGvdkvvWntV1G2OybNl/Z9k2Ou3t27c1fvx41alTR9WrV5ckBQQE6MKFC5KkCxcuKHfu\n3JLu9rA7e/as47nnzp1T3rx5lTdvXp07d84x/fz586lOT2wPAAAAAAAA/BVkS088Y4w+/vhjhYSE\n6LnnnnNMr1q1qjZs2KCmTZtqw4YNjhS4atWqWrFihZ544gkdOHBAvr6+CgwMVMWKFbVgwQLHYBY7\nduxQ27Zt5e/vLx8fH+3fv1+lS5fWxo0b9cwzz2THpgEAkG0y1APiRtbVAQAAACD7ZUuIt2/fPm3c\nuFHFihVT//79JUlt2rRR06ZNNXHiRK1du1bBwcHq16+fJKlSpUqKiorSq6++Kk9PT/Xq1UuS5O/v\nr3/+858aNGiQJKlFixby9/eXJHXv3l0fffSRbt68qYoVK6pSpUrZsWkAAAAAAABAlsuWEK9MmTJa\ntGhRqvPeeeedFNNsNpu6d++eavsGDRqoQYMGKaaXKlVK48ePf7BCAQAAAAAAAAvKtnviAQAAAAAA\nALg/2To6LQAAgDvhPoQAAACwCnriAQAAAAAAABZHTzwAAJClMtSbTaJHGwAAAJAKeuIBAAAAAAAA\nFkeIBwAAAAAAAFgcIR4AAAAAAABgcYR4AAAAAAAAgMUR4gEAAAAAAAAWR4gHAAAAAAAAWBwhHgAA\nAAAAAGBxhHgAAAAAAACAxeV82AUAANzT+J1bXG98I+vqAAAAAIC/A3riAQAAAAAAABZHiAcAAAAA\n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\nr9d1eV089/a8n4cbnPvN53PfQ1JfX5+BAwfmqquuyogRI/KNb3wj48ePzwEHHLDCfjvuuGNuuOGG\nnHzyybn99tvz2c9+9hPnb3aJ17Nnz7z22mvp3r37J34zAAAAACiFG2+8cY3bfPvb317p8pqamtx0\n000rLB8wYECefPLJptejRo1Kkhx99NE5+uijkyS77LJLHn300U8SeTnNLvE6d+6cyy67LHvssccK\nT9M46qij/ukgAAAAAMDKNbvEW7x4cXbffffU19dn3rx56zMTAAAAAPAxzS7xzjjjjPWZAwAAAABY\nhWaXeH//+99Xua5Lly7rJAwAAAAAa2/cjCeav/Gi9ZeD9afZJd43v/nNVa776U9/uk7CAAAAAAAr\nanaJ949F3TvvvJO77rorPXv2XOehAAAAAGBdmTVrVkaMGJG5c+emoqIixx57bE455ZQVtvve976X\niRMnpqamJvX19Tn//PPzhS98Ya3f74477si0adMyZsyYdRE/yVqUeP+oQ4cOOf7443PWWWdl8ODB\n6ywQAAAAABu3zi0uW6fHm1t/wWrXt2zZMhdffHH69OmTurq6DBs2LEOGDMm//Mu/rLDtqaeemjPP\nPDMvvvhivvjFL+b5559PZWXlOs37SfxTCWbPnp3FixevqywAAAAAsM516dIlffr0SZJUVVWlR48e\n+dvf/rbafXr06JEWLVpk3rx5efvtt3PCCSfk85//fD7/+c/nqaeeSpJMnTo1Bx54YPbbb78cdNBB\nefnll1c4zu9///sceOCBmTdvXu65557ss88+GTp0aL74xS+u1Wdo9ki87373u6moqGh6vXjx4vzv\n//5vjjjiiLV6QwAAAAAolTfeeCMzZszI7rvvvtrt/vSnP6WysjKdOnXK6aefnlNPPTUDBw7Mm2++\nmaOOOiqPPfZYdtxxx/zqV79Ky5Yt8/DDD+eyyy7Lrbfe2nSMe++9Nz/84Q/z3//93+nQoUPGjRuX\nn/70p9lqq62yYMGCtcrd7BJvv/32W+51mzZt8pnPfCZbbbXVWr0hAAAAAJRCXV1dTjzxxFxyySXZ\nfPPNV7rNjTfemJ/97GepqqrKTTfdlIqKijzyyCP5y1/+0rTNu+++m7q6uixcuDAjRozIX//611RU\nVGTp0qVN2zz66KOZPn167rzzzqb3GjBgQL7xjW/kS1/6Ug4++OC1yt7sEm/o0KFrdWAAAAAAKIql\nS5fmxBNPzOGHH55DDjlkldt9dE+8j2toaMhvfvObtGnTZrnlo0aNyuDBg3PbbbfljTfeyJe//OWm\ndbIz1FQAACAASURBVNttt11ef/31vPLKK+nbt2+S5Kqrrsqf/vSn/P73v88BBxyQ3//+96murm5W\n/mbfE2/ZsmW58847M2LEiPzbv/1bRowYkTvvvDPLli1r7iEAAAAAYINrbGzM2WefnR49euT0009f\n6/2HDh2aCRMmNL2eMWNGkmThwoXZcsstk3z4RNqP23rrrXPLLbdkxIgRmTlzZpLkr3/9a3bfffec\nd955qampyaxZs5qdodkl3sSJEzNjxox8/etfz5VXXpmvf/3ree655zJx4sRmvxkAAAAAbGhPPfVU\n7rrrrvzP//xP9t133+y7776ZPHlys/e/7LLLMn369AwZMqRp5F2SjBgxIpdddln222+/1NfXr7Df\njjvumBtuuCEnn3xy/vrXv+biiy/OkCFDss8++2TAgAHZeeedm52h2dNpn3zyyVx55ZVNc3i7du2a\nz372szn33HNz/PHHN/sNAQAAAPh0m1t/wQZ9v4EDB2bOnDlr3O7b3/72SpfX1NTkpptuWmH5gAED\n8uSTTza9HjVqVJLk6KOPztFHH50k2WWXXfLoo48mSf7zP/9zbaM3afZIvMbGxk/8JgAAAADAJ9fs\nkXh77bVXxo4dmyOOOCKdOnXK22+/nZ///OcZOHDg+swHAAAAAJ96zS7xjjnmmPz85z/PzTffnPnz\n56e6ujqDBg3K4Ycfvj7zAQAAAMCn3hpLvJkzZ+bpp5/OMccck6OOOipHHXVU07qJEyfm1VdfTY8e\nPdZrSAAAAAD4NFvjPfF+8YtfpFevXitdt/POO+fuu+9e56EAAAAA2Hi0atUqS5cuLXWMQlu6dGla\ntWq1yvVrHIn32muvpW/fvitdt8suu+SGG2745OkAAAAA2Oh17tw5c+fOzZIlS0odpbBatWqVzp07\nr3L9Gku8Dz74IMuWLUvr1q1XWFdfX58PPvjgn0sIAAAAwEatoqIiW2yxRaljlLU1Tqft1q1bpk+f\nvtJ106dPT7du3dZ5KAAAAADg/1ljiXfwwQfnRz/6UZ566qk0NDQkSRoaGvLUU0/lpptuysEHH7ze\nQwIAAADAp9kap9MOHjw477zzTq677rosXbo07dq1y8KFC9OqVasceeSRGTx48IbICQAAAACfWmss\n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\nFJwSDwAAAAAKTokHAAAAAAWnxAMAAACAglPiAQAAAEDBKfEAAAAAoOCUeAAAAABQcEo8AAAAACg4\nJR4AAAAAFJwSDwAAAAAKTokHAAAAAAWnxAMAAACAglPiAQAAAEDBKfEAAAAAoOCUeAAAAABQcC1L\nHQCA5uvffWIa553V7O0raq5ej2kAAADYUIzEAwAAAICCU+IBAAAAQMEp8QAAAACg4JR4AAAAAFBw\nSjwAAAAAKDglHgAAAAAUnBIPAAAAAApOiQcAAAAABafEAwAAAICCU+IBAAAAQMEp8QAAAACg4JR4\nAAAAAFBwSjwAAAAAKDglHgAAAAAUXMtSBwCKY9yMJ9ZyjzvWSw4AAABgeUbiAQAAAEDBlXwk3pln\nnpk2bdqksrIyLVq0yJgxY1JXV5fx48dn7ty56dy5c84555xUVVWlsbExt956a5555plssskmOeOM\nM9K9e/ckyUMPPZS77747SXLYYYdl6NChJfxUAAAAALDulLzES5KLLroo7dq1a3o9adKk7LLLLhk+\nfHgmTZqUSZMm5ZhjjskzzzyTt956K9dcc01eeumlTJgwIZdffnnq6urys5/9LGPGjEmSnHfeeenf\nv3+qqqpK9ZEAAAAAYJ0p5HTaKVOmZMiQIUmSIUOGZMqUKUmSp59+Ovvss08qKirSo0ePvPfee5k/\nf36mTZuWPn36pKqqKlVVVenTp0+mTZtWyo8AAAAAAOtMIUbiXXbZZUmSAw44IMOGDcuCBQvSsWPH\nJEmHDh2yYMGCJEltbW06derUtF9NTU1qa2tTW1ubmpqapuXV1dWpra3dgJ8AAAAAANafkpd4l1xy\nSaqrq7NgwYJceuml6dq163LrKyoqUlFRsc7eb/LkyZk8eXKSZMyYMU2j/NbkkSxbZxlWprk5Pon1\nmb1ccyflm71ccyflm71ccyfFyd6zZ8/1mmVtrO13Xq7ZyzV3Ur7ZyzV3Ur7ZyzV3Ur7ZyzV3Ur7Z\nyzV3Ur7ZyzV3Ur7ZyzV3kvTvPjGN885q9vZPv3rM2kZqtnK9JqL5Sl7iVVdXJ0nat2+fAQMG5OWX\nX0779u0zf/78dOzYMfPnz2+6X151dXXefvvtpn3nzZuX6urqVFdX5/nnn29aXltbm169eq30/YYN\nG5Zhw4Y1vR4wYECzco6b8cRaf7a10dwcn8T6zF6uuZPyzV6uuZPyzV6uuZPiZH/hhRfWa5a1sbbf\neblmL9fcSflmL9fcSflmL9fcSflmL9fcSflmL9fcSflmL9fcSflmL9fcn0RRfj5fW2ubu7GxcT0l\n+XQr6T3xFi1alA8++KDp188++2y23Xbb9O/fPw8//HCS5OGHH246Wfr3759HHnkkjY2NefHFF9O2\nbdt07Ngxffv2zfTp01NXV5e6urpMnz49ffv2LdnnAgAAAIB1qaQj8RYsWJCrrroqSVJfX5/Bgwen\nb9++2X777TN+/Pj84Q9/SOfOnXPOOeckSfr165epU6fmm9/8Zlq3bp0zzjgjSVJVVZXDDz88o0aN\nSpIcccQRnkwLAAAAwEajpCVely5dcuWVV66wfPPNN893v/vdFZZXVFTk5JNPXumx9ttvv+y3337r\nPCMAAAAAlFpJp9MCAAAAAGumxAMAAACAglPiAQAAAEDBKfEAAAAAoOCUeAAAAABQcEo8AAAAACg4\nJR4AAAAAFJwSDwAAAAAKTokHAAAAAAXXstQBAAAAgE+v/t0npnHeWc3evqLm6vWYBorLSDwAAAAA\nKDglHgAAAAAUnBIPAAAAAApOiQcAAAAABafEAwAAAICCU+IBAAAAQMEp8QAAAACg4JR4AAAAAFBw\nSjwAAAAAKDglHgAAAAAUnBIPAAAAAApOiQcAAAAABafEAwAAAICCU+IBAAAAQMEp8QAAAACg4JR4\nAAAAAFBwSjwAAAAAKDglHgAAAAAUXMtSBwAAAAD+ef27T0zjvLOavX1FzdXrMQ2wrhmJBwAAAAAF\np8QDAAAAgIJT4gEAAABAwSnxAAAAAKDglHgAAAAAUHCeTgvAeudJaQAAAP8cI/EAAAAAoOCUeAAA\nAABQcEo8AAAAACg498QDAArFPRQBAGBFRuIBAAAAQMEp8QAAAACg4JR4AAAAAFBwSjwAAAAAKDgl\nHgAAAAAUnBIPAAAAAAquZakDAADrXv/uE9M476xmb19Rc/V6TPPp4DsHAGB9MhIPAAAAAApOiQcA\nAAAABWc6LQAAAPz/3B4BKCoj8QAAAACg4JR4AAAAAFBwptMCwGqYUgMAABSBkXgAAAAAUHBKPAAA\nAAAoOCUeAAAAABSce+IBAHzKufcjAEDxGYkHAAAAAAWnxAMAAACAgjOdFgCAsmQaMADwaWIkHgAA\nAAAUnBIPAAAAAApOiQcAAAAABafEAwAAAICCU+IBAAAAQMF5Oi0AAGxgnqwLAKwtI/EAAAAAoOCU\neAAAAABQcKbTAgAAzWIaMACUjpF4AAAAAFBwSjwAAAAAKDglHgAAAAAUnBIPAAAAAApOiQcAAAAA\nBafEAwAAAICCU+IBAAAAQMG1LHUAAAAANj79u09M47yzmr19Rc3V6zENQPkzEg8AAAAACs5IPAAA\nYKNnVBgA5U6JBwAAUFDKRwA+YjotAAAAABScEg8AAAAACk6JBwAAAAAFp8QDAAAAgIJT4gEAAABA\nwSnxAAAAAKDglHgAAAAAUHBKPAAAAAAoOCUeAAAAABScEg8AAAAACk6JBwAAAAAFp8QDAAAAgIJT\n4gEAAABAwSnxAAAAAKDglHgAAAAAUHBKPAAAAAAoOCUeAAAAABScEg8AAAAACk6JBwAAAAAFp8QD\nAAAAgIJT4gEAAABAwSnxAAAAAKDglHgAAAAAUHBKPAAAAAAoOCUeAAAAABScEg8AAAAACk6JBwAA\nAAAFp8QDAAAAgIJT4gEAAABAwSnxAAAAAKDgWpY6wLo0bdq03HrrrWloaMj++++f4cOHlzoSAAAA\nAPzTNpqReA0NDbn55ptz/vnnZ/z48Xnsscfy5ptvljoWAAAAAPzTNpoS7+WXX86WW26ZLl26pGXL\nltl7770zZcqUUscCAAAAgH9aRWNjY2OpQ6wLTz75ZKZNm5bTTjstSfLII4/kpZdeykknnbTcdpMn\nT87kyZOTJGPGjNngOQEAAABgbW00I/Gaa9iwYRkzZsx6L/DOO++89Xr89aVccyflm71ccyflm71c\ncyflm71ccyflm71ccyflm71ccyflm71ccyflm71ccyflm71ccyflm71ccyflm71ccyflm71cc3/a\nbTQlXnV1debNm9f0et68eamuri5hIgAAAABYNzaaEm/77bfP3/72t8yZMyfLli3L448/nv79+5c6\nFgAAAAD801qMHj16dKlDrAuVlZXZcsst84Mf/CC//e1v87nPfS4DBw4saabu3buX9P0/qXLNnZRv\n9nLNnZRv9nLNnZRv9nLNnZRv9nLNnZRv9nLNnZRv9nLNnZRv9nLNnZRv9nLNnZRv9nLNnZRv9nLN\nnZRv9nLN/Wm20TzYAgAAAAA2VhvNdFoAAAAA2Fgp8QAAAACg4JR4AAAAAFBwLUsdYGMxa9asTJky\nJbW1tUmS6urq9O/fP1tvvXWJk228Zs2aldra2uy4445p06ZN0/Jp06alb9++JUy2ei+//HKSZIcd\ndsibb76ZadOmpWvXrtltt91KnGztXHvttRkxYkSpY6y1mTNn5uWXX84222yTXXfdtdRxVuull15K\nt27d0rZt2yxZsiSTJk3Kq6++mq233jqHHXZY2rZtW+qIK3Xfffdljz32SKdOnUodZa0tW7Ysjz32\nWDp27Jg+ffrk0UcfzV/+8pd069Ytw4YNS8uWxf3f5t///vc89dRTmTdvXiorK7PVVltl8ODBhT1P\nAACAtePBFuvApEmT8thjj2XQoEGprq5OktTW1jYtGz58eIkTfjIPPvhg9t1331LHWKn77rsv999/\nf7p165bXX389xx9/fAYMGJAkGTlyZMaOHVvihCt31113Zdq0aamvr0+fPn3y0ksvpXfv3pkxY0Z2\n3XXXHHbYYaWOuFL/+H02Njbmz3/+c3beeeckH37nRTVq1KhcccUVSZLJkyfn/vvvzx577JFnn302\nu+++e6H/fH7rW9/KlVdemRYtWuTGG2/MJptskoEDB2bGjBl5/fXX83//7/8tdcSVOu6449KmTZt0\n6dIlgwYNyl577ZV27dqVOlazXHPNNamvr8/ixYuz2WabZdGiRdlzzz0zY8aMNDY2Fra4vu+++zJ1\n6tT07NkzzzzzTLbbbrtsttlm+eMf/5iTTz45vXv3LnVE4B8sWLAg7du3L3UMoIy9//77+cUvfpEp\nU6ZkwYIFqaioSPv27dO/f/8MHz48m222WakjUhDvvPNO7rrrrlRUVOSoo47Kb37zmzz11FPp1q1b\nTjjhhHTs2LHUEWmm4g4pKCMPPvhgxo0bt8IIjUMOOSTf+ta3Cl0SrM6dd95Z2BLvgQceyNixY9Om\nTZvMmTMn3//+9zN37twcdNBBKXIv/eSTT+bKK6/M0qVLc8opp+SGG25I27Zt88UvfjHnn39+YUu8\n2tradOvWLfvvv38qKirS2NiYV199NYceemipo61RfX19068feOCBXHjhhWnXrl0OPfTQXHDBBYX+\n89nY2JgWLVokSV599dWmMnWnnXbKueeeW8poq9WlS5eMGTMmM2bMyOOPP54777wz3bt3z6BBg7Ln\nnntm0003LXXEVXrjjTdy1VVXpb6+PqeddlpuvPHGVFZW5nOf+1yhv/MHHnggV155ZSorK3PIIYfk\niiuuyOjRo3PAAQfke9/7Xr73ve+VOuIquQBhbZTrRUhdXd1yrxsbG3P++ec3/b1eVVVVilifOu++\n+24233zzUsfYaL3yyiuZOHFiOnbsmK9+9au54YYb8vLLL6dr16455ZRT8tnPfrbUETc648ePT+/e\nvTN69Oh06NAhyYd/Tz700EMZP358vvOd75Q44dq7/PLLc/7555c6xiq9//77mTRpUubNm5d+/fpl\n8ODBTesmTJiQk08+uYTpVu26667LbrvtlsWLF+fiiy/O4MGDM2rUqEyZMiU33XRTvv3tb5c6Is2k\nxFsHKioqMn/+/HTu3Hm55fPnz09FRUWJUjXPqkbyNDY2ZsGCBRs4TfM1NjY2TaHdYostMnr06Iwb\nNy5z584tdInXokWLVFZWZpNNNkmXLl2aprm1bt260OfKFVdckfvuuy933313jj322Gy33XZp3bp1\nevXqVepoa9TY2Ji6uro0NjamsbGxaURYmzZtmgqyotpmm22aRsR+5jOfySuvvJLtt98+s2fPLvS0\nzoqKilRWVmbXXXfNrrvummXLlmXatGl59NFHc/vtt+fmm28udcRVamxszLJly7Jo0aIsXrw477//\nfqqqqrJ06dLlCuEiqq+vT2VlZZYuXZpFixYlSTp16lT43BvjBUhS7IuQcr0AScr3IuSkk05a4RYD\ntbW1GTlyZCoqKnLttdeWKNmaffw2Je+//35uu+22vPLKK9lmm21y3HHHNf25LZqf/OQnOfTQQ9Ou\nXbu88sorGT9+fCoqKlJfX58RI0YU+meYkSNHZo899sigQYOy5ZZbljpOs02YMCFHHnlk3nvvvVx4\n4YU57rjjcuGFF2bGjBmZMGFCLrvsslJHXKVFixbll7/8ZdNtKVq2bJktt9wyBxxwQIYOHVrqeKs0\nZ86cXHDBBcst69ChQ4YPH54HH3ywRKnW7NVXX13lutdee23DBfkErr/++my11VbZc8898+CDD+bJ\nJ5/MWWedlVatWuWll14qdbxVWrBgQQ488MAkyf333980kOHAAw/MH/7wh1JGYy0V9yqwjBx//PH5\n93//92y11VapqalJkrz99tt56623ctJJJ5U43eotWLAgF1xwwQojHRobG3PhhReWKNWatW/fPq+9\n9lq22267JB8WMuedd15uuOGGvPHGG6UNtxotW7bM4sWLs8kmm2TMmDFNy99///1UVhb3OTMfje7Z\na6+9ctttt6V9+/aFLwY+8v777+e8885LY2NjU+HesWPHLFq0qNCFb5KcdtppufXWW3P33Xdn8803\nz3e+853U1NSkpqYmp556aqnjrdI/fq8tW7ZM//79079//yxevLhEqZpn3333zdlnn52GhoYcffTR\n+f73v58tttgiL730Uvbee+9Sx1ul/fffP6NGjcoOO+yQmTNn5ktf+lKSZOHChYUf4VOuFyBJ+V6E\nlOsFSFK+FyHHHHNMnn322Rx77LHZdtttkyRnnnlmrrvuuhInW7P//u//birxfvzjH6djx44ZOXJk\nnnrqqfzoRz8qbHE6derU/Nu//VuSZOLEiTn77LOzww47ZPbs2bnmmmuW+zmsaOrq6vLee+/l4osv\nTocOHTJo0KDsvffeTbftKar6+vr069cvyYcl6sCBA5Mku+yyS26//fZSRluja665JnvssUcuuOCC\nPPHEE1m0aFEGDRqUn//855k9e3a++tWvljriSnXu3Dm//OUvM2TIkBX+IazI9yYeNWrUKov09957\nbwOnWTt///vfmwbC7LHHHrn77rvz7//+74X9u/AjH//5fMiQIcuta2ho2NBx+Cco8daBvn375uqr\nr87LL7+83IMtdthhh0IXM0my2267ZdGiRU1l2McV+V8oR4wYscIoqhYtWmTEiBEZNmxYiVKt2cUX\nX5xWrVolyXLnxrJly3LmmWeWKlaz1dTU5Fvf+lamTp1a6CmRH7eqC6SKiopCT49MkrZt2+bMM8/M\n+++/nzlz5qShoSHV1dWFHfXwkbPPPnuV6zbZZJMNmGTtHXLIIU1lXXV1dYYMGZIZM2Zk2LBh2WGH\nHUqcbtUOOuig7LLLLpk1a1YOPfTQdOvWLUnSrl27XHzxxSVOt3rlegGSlO9FSLlegCTlexFy6KGH\nZu+9985tt92WmpqaHHnkkYUegb8qr7zySq688sokH/59+fDDD5c40ao1NDSkvr4+LVq0yJIlS5r+\nDu/atWuWLl1a4nSrV1VVla997Wv52te+lhdeeCGPPfZYRo4cma233jqDBg0q7M+6rVq1yvTp0/P+\n+++noqIif/zjH7PHHnvk+eefL/w10dy5c5tG3B1yyCEZNWpUjjjiiJxxxhn51re+VdgS7+yzz86k\nSZMyevTopllUHTp0yO67755zzjmnxOlWbeutt84pp5ySrbbaaoV1p59+egkSNd+yZcvS0NDQdE4f\ndthhqa6uzkUXXdQ0E6KI+vfvn0WLFqVNmzY5+uijm5a/9dZb6dq1awmTsbaUeOtIZWVlevToUeoY\na211f0meddZZGzDJ2vloxOPK7LTTThswydr5qMD7R+3atSubG/8nH5a/5fY03X+0ySabZIstPmRz\nygAAD9NJREFUtih1jGZp27btSov2oir3HwQ+PtJhs802axpJUHTbbLNNttlmm1LHWGvlegGSlO9F\nSLlegCTlfRHy0T+EPf3007n00ksLPzL5IwsWLMivf/3rNDY25oMPPmga2Z6sOPK6SD7/+c/niiuu\nyPDhw7Prrrvm1ltvzZ577pnnnnuurP6f2rNnz/Ts2TMnnnhinn322Tz++OOFLfG+/vWv5yc/+Ukq\nKipywQUX5He/+12uv/76VFdXF3oGQfLhz4UzZ87MTjvtlKeffrppFHtlZWWhz/Oqqqrsu+++6dOn\nT3r06NF0u6Fk+anwRfOVr3xlld/rCSecsIHTrJ3dd989zz33XPr06dO0bOjQoenQoUNuueWWEiZb\nvaOOOiqzZs1KbW1tdtxxx6ZzZcstt8z+++9f4nSsDU+nBQAKqchPSU8+fFjRtttuu9Ly6KMRKEU0\nceLE9OnTZ7kLkOTDC75bbrkl11xzTYmS/XOKfr583JIlS/LWW29l2223LXzuu+66a7nX//qv/5p2\n7drlnXfeycSJEwv71O4k+fOf/5zf/e53+dvf/pb6+vp06tQpAwYMyL777lvo++L+x3/8x2pHtZej\nop/nr7/+en74wx/mrbfeytZbb53TTz89Xbt2zcKFC/Poo4/moIMOKnXElbrvvvty//33p1u3bnn9\n9ddz/PHHZ8CAAUk+vLfiRw/PKaKVFUpJscvHj6wq+zPPPNM0pbxofvOb3+S3v/1tWZ4rLM9IPACg\nkIr8lPQkqx2lWeTptMccc8xKl/ft2zdf/vKXN3Cadafo58vHtW7duuneeEXP/ZWvfGWlyzt06JDe\nvXtv4DRrp3fv3ivNWPRCaXUFXtGzr0rRz/PPfOYzueKKK1ZY3q5du0LfQuaBBx7I2LFj06ZNm8yZ\nMyff//73M3fu3Bx00EGFHkH48fLxhz/84XKF0sfvw1lEHy/D/jH7HXfcUdgSb/LkyWV5rrAiJR4A\nUDLl+pT0NSn6BeuqFD13uZ4v5Zp7TYp+vqxKueZOip3deb7hNTY2No0E22KLLTJ69OiMGzcuc+fO\nLXQxU67lY1K+ZVi5niusSIkHAJRMuT4lPSnfC9ZyzZ2U7/lSrrmT8j1fyjV3Ur7ZnecbXvv27fPa\na6813eexTZs2Oe+883LDDTfkjTfeKG241SjnQqlcs5frucKKlHgAQMmU61PSk/K9YC3X3En5ni/l\nmjsp3/OlXHMn5Zvdeb7hjRgxYoX7O7Zo0SIjRowo7ANQkvIulMo1e7meK6xIiQcAlEy5PiU9Kd8L\n1nLNnZTv+VKuuZPyPV/KNXdSvtmd5xteTU3NKtfttNNOGzDJ2innQqlcs5frucKKPJ0WAAAAAAqu\nstQBAAAAAIDVU+IBAAAAQMEp8QCAT73Zs2fn3HPPzde+9rXcd999pY6znDlz5uTII49MfX39Ojvm\nkUcembfeemudHe+TWNvPdeaZZ+bZZ59dz6kAAIpLiQcArHcrK2Aeeuihwjz175e//GV69+6dH//4\nxznooINWWP+///u/ufTSS3PCCSfk+OOPz8iRIzN16tQkyZ///OecdtppGzryevHoo4/mnHPOWW7Z\nJZdcstJlkyZN2pDRAAA+9ZR4AMBG5ZOMWHv77bezzTbbrHL92LFj06dPn9x0002ZMGFCTjjhhLRt\n2/afiblBrO130atXr8yaNSsLFy5s2v/111/PkiVLllv24osvpmfPnus8LwAAq9ay1AEAAJLkzTff\nzIQJE/Laa6+luro6X/3qV9O/f/8kyejRo/O5z30u+++/f5IPR/E98MADueSSS5J8OD30xBNPzH33\n3Zf6+vpcd911Kxz/6aefzn/913+ltrY22223XU4++eRsvfXWufjii/P8889n5syZ+c///M+MHTs2\nXbt2bdpv4cKFmTNnTvbff/+0bPnhj0477bRTkmTRokW5/PLLs2zZshx77LFJkquvvjq1tbW59dZb\nM2vWrLRu3Tp77rlnjjvuuKb9jzzyyJx88sn59a9/nYULF2bw4ME56aSTUlFRkYaGhkycODEPP/xw\nNt100xxyyCHLfY4HH3ww99xzT+bNm5d27drlS1/6Ug444IAkH44K/MEPfpAvfOELuffee9OnT598\n4xvfyD333JNf//rXqaioyFFHHbXK34Pq6up06dIlzz//fAYOHJi//vWv2WabbVJTU7PcssbGxmy/\n/fZJktra2txyyy154YUX0qZNmxx88MFNoxkbGhpyzz335IEHHsh7772XnXfeOaecckqqqqpWeO8n\nn3wyt99+e0aOHJltt902jzzySO64444sWrRohe/g5ZdfXuX3O2HChLRu3Tpf+9rXmrYfO3Zsevfu\nvcJxAADKiZF4AEDJLVu2rGm024QJE3LiiSfmmmuuyezZs5t9jClTpuTyyy/P+PHjV1g3e/bsXH31\n1Tn++OMzYcKE9OvXL2PHjs2yZcty0UUXpWfPnjnxxBNz++23L1fgJcnmm2+eLbfcMj/4wQ/yxz/+\nMe+8807TujZt2uT8889Px44dc/vtt+f2229PdXV1Kisrc9xxx+Xmm2/OpZdemueeey7333//csed\nOnVqrrjiilx11VV54oknMn369CTJ5MmTM3Xq1IwdOzZjxozJU089tdx+7du3z8iRI3PbbbfljDPO\nyG233ZZXX321af0777yTurq6XH/99Tn11FMzbdq0/OpXv8p3vvOdXH311ZkxY8Zqv8eePXvmhRde\nSJI8//zz2WmnnbLTTjstt2zHHXdMy5Yt09DQkLFjx2a77bbLjTfemO9+97u57777Mm3atCTJb3/7\n20yZMiWjR4/OjTfemKqqqkyYMGGF93zwwQfzk5/8JBdeeGG23XbbvPnmm7npppsyYsSI3HjjjXn3\n3Xczb968pu1X9/0OHTo0jz32WBoaGpJ8WMLOmDEjgwcPXu3nBgAoOiUeALBBXHnllTn++OOb/vt4\nmfPSSy9l0aJFGT58eFq2bJmdd945u+22Wx599NFmH//LX/5yqqqq0rp16xXWPf744+nXr1/69OmT\nli1b5tBDD82SJUvyl7/8ZY3HraioyEUXXZTOnTvn9ttvz6mnnpqLLroof/vb31a5T/fu3dOjR4+0\naNEiW2yxRYYNG5bnn39+uW2GDx+ezTbbLJ06dUrv3r3z2muvJUmeeOKJHHTQQenUqVOqqqoyfPjw\n5fbbbbfdsuWWW6aioiK9evVKnz59MnPmzOXyHnnkkWnVqlVat26dxx9/PEOHDs22226bNm3a5Ctf\n+cpqP2+vXr2aCruZM2emZ8+eyxV7M2fOTK9evZIkr7zyShYuXJgjjjgiLVu2TJcuXbL//vvn8ccf\nT5L8/ve/z9FHH52ampq0atUqX/nKV/LUU08tN8333nvvzT333JPRo0dnyy23TPLhqLzdd989vXr1\nSqtWrXLUUUeloqKiWd/vDjvskLZt2+a5555L8uHvfe/evdOhQ4fVfm4AgKIznRYA2CDOPffc9OnT\np+n1R1Nik2T+/Pnp1KlTKiv/378vdu7cObW1tc0+fk1NzSrXzZ8/P507d256XVlZmU6dOjX7+DU1\nNTnppJOSfHj/vB/96Ee59tprc9lll610+9mzZ+fHP/5xXnnllSxZsiT19fXp3r37ctt8vFTaZJNN\nsmjRoqasnTp1alr38dxJ8swzz+RnP/tZZs+encbGxixevDjbbrtt0/p27dotV2TOnz9/uff+x+P9\no549e+aGG25IXV1dXnrppXzzm99MmzZtMn/+/NTV1WXmzJlN02Xnzp2b+fPn5/jjj2/av6Ghoel+\neXPnzs1VV121XAFXWVmZBQsWNL3+1a9+lcMPP3y537/a2trlXrdp0yabb7550+s1fb9DhgzJI488\nkj59+uR//ud/cuCBB672MwMAlAMlHgBQch07dszbb7+dhoaGpiLv7bffzlZbbZXkw5Jr8eLFTdt/\nfErrRz5eFK3s+G+88UbT68bGxrz99tuprq5e66ydOnXKv/7rv+bqq69e5ftOmDAh2223Xc4666xs\nuummuffee/Pkk0826/gffRcf+fivly5dmnHjxmXEiBHp379/WrZsme9973vL7f+PeTp27LjcVNSP\nH29lunTpkurq6kyePDmdOnVKmzZtkiQ9evTI5MmTs2jRovTo0SPJh9/FFltskWuuuWalx6qpqcnp\np5/edA/Bj5szZ06S5IILLsjll1+eDh06ZODAgU2ZZ82a1bTt4sWL8+677za9XtP3+7nPfS7/5//8\nn7z22mt58803s8cee6z2MwMAlAPTaQGAkttxxx2zySab5J577smyZcvy5z//OX/6058yaNCgJMl2\n222XP/7xj1m8eHHeeuut/OEPf1ir4++999555plnMmPGjCxbtiy/+tWv0qpVq/zLv/zLGvetq6vL\nnXfembfeeisNDQ1ZuHBhHnzwwey4445JPrxH3bvvvpv333+/aZ8PPvggbdu2TZs2bTJr1qz87ne/\na3bWvfbaK7/5zW8yb9681NXVZdKkSU3rli1blqVLl6Zdu3Zp0aJFnnnmmTz77LNrPN5DDz2UN998\nM4sXL85dd921xgw77bRT7r333uXKt4+Wbb/99k0j/XbYYYdsuummmTRpUpYsWZKGhoa88cYbefnl\nl5MkBxxwQO64447MnTs3yYf3p5syZcpy77XNNtvk/PPPz80335ynn346STJw4MD86U9/ysyZM7Ns\n2bL89Kc/TWNjY9M+a/p+a2pqsv322+faa6/NnnvuudIp1gAA5cZIPACg5Fq2bJmRI0dmwoQJ+cUv\nfpHq6uqMGDEi3bp1S5IcfPDBeeWVV/L1r389n/nMZzJ48OA1PqDh47p27ZpvfOMbueWWW5qeTjty\n5Mimp8WuKducOXNyySWXZOHChWnTpk169+6dM888M0nSrVu3DBo0KCNGjEhDQ0O+//3v59hjj82P\nfvSj/PKXv8xnP/vZ7L333k33aFuT/fffP7Nnz865556bTTfdNIceemjTvptuumlOOOGEjB8/PkuX\nLs3uu+/e9ATfVenXr18OPvjgXHzxxamsrMxRRx21xnsN9urVK4899thyJV7Pnj1z++23Z999921a\nVllZmZEjR+bHP/5xzjzzzCxbtixdu3ZtegLuR9NuL7300syfPz/t27fPXnvtlQEDBiz3ftttt13O\nO++8jBkzJi1atEi/fv1y0kkn5eqrr87ixYtzyCGHLDe9tjnf75AhQ3LttdcuN9UXAKCcVTR+/J81\nAQBgI/D888/nBz/4Qa6//vrVTrUGACgXptMCALBRWbZsWe67777sv//+CjwAYKOhxAMAYKPx5ptv\n5oQTTsg777zTNJ0XAGBjYDotAAAAABSckXgAAAAAUHBKPAAAAAAoOCUeAAAAABScEg8AAAAACk6J\nBwAAAAAF9/8BqRGYKS2mSe4AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7faa05de02e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = (e[['1 Peak', '2 Peaks']][::-1].plot.bar(figsize=(20,10),\n",
" legend=True,\n",
" cmap='Set3'))\n",
"\n",
"ax.set_axis_bgcolor('black')\n",
"ax.set_title(\"Relative Counts for Mono and Bimodal Distributions for Unique Route-Direction-Trip-Stop Combination\")\n",
"ax.set_xlabel(\"Hour of Standard Weekday\")\n",
"ax.set_ylabel(\"Counts\")\n",
"\n",
"plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))"
]
},
{
"cell_type": "code",
"execution_count": 199,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Beginning morning headways-by-hour analysis...\n",
"Analyzing route 1/239 (B1)\n",
"Analyzing route 2/239 (B11)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py:137: RuntimeWarning: Mean of empty slice.\n",
"/usr/local/lib/python3.6/site-packages/numpy/core/_methods.py:80: RuntimeWarning: invalid value encountered in double_scalars\n",
" ret = ret.dtype.type(ret / rcount)\n",
"/usr/local/lib/python3.6/site-packages/numpy/core/fromnumeric.py:2889: RuntimeWarning: Mean of empty slice.\n",
" out=out, **kwargs)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Analyzing route 3/239 (B12)\n",
"Analyzing route 4/239 (B13)\n",
"Analyzing route 5/239 (B14)\n",
"Analyzing route 6/239 (B15)\n",
"Analyzing route 7/239 (B16)\n",
"Analyzing route 8/239 (B17)\n",
"Analyzing route 9/239 (B2)\n",
"Analyzing route 10/239 (B20)\n",
"Analyzing route 11/239 (B24)\n",
"Analyzing route 12/239 (B25)\n",
"Analyzing route 13/239 (B26)\n",
"Analyzing route 14/239 (B3)\n",
"Analyzing route 15/239 (B31)\n",
"Analyzing route 16/239 (B32)\n",
"Analyzing route 17/239 (B35)\n",
"Analyzing route 18/239 (B36)\n",
"Analyzing route 19/239 (B37)\n",
"Analyzing route 20/239 (B38)\n",
"Analyzing route 21/239 (B39)\n",
"Analyzing route 22/239 (B4)\n",
"Analyzing route 23/239 (B41)\n",
"Analyzing route 24/239 (B42)\n",
"Analyzing route 25/239 (B43)\n",
"Analyzing route 26/239 (B44)\n",
"Analyzing route 27/239 (B44+)\n",
"Analyzing route 28/239 (B45)\n",
"Analyzing route 29/239 (B46)\n",
"Analyzing route 30/239 (B46+)\n",
"Analyzing route 31/239 (B47)\n",
"Analyzing route 32/239 (B48)\n",
"Analyzing route 33/239 (B49)\n",
"Analyzing route 34/239 (B52)\n",
"Analyzing route 35/239 (B54)\n",
"Analyzing route 36/239 (B57)\n",
"Analyzing route 37/239 (B6)\n",
"Analyzing route 38/239 (B60)\n",
"Analyzing route 39/239 (B61)\n",
"Analyzing route 40/239 (B62)\n",
"Analyzing route 41/239 (B63)\n",
"Analyzing route 42/239 (B64)\n",
"Analyzing route 43/239 (B65)\n",
"Analyzing route 44/239 (B67)\n",
"Analyzing route 45/239 (B68)\n",
"Analyzing route 46/239 (B69)\n",
"Analyzing route 47/239 (B7)\n",
"Analyzing route 48/239 (B70)\n",
"Analyzing route 49/239 (B74)\n",
"Analyzing route 50/239 (B8)\n",
"Analyzing route 51/239 (B82)\n",
"Analyzing route 52/239 (B83)\n",
"Analyzing route 53/239 (B84)\n",
"Analyzing route 54/239 (B9)\n",
"Analyzing route 55/239 (BX3)\n",
"Analyzing route 56/239 (BX4)\n",
"Analyzing route 57/239 (BX4A)\n",
"Analyzing route 58/239 (BX5)\n",
"Analyzing route 59/239 (BX6)\n",
"Analyzing route 60/239 (BX7)\n",
"Analyzing route 61/239 (BX8)\n",
"Analyzing route 62/239 (BX9)\n",
"Analyzing route 63/239 (BX1)\n",
"Analyzing route 64/239 (BX10)\n",
"Analyzing route 65/239 (BX11)\n",
"Analyzing route 66/239 (BX12)\n",
"Analyzing route 67/239 (BX12+)\n",
"Analyzing route 68/239 (BX13)\n",
"Analyzing route 69/239 (BX15)\n",
"Analyzing route 70/239 (BX16)\n",
"Analyzing route 71/239 (BX17)\n",
"Analyzing route 72/239 (BX18)\n",
"Analyzing route 73/239 (BX19)\n",
"Analyzing route 74/239 (BX2)\n",
"Analyzing route 75/239 (BX20)\n",
"Analyzing route 76/239 (BX21)\n",
"Analyzing route 77/239 (BX22)\n",
"Analyzing route 78/239 (BX24)\n",
"Analyzing route 79/239 (BX26)\n",
"Analyzing route 80/239 (BX27)\n",
"Analyzing route 81/239 (BX28)\n",
"Analyzing route 82/239 (BX29)\n",
"Analyzing route 83/239 (BX30)\n",
"Analyzing route 84/239 (BX31)\n",
"Analyzing route 85/239 (BX32)\n",
"Analyzing route 86/239 (BX33)\n",
"Analyzing route 87/239 (BX34)\n",
"Analyzing route 88/239 (BX35)\n",
"Analyzing route 89/239 (BX36)\n",
"Analyzing route 90/239 (BX38)\n",
"Analyzing route 91/239 (BX39)\n",
"Analyzing route 92/239 (BX40)\n",
"Analyzing route 93/239 (BX41)\n",
"Analyzing route 94/239 (BX41+)\n",
"Analyzing route 95/239 (BX42)\n",
"Analyzing route 96/239 (BX46)\n",
"Analyzing route 97/239 (M1)\n",
"Analyzing route 98/239 (M2)\n",
"Analyzing route 99/239 (M3)\n",
"Analyzing route 100/239 (M4)\n",
"Analyzing route 101/239 (M5)\n",
"Analyzing route 102/239 (M7)\n",
"Analyzing route 103/239 (M8)\n",
"Analyzing route 104/239 (M9)\n",
"Analyzing route 105/239 (M10)\n",
"Analyzing route 106/239 (M100)\n",
"Analyzing route 107/239 (M101)\n",
"Analyzing route 108/239 (M102)\n",
"Analyzing route 109/239 (M103)\n",
"Analyzing route 110/239 (M104)\n",
"Analyzing route 111/239 (M106)\n",
"Analyzing route 112/239 (M11)\n",
"Analyzing route 113/239 (M116)\n",
"Analyzing route 114/239 (M12)\n",
"Analyzing route 115/239 (M14A)\n",
"Analyzing route 116/239 (M14D)\n",
"Analyzing route 117/239 (M15)\n",
"Analyzing route 118/239 (M15+)\n",
"Analyzing route 119/239 (M20)\n",
"Analyzing route 120/239 (M21)\n",
"Analyzing route 121/239 (M22)\n",
"Analyzing route 122/239 (M23+)\n",
"Analyzing route 123/239 (M31)\n",
"Analyzing route 124/239 (M34+)\n",
"Analyzing route 125/239 (M34A+)\n",
"Analyzing route 126/239 (M35)\n",
"Analyzing route 127/239 (M42)\n",
"Analyzing route 128/239 (M50)\n",
"Analyzing route 129/239 (M55)\n",
"Analyzing route 130/239 (M57)\n",
"Analyzing route 131/239 (M60+)\n",
"Analyzing route 132/239 (M66)\n",
"Analyzing route 133/239 (M72)\n",
"Analyzing route 134/239 (M79+)\n",
"Analyzing route 135/239 (M86+)\n",
"Analyzing route 136/239 (M96)\n",
"Analyzing route 137/239 (M98)\n",
"Analyzing route 138/239 (METJE)\n",
"Analyzing route 139/239 (Q1)\n",
"Analyzing route 140/239 (Q2)\n",
"Analyzing route 141/239 (Q3)\n",
"Analyzing route 142/239 (Q4)\n",
"Analyzing route 143/239 (Q5)\n",
"Analyzing route 144/239 (Q12)\n",
"Analyzing route 145/239 (Q13)\n",
"Analyzing route 146/239 (Q15)\n",
"Analyzing route 147/239 (Q15A)\n",
"Analyzing route 148/239 (Q16)\n",
"Analyzing route 149/239 (Q17)\n",
"Analyzing route 150/239 (Q20A)\n",
"Analyzing route 151/239 (Q20B)\n",
"Analyzing route 152/239 (Q24)\n",
"Analyzing route 153/239 (Q26)\n",
"Analyzing route 154/239 (Q27)\n",
"Analyzing route 155/239 (Q28)\n",
"Analyzing route 156/239 (Q30)\n",
"Analyzing route 157/239 (Q31)\n",
"Analyzing route 158/239 (Q32)\n",
"Analyzing route 159/239 (Q36)\n",
"Analyzing route 160/239 (Q42)\n",
"Analyzing route 161/239 (Q43)\n",
"Analyzing route 162/239 (Q44+)\n",
"Analyzing route 163/239 (Q46)\n",
"Analyzing route 164/239 (Q48)\n",
"Analyzing route 165/239 (Q54)\n",
"Analyzing route 166/239 (Q55)\n",
"Analyzing route 167/239 (Q56)\n",
"Analyzing route 168/239 (Q58)\n",
"Analyzing route 169/239 (Q59)\n",
"Analyzing route 170/239 (Q76)\n",
"Analyzing route 171/239 (Q77)\n",
"Analyzing route 172/239 (Q83)\n",
"Analyzing route 173/239 (Q84)\n",
"Analyzing route 174/239 (Q85)\n",
"Analyzing route 175/239 (Q88)\n",
"Analyzing route 176/239 (S40)\n",
"Analyzing route 177/239 (S42)\n",
"Analyzing route 178/239 (S44)\n",
"Analyzing route 179/239 (S46)\n",
"Analyzing route 180/239 (S48)\n",
"Analyzing route 181/239 (S51)\n",
"Analyzing route 182/239 (S52)\n",
"Analyzing route 183/239 (S53)\n",
"Analyzing route 184/239 (S54)\n",
"Analyzing route 185/239 (S55)\n",
"Analyzing route 186/239 (S56)\n",
"Analyzing route 187/239 (S57)\n",
"Analyzing route 188/239 (S59)\n",
"Analyzing route 189/239 (S61)\n",
"Analyzing route 190/239 (S62)\n",
"Analyzing route 191/239 (S66)\n",
"Analyzing route 192/239 (S74)\n",
"Analyzing route 193/239 (S76)\n",
"Analyzing route 194/239 (S78)\n",
"Analyzing route 195/239 (S79+)\n",
"Analyzing route 196/239 (S81)\n",
"Analyzing route 197/239 (S84)\n",
"Analyzing route 198/239 (S86)\n",
"Analyzing route 199/239 (S89)\n",
"Analyzing route 200/239 (S90)\n",
"Analyzing route 201/239 (S91)\n",
"Analyzing route 202/239 (S92)\n",
"Analyzing route 203/239 (S93)\n",
"Analyzing route 204/239 (S94)\n",
"Analyzing route 205/239 (S96)\n",
"Analyzing route 206/239 (S98)\n",
"Analyzing route 207/239 (X1)\n",
"Analyzing route 208/239 (X10B)\n",
"Analyzing route 209/239 (X10)\n",
"Analyzing route 210/239 (X11)\n",
"Analyzing route 211/239 (X12)\n",
"Analyzing route 212/239 (X14)\n",
"Analyzing route 213/239 (X15)\n",
"Analyzing route 214/239 (X17)\n",
"Analyzing route 215/239 (X17A)\n",
"Analyzing route 216/239 (X17J)\n",
"Analyzing route 217/239 (X19)\n",
"Analyzing route 218/239 (X2)\n",
"Analyzing route 219/239 (X21)\n",
"Analyzing route 220/239 (X22)\n",
"Analyzing route 221/239 (X22A)\n",
"Analyzing route 222/239 (X27)\n",
"Analyzing route 223/239 (X28)\n",
"Analyzing route 224/239 (X3)\n",
"Analyzing route 225/239 (X30)\n",
"Analyzing route 226/239 (X31)\n",
"Analyzing route 227/239 (X37)\n",
"Analyzing route 228/239 (X38)\n",
"Analyzing route 229/239 (X4)\n",
"Analyzing route 230/239 (X42)\n",
"Analyzing route 231/239 (X5)\n",
"Analyzing route 232/239 (X63)\n",
"Analyzing route 233/239 (X64)\n",
"Analyzing route 234/239 (X68)\n",
"Analyzing route 235/239 (X7)\n",
"Analyzing route 236/239 (X8)\n",
"Analyzing route 237/239 (X9)\n",
"Analyzing route 238/239 (MS1)\n",
"Analyzing route 239/239 (MS2)\n",
"Done\n",
" 00-05 mins 05-10 mins 10-15 mins 15-20 mins 20-25 mins 25-30 mins \\\n",
"0 NaN NaN 10.0 NaN NaN NaN \n",
"1 2.5 NaN NaN NaN NaN NaN \n",
"2 2.5 NaN NaN NaN NaN NaN \n",
"3 2.5 NaN NaN NaN NaN NaN \n",
"4 NaN 7.5 NaN NaN NaN NaN \n",
"\n",
" 30-35 mins 35-40 mins 40-45 mins 45-50 mins 50-55 mins 55-60 mins \n",
"0 NaN NaN 40.0 NaN NaN NaN \n",
"1 NaN NaN 40.0 NaN NaN NaN \n",
"2 NaN NaN 40.0 NaN NaN NaN \n",
"3 NaN NaN 40.0 NaN NaN NaN \n",
"4 30.0 NaN NaN NaN NaN NaN \n"
]
}
],
"source": [
"def get_peak_times(headways, block_size=5):\n",
" # arrange in order\n",
" np_hwy = np.array(sorted(headways))\n",
" # let's work in terms of minutes, headways originally in seconds\n",
" np_hwy = np_hwy/60\n",
" \n",
" # these could be dynamic but for now\n",
" # we will work in 60 minute blocks\n",
" min_hw = 0\n",
" max_hw = 59\n",
" time_frame = 60\n",
" \n",
" floating_counts = []\n",
" for tb in range(round(time_frame/5)):\n",
" m = tb * 5 + min_hw\n",
" start_time = m - block_size\n",
" end_time = m + block_size\n",
"\n",
" if start_time <= min_hw:\n",
" start_time = min_hw\n",
"\n",
" if end_time >= max_hw:\n",
" end_time = max_hw\n",
"\n",
" s = np_hwy[(np_hwy >= start_time) & (np_hwy <= end_time)].size\n",
" floating_counts.append((m, s))\n",
"\n",
" min_marks = list(map(lambda x: x[0], floating_counts))\n",
" counts = list(map(lambda x: x[1], floating_counts))\n",
" booleaned = list(map(lambda x: 1 if x >= 1 else 0, counts))\n",
" \n",
" unique_peaks = np.array(list(unique_justseen(booleaned))).sum()\n",
" \n",
" if unique_peaks > 1:\n",
" # get sub lists for approx peak times\n",
" list_of_tblocks = []\n",
" curr_b = []\n",
" for i, b in enumerate(booleaned):\n",
" if b == 0:\n",
" if len(curr_b) > 0:\n",
" list_of_tblocks.append(curr_b)\n",
" curr_b = []\n",
" else:\n",
" curr_b.append(min_marks[i])\n",
" \n",
" avg_times = []\n",
" for tblock in list_of_tblocks:\n",
" avg_times.append(np.array(tblock).mean())\n",
" \n",
" else:\n",
" avg_times = []\n",
"\n",
" final_avgs = [np.nan] * 12\n",
" for at in avg_times:\n",
" if at >= 0 and at < 5:\n",
" final_avgs[0] = at\n",
" elif at >= 5 and at < 10:\n",
" final_avgs[1] = at\n",
" elif at >= 10 and at < 15:\n",
" final_avgs[2] = at\n",
" elif at >= 15 and at < 20:\n",
" final_avgs[3] = at\n",
" elif at >= 20 and at < 25:\n",
" final_avgs[4] = at\n",
" elif at >= 25 and at < 30:\n",
" final_avgs[5] = at\n",
" elif at >= 30 and at < 35:\n",
" final_avgs[6] = at\n",
" elif at >= 35 and at < 40:\n",
" final_avgs[7] = at\n",
" elif at >= 40 and at < 45:\n",
" final_avgs[8] = at\n",
" elif at >= 45 and at < 50:\n",
" final_avgs[9] = at\n",
" elif at >= 50 and at < 55:\n",
" final_avgs[10] = at\n",
" elif at >= 55 and at < 60:\n",
" final_avgs[11] = at\n",
"\n",
" return final_avgs\n",
"\n",
"\n",
"\n",
"peak_dists_df = None\n",
"\n",
"unique_routes = gtfs_dfs['routes']['route_id'].values\n",
"\n",
"print('Beginning morning headways-by-hour analysis...')\n",
"for current_route_i in range(len(unique_routes)):\n",
" current_route = unique_routes[current_route_i]\n",
" print('Analyzing route {}/{} ({})'.format((current_route_i + 1), (len(unique_routes)), current_route))\n",
" \n",
" route_trips = gtfs_dfs['trips'][gtfs_dfs['trips']['route_id'] == current_route]\n",
" route_trips_directions = list(set(route_trips['direction_id'].values))\n",
"\n",
" for current_direction_i in range(len(route_trips_directions)):\n",
" current_direction = route_trips_directions[current_direction_i]\n",
" \n",
" route_service_ids = list(set(route_trips['service_id'].values))\n",
"\n",
" for current_service_id in route_service_ids:\n",
" dir_const = route_trips['direction_id'] == current_direction\n",
" serv_cons = route_trips['service_id'] == current_service_id\n",
" route_trips_ids = route_trips[(dir_const & serv_cons)]['trip_id'].values\n",
"\n",
" route_st_times = gtfs_dfs['stop_times'][gtfs_dfs['stop_times']['trip_id'].isin(route_trips_ids)]\n",
" route_st_ids = list(set(route_st_times['stop_id'].values))\n",
"\n",
" for route_st_id in route_st_ids:\n",
" single_stop_route = gtfs_dfs['stop_times'][gtfs_dfs['stop_times']['stop_id'] == route_st_id]\n",
"\n",
" single_stop_route_sorted = single_stop_route.sort_values(by='departure_time_sec', ascending=True)\n",
"\n",
" # results will contain a tuple (departure_time, preceding_headway)\n",
" deps = list(single_stop_route_sorted['departure_time_sec'].values)\n",
" \n",
" # get the last departure time of the day and make it the first\n",
" # in the list to be compared against arrivals\n",
" dep_last = deps[-1]\n",
"\n",
" # TODO: improve this hack\n",
" # handle if last departure was before midnight\n",
" if dep_last > 80000:\n",
" dep_last = dep_last - 86400\n",
" deps = [dep_last] + deps[:-1]\n",
" \n",
" arrs = single_stop_route_sorted['arrival_time_sec'].values\n",
" \n",
" headways = arrs - deps\n",
" secs_in_hr = (60.0 * 60.0)\n",
" hrs = np.array(list(map(lambda x: math.floor(x/secs_in_hr), deps)))\n",
"\n",
" bucketed = []\n",
" for hr in range(24):\n",
" subset = headways[hrs == hr]\n",
" count = len(subset)\n",
" mean = subset.mean()\n",
" med = np.median(subset)\n",
" \n",
" # handle when log(0) would be called\n",
" abs_diff = abs(mean - med)\n",
" if count > 0 and abs_diff > 1:\n",
" log_diff = round(math.log(abs_diff), 3)\n",
" else:\n",
" log_diff = 0\n",
" \n",
" # calculate the number of peaks in the hour\n",
" if count > 0:\n",
" cumulative_hwys = [subset[0]]\n",
" for hwy in subset[1:]:\n",
" cumulative_hwys.append(cumulative_hwys[-1] + (hwy))\n",
" peak_times = get_peak_times(cumulative_hwys)\n",
" else:\n",
" peak_times = [np.nan] * 6\n",
"\n",
" bucketed.append(peak_times)\n",
"\n",
" bucketed_df = pd.DataFrame(bucketed,\n",
" columns=['00-05 mins',\n",
" '05-10 mins',\n",
" '10-15 mins',\n",
" '15-20 mins',\n",
" '20-25 mins',\n",
" '25-30 mins',\n",
" '30-35 mins',\n",
" '35-40 mins',\n",
" '40-45 mins',\n",
" '45-50 mins',\n",
" '50-55 mins',\n",
" '55-60 mins'])\n",
"\n",
" if peak_dists_df is None:\n",
" peak_dists_df = bucketed_df\n",
" else:\n",
" peak_dists_df = peak_dists_df.append(bucketed_df)\n",
"\n",
"print('Done')\n",
"print(peak_dists_df.head())"
]
},
{
"cell_type": "code",
"execution_count": 201,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7faa04dc9438>"
]
},
"execution_count": 201,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABOQAAAKPCAYAAADNIhW/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs/WmYVuWZL27/ilksFAoLB0xUUGxQERSMUwCBmEFj26ho\nBAccE4wiup3TYrSlMQZRULeKigq6taOI3W6TdBCBxCEphsKB0OCA0e0AAk0LoiA87wdf6m8FFDDU\n0uB5HsdzpNZ0r2tdz0M+/LzXWmWlUqkUAAAAAKAQ9b7sAgAAAADg60QgBwAAAAAFEsgBAAAAQIEE\ncgAAAABQIIEcAAAAABRIIAcAAAAABRLIAQCb7I033kivXr2y9dZbp6ys7G8eb/78+SkrK8sf/vCH\nzVDdV8eXeV1lZWUZN27c5+4zefLklJWV5c033yyoqtruueeeNGjQYJOOOfXUU9O7d+86qmjT9OjR\nI2ecccbfzbgAwFeHQA4AvqBFixbl4osvzp577pkmTZqkVatW6datW+677758/PHHhdfTu3fvnHrq\nqYWca+jQoVmwYEGqq6vz9ttvf+Z+pVIpo0ePzgEHHJDy8vJsvfXW6dq1a0aPHp1SqVRIrV91V111\nVcrKyrLffvuts23WrFkpKyvbLKFZgwYNcs8999Rad/DBB+ftt9/OTjvt9DeN/VWz66671vStSZMm\n+Yd/+If84he/yJo1a77UutbW9FmfXXfdNUkyfvz43HDDDV9qrQBA3dq0/yQJACT5ZIbYoYcemgYN\nGuTqq69O586d07BhwzzzzDP55S9/mY4dO6ZTp05fdpl1Zt68eTnggAOyxx57fO5+p556ah555JH8\ny7/8S37wgx+krKwsTzzxRAYPHpynn356nYCoaKtWrUrDhg2/1BqSpLKyMnPmzMmMGTNqBXO33357\ndtlll7z++ut1ct5GjRplhx12qJOxv2yXXHJJzj///KxYsSKPPfZYLrjggpSVleWiiy760mr6dHj9\nzDPP5JhjjsmMGTOy4447Jknq16+fJKmoqPhS6gMAimOGHAB8AQMHDsxHH32UGTNmpF+/funQoUP2\n2GOPnHLKKZk+fXpNULVq1apceumlad26dRo1apQOHTrkgQceqDXW+m4t/OvZbrvuumuuvPLKDBo0\nKBUVFdl+++0zePDgmpl4p556ap588snce++9NbNtJk+enOST2Wxt2rRJ48aNU1lZme9+97tZsWLF\nZ17b+++/n7PPPjuVlZVp3LhxunTpkv/8z/+sVe+TTz6Zu+++O2VlZZ85K2/8+PG57777cvfdd+f8\n889Pu3btsscee2TQoEG56667cu+992b8+PG1jpk/f3569eqVrbbaKm3atMmDDz5Ya/uGruV3v/td\nDjnkkGy11VZp3bp1BgwYkEWLFtVsX3u746hRo7LrrrumcePGGTVqVLbddtt8+OGHtc513XXX5Zvf\n/GbNrKqXX345xxxzTJo3b54WLVrk8MMPzwsvvFDrmH/7t3/L7rvvniZNmuTggw/O888//5l9/rRt\nttkmxx57bEaPHl2z7oMPPsj999+f008/vda+n3Wb6fpmwK216667ZvXq1RkwYEDN72N9Y61dfuKJ\nJ3LQQQdlq622yv7775+XXnopL730Ug499NA0bdo0BxxwQGbPnl3rHE888UT233//NG7cOK1atcrA\ngQOzfPnymu1r1qzJP//zP6dVq1YpLy/P8ccfnyVLltQa47XXXkufPn2y0047pWnTptlnn30yduzY\njerhXysvL88OO+yQ3XbbLeeff3569epV6/c2ffr0HH744SkvL09lZWX69OlTK/j8IrVUV1dnp512\nyoUXXrjeGaA77LBDzWdt6FZZWVmzrrKyMsm6t6z26NEjp59+en72s5+lVatWad68ea644oqsWbMm\nV199dbbffvtUVlbmiiuuqHW+VatW5aqrrspuu+2WJk2aZK+99srtt99ea58777wz7du3T5MmTVJR\nUZFu3bp9abcwA8DXiUAOADbR4sWL88QTT+SnP/1ptt1223W2N2zYMFtvvXWS5PLLL8/o0aNz4403\n5sUXX0z//v3Tv3//PPnkk5t83lGjRmXHHXfMH//4x4waNSo333xz7r333iTJTTfdlG9/+9vp27dv\n3n777bz99ts5+OCDM378+AwbNiw33XRT5s2bl9/97nf5/ve//7nnOe200/Lb3/4248aNS3V1dQ45\n5JAceeSRmTNnTpJPZvkcdNBBOfHEE/P222/npptuWu84Y8eOTdu2bdO3b991th1//PFp27btOkHk\nxRdfnNNOOy3V1dU58cQT069fv8ycOTNJNngtkyZNyj/+4z/mhBNOyPPPP58JEyZk/vz56dOnT61w\n5E9/+lMmTZqUxx57LLNmzcrJJ5+clStX5rHHHqtVy3333Zf+/funXr16effdd3PooYemVatW+f3v\nf5/nnnsue+65Z3r06JGFCxcmSWbOnJkf/ehHOe644zJr1qz8r//1vzJo0KDP7fWnnXXWWXnggQfy\nwQcfJEkefPDB7LTTTvn2t7+90WN8lqqqqtSvXz833nhjze/j81xxxRW59tprM3369DRq1Cg/+tGP\n8pOf/CQ///nPa9YNGDCgZv/nn38+Rx11VLp165ZZs2bl3nvvzeOPP54f//jHNfuMGjUqN9xwQ66/\n/vrMmDEj+++/f37+85/XOu+yZcvSs2fP/PrXv84LL7yQs846KwMGDMhTTz31N/dgq622yqpVq5Ik\ns2fPTvfu3XPQQQdl2rRpmTRpUurXr5/vfOc7NcHsptby5JNPpkePHrnwwgszfPjwzfJsxU97+OGH\ns2rVqvzhD3/IDTfckKFDh+aII47IsmXL8vvf/z6//OUvM3To0Pz617+uOebMM8/M+PHjc/vtt+fP\nf/5zrrzyylxyySW56667knwSSv74xz/OZZddlv/6r//KlClTcvLJJ2/WugGAz1ACADbJH//4x1KS\n0iOPPPK5+y1fvrzUqFGj0i233FJr/dFHH1067LDDapaTlMaOHVtrn169epVOOeWUmuVddtml9MMf\n/rDWPt/73vdKJ5xwwmceUyqVSjfccENpjz32KK1cuXJjLq00b968UpLS//2//7fW+s6dO5cGDBhQ\ns9y9e/fS6aef/rljtW/fvnTUUUd95vYf/vCHpQ4dOpRKpVLptddeKyUp/exnP6u1z0EHHVTq37//\nRl1L9+7dS5dcckmtda+//nopSWnmzJmlUqlUOuWUU0rbbrtt6f3336+13/HHH1/6wQ9+ULNcVVVV\nSlKaM2dOqVQqlYYMGVL61re+VeuYNWvWlNq0aVMaMWJEqVQqlfr161c6+OCDa+0zatSoUpLS73//\n+8/sw5AhQ0pt27YtlUqlUocOHUp33313qVQqlb71rW+Vhg8fXnrqqadKSUpvvPFGqVQqrbO8Vv36\n9UtjxoypWf7r39Vfb1/fWGuXH3300Zp9/u3f/q2UpPTwww/XrBs/fnwpSU0f+/fvX+ratWutsSdM\nmFAqKysrzZ8/v1QqlUqtW7cuXX755bX2OeaYY0r169f/zN6USqXSUUcdVTrjjDNqlk855ZRSr169\nPveYXXbZpXTNNdeUSqVSafXq1aXHH3+81KhRo5rfxymnnFI6/vjjax3z4Ycflrbaaqta176hWtb+\nO7j//vtLW2+9dWncuHGfW9enfdb3+OlxP72877771tqnQ4cOpb333rvWuo4dO5YuvPDCUqlUKr36\n6qulsrKy0p///Oda+/z85z+vGWv8+PGlbbbZprR06dKNrhsA2DzMkAOATVTayJcRvPzyy1m5cmW6\ndetWa3337t3z0ksvbfJ5//qZdDvttFPefffdzz2mb9++WbVqVXbZZZeceuqpGTt2bN5///3P3H/t\nbYh/XXO3bt2+UM2b6qCDDqq1fMghh9Scd0PXUlVVlRtvvDHl5eU1nw4dOiT55Jl3a7Vv3z7l5eW1\nznPKKafkP//zP7NgwYIkn8yOO+CAA7LnnnvWjD19+vRaYzdr1izz58+vGXv27Nk5+OCDa4176KGH\nbtL1n3nmmRk9enSef/75VFdXf2mzlfbdd9+av9c+Y65jx47rrFvbr5deemm9v/NSqZTZs2fnf/7n\nf/L//t//22B/Pvjgg1x66aXZa6+9UlFRkfLy8jzxxBNf6Bl611xzTcrLy9OkSZP06dMnp5xySq66\n6qokn3yfjz76aK3vs2XLlvnwww9rvs+NreU3v/lNTjrppDz44IPp16/fJte5sT79nSSffAef/k7W\nrlv7nUybNi2lUildunSpdZ1Dhw6tucbvfOc7adOmTXbbbbeccMIJueOOO/Lee+/V2TUAAP8fL3UA\ngE20xx57pF69epk9e3b69OnzN49XVla2Tsi39ta6T2vUqNE6x23orZGtW7fOnDlz8tRTT2XSpEm5\n5pprcskll+SPf/xjvvGNb/zNtX+edu3a5cUXX/zM7bNnz14nUPg8G7qWNWvW5JJLLslJJ520zrGf\nfnHB2tuJP+3www/PdtttlwceeCDnnHNOHnzwwZrwJvnk+We9evXKzTffvM6x67tt+Ys6+eSTc9ll\nl+WCCy7IP/3TP2W77bZbZ5969T7576mf/s2sXr16s75B9NMvulh76+X61m3ut5ZedNFFeeyxx3LD\nDTdkzz33zNZbb50LL7wwS5cu3eSxzjnnnAwcODBbbbVVdtxxx5q+JZ/UfdJJJ+XSSy9d57iWLVtu\nUi177713mjRpktGjR+fwww9f59/p5vLXLx8pKytb77q138na/33mmWfStGnTdfZLPnnO3rRp0/L0\n009n4sSJue2223LxxRfnySefzP77718n1wEAfMIMOQDYRBUVFfn+97+fm2++eb1BwapVq7J8+fLs\nvvvuady4caZOnVpr+5QpU7L33nvXLLdq1SpvvfVWzfJHH320zgPzN0ajRo2yevXqddY3btw43/ve\n9/KLX/wiL7zwQj744INMmDBhvWPstddeSbJOzVOnTq1V88bo379/XnnllTz00EPrbHvooYfyyiuv\npH///rXWP/fcc7WWn3nmmZpZbhu6li5duuSll17K7rvvvs7nr2fE/bX69eunX79+GTt2bH79619n\n6dKlOeGEE2q2rx175513XmfstQ/i79ChQ5555pla4z799NMb0an/T0VFRY499tg8+eSTOfPMM9e7\nT6tWrZKk1m+murp6gzM3P+v3sTnstdde6/2dl5WVZa+99so222yT1q1bb7A/U6dOTb9+/dK3b9/s\nu+++adOmTebOnfuFaqqoqMjuu++e1q1b1wrjkk++z+effz5t27Zd5/ts0aLFJtWy8847Z8qUKZkz\nZ07+6Z/+KR999NEXqndzWxuo/eUvf1nnGtu2bVuzX/369dOtW7dcffXVmT59enbcccd1XjwDAGx+\nAjkA+AJuvfXWNGzYMPvvv38eeOCBzJ49Oy+//HLGjRuXLl26ZN68eWnatGnOO++8/PM//3N+9atf\nZe7cuRk6dGgee+yxXH755TVj9e7dO7fddlueffbZvPjiizn11FOzcuXKTa5pt912y/Tp0/PKK6/k\nvffey6pVq3LXXXdl9OjRmTVrVl5//fXcf//9ef/992uFXJ/Wtm3bHHfccRk4cGB++9vfZs6cORk0\naFBefPHFXHTRRZtUz7HHHpt+/frl9NNPz4033ph58+bl5ZdfzsiRI3PGGWfk5JNPXmeG4V133ZUH\nHnggc+fOzZVXXplnn302F1xwQc22z7uWq6++Oo899lguuOCCVFdX55VXXslvfvObnH766Z/7Vtm1\nTj755MyYMSNDhgzJkUceWfMWzCT56U9/mtWrV+cf//Ef8/vf/z7z58/PH/7wh1xxxRU1IdPgwYPz\n7LPP5oorrsjcuXPz6KOPZvjw4ZvUsyQZPXp0Fi5cmJ49e653++67755ddtklV111VebMmZM//OEP\nGTx48AZfIrDbbrvlqaeeyltvvbXZb0u86KKLMmPGjAwePDhz5szJb37zm5x77rnp169fvvnNbyZJ\nLrzwwtx0000ZO3Zs5s2bl+HDh2fixIm1xtlzzz3z2GOP5U9/+lNmz56ds846q1bwuLlcfvnl+fOf\n/5z+/fvnT3/6U1577bU89dRTGTRoUF599dVNrqV169aZMmVK5s+fn6OOOmqjfm91bffdd89pp52W\nM888M2PHjs3LL7+cWbNm5e677851112XJHnssccyYsSITJ8+PX/5y18yYcKEvPHGG5/5/w8AwOYj\nkAOAL+Cb3/xmZsyYkaOPPjpXXXVV9ttvvxx88MEZPXp0LrrooprZZNdee23OPPPMnH/++dl7770z\nbty4jBs3Lr169aoZ65e//GX23nvvfPe73833v//9dOvWLV27dt3kmi688MJst9122XfffVNZWZmn\nn346LVq0yJgxY9KjR4+0b98+N9xwQ+64445a5/9rd955Z7773e+mf//+2XffffP000/n8ccfzz/8\nwz9sck1jx47N8OHDc//992ffffdNx44dc99992X48OG555571tl/2LBhueOOO9KxY8eMHTs248aN\ny3777ZckG7yWww47LJMmTcrzzz+fb3/72+nYsWMGDx6cZs2arXNr3/p07NgxnTp1Wu+z27bffvs8\n++yz2W677dKnT5/sueee6devX15//fXsuOOOSVITzj744IPZZ599MmzYsIwYMWKTe9akSZP13qq6\nVoMGDfLQQw9lwYIF6dy5c84555xce+2168wC+2vDhw/P9OnTs+uuu9bM6ttcOnbsmH//93/P1KlT\ns+++++akk07KEUcckdtuu61mn0GDBuW8887L4MGD06lTpzz77LO58sora40zYsSI7LLLLjnssMPS\nq1evtG7dOscee+xmrTX55DmCzzzzTJYtW5bvfve76dChQ84888ysWLEizZs3/0K17LDDDpk8eXLe\neeedHHnkkTVvy/0y3XHHHRk8eHCuvfbadOjQIb169cq9996bNm3aJPnk39R//Md/5Hvf+17atWuX\niy++OD/72c9y+umnf8mVA8CWr6y0sU+mBgAAAAD+ZmbIAQAAAECBBHIAAAAAUCCBHAAAAAAUSCAH\nAAAAAAUSyAEAAABAgQRyAAAAAFCk0tdckr+7T1VV1Zdew9fto+d6/nX46Lmefx0+eq7nX4ePnuv5\n1+Gj53r+dfj8PfecDTNDDgAAAAAKJJADAAAAgAIJ5AAAAACgQAI5AAAAACiQQA4AAAAACiSQAwAA\nAIACCeQAAAAAoEACOQAAAAAokEAOAAAAAAokkAMAAACAAgnkAAAAAKBAAjkAAAAAKJBADgAAAAAK\n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\n8fS8eHpePD3fshUWyFVUVCRJtt1223Tt2jUvv/xytt122yxZsiQtWrTIkiVLap4vV1FRkffee6/m\n2EWLFqWioiIVFRWZPXt2zfrFixenQ4cOqaioyKJFi9bZf3169+6d3r171yx37dp1s17nWsNfeLZO\nxq1rddWPv3dVVVV6UzA9L56eF0/Pi6fnxdPz4ul58fS8eHpePD0v3t9zz0ul0pddwldeIc+Q+/DD\nD7NixYqav59//vl885vfTJcuXTJlypQkyZQpU2p+aF26dMnUqVNTKpUyd+7cNG3aNC1atEinTp0y\na9asLFu2LMuWLcusWbPSqVOntGjRIltttVXmzp2bUqmUqVOnpkuXLkVcGgAAAABskkJmyC1dujS/\n/OUvkySrV6/OoYcemk6dOqVt27YZMWJEJk2alMrKygwePDhJ0rlz58yYMSPnnXdeGjVqlIEDByZJ\nysvLc8wxx+Syyy5Lkhx77LEpLy9Pkpxxxhm59dZbs3LlynTq1MkbVgEAAAD4SiokkNt+++1z/fXX\nr7O+WbNmufLKK9dZX1ZWljPOOGO9Y/Xs2TM9e/ZcZ33btm0zfPjwv71YAAAAAKhDhdyyCgAAAAB8\nQiAHAAAAAAUSyAEAAABAgQRyAAAAAFAggRwAAAAAFEggBwAAAAAFEsgBAAAAQIEEcgAAAABQIIEc\nAAAAABRIIAcAAAAABRLIAQAAAECBBHIAAAAAUCCBHAAAAAAUSCAHAAAAAAUSyAEAAABAgQRyAAAA\nAFAggRwAAAAAFEggBwAAAAAFEsgBAAAAQIEEcgAAAABQIIEcAAAAABRIIAcAAAAABRLIAQAAAECB\nBHIAAAAAUCCBHAAAAAAUSCAHAAAAAAUSyAEAAABAgQRyAAAAAFAggRwAAAAAFEggBwAAAAAFEsgB\nAAAAQIEEcgAAAABQIIEcAAAAABRIIAcAAAAABRLIAQAAAECBBHIAAAAAUCCBHAAAAAAUSCAHAAAA\nAAUSyAEAAABAgQRyAAAAAFAggRwAAAAAFEggBwAAAAAFEsgBAAAAQIEEcgAAAABQIIEcAAAAABRI\nIAcAAAAABRLIAQAAAECBBHIAAAAAUCCBHAAAAAAUSCAHAAAAAAUSyAEAAABAgQRyAAAAAFCgLxzI\nvfjii5k9e/bmrAUAAAAAtngbHcgNGTIkc+bMSZJMmDAhN910U2666aaMHz++zooDAAAAgC3NRgdy\nb7zxRtq1a5ckefLJJzNkyJBce+21+d3vfldnxQEAAADAlqbBxu5YKpWSJO+8806SZOedd06SLF++\nvA7KAgAAAIAt00YHcnvuuWfuvvvuLFmyJF27dk3ySTjXrFmzOisOAAAAALY0G33L6jnnnJOmTZtm\nl112Sd++fZMkb731Vn7wgx/UWXEAAAAAsKXZ6BlyL774Yk488cRa6/bbb78899xzm70oAAAAANhS\nbfQMudtuu22962+//fbNVgwAAAAAbOk2OEPu3XffTZKsWbMmCxYsqHm5w9ptjRo1qrvqAAAAAGAL\ns8FA7rzzzqv5+9xzz621rXnz5jnuuOM2+mRr1qzJpZdemoqKilx66aVZsGBBbrzxxrz//vtp06ZN\nzj333DRo0CCrVq3KzTffnFdffTXNmjXL+eefn1atWiVJHn300UyaNCn16tXLgAED0qlTpyRJdXV1\nxowZkzVr1qRXr145+uijN7ouAAAAACjKBgO5hx56KEkyZMiQ/PznP/+bTvbEE0+kdevWWbFiRZJk\n3LhxOeKII3LIIYfkjjvuyKRJk3L44Ydn0qRJ2XrrrTNq1Kg8/fTTuf/++zN48OC8+eabeeaZZ3LD\nDTdkyZIlueaaa3LTTTclSe6666787Gc/S8uWLXPZZZelS5cu2Xnnnf+megEAAAD425VKpSxcuDCr\nVq36skspTMOGDVNZWZmysrJ1tm30Sx3+1jBu0aJFmTFjRvr06ZPHH388pVIpL730UgYNGpQk6dGj\nR371q1/l8MMPz7Rp02pm3h144IG5++67UyqVUlVVlYMPPjgNGzZMq1atssMOO+Tll19Okuywww7Z\nfvvtkyQHH3xwqqqqBHIAAAAAXwELFy7Mxx9//LV69NmqVauycOHCmrs+P22jA7kFCxbk//yf/5P5\n8+fnww8/rLXtf//v/73B4++5557079+/Znbc+++/n6ZNm6Z+/fpJkoqKiixevDhJsnjx4rRs2TJJ\nUr9+/TRt2jTvv/9+Fi9enD322KNmzE8fs3b/tX/PmzdvvXVMnDgxEydOTJIMGzYsVVVVG3X9m2pq\nPq6TcetaXfXj71379u31pmB6Xjw9L56eF0/Pi6fnxdPz4ul58fS8eHpevC2t56tWrfpahXHJJzPk\nVq5cud5tGx3I3XTTTdl+++1z8sknp3HjxptUwPTp07PtttumTZs2eemllzbp2M2td+/e6d27d81y\n165d6+Q8w194tk7GrWt11Y+/d1VVVXpTMD0vnp4XT8+Lp+fF0/Pi6Xnx9Lx4el48PS/e33PPP/1C\nUNZvowO5N998M9dcc03q1au3ySf5r//6r0ybNi0zZ87MypUrs2LFitxzzz354IMPsnr16tSvXz+L\nFy9ORUVFkk9mvi1atCgtW7bM6tWr88EHH6RZs2Y169f69DGfXr9o0aKa9QAAAADQqlWr/PjHP87V\nV1+dJLnllluyfPnyXHzxxYXXstGBXPv27TN//vy0adNmk09y4okn5sQTT0ySvPTSS/mP//iPnHfe\nebnhhhvy3HPP5ZBDDsnkyZPTpUuXJMn++++fyZMnp127dnnuueey1157paysLF26dMnIkSNz5JFH\nZsmSJXn77bez++67p1Qq5e23386CBQtSUVGRZ555ptbbYQEAAAD46hj77iubdbyTtm+7wX0aN26c\nJ554IoMGDar16LMvw0YHcpWVlbn22mtzwAEHpHnz5rW2HX/88V/o5P369cuNN96YBx98MLvttlt6\n9uyZJOnZs2duvvnmnHvuuSkvL8/555+fJPnGN76Rgw46KBdccEHq1auX008/vWbG3mmnnZZrr702\na9asyWGHHZZvfOMbX6gmAAAAALY89evXz0knnZTbb789l19+ea1tf/nLX3L++edn0aJF2W677XLT\nTTdl5513zrnnnptmzZqluro6CxYsyJAhQ/LDH/4wSXLzzTfn3//93/PRRx/lBz/4QS655JKNrmWj\nA7mPPvoo+++/f1avXl3r9tBNtddee2WvvfZKkmy//fb513/913X2adSoUS644IL1Ht+nT5/06dNn\nnfX77bdf9ttvvy9cFwAAAABbttNOOy09evTIT3/601rrL7/88vTt2zcnnHBCHnjggVx++eW57777\nkiTvvvtuHn/88cybNy8nnXRSfvjDH+app57Ka6+9lt/+9rcplUo56aST8uyzz+aggw7aqDo2OpAb\nOHDgJlweAAAAAHy1NGvWLMcdd1xGjx6dJk2a1KyfNm1axowZkyQ57rjjap4zlyTf//73U69evey5\n555ZuHBhkmTy5MmZPHlyzd2ey5cvz6uvvrr5A7l33333M7dtv/32GzsMAAAAAHxpzj777PTu3Tsn\nnHDCRu3fuHHjmr/XvkG2VCrlvPPOyymnnPKFatjoQO7zXpLw0EMPfaGTAwAAAECRWrRokaOOOioP\n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\nTXqDpF27dnrsscfqvZ3srDvvvNOFiUIfmdvz+/2qq6tTRESEJGn8+PHyer2aNWuWTp8+7fJ0oem7\nj6uPjIzU7bffrpUrV+qJJ54g8yD57j8mhg0b9r2fw/kTGRkpSYqKilLXrl0Db2mKjIzk7apBcsst\nt+jAgQN65plnNHDgQI0ePZqsg2zGjBnavHmzFi9erLFjxyo9PV2RkZG8nSyIqqqqtHnzZtXV1cnv\n9wfOLR6Ph/UeJGRu76qrrtLs2bM1btw4XXbZZVq6dKkGDRqknTt38tTsEEYh14jdddddysnJ0alT\np+q9ZTU2NlZ33323y9OFpmuuuUaVlZUNlkPXXnutCxOFPjK3N2DAAO3cuVN9+/YNHBs+fLgSEhL0\n0ksvuThZ6EpJSVFhYaH69esXOHbdddcpMTFROTk5Lk4WutLT03X69GnFxMTohhtuCBwvKipShw4d\nXJwsdCUkJAQyf+SRRwLHy8vLud9QEKWkpOjRRx/VBx98oMzMTK6kMHD55Zerb9++ev3117VmzZp6\nv3TB+ZeamqotW7ZIkrp3767y8nIlJCSovLycG94HCZnbu/rqq9W5c2f97W9/07Fjx1RbW6tjx47p\n8ssv1/jx490eD0HCU1abgPLy8nqPPj77lgQAAIDG7vTp06qurlbr1q3dHiXklZWV6eDBgzycx9Ch\nQ4e0Z88eXXXVVW6PAgBoYiLcHgD/XEJCglJSUpSSkqK//e1vbo8Tdl544QW3Rwg7ZG6PG8XaY53b\nY53be+ONNxQTE0MZZyQxMVH5+flujxFWunTpovLycrfHCDv8DLVH5vbYt4Q+CrkmZuvWrW6PEHYO\nHDjg9ghhh8ztnb0KF3ZY5/ZY5/bYt9jj3GKPdW6PdW6PzO2xbwl9FHJNDO8wthcfH+/2CGGHzO1x\ns1h7rHN7rHN77FvscW6xxzq3xzq3R+b22LeEPu4h18R898mIAAAAjRn7FoQD1jkA4P+CR141YrW1\ntVqzZo02b96ssrIySd8+1CE9PV0jR47kiWVBcPjwYV100UWSJL/fr9WrV2vfvn3q1KmTJkyYoOjo\naJcnDD1VVVV6++23lZ+fr4qKCnk8HrVu3Vrp6ekaN26cWrZs6faIIee7T/usqqrSsmXLtH//fnXq\n1EkTJ07kwTFBwDq3xzq3x77FHvsWe6xze6xze+xb7LFvCU9cIdeILViwQC1bttSwYcOUlJQkSSot\nLdW6detUWVmpadOmuTxh6JkxY4bmzp0rSfrTn/6kEydOaMSIEdq8ebMqKyv1m9/8xuUJQ8+TTz6p\n3r17a/jw4YEfNOXl5Vq7dq127typ3/72ty5PGHq+u86ff/55JSQkaNSoUfr000+1a9cuPfjggy5P\nGHpY5/ZY5/bYt9hj32KPdW6PdW6PfYs99i3hiWurG7GDBw/qtttuU48ePZSUlKSkpCT16NFDt912\nmw4dOuT2eCHpu/30jh07dPvttys1NVUTJ04k8yApLi7WuHHj6v3WJyEhQePGjVNJSYmLk4WH/fv3\n64YbblBycrLGjBlD5kHCOncX69wG+xZ77Fvssc7tsc7tsW9xF/uW8ME11Y1YXFycNm7cqEGDBgXu\nS1FXV6dNmzZxmXCQVFVVafPmzaqrq5Pf7w+87cDj8cjj8bg8XWhKTk7W6tWrNWzYsHN+A9emTRuX\npwtNFRUVevfdd+U4jk6dOiXHcQLrm4umg4N1bo91bo99iz32LfZY5/ZY5/bYt9hj3xKeKOQasfvu\nu0/Lly9XTk6O4uLi5DiOTp48qUsvvVRTp051e7yQlJqaqi1btkiSunfvrvLyciUkJKi8vFytWrVy\nebrQNHXqVK1atUqZmZmqqKiQ9O1v4AYMGMDbPoJk1KhROnXqlCRp2LBhOnHihOLj41VeXs7TnIKE\ndW6PdW6PfYs99i32/vc6l6TKykrWeRCxzu2xb7HHviU8cQ+5JuLEiROSxA8dAADQ6LFvQThgnQMA\nforIzMzMTLeHwPf76quvtGbNGm3dulW7du3S4cOH1apVK8XHx7s9Wsg6m/mGDRu0bds2HT58WHFx\ncWTugo8//lgXX3yx22OEFTIPnq+++kqHDx9W69at6z2Fr7CwUO3bt3dxstBF5vb27dsnn8+nDh06\nqKSkRHl5eTp58qQ6dOjg9mgh62zmXq9XR44cUV5eniorK8ncQHR0tKKjo/Xss8/q8ssvd3ucsELm\ntnbv3q1Nmzbp1KlT/Pw0QubhgbesNmKrVq3S+vXrdeWVV6pbt26SJJ/PpwULFujKK6/UuHHjXJ4w\n9Hxf5s888wyZu+CNN97QiBEj3B4jrJB5cLz33nv68MMP1bFjRz3//POaNGmSBg4cKEn6y1/+EnjM\nPc4fMre3YsUKFRYWqra2Vn379tXevXvVu3dvrVq1SgcPHtT48ePdHjHkfF/mq1ev1qFDh8g8CM4+\nBfEsx3H0+eef6+TJk5K+fVIizi8yt/fQQw9p9uzZkqTc3Fx9+OGHuvzyy7Vy5UodPHiQfxMFAZmH\nJwq5Ruzjjz9WVlZWvd/qS9KYMWN0//338z9lEJC5venTpzd43HGcwD0rcH6Rub2PPvpIc+fOVUxM\njIqLi/WHP/xBJSUluuaaa7hRb5CQub1Nmzbp6aefVk1NjaZMmaLnnntOsbGxuvbaa/Xwww9TDgUB\nmdvz+Xzq2LGjRo0aJY/HI8dxdODAAY0dO9bt0UIWmdurra0N/PdHH32kRx99VPHx8Ro7dqweeeQR\n/k0UBGQenijkGjGPx6OysjIlJyfXO15WVsYThYKEzO1VVFTokUceOefJZI7j6NFHH3VpqtBG5vYc\nx1FMTIwkqW3btsrMzFRWVpZKSkooh4KEzO1FRkYqIiJC0dHRateunWJjYyVJzZs352dokJC5vdmz\nZ+u9997TW2+9pRtvvFFdunRR8+bNlZqa6vZoIYvM7TmOo8rKSjmOI8dxArfuiYmJUWRkpMvThSYy\nD08Uco3YpEmT9MQTT6hDhw5KSkqSJB0/flxFRUW69dZbXZ4uNJG5vf79++v06dMNPj2IjVZwkLm9\n1q1b69ChQ4HMY2JiNHPmTD333HP68ssv3R0uRJG5vaioKFVXVys6Olpz5swJHK+qqlJERISLk4Uu\nMrcXERGhMWPG6IorrtCyZcvUunXrele24Pwjc3tVVVWaOXOmHMcJXLCQmJio06dP80utICHz8MRT\nVhu5urq6wM16Jcnr9apbt25ssoKIzAGcb6WlpYqMjFRCQsI5n9u9e7d69uzpwlShjczt1dTUqFmz\nZucc/+abb1ReXq7OnTu7MFVoI3P3FRQUaPfu3fr1r3/t9ihhg8zdU11drYqKCrVt29btUcIGmYc2\nCjkAAAAAAADAEJf8AAAAAAAAAIYo5AAAAAAAAABDFHIAAAA/YPHixVq5cqXbY/wka9eu/clPUf78\n8891xx13nKeJAAAAwhtPWQUAAGHp7rvvls/n0wsvvKD4+PjA8QcffFCHDh3Ss88+q7Zt22rKlCnn\n7e+8/vrrlZ2drfbt25+315SkhQsX6pNPPlFUVJQ8Ho86dOigiRMn8uRkAACARoor5AAAQNhq27at\n1q9fH/j4yy+/VHV1tYsT/d/98pe/1CuvvKJly5bpqquu0rx581RXV+f2WAAAAGgAV8gBAICwNXTo\nUOXl5enqq6+W9O1bO4cNG6bXXnst8DULFy5UUlKSbrjhBn3++ef64x//qF/84hdavXq1IiIijnkQ\n+AAABgZJREFU9Ktf/UojRoyQJGVmZupnP/uZRo0aFXi9jz76SL/73e80a9YsSdIDDzwgSbrzzjs1\nePBgbd26Va+99ppKSkp04YUX6rbbbtNFF10kSVq1apXef/99nTp1SomJiZo8ebL69Onzg9+Tx+PR\nkCFD9MILL6i8vFxer/ecr/niiy/08ssv6+jRo7rgggs0adIkXXLJJZKkyspK/elPf9L27dt15swZ\n9erVSw8++OA5r/Hee+/p73//u37729+qWbNmWrRokXbv3i2Px6NOnTopMzNTERH87hcAAKAhFHIA\nACBsde/eXXl5eTpy5IguuOACbdiwQb/73e/qFXL/W3l5uaqqqvT888/rs88+0x/+8AcNHDhQcXFx\nP/h3Pf7447r++uv19NNPB96yevDgQT333HOaMWOGunbtqry8PP3+97/XggULVFJSog8//FCzZ8+W\n1+tVcXHxv3TFW11dndatW6e2bdsqISHhnM9XVlZqzpw5uvnmm3XllVdq48aNmjNnjrKzs9WqVSv9\n8Y9/VExMjLKyshQTE6M9e/ac8xorV65Ufn6+Hn/8ccXHx+vPf/6zvF6vcnJyJEl79+6Vx+P5p7MC\nAACEKwo5AAAQ1s5eJZeamqqOHTs2eEXZd0VGRuq6665TZGSk+vfvr5iYGB09elQ9evT40X93bm6u\nMjIy1L17d0nS8OHD9fbbb2vv3r3yer2qqanRkSNHFB8fr7Zt2/7ga73zzjv64IMPVFNTI0m64447\nGrxCraCgQO3bt9fQoUMlSUOGDNH777+vrVu36rLLLlNhYaFefPHFQMH43fvQOY6jZcuWad++fZo1\na5ZiY2MDmZSXl+v48eNq3769evXq9aOzAAAACCcUcgAAIKwNHTpUs2bNUnFxsYYNG/ZPv75Vq1aK\njIwMfBwdHa3Tp0//n/7u48ePa926dfrggw8Cx/x+v3w+n1JTUzVp0iStWLFCR44c0WWXXaabbrrp\newvDsWPH6oYbbpDjOPp//+//6cknn1RcXJzS0tLqfZ3P51NycnK9Y8nJyfL5fCotLVVcXNz3Xu1X\nVVWl3NxcTZs2LVDGSdK1116rFStW6L/+678kSRkZGRo3btz/KRMAAIBwQCEHAADCWnJystq2batt\n27bpjjvu+EmvFR0dXe+hEOXl5T/49UlJSRo/frzGjx/f4OeHDBmiIUOGqKqqSosXL9by5ct1zz33\n/OBrejwede7cWZdccokKCgrOKeS8Xq8+/fTTeseOHz+ufv36KSkpSZWVlTp58qRatmx5zmu3bNlS\n99xzj+bPn6/p06erZ8+ekqQWLVropptu0k033aQvv/xSTzzxhLp27fpP73cHAAAQrrjTLgAACHt3\n3HGHHnvsMcXExPyk1+nSpYs2b96s6upqFRUVac2aNfU+37p1a3399deBj0eNGqW///3v2rt3rxzH\n0enTp1VQUKBTp07p6NGj2rlzp2pqatS8eXM1b978X74v21dffaXdu3erU6dO53wuLS1Nx44d0yef\nfKLa2lpt2LBBR44cUf/+/ZWYmKh+/fopJydHlZWV8vv92rVrV70/37t3b917773KysrSvn37JElb\nt25VUVGRHMdRbGysIiIiuIccAADAD+AKOQAAEPbOPmThp/rFL36h/fv3B56UOmTIEO3YsSPw+X/7\nt3/TwoULdebMGU2ZMkWDBw/W7bffrpdeeknHjh1T8+bN1bNnT/Xq1Us1NTVavny5vvrqK0VGRuqS\nSy7RlClTvvfvXr16tf76179KkuLi4jR8+HBlZGSc83WtWrXSzJkztXTpUi1ZskTt27fXzJkzFR8f\nL0m655579PLLL2vatGny+/3q3bt3vfvISVLfvn115513au7cuXrooYd07NgxvfTSS/rmm2/UsmVL\nXXXVVbr00kvPR6QAAAAhyeM4juP2EAAAAAAAAEC44C2rAAAAAAAAgCEKOQAAAAAAAMAQhRwAAAAA\nAABgiEIOAAAAAAAAMEQhBwAAAAAAABiikAMAAAAAAAAMUcgBAAAAAAAAhijkAAAAAAAAAEMUcgAA\nAAAAAICh/w8gdpKtKqVUBAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7faa04dc9320>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"e = (peak_dists_df[~peak_dists_df.isnull()].count().plot.bar(figsize=(20,10),\n",
" legend=True,\n",
" cmap='Set3'))\n",
"\n",
"e.set_facecolor('black')\n",
"e.set_title(\"Counts of Observed Multimodal Peak Times\")\n",
"e.set_xlabel(\"Minutes Blocks\")\n",
"e.set_ylabel(\"Counts\")\n",
"\n",
"plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))"
]
},
{
"cell_type": "code",
"execution_count": 177,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"null_mean = cumulative_results_df['mean'].isnull()\n",
"null_median = cumulative_results_df['median'].isnull()\n",
"\n",
"def condense(sub_df):\n",
" ct_sum = sub_df['count'].sum()\n",
" mean_avg = (sub_df['count'] * sub_df['mean']).sum()/ct_sum\n",
" median_avg = (sub_df['count'] * sub_df['median']).sum()/ct_sum\n",
" log_avg = (sub_df['count'] * sub_df['log_diff']).sum()/ct_sum\n",
" \n",
" return pd.Series([ct_sum, mean_avg, median_avg, log_avg], index=['count',\n",
" 'mean',\n",
" 'median',\n",
" 'log_diff'])\n",
"\n",
"gathered = cumulative_results_df[~(null_mean | null_median)].groupby('hour').apply(condense)"
]
},
{
"cell_type": "code",
"execution_count": 300,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\nnl/nta99LRMmVMe7bbrppjzwwANstdVWQ/eEsDiTJEkj3E477cTxxx/PiSeeyBNPPPH89MxkxowZ\nTJo06UXLn3TSSay99tqcccYZLFu2jDe96U3Pz1tttdWeHx41ahTPPfdc2/Pvzm5NSZI0ou29994c\ncsghy134dfvtt+ess86i625Id999NwBPPfUU48ePZ9SoUVx00UXDUoD1xZYzSZI0aM1c+qJdJkyY\nwP7777/c9IMPPphjjjmGAw44gGXLljFx4kSOPfZY3v3ud3PYYYdx0UUXscMOOzBmzJhhyLp33ltz\nmGx42IXLTbtvxl7DkIkkSSvu4osvZvz48cOdRm09/PDDTJkypftk760pSZI00tituZKxRU6SpJHN\nljNJkqQasTiTJEmqkbYWZxExLiLOiYi7IuLOiNghItaOiEsjYk75u1ZZNiLi+IiYGxF/jIht2pmb\nJElSHbW75ew44NeZuTnwOuBO4HDgsszcBLisjANMATYpj6nACW3OTZIkqXbadkJARLwc2Bk4CCAz\nnwWejYh9gDeXxWYCVwKHAfsAs7K6tsd1pdVtvcxc2K4cJUlSa2x74a4tjXfjXpf1u8x2223HHnvs\nwZFHHgnA0qVLmTJlCltuuSXHHnts09v6yEc+wrRp09hiiy2YNm0aX/va1xg7duyAcx+sdracbQT8\nFfhxRNwcET+KiJcAExoKrkVA11XrJgLzG9a/v0x7kYiYGhE3RsSNbcxdkiTV3JgxY5g3bx7PPPMM\nUN1Lc9111x1UzOOOO25YCzNo76U0RgPbAP+VmddHxHG80IUJQGbmil5INjNPAk6CkX0RWkmSNHg7\n7rgj1157LbvuuiuzZ89m991355ZbbgFg8eLFHH300cybN4+lS5cydepUdtllF5555hm++tWvMmfO\nHCZNmsSSJUuej7f33nsza9Ysxo0bx2c/+1kefPBBlixZwv7778873/lOAHbeeWf2339/rrnmGlZf\nfXW+9a1vsc4667TsObWz5ex+4P7MvL6Mn0NVrD0YEesBlL8PlfkLgA0a1l+/TJMkSerRbrvtxuzZ\ns1myZAlz5sxhyy23fH7eKaecwrbbbsvMmTM58cQTOf7441m8eDHnnnsua6yxBmeffTZTp07lrrvu\n6jH2f//3f3Paaacxa9YszjzzTB5//HGgKvq23HJLzjjjDLbeemvOO++8lj6ntrWcZeaiiJgfEZtl\n5t3ArsAd5XEgcFT5e35Z5QLgExHxM+CNwBMebyZJkvqyySabsHDhQi655BJ23HHHF827/vrrufrq\nqzn99NMBWLJkCYsWLeLmm2/mve997/Prd79hepczzzyTK6+8EoAHH3yQ+fPnM27cOFZddVV22mkn\nADbffHNuuOGGlj6ndt8h4L+An0TEasA9wAepWuvOioiDgfuA95RlLwL2BOYCT5dlJUmS+rTTTjtx\n/PHHc+KJJ/LEE088Pz0zmTFjBpMmTVrhmDfddBM33HADp5xyCmussQYf+chHePbZZwEYPXo0EQHA\nKquswtKlS1vyPLq09VIamXlLZm6bmf+Smftm5mOZ+Uhm7pqZm2TmWzPz0bJsZubHM3PjzPznzPSA\nf0mS1K+9996bQw45ZLkWsO23356zzjqL6kIQcPfddwOw9dZbc8kllwAwd+5c5s6du1zMp556irFj\nx7LGGmtw7733cvvtt7f5WbzAe2tKkqRBa+bSF+0yYcIE9t9//+WmH3zwwRxzzDEccMABLFu2jIkT\nJ3Lsscfyrne9i69+9avst99+TJo0ic0333y5dXfYYQfOPfdc9ttvPzbccMMXHcvWbtFVTY5EI/ls\nzXbdoNwbn0uShsLFF1/M+PHjhzuN2nr44YeZMmVK98k3Zea2/a3rvTUlSZJqxOJMkiSpRizOJEnS\nClu2bNlwp1Brg3l9LM4kSdIKmzt3bssvIbGyWLp0aY9ngDbLszUlSdIKmz59OtOnT2fy5MmMGmVb\nT5dly5Yxd+5cpk+fPuAYFmeSJGmFPfbYY0ybNm2401gpWepKkiTViMWZJElSjVicSZIk1YjFmSRJ\nUo1YnEmSJNWIxZkkSVKNWJxJkiTViMWZJElSjVicSZIk1YjFmSRJUo1YnEmSJNWIxZkkSVKNWJxJ\nkiTViMWZJElSjVicSZIk1YjFmSRJUo1YnEmSJNWIxZkkSVKNWJxJkiTViMWZJElSjVicSZIk1YjF\nmSRJUo1YnEmSJNWIxZkkSVKNWJxJkiTViMWZJElSjVicSZIk1YjFmSRJUo1YnEmSJNWIxZkkSVKN\nWJxJkiTViMWZJElSjVicSZIk1YjFmSRJUo1YnEmSJNWIxZkkSVKNjB7uBFR/Gx52YY/T75ux1xBn\nIknSys+WM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGmlrcRYR90bEbRFxS0TcWKatHRGX\nRsSc8netMj0i4viImBsRf4yIbdqZmyRJUh0NRcvZv2XmVpm5bRk/HLgsMzcBLivjAFOATcpjKnDC\nEOQmSZJUK8PRrbkPMLMMzwT2bZg+KyvXAeMiYr1hyE+SJGnYtLs4S2B2RNwUEVPLtAmZubAMLwIm\nlOGJwPyGde8v0yRJkjpGu+8Q8KbMXBARrwAujYi7GmdmZkZErkjAUuRN7XdBSZKkEaitLWeZuaD8\nfQj4BfAG4MGu7sry96Gy+AJgg4bV1y/Tusc8KTO3bTiGTZIkaaXRtuIsIl4SEWO7hoHdgNuBC4AD\ny2IHAueX4QuA/yhnbW4PPNHQ/SlJktQR2tmtOQH4RUR0beeMzPx1RPweOCsiDgbuA95Tlr8I2BOY\nCzwNfLCNuUmSJNVS24qzzLwHeF0P0x8Bdu1hegIfb1c+kiRJI4F3CJAkSaoRizNJkqQasTiTJEmq\nEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJqhGLM0mS\npBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQasTiT\nJEmqEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJqhGL\nM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQa\nsTiTJEmqEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJ\nqhGLM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqkX6Ls4hYPyI+GxHnR8TvI+LqiPh+RLw9IppZf5WI\nuDkiLizjG0XE9RExNyLOjIjVyvTVy/jcMn/SYJ+cJEnSSNNncRURPwZOAZ4FZgAHAP8J/AbYA7gm\nInbuZxvTgDsbxmcAx2bmZOAx4OAy/WDgsTL92LKcJElSRxndz/xvZ+btPUy/Hfh5afV6VW8rR8T6\nwNuBrwOHRkQAbwH+vSwyE5gOnADsU4YBzgG+GxGRmdncU5EkSRr5+mw566kwi4i1IuJfyvxnM3Nu\nHyG+A3weWFbG1wEez8ylZfx+YGIZngjML3GXAk+U5btvf2pE3BgRN/aVuyRJ0kjU1AkBEXFlRLws\n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\n0m35UJm+ANigYbn1yzRJktRCPbX62+JfL0N9KY0LgAPL8IHA+Q3T/6Octbk98ERD96ckSVLHaFvL\nWUT8FHgzMD4i7geOAI4CzoqIg4H7gPeUxS8C9gTmAk8DH2xXXpIkSXXWtuIsMw/oZdauPSybwMfb\nlYtGDg+ylyR1Om98LkmD4PE7klrN4kxS7bSj4LFVVtJIYXEmSTVjISl1NoszSZI0KP6gaC2LM0nq\nEB4fJ40MFmeSBsxfy1L7WEx3LoszSdKgWERIrWVx1gH8xylJ0shhcSbVjMW0NLK6zEdSrhoZhvre\nmpIkSeqDLWdSh7BFTpJGBoszSVLH8EeKRgK7NSVJkmrE4kySJKlGLM4kSZJqxOJMkiSpRizOJEmS\nasTiTJIkqUYsziRJkmrE4kySJKlGLM4kSZJqxOJMkiSpRizOJEmSasTiTJIkqUYsziRJkmrE4kyS\nJKlGRg93Ahq58oiXLTctvvLkMGQiSdLKw5YzSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQa\nsTiTJEmqEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJ\nqhGLM0mSpBqxOJMkSaoRizNJkqQasTiTJEmqEYszSZKkGrE4kyRJqhGLM0mSpBqxOJMkSaoRizNJ\nkqQaqVVxFhF7RMTdETE3Ig4f7nwkSZKGWm2Ks4hYBfgeMAXYAjggIrYY3qwkSZKGVm2KM+ANwNzM\nvCcznwV+BuwzzDlJkiQNqcjM4c4BgIh4N7BHZh5Sxj8AvDEzP9FtuanA1DK6GXB3m1MbDzzc4XHN\ndWTFNVdzbVdccx1Zcc21fXEHasPMXLe/hUYPRSatlJknAScN1fYi4sbM3LaT45rryIprrubarrjm\nOrLimmv74rZbnbo1FwAbNIyvX6ZJkiR1jDoVZ78HNomIjSJiNWB/4IJhzkmSJGlI1aZbMzOXRsQn\ngEuAVYBTMvNPw5wWtK8LdSTFNdeRFddczbVdcc11ZMU11yE8DKqVanNCgCRJkurVrSlJktTxLM4k\nSZJqxOKsD+24nVREnBIRD0XE7a2IV2JuEBFXRMQdEfGniJjWorhrRMQNEXFrifuVVsQtsVeJiJsj\n4sIWxrw3Im6LiFsi4sYWxh0XEedExF0RcWdE7DDIeJuVHLseT0bEp1qU66fLe3V7RPw0ItZoQcxp\n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\n6lTLRcPhRwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efdacef8c50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#!/usr/bin/env python\n",
"import numpy as np\n",
"import matplotlib.mlab as mlab\n",
"import matplotlib.pyplot as plt\n",
"\n",
"width = 0.25\n",
"left_x_loc = gathered.index.values\n",
"right_x_loc = left_x_loc + width\n",
"\n",
"fig, ax = plt.subplots(figsize=(10,7))\n",
"l = ax.bar(left_x_loc, gathered['mean'].values, width=width, align='edge')\n",
"r = ax.bar(right_x_loc, gathered['median'].values, width=width, align='edge')\n",
"\n",
"ax.legend((l, r), ('Mean', 'Median'))\n",
"\n",
"# add some text for labels, title and axes ticks\n",
"ax.set_ylabel('difference (seconds)')\n",
"ax.set_facecolor('black')\n",
"ax.set_title('Disparity between headway mean and median by hr')\n",
"ax.set_xticks(range(24))\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": 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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.