{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Logistics Analysis\n",
"\n",
"In this example, we will analyze the accuracy of a public transit system. The example, is analyzing three lines in Seattle, and it is based on the great blog post [The Waiting Time Paradox, or, Why Is My Bus Always Late?](https://jakevdp.github.io/blog/2018/09/13/waiting-time-paradox/)\n",
"\n",
"[](https://studiolab.sagemaker.aws/import/github/aiola-lab/from-excel-to-pandas/blob/master/notebooks/08.01_Logistics_analysis.ipynb)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Loading the data\n",
"\n",
"The data that we have is capturing a couple of bus lines in Seattle, WA. Here is a map of the various lines that operate in the city. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import Image\n",
"Image(url='http://jakevdp.github.io/images/seattle-transit-map.png') "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = 'https://gist.githubusercontent.com/jakevdp/82409002fcc5142a2add0168c274a869/raw/1bbabf78333306dbc45b9f33662500957b2b6dc3/arrival_times.csv'\n",
"\n",
"import requests\n",
"from io import StringIO\n",
"\n",
"response = requests.get(url)\n",
"response"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The CSV file is read through a URL and therefore, we need to convert the text of the response to a simple string as we get when we read a local file. For that we will use the StringIO functionality as follows:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
OPD_DATE
\n",
"
VEHICLE_ID
\n",
"
RTE
\n",
"
DIR
\n",
"
TRIP_ID
\n",
"
STOP_ID
\n",
"
STOP_NAME
\n",
"
SCH_STOP_TM
\n",
"
ACT_STOP_TM
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2016-03-26
\n",
"
6201
\n",
"
673
\n",
"
S
\n",
"
30908177
\n",
"
431
\n",
"
3RD AVE & PIKE ST (431)
\n",
"
01:11:57
\n",
"
01:13:19
\n",
"
\n",
"
\n",
"
1
\n",
"
2016-03-26
\n",
"
6201
\n",
"
673
\n",
"
S
\n",
"
30908033
\n",
"
431
\n",
"
3RD AVE & PIKE ST (431)
\n",
"
23:19:57
\n",
"
23:16:13
\n",
"
\n",
"
\n",
"
2
\n",
"
2016-03-26
\n",
"
6201
\n",
"
673
\n",
"
S
\n",
"
30908028
\n",
"
431
\n",
"
3RD AVE & PIKE ST (431)
\n",
"
21:19:57
\n",
"
21:18:46
\n",
"
\n",
"
\n",
"
3
\n",
"
2016-03-26
\n",
"
6201
\n",
"
673
\n",
"
S
\n",
"
30908019
\n",
"
431
\n",
"
3RD AVE & PIKE ST (431)
\n",
"
19:04:57
\n",
"
19:01:49
\n",
"
\n",
"
\n",
"
4
\n",
"
2016-03-26
\n",
"
6201
\n",
"
673
\n",
"
S
\n",
"
30908252
\n",
"
431
\n",
"
3RD AVE & PIKE ST (431)
\n",
"
16:42:57
\n",
"
16:42:39
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
39152
\n",
"
2016-05-27
\n",
"
6215
\n",
"
674
\n",
"
N
\n",
"
30905957
\n",
"
578
\n",
"
3RD AVE & PIKE ST (578)
\n",
"
10:50:25
\n",
"
10:49:50
\n",
"
\n",
"
\n",
"
39153
\n",
"
2016-05-27
\n",
"
6215
\n",
"
674
\n",
"
N
\n",
"
30905720
\n",
"
578
\n",
"
3RD AVE & PIKE ST (578)
\n",
"
13:02:27
\n",
"
13:07:10
\n",
"
\n",
"
\n",
"
39154
\n",
"
2016-05-27
\n",
"
6215
\n",
"
674
\n",
"
N
\n",
"
30905729
\n",
"
578
\n",
"
3RD AVE & PIKE ST (578)
\n",
"
15:14:29
\n",
"
15:15:55
\n",
"
\n",
"
\n",
"
39155
\n",
"
2016-05-27
\n",
"
6215
\n",
"
674
\n",
"
N
\n",
"
30905740
\n",
"
578
\n",
"
3RD AVE & PIKE ST (578)
\n",
"
17:26:29
\n",
"
17:25:40
\n",
"
\n",
"
\n",
"
39156
\n",
"
2016-05-27
\n",
"
6216
\n",
"
674
\n",
"
N
\n",
"
30905885
\n",
"
578
\n",
"
3RD AVE & PIKE ST (578)
\n",
"
18:06:29
\n",
"
18:07:01
\n",
"
\n",
" \n",
"
\n",
"
39157 rows × 9 columns
\n",
"
"
],
"text/plain": [
" OPD_DATE VEHICLE_ID RTE DIR TRIP_ID STOP_ID \\\n",
"0 2016-03-26 6201 673 S 30908177 431 \n",
"1 2016-03-26 6201 673 S 30908033 431 \n",
"2 2016-03-26 6201 673 S 30908028 431 \n",
"3 2016-03-26 6201 673 S 30908019 431 \n",
"4 2016-03-26 6201 673 S 30908252 431 \n",
"... ... ... ... .. ... ... \n",
"39152 2016-05-27 6215 674 N 30905957 578 \n",
"39153 2016-05-27 6215 674 N 30905720 578 \n",
"39154 2016-05-27 6215 674 N 30905729 578 \n",
"39155 2016-05-27 6215 674 N 30905740 578 \n",
"39156 2016-05-27 6216 674 N 30905885 578 \n",
"\n",
" STOP_NAME SCH_STOP_TM ACT_STOP_TM \n",
"0 3RD AVE & PIKE ST (431) 01:11:57 01:13:19 \n",
"1 3RD AVE & PIKE ST (431) 23:19:57 23:16:13 \n",
"2 3RD AVE & PIKE ST (431) 21:19:57 21:18:46 \n",
"3 3RD AVE & PIKE ST (431) 19:04:57 19:01:49 \n",
"4 3RD AVE & PIKE ST (431) 16:42:57 16:42:39 \n",
"... ... ... ... \n",
"39152 3RD AVE & PIKE ST (578) 10:50:25 10:49:50 \n",
"39153 3RD AVE & PIKE ST (578) 13:02:27 13:07:10 \n",
"39154 3RD AVE & PIKE ST (578) 15:14:29 15:15:55 \n",
"39155 3RD AVE & PIKE ST (578) 17:26:29 17:25:40 \n",
"39156 3RD AVE & PIKE ST (578) 18:06:29 18:07:01 \n",
"\n",
"[39157 rows x 9 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bus_arrival_times = (\n",
" pd\n",
" .read_csv(\n",
" StringIO(\n",
" response.text\n",
" )\n",
" )\n",
")\n",
"\n",
"bus_arrival_times"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Exploration\n",
"\n",
"Let's check how many days, buses, routes, trips, stops, etc. do we have in the data.\n",
"* Start with the bus arrival times data above\n",
"* Convert every cell to string value\n",
"* Describe the table (count, unique values, top and frequency)\n",
"* Focus only on the unique values count"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"OPD_DATE 63\n",
"VEHICLE_ID 115\n",
"RTE 3\n",
"DIR 2\n",
"TRIP_ID 1660\n",
"STOP_ID 2\n",
"STOP_NAME 2\n",
"SCH_STOP_TM 1357\n",
"ACT_STOP_TM 27633\n",
"Name: unique, dtype: object"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(\n",
" bus_arrival_times\n",
" .astype(str)\n",
" .describe()\n",
" .loc['unique']\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that we have 63 days of data, for 115 buses, in 3 lines (_RTE_) and 2 directions and schedule and arrival times in 2 stops over 1660 trips."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Cleanup\n",
"\n",
"Let's make the data easier to understand and to calculate the accuracy of the lines\n",
"* Start with the bus arrival times table above\n",
"* Filter out invalid records with _TRIP_ID_ = 0\n",
"* Create a _scheduled_ column timestamp with the combination of the date and the scheduled stop time\n",
"* Create a _actual_ column timestamp with the combination of the date and the actual stop time\n",
"* Calculate the difference between the above timestamps \n",
"* Calculate the difference in minutes by scaling to seconds and then 60 (seconds in a minute)\n",
"* Fix the rows that fall across midnights (difference larger than 1000 minutes)\n",
"* Add a column with the route symbol (_C_, _D_ or _E_)\n",
"* Add a column with the direction of the trip (_northbound_ or _southbound_)\n",
"* Focus only on the new columns we created here"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(\n",
" trips_accuracy\n",
" .hist(bins=50)\n",
");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or even break it down by the different routes and directions to see if the grouops are behaving in a similar way"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"(\n",
" trips_accuracy\n",
" .query('minutes_late < 30')\n",
" .hist(\n",
" bins=50,\n",
" sharex=True, \n",
" by=['route','direction'], \n",
" figsize=(10,6)\n",
" )\n",
");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Fancier Visualization\n",
"\n",
"The default visualization functionality of Pandas is often enhanced with a set of graphic libraries that we will cover in a dedicated chapter. Here is an improved visualization using Seaborn."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.7/site-packages/secretstorage/dhcrypto.py:16: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n",
" from cryptography.utils import int_from_bytes\n",
"/opt/conda/lib/python3.7/site-packages/secretstorage/util.py:25: CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead\n",
" from cryptography.utils import int_from_bytes\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip install seaborn --quiet"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"g = (\n",
" sns\n",
" .FacetGrid(\n",
" trips_accuracy, \n",
" row=\"direction\", \n",
" col=\"route\"\n",
" )\n",
")\n",
"\n",
"g.map(\n",
" plt.hist, \n",
" \"minutes_late\", \n",
" bins=np.arange(-10, 20)\n",
")\n",
"g.set_titles('{col_name} {row_name}')\n",
"g.set_axis_labels('minutes late', 'number of trips');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You might expect that the buses stick closer to their schedule near the beginning of each one-way trip and show more spread near the end, and this is borne out in the data: the southbound C-line and northbound D and E lines are near the beginning of their respective routes, and in the opposite direction they are near the end."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Scheduled and Actual Arrival Intervals\n",
"\n",
"* Start with the trips_accuracy table above\n",
"* Sort the value based on the Scheduled time\n",
"* Group by _route_ and _direction_\n",
"* Focus only on the Scheduled and actual time columns\n",
"* calculate the diff between every adjacent trips in each Group\n",
"* Convert null values to 0\n",
"* Convert the time delta values to minutes\n",
"* Merge with the original table based on the similar index of both tables\n",
"* Change the name of the column from the diff table to include the suffix _interval"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:5: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" \"\"\"\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
scheduled_interval
\n",
"
actual_interval
\n",
"
route
\n",
"
direction
\n",
"
scheduled
\n",
"
actual
\n",
"
minutes_late
\n",
"
\n",
" \n",
" \n",
"
\n",
"
19512
\n",
"
0.0
\n",
"
0.0
\n",
"
C
\n",
"
northbound
\n",
"
2016-03-26 00:00:25
\n",
"
2016-03-26 00:05:01
\n",
"
4.600000
\n",
"
\n",
"
\n",
"
79
\n",
"
0.0
\n",
"
0.0
\n",
"
C
\n",
"
southbound
\n",
"
2016-03-26 00:04:57
\n",
"
2016-03-26 00:05:18
\n",
"
0.350000
\n",
"
\n",
"
\n",
"
19725
\n",
"
0.0
\n",
"
0.0
\n",
"
D
\n",
"
northbound
\n",
"
2016-03-26 00:05:25
\n",
"
2016-03-26 00:05:06
\n",
"
-0.316667
\n",
"
\n",
"
\n",
"
155
\n",
"
0.0
\n",
"
0.0
\n",
"
E
\n",
"
southbound
\n",
"
2016-03-26 00:27:59
\n",
"
2016-03-26 00:28:04
\n",
"
0.083333
\n",
"
\n",
"
\n",
"
19569
\n",
"
0.0
\n",
"
0.0
\n",
"
E
\n",
"
northbound
\n",
"
2016-03-26 00:28:10
\n",
"
2016-03-26 00:29:46
\n",
"
1.600000
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
19462
\n",
"
15.0
\n",
"
13.0
\n",
"
D
\n",
"
southbound
\n",
"
2016-05-27 23:44:58
\n",
"
2016-05-27 23:45:36
\n",
"
0.633333
\n",
"
\n",
"
\n",
"
4609
\n",
"
15.0
\n",
"
16.0
\n",
"
C
\n",
"
southbound
\n",
"
2016-05-27 23:49:57
\n",
"
2016-05-27 23:49:35
\n",
"
-0.366667
\n",
"
\n",
"
\n",
"
9735
\n",
"
30.0
\n",
"
27.0
\n",
"
E
\n",
"
southbound
\n",
"
2016-05-27 23:53:59
\n",
"
2016-05-27 23:57:15
\n",
"
3.266667
\n",
"
\n",
"
\n",
"
29313
\n",
"
30.0
\n",
"
30.0
\n",
"
E
\n",
"
northbound
\n",
"
2016-05-27 23:55:10
\n",
"
2016-05-27 23:54:09
\n",
"
-1.016667
\n",
"
\n",
"
\n",
"
19426
\n",
"
15.0
\n",
"
-1425.0
\n",
"
D
\n",
"
southbound
\n",
"
2016-05-27 23:59:58
\n",
"
2016-05-27 00:01:28
\n",
"
1.500000
\n",
"
\n",
" \n",
"
\n",
"
38917 rows × 7 columns
\n",
"
"
],
"text/plain": [
" scheduled_interval actual_interval route direction \\\n",
"19512 0.0 0.0 C northbound \n",
"79 0.0 0.0 C southbound \n",
"19725 0.0 0.0 D northbound \n",
"155 0.0 0.0 E southbound \n",
"19569 0.0 0.0 E northbound \n",
"... ... ... ... ... \n",
"19462 15.0 13.0 D southbound \n",
"4609 15.0 16.0 C southbound \n",
"9735 30.0 27.0 E southbound \n",
"29313 30.0 30.0 E northbound \n",
"19426 15.0 -1425.0 D southbound \n",
"\n",
" scheduled actual minutes_late \n",
"19512 2016-03-26 00:00:25 2016-03-26 00:05:01 4.600000 \n",
"79 2016-03-26 00:04:57 2016-03-26 00:05:18 0.350000 \n",
"19725 2016-03-26 00:05:25 2016-03-26 00:05:06 -0.316667 \n",
"155 2016-03-26 00:27:59 2016-03-26 00:28:04 0.083333 \n",
"19569 2016-03-26 00:28:10 2016-03-26 00:29:46 1.600000 \n",
"... ... ... ... \n",
"19462 2016-05-27 23:44:58 2016-05-27 23:45:36 0.633333 \n",
"4609 2016-05-27 23:49:57 2016-05-27 23:49:35 -0.366667 \n",
"9735 2016-05-27 23:53:59 2016-05-27 23:57:15 3.266667 \n",
"29313 2016-05-27 23:55:10 2016-05-27 23:54:09 -1.016667 \n",
"19426 2016-05-27 23:59:58 2016-05-27 00:01:28 1.500000 \n",
"\n",
"[38917 rows x 7 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trips_intervals = (\n",
" trips_accuracy\n",
" .sort_values('scheduled')\n",
" .groupby(['route', 'direction'])\n",
" ['scheduled','actual']\n",
" .diff()\n",
" .fillna(pd.Timedelta(seconds=0))\n",
" .astype('timedelta64[m]')\n",
" .merge(\n",
" trips_accuracy,\n",
" left_index=True, \n",
" right_index=True,\n",
" suffixes=(\"_interval\",\"\")\n",
" )\n",
")\n",
"trips_intervals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that we have a few issues with the midnights and some of the interval are a day apart. Previously, we fixed it in the flow, however, now we can use a function that is fixing this issues on a specific column to simplify our code. \n",
"* Start with the given table \n",
"* If the value is smaller than 1,000 \n",
"* Assign to the given column name the original value of the column \n",
"* Otheriwse, assign a value that is (60 minutes by 24 hours) minutes smaller\n",
"* Repeat for values that are larger than -1,000"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def fix_midnights(df, col_name):\n",
" fixed_df = (\n",
" df\n",
" .assign(**{col_name : lambda x: np.where(\n",
" x[col_name] < 1_000, \n",
" x[col_name], \n",
" x[col_name] - 60*24)}\n",
" )\n",
" .assign(**{col_name : lambda x: np.where(\n",
" x[col_name] > -1_000, \n",
" x[col_name], \n",
" x[col_name] + 60*24)}\n",
" )\n",
" )\n",
" return fixed_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have a business logic function that can fix the midnight problem that we saw in our data, we can apply on the two problematic columns in our table:\n",
"* Start with the trip intervals table above\n",
"* Fix the midnight problem in scheduled_interval column\n",
"* Fix the midnight problem in actual_interval column"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
scheduled_interval
\n",
"
actual_interval
\n",
"
route
\n",
"
direction
\n",
"
scheduled
\n",
"
actual
\n",
"
minutes_late
\n",
"
\n",
" \n",
" \n",
"
\n",
"
19512
\n",
"
0.0
\n",
"
0.0
\n",
"
C
\n",
"
northbound
\n",
"
2016-03-26 00:00:25
\n",
"
2016-03-26 00:05:01
\n",
"
4.600000
\n",
"
\n",
"
\n",
"
79
\n",
"
0.0
\n",
"
0.0
\n",
"
C
\n",
"
southbound
\n",
"
2016-03-26 00:04:57
\n",
"
2016-03-26 00:05:18
\n",
"
0.350000
\n",
"
\n",
"
\n",
"
19725
\n",
"
0.0
\n",
"
0.0
\n",
"
D
\n",
"
northbound
\n",
"
2016-03-26 00:05:25
\n",
"
2016-03-26 00:05:06
\n",
"
-0.316667
\n",
"
\n",
"
\n",
"
155
\n",
"
0.0
\n",
"
0.0
\n",
"
E
\n",
"
southbound
\n",
"
2016-03-26 00:27:59
\n",
"
2016-03-26 00:28:04
\n",
"
0.083333
\n",
"
\n",
"
\n",
"
19569
\n",
"
0.0
\n",
"
0.0
\n",
"
E
\n",
"
northbound
\n",
"
2016-03-26 00:28:10
\n",
"
2016-03-26 00:29:46
\n",
"
1.600000
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
19462
\n",
"
15.0
\n",
"
13.0
\n",
"
D
\n",
"
southbound
\n",
"
2016-05-27 23:44:58
\n",
"
2016-05-27 23:45:36
\n",
"
0.633333
\n",
"
\n",
"
\n",
"
4609
\n",
"
15.0
\n",
"
16.0
\n",
"
C
\n",
"
southbound
\n",
"
2016-05-27 23:49:57
\n",
"
2016-05-27 23:49:35
\n",
"
-0.366667
\n",
"
\n",
"
\n",
"
9735
\n",
"
30.0
\n",
"
27.0
\n",
"
E
\n",
"
southbound
\n",
"
2016-05-27 23:53:59
\n",
"
2016-05-27 23:57:15
\n",
"
3.266667
\n",
"
\n",
"
\n",
"
29313
\n",
"
30.0
\n",
"
30.0
\n",
"
E
\n",
"
northbound
\n",
"
2016-05-27 23:55:10
\n",
"
2016-05-27 23:54:09
\n",
"
-1.016667
\n",
"
\n",
"
\n",
"
19426
\n",
"
15.0
\n",
"
15.0
\n",
"
D
\n",
"
southbound
\n",
"
2016-05-27 23:59:58
\n",
"
2016-05-27 00:01:28
\n",
"
1.500000
\n",
"
\n",
" \n",
"
\n",
"
38917 rows × 7 columns
\n",
"
"
],
"text/plain": [
" scheduled_interval actual_interval route direction \\\n",
"19512 0.0 0.0 C northbound \n",
"79 0.0 0.0 C southbound \n",
"19725 0.0 0.0 D northbound \n",
"155 0.0 0.0 E southbound \n",
"19569 0.0 0.0 E northbound \n",
"... ... ... ... ... \n",
"19462 15.0 13.0 D southbound \n",
"4609 15.0 16.0 C southbound \n",
"9735 30.0 27.0 E southbound \n",
"29313 30.0 30.0 E northbound \n",
"19426 15.0 15.0 D southbound \n",
"\n",
" scheduled actual minutes_late \n",
"19512 2016-03-26 00:00:25 2016-03-26 00:05:01 4.600000 \n",
"79 2016-03-26 00:04:57 2016-03-26 00:05:18 0.350000 \n",
"19725 2016-03-26 00:05:25 2016-03-26 00:05:06 -0.316667 \n",
"155 2016-03-26 00:27:59 2016-03-26 00:28:04 0.083333 \n",
"19569 2016-03-26 00:28:10 2016-03-26 00:29:46 1.600000 \n",
"... ... ... ... \n",
"19462 2016-05-27 23:44:58 2016-05-27 23:45:36 0.633333 \n",
"4609 2016-05-27 23:49:57 2016-05-27 23:49:35 -0.366667 \n",
"9735 2016-05-27 23:53:59 2016-05-27 23:57:15 3.266667 \n",
"29313 2016-05-27 23:55:10 2016-05-27 23:54:09 -1.016667 \n",
"19426 2016-05-27 23:59:58 2016-05-27 00:01:28 1.500000 \n",
"\n",
"[38917 rows x 7 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fixed_trip_intervals = (\n",
" trips_intervals\n",
" .pipe(fix_midnights, 'scheduled_interval')\n",
" .pipe(fix_midnights, 'actual_interval')\n",
")\n",
"fixed_trip_intervals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Visualization\n",
"### Actual Intervals Distribution\n",
"\n",
"* Create grid of graphs from the fixed trip intervals table\n",
"* each row will have a different direction\n",
"* each column will have a different route\n",
"* In each graph create an histogram with the actual interval value\n",
"* with bins between 0 and 50\n",
"* Add a title for each graph with the route and direction\n",
"* Add labels to the axis"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"g = (\n",
" sns\n",
" .FacetGrid(\n",
" fixed_trip_intervals, \n",
" row=\"direction\", \n",
" col=\"route\"\n",
" )\n",
")\n",
"g.map(\n",
" plt.hist, \n",
" \"actual_interval\", \n",
" bins=np.arange(50)\n",
")\n",
"g.set_titles('{col_name} {row_name}')\n",
"g.set_axis_labels('actual interval (minutes)', 'number of buses');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"the distributions may be affected by non-constant scheduled arrival intervals. Let's understand the different intervals that are scheduled. We will repeat the graphs logic above and plot the _schedule interval_ instead of the actual ones. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"g = (\n",
" sns\n",
" .FacetGrid(\n",
" fixed_trip_intervals, \n",
" row=\"direction\", \n",
" col=\"route\"\n",
" )\n",
")\n",
"g.map(plt.hist, \"scheduled_interval\", bins=np.arange(20) - 0.5)\n",
"g.set_titles('{col_name} {row_name}')\n",
"g.set_axis_labels('scheduled interval (minutes)', 'frequency');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Heat Maps\n",
"We can see the most of the lines have 7, 12 and 15 minutes interval for most of the trips. If we to see the heat map of the interval plans, we can add the hour and the day-of-week (dow) to the table using _eval_:\n",
"* Start with the fixed trip intervals table above\n",
"* Add a column with the hour in the day of each trip\n",
"* Add a column with the name of the day in the week\n",
"* Convert the name of the day to be an ordered category based on the day names from the calendar (it will make the order of the days in the graph to be as expected and not alphabetic)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
scheduled_interval
\n",
"
actual_interval
\n",
"
route
\n",
"
direction
\n",
"
scheduled
\n",
"
actual
\n",
"
minutes_late
\n",
"
hour
\n",
"
dow
\n",
"
\n",
" \n",
" \n",
"
\n",
"
19512
\n",
"
0.0
\n",
"
0.0
\n",
"
C
\n",
"
northbound
\n",
"
2016-03-26 00:00:25
\n",
"
2016-03-26 00:05:01
\n",
"
4.600000
\n",
"
0
\n",
"
Saturday
\n",
"
\n",
"
\n",
"
79
\n",
"
0.0
\n",
"
0.0
\n",
"
C
\n",
"
southbound
\n",
"
2016-03-26 00:04:57
\n",
"
2016-03-26 00:05:18
\n",
"
0.350000
\n",
"
0
\n",
"
Saturday
\n",
"
\n",
"
\n",
"
19725
\n",
"
0.0
\n",
"
0.0
\n",
"
D
\n",
"
northbound
\n",
"
2016-03-26 00:05:25
\n",
"
2016-03-26 00:05:06
\n",
"
-0.316667
\n",
"
0
\n",
"
Saturday
\n",
"
\n",
"
\n",
"
155
\n",
"
0.0
\n",
"
0.0
\n",
"
E
\n",
"
southbound
\n",
"
2016-03-26 00:27:59
\n",
"
2016-03-26 00:28:04
\n",
"
0.083333
\n",
"
0
\n",
"
Saturday
\n",
"
\n",
"
\n",
"
19569
\n",
"
0.0
\n",
"
0.0
\n",
"
E
\n",
"
northbound
\n",
"
2016-03-26 00:28:10
\n",
"
2016-03-26 00:29:46
\n",
"
1.600000
\n",
"
0
\n",
"
Saturday
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
19462
\n",
"
15.0
\n",
"
13.0
\n",
"
D
\n",
"
southbound
\n",
"
2016-05-27 23:44:58
\n",
"
2016-05-27 23:45:36
\n",
"
0.633333
\n",
"
23
\n",
"
Friday
\n",
"
\n",
"
\n",
"
4609
\n",
"
15.0
\n",
"
16.0
\n",
"
C
\n",
"
southbound
\n",
"
2016-05-27 23:49:57
\n",
"
2016-05-27 23:49:35
\n",
"
-0.366667
\n",
"
23
\n",
"
Friday
\n",
"
\n",
"
\n",
"
9735
\n",
"
30.0
\n",
"
27.0
\n",
"
E
\n",
"
southbound
\n",
"
2016-05-27 23:53:59
\n",
"
2016-05-27 23:57:15
\n",
"
3.266667
\n",
"
23
\n",
"
Friday
\n",
"
\n",
"
\n",
"
29313
\n",
"
30.0
\n",
"
30.0
\n",
"
E
\n",
"
northbound
\n",
"
2016-05-27 23:55:10
\n",
"
2016-05-27 23:54:09
\n",
"
-1.016667
\n",
"
23
\n",
"
Friday
\n",
"
\n",
"
\n",
"
19426
\n",
"
15.0
\n",
"
15.0
\n",
"
D
\n",
"
southbound
\n",
"
2016-05-27 23:59:58
\n",
"
2016-05-27 00:01:28
\n",
"
1.500000
\n",
"
23
\n",
"
Friday
\n",
"
\n",
" \n",
"
\n",
"
38917 rows × 9 columns
\n",
"
"
],
"text/plain": [
" scheduled_interval actual_interval route direction \\\n",
"19512 0.0 0.0 C northbound \n",
"79 0.0 0.0 C southbound \n",
"19725 0.0 0.0 D northbound \n",
"155 0.0 0.0 E southbound \n",
"19569 0.0 0.0 E northbound \n",
"... ... ... ... ... \n",
"19462 15.0 13.0 D southbound \n",
"4609 15.0 16.0 C southbound \n",
"9735 30.0 27.0 E southbound \n",
"29313 30.0 30.0 E northbound \n",
"19426 15.0 15.0 D southbound \n",
"\n",
" scheduled actual minutes_late hour dow \n",
"19512 2016-03-26 00:00:25 2016-03-26 00:05:01 4.600000 0 Saturday \n",
"79 2016-03-26 00:04:57 2016-03-26 00:05:18 0.350000 0 Saturday \n",
"19725 2016-03-26 00:05:25 2016-03-26 00:05:06 -0.316667 0 Saturday \n",
"155 2016-03-26 00:27:59 2016-03-26 00:28:04 0.083333 0 Saturday \n",
"19569 2016-03-26 00:28:10 2016-03-26 00:29:46 1.600000 0 Saturday \n",
"... ... ... ... ... ... \n",
"19462 2016-05-27 23:44:58 2016-05-27 23:45:36 0.633333 23 Friday \n",
"4609 2016-05-27 23:49:57 2016-05-27 23:49:35 -0.366667 23 Friday \n",
"9735 2016-05-27 23:53:59 2016-05-27 23:57:15 3.266667 23 Friday \n",
"29313 2016-05-27 23:55:10 2016-05-27 23:54:09 -1.016667 23 Friday \n",
"19426 2016-05-27 23:59:58 2016-05-27 00:01:28 1.500000 23 Friday \n",
"\n",
"[38917 rows x 9 columns]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pandas.api.types import CategoricalDtype\n",
"import calendar\n",
"trip_intervals_with_time = (\n",
" fixed_trip_intervals\n",
" .eval(\"hour = scheduled.dt.hour\")\n",
" .assign(dow = lambda x : x.scheduled.dt.day_name().astype(\n",
" CategoricalDtype(\n",
" ordered=True, \n",
" categories=list(calendar.day_name))\n",
" )\n",
" )\n",
")\n",
"trip_intervals_with_time"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To plot the heatmap we will use the built-in heatmap graph of Seaborn library:\n",
"* Start with the trip intervals table with the hour and dow above\n",
"* Take only the _hour_, _dow_ and _scheduled interval_ columns\n",
"* Create a pivot table with _hour_ as the index and _dow_ as columns (with mean as default aggregation function)\n",
"* Clip values that are larger than 60 minutes to 60\n",
"* Remove the first level of the columns names (the name of the calculated column _scheduled interval_)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.heatmap(\n",
" trip_intervals_with_time\n",
" [['hour','dow','scheduled_interval']]\n",
" .pivot_table(index='hour', columns='dow')\n",
" .clip(upper=60)\n",
" .droplevel(0, axis='columns'),\n",
" cmap=\"YlOrRd\"\n",
");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As expected the larger intervals are during the night (between midnight and 5 AM) and the shortest are during the rush hours of the morning and afternoon. We can also see the Saturday and Sunday have longer interval as expected.\n",
"\n",
"Let's check how the actual arrival times behave across the week and create a similar heatmap of the _minute late_ column that we calculated above. "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.heatmap(\n",
" trip_intervals_with_time\n",
" [['hour','dow','minutes_late']]\n",
" .pivot_table(index='hour', columns='dow')\n",
" .clip(upper=60)\n",
" .droplevel(0, axis='columns'),\n",
" cmap=\"YlOrRd\"\n",
");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Most of the problems are at 5 PM mostly on Monday, Thursday and Friday. We can also see some higher delay on the last shift of the night at 4 AM, however, it is probably not affecting that many people like the delays of the rush hours of the afternoon. \n",
"\n",
"Let's break it down by route:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"minutes_late_heatmap_by_route = (\n",
" trip_intervals_with_time\n",
" [['hour','dow','minutes_late','route']]\n",
" .pivot_table(index=['route','hour'], columns=['dow'])\n",
" .clip(upper=60)\n",
" .droplevel(0, axis='columns')\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Heatmap as a table with values\n",
"\n",
"This time we will create the heat map more similar to the way it will be presented in Excel using style (similar to Conditional Formatting in Excel):\n",
"* Start with the pivot table per route\n",
"* Apply style to table\n",
"* Format the values to be with up to 2 digits of precision\n",
"* Apply conditional backgroud to each cell with gradient from yellow to orange to red"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
dow
\n",
"
Monday
\n",
"
Tuesday
\n",
"
Wednesday
\n",
"
Thursday
\n",
"
Friday
\n",
"
Saturday
\n",
"
Sunday
\n",
"
\n",
"
\n",
"
route
\n",
"
hour
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
C
\n",
"
0
\n",
"
-0.017
\n",
"
-1.4
\n",
"
-1.0
\n",
"
-0.67
\n",
"
-0.62
\n",
"
1.6
\n",
"
0.98
\n",
"
\n",
"
\n",
"
1
\n",
"
0.33
\n",
"
-0.21
\n",
"
-1.3
\n",
"
-0.67
\n",
"
0.34
\n",
"
-0.25
\n",
"
-1.9
\n",
"
\n",
"
\n",
"
2
\n",
"
0.14
\n",
"
-0.68
\n",
"
1.2
\n",
"
1.3
\n",
"
0.4
\n",
"
2.1
\n",
"
2.1
\n",
"
\n",
"
\n",
"
3
\n",
"
0.36
\n",
"
0.91
\n",
"
-2.1
\n",
"
1.5
\n",
"
-
\n",
"
-
\n",
"
0.15
\n",
"
\n",
"
\n",
"
4
\n",
"
3.6
\n",
"
-1.6
\n",
"
5.0
\n",
"
1.5
\n",
"
-
\n",
"
-
\n",
"
4.0
\n",
"
\n",
"
\n",
"
5
\n",
"
1.2
\n",
"
0.61
\n",
"
0.39
\n",
"
0.51
\n",
"
-0.0023
\n",
"
-0.55
\n",
"
-0.37
\n",
"
\n",
"
\n",
"
6
\n",
"
0.33
\n",
"
0.42
\n",
"
0.16
\n",
"
0.04
\n",
"
0.28
\n",
"
-0.7
\n",
"
0.018
\n",
"
\n",
"
\n",
"
7
\n",
"
1.7
\n",
"
2.2
\n",
"
2.1
\n",
"
1.6
\n",
"
2.0
\n",
"
0.36
\n",
"
-0.51
\n",
"
\n",
"
\n",
"
8
\n",
"
2.3
\n",
"
2.5
\n",
"
2.6
\n",
"
3.7
\n",
"
4.3
\n",
"
-0.58
\n",
"
-1.7
\n",
"
\n",
"
\n",
"
9
\n",
"
1.0
\n",
"
2.0
\n",
"
2.7
\n",
"
2.5
\n",
"
2.8
\n",
"
0.73
\n",
"
-2.3
\n",
"
\n",
"
\n",
"
10
\n",
"
-0.33
\n",
"
-0.44
\n",
"
-0.46
\n",
"
1.1
\n",
"
0.98
\n",
"
1.7
\n",
"
-1.9
\n",
"
\n",
"
\n",
"
11
\n",
"
-1.4
\n",
"
-0.93
\n",
"
-0.11
\n",
"
0.23
\n",
"
1.4
\n",
"
3.1
\n",
"
-1.7
\n",
"
\n",
"
\n",
"
12
\n",
"
-0.57
\n",
"
-1.2
\n",
"
-0.23
\n",
"
-0.19
\n",
"
0.96
\n",
"
0.88
\n",
"
-1.2
\n",
"
\n",
"
\n",
"
13
\n",
"
-2.0
\n",
"
-1.8
\n",
"
-1.0
\n",
"
-0.83
\n",
"
-0.082
\n",
"
2.3
\n",
"
-0.51
\n",
"
\n",
"
\n",
"
14
\n",
"
0.01
\n",
"
0.12
\n",
"
0.69
\n",
"
0.052
\n",
"
1.1
\n",
"
2.0
\n",
"
-1.2
\n",
"
\n",
"
\n",
"
15
\n",
"
0.52
\n",
"
0.19
\n",
"
0.54
\n",
"
1.3
\n",
"
2.1
\n",
"
1.9
\n",
"
-1.9
\n",
"
\n",
"
\n",
"
16
\n",
"
2.1
\n",
"
1.6
\n",
"
2.0
\n",
"
2.8
\n",
"
4.8
\n",
"
1.6
\n",
"
-1.8
\n",
"
\n",
"
\n",
"
17
\n",
"
4.1
\n",
"
3.4
\n",
"
3.4
\n",
"
6.7
\n",
"
6.5
\n",
"
0.51
\n",
"
-1.2
\n",
"
\n",
"
\n",
"
18
\n",
"
2.6
\n",
"
1.2
\n",
"
1.7
\n",
"
4.8
\n",
"
5.3
\n",
"
-0.00075
\n",
"
-0.74
\n",
"
\n",
"
\n",
"
19
\n",
"
0.24
\n",
"
-0.1
\n",
"
0.4
\n",
"
1.8
\n",
"
2.3
\n",
"
2.0
\n",
"
0.27
\n",
"
\n",
"
\n",
"
20
\n",
"
2.1
\n",
"
1.5
\n",
"
0.52
\n",
"
2.6
\n",
"
2.7
\n",
"
2.5
\n",
"
1.1
\n",
"
\n",
"
\n",
"
21
\n",
"
1.6
\n",
"
0.88
\n",
"
1.8
\n",
"
2.9
\n",
"
2.7
\n",
"
3.4
\n",
"
0.044
\n",
"
\n",
"
\n",
"
22
\n",
"
0.34
\n",
"
0.39
\n",
"
-0.1
\n",
"
1.5
\n",
"
0.99
\n",
"
2.1
\n",
"
0.52
\n",
"
\n",
"
\n",
"
23
\n",
"
-0.37
\n",
"
-0.67
\n",
"
-0.91
\n",
"
0.27
\n",
"
-0.28
\n",
"
1.1
\n",
"
-1.2
\n",
"
\n",
"
\n",
"
D
\n",
"
0
\n",
"
0.11
\n",
"
1.0
\n",
"
0.088
\n",
"
-0.11
\n",
"
1.7
\n",
"
1.6
\n",
"
2.4
\n",
"
\n",
"
\n",
"
1
\n",
"
3.6
\n",
"
0.68
\n",
"
0.12
\n",
"
1.1
\n",
"
4.0
\n",
"
3.0
\n",
"
3.1
\n",
"
\n",
"
\n",
"
2
\n",
"
2.2
\n",
"
1.7
\n",
"
3.6
\n",
"
2.2
\n",
"
1.8
\n",
"
3.1
\n",
"
3.1
\n",
"
\n",
"
\n",
"
3
\n",
"
2.0
\n",
"
1.8
\n",
"
1.7
\n",
"
2.1
\n",
"
-0.5
\n",
"
3.1
\n",
"
2.5
\n",
"
\n",
"
\n",
"
4
\n",
"
2.6
\n",
"
1.4
\n",
"
1.1
\n",
"
1.8
\n",
"
0.071
\n",
"
2.0
\n",
"
3.2
\n",
"
\n",
"
\n",
"
5
\n",
"
0.4
\n",
"
0.12
\n",
"
0.28
\n",
"
0.69
\n",
"
1.3
\n",
"
-1.8
\n",
"
-1.4
\n",
"
\n",
"
\n",
"
6
\n",
"
0.82
\n",
"
1.2
\n",
"
0.91
\n",
"
1.3
\n",
"
1.2
\n",
"
-0.77
\n",
"
-0.38
\n",
"
\n",
"
\n",
"
7
\n",
"
0.55
\n",
"
1.1
\n",
"
1.1
\n",
"
0.76
\n",
"
0.51
\n",
"
-1.5
\n",
"
-0.3
\n",
"
\n",
"
\n",
"
8
\n",
"
2.7
\n",
"
2.4
\n",
"
2.8
\n",
"
2.1
\n",
"
1.3
\n",
"
0.0045
\n",
"
-0.95
\n",
"
\n",
"
\n",
"
9
\n",
"
0.42
\n",
"
1.2
\n",
"
1.8
\n",
"
2.0
\n",
"
1.1
\n",
"
-0.64
\n",
"
-0.46
\n",
"
\n",
"
\n",
"
10
\n",
"
0.52
\n",
"
0.28
\n",
"
0.19
\n",
"
0.84
\n",
"
1.7
\n",
"
0.94
\n",
"
0.36
\n",
"
\n",
"
\n",
"
11
\n",
"
-0.0036
\n",
"
1.1
\n",
"
0.93
\n",
"
1.3
\n",
"
1.9
\n",
"
1.2
\n",
"
0.2
\n",
"
\n",
"
\n",
"
12
\n",
"
0.57
\n",
"
0.82
\n",
"
0.78
\n",
"
1.7
\n",
"
2.2
\n",
"
0.65
\n",
"
-0.02
\n",
"
\n",
"
\n",
"
13
\n",
"
0.45
\n",
"
1.3
\n",
"
1.2
\n",
"
0.89
\n",
"
1.2
\n",
"
1.7
\n",
"
0.78
\n",
"
\n",
"
\n",
"
14
\n",
"
0.19
\n",
"
0.9
\n",
"
1.3
\n",
"
1.5
\n",
"
1.5
\n",
"
0.77
\n",
"
0.44
\n",
"
\n",
"
\n",
"
15
\n",
"
2.5
\n",
"
1.9
\n",
"
2.3
\n",
"
1.7
\n",
"
3.3
\n",
"
1.3
\n",
"
0.17
\n",
"
\n",
"
\n",
"
16
\n",
"
4.7
\n",
"
0.43
\n",
"
0.62
\n",
"
2.2
\n",
"
3.1
\n",
"
1.5
\n",
"
0.086
\n",
"
\n",
"
\n",
"
17
\n",
"
5.2
\n",
"
1.9
\n",
"
2.1
\n",
"
6.8
\n",
"
6.5
\n",
"
2.4
\n",
"
0.4
\n",
"
\n",
"
\n",
"
18
\n",
"
1.5
\n",
"
1.4
\n",
"
1.3
\n",
"
4.8
\n",
"
3.8
\n",
"
2.5
\n",
"
1.5
\n",
"
\n",
"
\n",
"
19
\n",
"
1.4
\n",
"
0.43
\n",
"
0.93
\n",
"
4.2
\n",
"
2.2
\n",
"
1.4
\n",
"
0.65
\n",
"
\n",
"
\n",
"
20
\n",
"
2.3
\n",
"
1.3
\n",
"
2.3
\n",
"
3.4
\n",
"
3.2
\n",
"
1.7
\n",
"
1.2
\n",
"
\n",
"
\n",
"
21
\n",
"
2.5
\n",
"
2.4
\n",
"
2.6
\n",
"
4.0
\n",
"
2.9
\n",
"
3.4
\n",
"
2.5
\n",
"
\n",
"
\n",
"
22
\n",
"
1.9
\n",
"
1.1
\n",
"
1.2
\n",
"
1.7
\n",
"
3.2
\n",
"
3.4
\n",
"
2.3
\n",
"
\n",
"
\n",
"
23
\n",
"
2.0
\n",
"
1.3
\n",
"
2.0
\n",
"
2.0
\n",
"
3.7
\n",
"
3.4
\n",
"
2.3
\n",
"
\n",
"
\n",
"
E
\n",
"
0
\n",
"
1.7
\n",
"
1.4
\n",
"
1.6
\n",
"
0.81
\n",
"
2.5
\n",
"
0.15
\n",
"
-0.89
\n",
"
\n",
"
\n",
"
1
\n",
"
0.92
\n",
"
1.9
\n",
"
1.5
\n",
"
0.17
\n",
"
2.8
\n",
"
-0.23
\n",
"
-0.33
\n",
"
\n",
"
\n",
"
2
\n",
"
2.8
\n",
"
1.2
\n",
"
0.9
\n",
"
-1.2
\n",
"
4.3
\n",
"
1.9
\n",
"
1.1
\n",
"
\n",
"
\n",
"
3
\n",
"
2.3
\n",
"
1.3
\n",
"
2.3
\n",
"
2.8
\n",
"
-
\n",
"
3.3
\n",
"
2.8
\n",
"
\n",
"
\n",
"
5
\n",
"
0.85
\n",
"
1.3
\n",
"
0.56
\n",
"
1.4
\n",
"
1.6
\n",
"
2.8
\n",
"
-0.47
\n",
"
\n",
"
\n",
"
6
\n",
"
0.89
\n",
"
1.9
\n",
"
1.3
\n",
"
1.5
\n",
"
1.6
\n",
"
-0.85
\n",
"
1.0
\n",
"
\n",
"
\n",
"
7
\n",
"
1.1
\n",
"
2.2
\n",
"
1.7
\n",
"
1.5
\n",
"
1.4
\n",
"
0.28
\n",
"
0.29
\n",
"
\n",
"
\n",
"
8
\n",
"
2.2
\n",
"
1.9
\n",
"
2.8
\n",
"
2.2
\n",
"
1.1
\n",
"
0.77
\n",
"
1.8
\n",
"
\n",
"
\n",
"
9
\n",
"
1.0
\n",
"
1.1
\n",
"
1.2
\n",
"
1.3
\n",
"
1.3
\n",
"
0.93
\n",
"
1.1
\n",
"
\n",
"
\n",
"
10
\n",
"
1.1
\n",
"
0.85
\n",
"
2.0
\n",
"
2.1
\n",
"
2.5
\n",
"
1.6
\n",
"
1.5
\n",
"
\n",
"
\n",
"
11
\n",
"
0.75
\n",
"
1.2
\n",
"
0.76
\n",
"
1.4
\n",
"
2.1
\n",
"
-0.39
\n",
"
0.74
\n",
"
\n",
"
\n",
"
12
\n",
"
1.2
\n",
"
1.4
\n",
"
2.2
\n",
"
1.9
\n",
"
2.5
\n",
"
1.5
\n",
"
0.25
\n",
"
\n",
"
\n",
"
13
\n",
"
0.21
\n",
"
0.53
\n",
"
0.58
\n",
"
0.88
\n",
"
2.3
\n",
"
1.0
\n",
"
0.98
\n",
"
\n",
"
\n",
"
14
\n",
"
1.0
\n",
"
2.1
\n",
"
1.2
\n",
"
2.5
\n",
"
4.6
\n",
"
0.93
\n",
"
1.1
\n",
"
\n",
"
\n",
"
15
\n",
"
1.8
\n",
"
1.7
\n",
"
2.5
\n",
"
2.6
\n",
"
4.2
\n",
"
0.9
\n",
"
1.3
\n",
"
\n",
"
\n",
"
16
\n",
"
2.8
\n",
"
2.3
\n",
"
3.1
\n",
"
4.4
\n",
"
4.9
\n",
"
-0.32
\n",
"
1.1
\n",
"
\n",
"
\n",
"
17
\n",
"
2.7
\n",
"
3.1
\n",
"
2.9
\n",
"
3.9
\n",
"
4.3
\n",
"
0.61
\n",
"
1.2
\n",
"
\n",
"
\n",
"
18
\n",
"
0.62
\n",
"
0.36
\n",
"
0.69
\n",
"
0.7
\n",
"
2.1
\n",
"
-0.35
\n",
"
-0.39
\n",
"
\n",
"
\n",
"
19
\n",
"
0.29
\n",
"
0.77
\n",
"
1.5
\n",
"
0.85
\n",
"
2.0
\n",
"
0.066
\n",
"
-1.0
\n",
"
\n",
"
\n",
"
20
\n",
"
1.3
\n",
"
1.7
\n",
"
1.8
\n",
"
2.4
\n",
"
2.1
\n",
"
-0.27
\n",
"
-0.68
\n",
"
\n",
"
\n",
"
21
\n",
"
1.5
\n",
"
3.0
\n",
"
2.7
\n",
"
1.4
\n",
"
2.5
\n",
"
-0.66
\n",
"
-1.3
\n",
"
\n",
"
\n",
"
22
\n",
"
2.2
\n",
"
2.4
\n",
"
2.5
\n",
"
2.3
\n",
"
2.3
\n",
"
-0.48
\n",
"
-0.57
\n",
"
\n",
"
\n",
"
23
\n",
"
2.3
\n",
"
2.2
\n",
"
3.2
\n",
"
1.9
\n",
"
3.5
\n",
"
-0.37
\n",
"
-1.2
\n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(\n",
" minutes_late_heatmap_by_route\n",
" .style\n",
" .format(\"{:.2}\", na_rep=\"-\")\n",
" .background_gradient(cmap='YlOrRd')\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now it is easy to see the 5-7 minutes delays during the rush hours of the C and D routes. We can also explore other problemaic times on Saturday, etc. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"instance_type": "ml.t3.medium",
"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.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}