diff --git a/doc/filtering_observed_arrivals.ipynb b/doc/filtering_observed_arrivals.ipynb index c265acd..f14f93e 100644 --- a/doc/filtering_observed_arrivals.ipynb +++ b/doc/filtering_observed_arrivals.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -393,13 +393,15 @@ "|2 | 62 |\n", "| 4 | 6 |\n", "\n", - "So the " + "So the `train_id` isn't quite unique per trip, but something weird is happening to have more train ids than actual trains..." ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [ { "ename": "NameError", @@ -423,20 +425,6 @@ "one_train = pandasql.read_sql(sql, con)" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 5, @@ -6803,6 +6791,13 @@ " & ((train_136['train_message'] != 'Delayed') | (train_136['timint'] < 1.0 ))]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using Minute-Resolution Data" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -7616,7 +7611,1486 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The top \"trips\" are from Bloor-Spadina to Yonge via St. George and vice-versa, but these are the stations on line 2..." + "The top \"trips\" are from Bloor-Spadina to Yonge via St. George and vice-versa, but these are the stations on line 2... I think we are getting data for the wrong line because the line id is actually assigned by the data pulling script. So we need to filter the data by line based on `subwayline` field in the `ntas_data` table." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Re-examining Line 1 by Filtering on Stations\n", + "Re-doing this entire processing by using the `subwayline` from the `ntas_data` table instead" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Recreate a day of data\n", + "sql = '''DROP MATERIALIZED VIEW IF EXISTS test_day CASCADE; \n", + "CREATE MATERIALIZED VIEW test_day AS \n", + "SELECT requestid, stationid, line_id, create_date, request_date, station_char, subwayline, system_message_type, \n", + " timint, traindirection, trainid, train_message\n", + "FROM requests_serverless\n", + "INNER JOIN ntas_data_serverless USING (requestid)\n", + "INNER JOIN stations ON stationid = station_id\n", + "WHERE request_date >= '2019-07-17'::DATE + interval '5 hours' \n", + "AND request_date < '2019-07-17'::DATE + interval '29 hours' \n", + "''' \n", + "with con:\n", + " with con.cursor() as cur:\n", + " cur.execute(sql)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Re-checking the number of unique trains" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subwaylineNumber of trains in a day
0BD48
1SHEP4
2YUS169
\n", + "
" + ], + "text/plain": [ + " subwayline Number of trains in a day\n", + "0 BD 48\n", + "1 SHEP 4\n", + "2 YUS 169" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sql = ''' SELECT subwayline, COUNT(DISTINCT trainid) AS \"Number of trains in a day\"\n", + " FROM test_day\n", + " GROUP BY subwayline'''\n", + "pandasql.read_sql(sql, con)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Double-checking stations and lines are correctly mapped" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subwaylinestation_charstationid
0BDBAT146
1BDBAT246
2BDBAU149
3BDBAU249
4YUSBLO150
5YUSBLO122
6YUSBLO222
7YUSBLO250
8BDBRD153
9BDBRD253
10BDBSP19
11BDBSP147
12BDBSP29
13BDBSP247
14SHEPBSS166
15SHEPBSS266
16SHEPBYV165
17SHEPBYV265
18BDCFK152
19BDCFK252
20BDCHE154
21BDCHE254
22BDCHR145
23BDCHR245
24YUSCOL120
25YUSCOL220
26BDCOX158
27BDCOX258
28YUSCVL16
29YUSCVL26
............
134YUSSUM124
135YUSSUM224
136YUSUNI116
137YUSUNI216
138YUSVMC180
139YUSVMC280
140BDVPK161
141BDVPK261
142BDWAR162
143BDWAR262
144BDWDB159
145BDWDB259
146YUSWEL121
147YUSWEL221
148YUSWIL12
149YUSWIL22
150SHEPYIE130
151SHEPYIE164
152SHEPYIE264
153SHEPYIE230
154YUSYKD13
155YUSYKD23
156YUSYKM129
157YUSYKM229
158BDYNG150
159BDYNG122
160BDYNG250
161BDYNG222
162YUSYUN177
163YUSYUN277
\n", + "

164 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " subwayline station_char stationid\n", + "0 BD BAT1 46\n", + "1 BD BAT2 46\n", + "2 BD BAU1 49\n", + "3 BD BAU2 49\n", + "4 YUS BLO1 50\n", + "5 YUS BLO1 22\n", + "6 YUS BLO2 22\n", + "7 YUS BLO2 50\n", + "8 BD BRD1 53\n", + "9 BD BRD2 53\n", + "10 BD BSP1 9\n", + "11 BD BSP1 47\n", + "12 BD BSP2 9\n", + "13 BD BSP2 47\n", + "14 SHEP BSS1 66\n", + "15 SHEP BSS2 66\n", + "16 SHEP BYV1 65\n", + "17 SHEP BYV2 65\n", + "18 BD CFK1 52\n", + "19 BD CFK2 52\n", + "20 BD CHE1 54\n", + "21 BD CHE2 54\n", + "22 BD CHR1 45\n", + "23 BD CHR2 45\n", + "24 YUS COL1 20\n", + "25 YUS COL2 20\n", + "26 BD COX1 58\n", + "27 BD COX2 58\n", + "28 YUS CVL1 6\n", + "29 YUS CVL2 6\n", + ".. ... ... ...\n", + "134 YUS SUM1 24\n", + "135 YUS SUM2 24\n", + "136 YUS UNI1 16\n", + "137 YUS UNI2 16\n", + "138 YUS VMC1 80\n", + "139 YUS VMC2 80\n", + "140 BD VPK1 61\n", + "141 BD VPK2 61\n", + "142 BD WAR1 62\n", + "143 BD WAR2 62\n", + "144 BD WDB1 59\n", + "145 BD WDB2 59\n", + "146 YUS WEL1 21\n", + "147 YUS WEL2 21\n", + "148 YUS WIL1 2\n", + "149 YUS WIL2 2\n", + "150 SHEP YIE1 30\n", + "151 SHEP YIE1 64\n", + "152 SHEP YIE2 64\n", + "153 SHEP YIE2 30\n", + "154 YUS YKD1 3\n", + "155 YUS YKD2 3\n", + "156 YUS YKM1 29\n", + "157 YUS YKM2 29\n", + "158 BD YNG1 50\n", + "159 BD YNG1 22\n", + "160 BD YNG2 50\n", + "161 BD YNG2 22\n", + "162 YUS YUN1 77\n", + "163 YUS YUN2 77\n", + "\n", + "[164 rows x 3 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sql = '''SELECT DISTINCT subwayline, station_char, stationid\n", + "FROM test_day\n", + "ORDER BY station_char'''\n", + "pandasql.read_sql(sql, con)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Seems ok. Rerunning the other processing queries based on that" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "split_trips = '''\n", + " CREATE SEQUENCE IF NOT EXISTS trip_ids;\n", + " CREATE MATERIALIZED VIEW test_day_w_trips AS\n", + " SELECT trainid, subwayline, traindirection, stationid, station_char, create_date, create_date + timint * interval '1 minute' AS expected_arrival, timint, train_message,\n", + " CASE traindirection WHEN lag(traindirection) OVER w THEN currval('trip_ids') ELSE nextval('trip_ids') END AS trip_id\n", + " FROM test_day\n", + " WHERE (timint < 1 OR train_message = 'AtStation') \n", + " WINDOW w AS (PARTITION BY subwayline, trainid ORDER BY create_date + timint * interval '1 minute') \n", + " '''\n", + "with con:\n", + " with con.cursor() as cur:\n", + " cur.execute(split_trips)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A final step is to group together multiple observations at a same station, during a same trip, to get an approximation of arrival and \"departure\" time." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "final_step = ''' DROP MATERIALIZED VIEW IF EXISTS test_day_final;\n", + "CREATE MATERIALIZED VIEW test_day_final AS \n", + "SELECT trainid, subwayline, traindirection, LEFT(station_char, -1) AS station, trip_id,\n", + " MIN(expected_arrival) AS estimated_arrival, MAX(expected_arrival) AS estimated_departure,\n", + " CASE (ARRAY_AGG(train_message ORDER BY expected_arrival))[1] WHEN 'AtStation' THEN 1 ELSE 0 END AS exact_arr, \n", + "CASE (ARRAY_AGG(train_message ORDER BY expected_arrival DESC))[1] WHEN 'AtStation' THEN 1 ELSE 0 END AS exact_dep\n", + " FROM test_day_w_trips \n", + " GROUP BY trainid, subwayline, traindirection, station, trip_id \n", + "'''\n", + "with con:\n", + " with con.cursor() as cur:\n", + " cur.execute(final_step)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
lineidNumber of observed tripsNumber of scheduled trips
011116747
12741704
24558457
\n", + "
" + ], + "text/plain": [ + " lineid Number of observed trips Number of scheduled trips\n", + "0 1 1116 747\n", + "1 2 741 704\n", + "2 4 558 457" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sql = ''' WITH observed_trips AS \n", + " (SELECT CASE subwayline\n", + " WHEN 'YUS' THEN '1'\n", + " WHEN 'BD' THEN '2'\n", + " WHEN 'SHEP' THEN '4'\n", + " END as lineid, \n", + " COUNT(DISTINCT trip_id) AS \"Number of observed trips\"\n", + " FROM test_day_final\n", + " GROUP BY lineid)\n", + " , unique_trips AS(SELECT route_short_name AS lineid, COUNT(DISTINCT trip_id) AS \"Number of scheduled trips\"\n", + " FROM gtfs.routes -- ON lineid::TEXT = route_short_name\n", + " INNER JOIN gtfs.trips USING (route_id)\n", + " INNER JOIN gtfs.calendar USING (service_id)\n", + " WHERE monday AND route_type = 1 AND route_short_name != '3'\n", + " GROUP BY route_short_name)\n", + " \n", + " SELECT *\n", + " FROM observed_trips\n", + " INNER JOIN unique_trips USING (lineid)\n", + " ORDER BY lineid'''\n", + "pandasql.read_sql(sql, con)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "sql = '''WITH inferred_trips AS(SELECT CASE subwayline\n", + " WHEN 'YUS' THEN 1\n", + " WHEN 'BD' THEN 2\n", + " WHEN 'SHEP' THEN 4\n", + " END as lineid, trip_id, COUNT(1) as stops\n", + "FROM test_day_final\n", + "GROUP BY lineid, trip_id\n", + "),\n", + "inferred_trip_length AS( SELECT lineid, stops, COUNT(trip_id) as obs_trips\n", + "FROM inferred_trips\n", + "GROUP BY lineid, stops)\n", + ",\n", + "gtfs_trip_lengths AS(SELECT route_short_name::INT AS lineid, trip_id, COUNT(1) as stops\n", + " FROM gtfs.stop_times \n", + " INNER JOIN gtfs.trips USING (trip_id)\n", + " INNER JOIN gtfs.routes USING (route_id)\n", + " INNER JOIN gtfs.calendar USING (service_id)\n", + " WHERE monday AND route_type = 1 AND route_short_name != '3'\n", + " GROUP BY route_short_name, trip_id\n", + ")\n", + ",gtfs_trip_length_distro AS (SELECT lineid, stops, COUNT(trip_id) as num_trips\n", + "FROM gtfs_trip_lengths\n", + "GROUP BY lineid, stops)\n", + "\n", + "SELECT lineid, stops, COALESCE(num_trips,0) as scheduled, COUNT(inferred_trips.trip_id) as observed \n", + "FROM inferred_trips\n", + "FULL OUTER JOIN gtfs_trip_length_distro USING (lineid, stops)\n", + "GROUP BY lineid, stops, num_trips\n", + "ORDER BY lineid, stops\n", + "'''\n", + "trip_lengths = pandasql.read_sql(sql, con)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Z+9bf/qo5w477JDrrrvuAb391V/9VXbbbbfsuOOOecc73nHf/Pe85z3Zeuuts88+++Tqq6+e9C4BAACYNavPCOocOPPMM/PEJz4x//Zv/5Ykuf3227PLLrvk5JNPzm677ZYf//jHWXfddZMkl112Wb7+9a9n7bXXzjbbbJOjjz466667bt797nfn7LPPzvrrr5/3ve99OeaYY/LmN785r3nNa3LuuefmqU99ag477LAZ9XXWWWflmmuuyYUXXpjWWg466KB8+ctfzvrrr5+TTjopl112We69997suuuuefrTnz7x/QIAADAbBNTl+NVf/dW88Y1vzFve8pYceOCB2WijjfKEJzwhu+22W5LkUY961H3r7r///tlwww2TJNtvv32uv/763Hbbbbnyyiuz9957J0n++7//O3vttVeuuuqqbLnlltlqq62SJIcffniOO+64le7rrLPOyllnnZVddtklSXLnnXfmmmuuyR133JFDDjkk6623XpLkoIMOGn8nAAAAPEgE1OXYeuutc+mll+aMM87I2972tjzrWc9a5rprr732fdMPf/jDc++996a1ll//9V/PZz7zmfute9llly2zzrx58/KLX/zivutL+5cwrbX88R//cX73d3/3fvM/+MEPrvA+AQAA9MpnUJfje9/7XtZbb70cfvjhedOb3pQLLrggN998cy666KIkyR133JF77713mbffc88989WvfjXXXnttktFnWr/97W9n2223zXXXXZfvfOc7SXK/ALvFFlvk0ksvTZJceuml+c///M8H1H3uc5+bE0444b7Ps95000255ZZb8oxnPCOf//znc/fdd+eOO+7IF77whcnsCAAAgAeBEdTluOKKK/KmN70pD3vYw7LWWmvlox/9aFprOfroo3P33Xdn3XXXzdlnn73M28+fPz+f+MQn8rKXvSw/+9nPkiTvfve7s/XWW+e4447LC17wgqy33nrZd9997/uypRe96EX55Cc/mac97WnZY489svXWWz+g7nOe85wsXLgwe+21V5LRv5/51Kc+lV133TWHHXZYdtpppzzucY+771RkAACA1UG1Dv7dyoIFC9rFF198v3kLFy7MdtttN0cdrdnsWwAA4MFUVZe01hasaD2n+AIAANAFARUAAIAuCKgAAAB0QUAFAACgCwIqAAAAXfBvZgAAAJiMqrFubgR1hq677rrssMMOc93GA+y3336Z/q96AAAAVierzQjqmEH8ATr496/3uffeezNv3mrzUAAAAMwKI6grcMwxx2SHHXbIDjvskA9+8INJRoHy5S9/ebbbbrsceuihueuuu5Ikb33rW7P99ttnxx13zB/90R8lSRYvXpwXvehF2W233bLbbrvlq1/9apLkne98Z17xildk7733zite8Yrsueee+da3vnXfdpeMiP7kJz/Jq171quy+++7ZZZddctpppyVJ7r777rz0pS/Ndtttl0MOOSR33333g7lbAAAAJs6w3XJccskl+fjHP54LLrggrbXsscceeeYzn5mrr746xx9/fPbee++86lWvykc+8pG88pWvzOc+97lcddVVqarcdtttSZI3vOEN+YM/+IPss88+ueGGG/Lc5z43CxcuTJJceeWVOe+887LuuuvmAx/4QE455ZS8613vys0335ybb745CxYsyJ/8yZ/kWc96Vk444YTcdttt2X333fPsZz87f/d3f5f11lsvCxcuzOWXX55dd911LncVAADA2IygLsd5552XQw45JOuvv3422GCD/OZv/ma+8pWvZPPNN8/ee++dJDn88MNz3nnnZcMNN8w666yTV7/61fnsZz+b9dZbL0ly9tln5/Wvf3123nnnHHTQQfnxj3+cO++8M0ly0EEHZd11102SvOQlL8mpp56aJDnllFNy6KGHJknOOuusvPe9783OO++c/fbbLz/96U9zww035Mtf/nIOP/zwJMmOO+6YHXfc8UHdNwAAAJNmBHUV1LQPxFZV5s2blwsvvDDnnHNOTj311Hz4wx/Oueeem1/84hc5//zzs8466zygzvrrr3/f9KabbpqNN944l19+eU4++eR87GMfS5K01vIv//Iv2WabbWb3TgEAAMwxI6jLse++++bzn/987rrrrvzkJz/J5z73uey777654YYb8rWvfS1J8ulPfzr77LNP7rzzztx+++15/vOfnw984AP5xje+kSR5znOekw996EP31bzsssuWub3DDjss73//+3P77bffNyL63Oc+Nx/60IfShm91+vrXv54kecYznpFPf/rTSZJvfvObufzyyye/AwAAAB5EAupy7LrrrjnyyCOz++67Z4899sjv/M7v5NGPfnS22Wab/O3f/m222267/OhHP8prX/va3HHHHTnwwAOz4447Zp999skx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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "line_one = trip_lengths[trip_lengths['lineid'] == 1]\n", + "fig, ax = plt.subplots(figsize=(16,9))\n", + "line_one.plot(x='stops', y='scheduled', kind='bar', ax=ax,position=0, color='red')\n", + "line_one.plot(x='stops', y='observed', sharey=True, sharex=True, kind='bar', ax=ax, position=1, color='blue')\n", + "ax.set_title('Line 1 Distribution of Trip Lengths')\n", + "ax.yaxis.set_label('Number of trips')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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dtghu+yyS2677bYkyQ033JCnP/3p2XLLLfPGN77xvmWceeaZ2X333TNr1qw85znPye23354kOeOMM7LNNttk1qxZ+fznP3/f/Av3em6//fa5+uqr71fbP/3TP2XnnXfOzJkz8/a3v/2+9ne9613Zaqutsueee+aKK66Y6l0CAACw0jxwelDH4IwzzshjHvOYfOUrX0mS3Hrrrdlpp51y0kknZeedd84vf/nLrLvuukmSSy65JBdffHHWXnvtbL311nnNa16TddddN+985ztz1llnZf3118/RRx+dY445Jm984xvz8pe/PF/72tfyuMc9Loceeugy1XXmmWfmyiuvzHe+85201nLAAQfkG9/4RtZff/2ceOKJueSSS3LPPfdk1qxZecITnjDl+wUAAGBlEFCX4I/+6I/y+te/Pn/913+d/fffPxtttFEe/ehHZ+edd06SPOxhD7tv3n322ScbbrhhkmS77bbLNddck1tuuSWXXXZZ9thjjyTJr3/96+y+++65/PLLs8UWW2TLLbdMkhx22GE57rjjJl3XmWeemTPPPDM77bRTkuT222/PlVdemdtuuy0HHXRQ1ltvvSTJAQccsOI7AQAAYBURUJdgq622ykUXXZTTTz89b33rW7P33nsvdt611177vuEHP/jBueeee9Jay1Of+tR89rOfXWDeSy65ZLHLmTZtWu699977xhf1lTCttbz5zW/OK17xigXa3/ve9y51mwAAAHrlGtQluOGGG7LeeuvlsMMOyxve8Iacd955ufHGG3P++ecnSW677bbcc889i33+brvtlm9961u56qqrkoyuaf3hD3+YbbbZJldffXV+9KMfJckCAXbzzTfPRRddlCS56KKL8pOf/OR+y913333zsY997L7rWa+//vrcdNNNedKTnpQvfvGLueuuu3LbbbflS1/60tTsCAAAgFVAD+oSfO9738sb3vCGPOhBD8paa62VD33oQ2mt5TWveU3uuuuurLvuujnrrLMW+/zp06fn+OOPz/Oe97z86le/SpK8853vzFZbbZXjjjsu++23X9Zbb73stdde991s6dnPfnY+8YlP5PGPf3x23XXXbLXVVvdb7tOe9rTMmTMnu+++e5LR18986lOfyqxZs3LooYdmhx12yKMe9aj7TkUGAAB4IKjWwdetzJ49u11wwQULtM2ZMyfbbrvtmCpavdm3AADAqlRVF7bWZi9tPqf4AgAA0AUBFQAAgC4IqAAAAHRBQAUAAKALAioAAABd8DUzAAAALJ+qKV2cHtRldPXVV2f77bcfdxn38+QnPzkLf1UPAADAA8kDpgd1ioN5Ovj61/vcc889mTbtAfNSAAAArBR6UJfimGOOyfbbb5/tt98+733ve5OMAuULXvCCbLvttjn44INz5513Jkne9KY3ZbvttsvMmTPzV3/1V0mSefPm5dnPfnZ23nnn7LzzzvnWt76VJDnqqKPywhe+MHvssUde+MIXZrfddssPfvCD+9Y7v0f0jjvuyEtf+tLssssu2WmnnXLqqacmSe66664897nPzbbbbpuDDjood91116rcLQAAAFNOt90SXHjhhfn4xz+e8847L6217LrrrvnjP/7jXHHFFfnoRz+aPfbYIy996Uvzr//6r3nJS16SL3zhC7n88stTVbnllluSJK997Wvzute9LnvuuWeuvfba7LvvvpkzZ06S5LLLLss555yTddddN8cee2xOPvnkvOMd78iNN96YG2+8MbNnz85b3vKW7L333vnYxz6WW265Jbvsskue8pSn5CMf+UjWW2+9zJkzJ5deemlmzZo1zl0FAACwwvSgLsE555yTgw46KOuvv3422GCD/Omf/mm++c1vZrPNNssee+yRJDnssMNyzjnnZMMNN8w666yTI444Ip///Oez3nrrJUnOOuusvPrVr86OO+6YAw44IL/85S9z++23J0kOOOCArLvuukmSQw45JKecckqS5OSTT87BBx+cJDnzzDPz7ne/OzvuuGOe/OQn5+677861116bb3zjGznssMOSJDNnzszMmTNX6b4BAACYanpQl0MtdEFsVWXatGn5zne+k7PPPjunnHJKPvCBD+RrX/ta7r333px77rlZZ5117rec9ddf/77hTTfdNBtvvHEuvfTSnHTSSfnwhz+cJGmt5XOf+1y23nrrlbtRAAAAY6YHdQn22muvfPGLX8ydd96ZO+64I1/4whey11575dprr823v/3tJMlnPvOZ7Lnnnrn99ttz66235pnPfGaOPfbYfPe7302SPO1pT8v73//++5Z5ySWXLHZ9hx56aN7znvfk1ltvva9HdN9998373//+tOGuThdffHGS5ElPelI+85nPJEm+//3v59JLL536HQAAALAKCahLMGvWrLz4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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "line_one = trip_lengths[trip_lengths['lineid'] == 2]\n", + "fig, ax = plt.subplots(figsize=(16,9))\n", + "line_one.plot(x='stops', y='scheduled', kind='bar', ax=ax,position=0, color='red')\n", + "line_one.plot(x='stops', y='observed', sharey=True, sharex=True, kind='bar', ax=ax, position=1, color='blue')\n", + "ax.set_title('Line 2 Distribution of Trip Lengths')\n", + "ax.yaxis.set_label('Number of trips')" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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brnllhx00EHZZpttcuyxxz68j/PPPz977rln5syZk5e85CVZvHhxkuS8887L0572tMyZMydf/epXH95+6VnPHXbYITfccMMfje2jH/1odt1118yePTvvf//7H17+wQ9+MNtuu2323nvvXHvtteP9kgAAAEyYtWcGdRKcd9552XzzzfONb3wjSXLXXXdl5513zhlnnJFdd901d999dzbYYIMkyZVXXpkrrrgi66+/frbbbru86U1vygYbbJDjjz8+F1xwQTbccMN8+MMfzgknnJBjjz02r3/963PhhRfmqU99ao444oiVGtf555+f6667Lpdccklaazn00EPzve99LxtuuGFOP/30XHnllVmyZEnmzJmTXXbZZdxfFwAAgIkgUB/FM57xjLztbW/LO97xjhxyyCHZZJNN8uQnPzm77rprkuRP/uRPHt52//33z8Ybb5wk2X777fOrX/0qd955Z6655prstddeSZI//OEP2XPPPfOzn/0sW2+9dbbZZpskyVFHHZWTTz55zOM6//zzc/7552fnnXdOkixevDjXXXddFi1alMMOOywzZsxIkhx66KGr/yIAAACsIQL1UWy77ba5/PLL881vfjPvec97st9++y132/XXX//h2+uuu26WLFmS1lqe+9zn5itf+cojtr3yyiuXu59p06blwQcffPj+sr4SprWWd73rXfnrv/7rRyz/+Mc/vsLnBAAA0CvXoD6KW265JTNmzMhRRx2Vt7/97bn44otz66235tJLL02SLFq0KEuWLFnu4/fYY4/84Ac/yPXXX59k5JrW//zP/8zTnva03HDDDfn5z3+eJI8I2JkzZ+byyy9Pklx++eX55S9/+Uf7PfDAA3Pqqac+fD3rzTffnNtuuy3PetazcvbZZ+e+++7LokWL8vWvf318XggAAIA1wAzqo/jJT36St7/97VlnnXWy3nrr5dOf/nRaa3nTm96U++67LxtssEEuuOCC5T5+s802y2mnnZaXvexl+f3vf58kOf7447Ptttvm5JNPzsEHH5wZM2Zkn332efjDll784hfnC1/4Qp7+9Kdn9913z7bbbvtH+z3ggAMyf/787LnnnklGvn7mi1/8YubMmZMjjjgiO+64Y/7sz/7s4VORAQAA1gbVOvi6lblz57Z58+Y9Ytn8+fMza9asSRrR1Oa1BQAA1qSquqy1NndF2znFFwAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAu+JoZAACAtUnVZI9gwphBXUk33HBDdthhh8kexh/Zd999s/RX9QAAAKxN1poZ1PH+JUEHX//6sCVLlmTatLXmrwIAAGBCmEFdgRNOOCE77LBDdthhh3z84x9PMhKUL3/5yzNr1qwcfvjhuffee5Mk73znO7P99ttn9uzZ+bu/+7skycKFC/PiF784u+66a3bdddf84Ac/SJIcd9xxecUrXpG99torr3jFK7LHHnvk6quvfvi4D82I3nPPPXnta1+b3XbbLTvvvHPOOeecJMl9992XI488MrNmzcphhx2W++67b02+LAAAAOPOtN2juOyyy/K5z30uF198cVpr2X333fPsZz871157bU455ZTstddeee1rX5t//Md/zGte85p87Wtfy89+9rNUVe68884kyZvf/Oa89a1vzd57750bb7wxBx54YObPn58kueaaa3LRRRdlgw02yIknnpgzzzwzH/jAB3Lrrbfm1ltvzdy5c/Pud787++23X0499dTceeed2W233fKc5zwnn/nMZzJjxozMnz8/V111VebMmTOZLxUAAMBqM4P6KC666KIcdthh2XDDDbPRRhvlRS96Ub7//e9nq622yl577ZUkOeqoo3LRRRdl4403zvTp03P00Ufnq1/9ambMmJEkueCCC/LGN74xO+20Uw499NDcfffdWbx4cZLk0EMPzQYbbJAkeelLX5qzzjorSXLmmWfm8MMPT5Kcf/75+dCHPpSddtop++67b+6///7ceOON+d73vpejjjoqSTJ79uzMnj17jb42AAAA480M6iqopS6IrapMmzYtl1xySb797W/nrLPOyic/+clceOGFefDBB/OjH/0o06dP/6P9bLjhhg/f3mKLLbLpppvmqquuyhlnnJF/+qd/SpK01vKv//qv2W677Sb2SQEAAEwyM6iPYp999snZZ5+de++9N/fcc0++9rWvZZ999smNN96YH/7wh0mSL3/5y9l7772zePHi3HXXXXn+85+fE088MT/+8Y+TJAcccEA+8YlPPLzPK6+8crnHO+KII/KRj3wkd91118MzogceeGA+8YlPpA2f6nTFFVckSZ71rGfly1/+cpLkpz/9aa666qrxfwEAAADWIIH6KObMmZNXv/rV2W233bL77rvnda97XZ7whCdku+22y6c+9anMmjUrd9xxR97whjdk0aJFOeSQQzJ79uzsvffeOeGEE5IkJ510UubNm5fZs2dn++23f3hmdFkOP/zwnH766XnpS1/68LL3vve9eeCBBzJ79uw8/elPz3vf+94kyRve8IYsXrw4s2bNyvve977ssssuE/tiAAAATLBqHXzfyty5c9vS3+E5f/78zJo1a5JGNLV5bQEAYC023t/BuQZUcllrbe6KtjODCgAAQBcEKgAAAF0QqAAAAHSh60Dt4frYqcZrCgAA9KrbQJ0+fXpuv/12QTWOWmu5/fbbl/mdrAAAAJNt2mQPYHm23HLLLFiwIAsXLpzsoUwp06dPz5ZbbjnZwwAAAPgj3Qbqeuutl6233nqyhwEAAMAa0u0pvgAAADy2CFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOjCmAO1qtatqiuq6t+G+1tX1cVVdX1VnVFVjxuWrz/cv35YP3Nihg4AAMBUsjIzqG9OMn/U/Q8nObG19tQkdyQ5elh+dJI7huUnDtsBAADAoxpToFbVlkkOTvLZ4X4l2S/JWcMmn0/ywuH2C4b7GdbvP2wPAAAAyzXWGdSPJzk2yYPD/U2T3NlaWzLcX5Bki+H2FkluSpJh/V3D9gAAALBcKwzUqjokyW2ttcvG88BVdUxVzauqeQsXLhzPXQMAALAWGssM6l5JDq2qG5KcnpFTe/8hySZVNW3YZsskNw+3b06yVZIM6zdOcvvSO22tndxam9tam7vZZput1pMAAABg7bfCQG2tvau1tmVrbWaSI5Nc2Fp7eZLvJDl82OxVSc4Zbp873M+w/sLWWhvXUQMAADDlrM73oL4jyd9W1fUZucb0lGH5KUk2HZb/bZJ3rt4QAQAAeCyYtuJN/n+tte8m+e5w+xdJdlvGNvcneck4jA0AAIDHkNWZQQUAAIBxI1ABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOjCCgO1qqZX1SVV9eOqurqqPjAs37qqLq6q66vqjKp63LB8/eH+9cP6mRP7FAAAAJgKxjKD+vsk+7XWdkyyU5KDqmqPJB9OcmJr7alJ7khy9LD90UnuGJafOGwHAAAAj2qFgdpGLB7urjf8tCT7JTlrWP75JC8cbr9guJ9h/f5VVeM2YgAAAKakMV2DWlXrVtWVSW5L8q0kP09yZ2ttybDJgiRbDLe3SHJTkgzr70qy6XgOGgAAgKlnTIHaWvuv1tpOSbZMsluSp63ugavqmKqaV1XzFi5cuLq7AwAAYC23Up/i21q7M8l3kuyZZJOqmjas2jLJzcPtm5NslSTD+o2T3L6MfZ3cWpvbWpu72WabreLwAQAAmCrG8im+m1XVJsPtDZI8N8n8jITq4cNmr0pyznD73OF+hvUXttbaeA4aAACAqWfaijfJ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qWvaKj7uSa21W4fbv07ypOH2FkluGrXdgmHZrZliqiZ7BFNfa5M9AgAAYE1a7Q9Jaq21JCudElV1TFXNq6p5CxcuXN1hAAAAsJZb1UD9zUOn7g5/3jYsvznJVqO223JY9kdaaye31ua21uZuttlmqzgMAAAApopVDdRzk7xquP2qJOeMWv7K4dN890hy16hTgQEAAGC5VngNalV9Jcm+SZ5YVQuSvD/Jh5KcWVVHJ/lVkpcOm38zyfOTXJ/k3iSvmYAxAwAAMAWtMFBbay9bzqr9l7FtS/I3qzsoAAAAHntW+0OSAAAAYDwIVAAAALqWk+kPAAAIDklEQVQgUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADowgq/BxUAelc12SOY+lqb7BEA8FhgBhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALowbbIHAEyeqskewWNDa5M9AgCAtYMZVAAAALogUAEAAOiCQAUAAKALAhUAAIAuCFQAAAC6IFABAADogkAFAACgCwIVAACALghUAAAAuiBQAQAA6IJABQAAoAsCFQAAgC4IVAAAALogUAEAAOjChARqVR1UVddW1fVV9c6JOAYAAABTy7gHalWtm+RTSZ6XZPskL6uq7cf7OAAAAEwtEzGDuluS61trv2it/SHJ6UleMAHHAQAAYAqZNgH73CLJTaPuL0iy+wQcB2DtUDXZI3gMaJM9gKnP+3gN8D5eI7yX1wDvZVbdRATqmFTVMUmOGe4urqprJ2ss9KkqT0zy28keB6yuivfyxPMPzonmfbwmeB+vCd7La4L38kRbS9/HTxnLRhMRqDcn2WrU/S2HZY/QWjs5yckTcHymiKqa11qbO9njgNXlvcxU4H3MVOG9zFQwld/HE3EN6qVJtqmqravqcUmOTHLuBBwHAACAKWTcZ1Bba0uq6o1J/j3JuklOba1dPd7HAQAAYGqZkGtQW2vfTPLNidg3jylOAWeq8F5mKvA+ZqrwXmYqmLLv42rNp2wBAAAw+SbiGlQAAABYaQIVAACALghUAAAAuiBQAcZRVT2tqvavqo2WWn7QZI0JVkVV7VZVuw63t6+qv62q50/2uGB1VNUXJnsMsLqqau/h/8kHTPZYJoIPSaJ7VfWa1trnJnscsCJV9d+T/E2S+Ul2SvLm1to5w7rLW2tzJnN8MFZV9f4kz8vIp/1/K8nuSb6T5LlJ/r219sFJHB6MSVWdu/SiJH+R5MIkaa0dusYHBaugqi5pre023H59Rv6t8bUkByT5emvtQ5M5vvEmUOleVd3YWvvzyR4HrEhV/STJnq21xVU1M8lZSf65tfYPVXVFa23nSR0gjNHwXt4pyfpJfp1ky9ba3VW1QZKLW2uzJ3WAMAZVdXmSa5J8NknLSKB+JcmRSdJa+5+TNzoYu9H/hqiqS5M8v7W2sKo2TPKj1tozJneE42tCvgcVVlZVXbW8VUmetCbHAqthndba4iRprd1QVfsmOauqnpKR9zKsLZa01v4ryb1V9fPW2t1J0lq7r6oenOSxwVjNTfLmJP9Xkre31q6sqvuEKWuhdarqCRm5PLNaawuTpLV2T1UtmdyhjT+BSi+elOTAJHcstbyS/MeaHw6skt9U1U6ttSuTZJhJPSTJqUmm1G83mfL+UFUzWmv3JtnloYVVtXESgcpaobX2YJITq+pfhj9/E//2Ze20cZLLMvLv4lZVT26t3Tp83sWU+wW4/0jpxb8l2eihf9iPVlXfXfPDgVXyyiSP+E1ma21JkldW1WcmZ0iwSp7VWvt98vA/8h+yXpJXTc6QYNW01hYkeUlVHZzk7skeD6ys1trM5ax6MMlha3Aoa4RrUAEAAOiCr5kBAACgCwIVAACALghUAJgAVfWWqpox2eMAgLWJa1ABYAJU1Q1J5rbWfjvZYwGAtYUZVABYTVW1YVV9o6p+XFU/rar3J9k8yXeq6jvDNi+rqp8M6z886rGLq+rEqrq6qr5dVZsNy/97VV1TVVdV1emT88wAYM0ygwoAq6mqXpzkoNba64f7Gyf5cYYZ1KraPMmPMvKdonckOT/JSa21s6uqJTmqtfalqnpfkj9rrb2xqm5JsnVr7fdVtUlr7c5JeXIAsAaZQQWA1feTJM+tqg9X1T6ttbuWWr9rku+21hYO3437pSTPGtY9mOSM4fYXk+w93L4qyZeq6qgs9f26ADBVCVQAWE2ttf9MMicjoXr8MBO6yrsb/jw4yaeG/V5aVdNWb5QA0D+BCgCraTiF997W2heTfDQjUbkoyeOHTS5J8uyqemJVrZvkZUn+57BunSSHD7f/KslFVbVOkq1aa99J8o4kGyfZaI08GQCYRH4bCwCr7xlJPlpVDyZ5IMkbkuyZ5LyquqW19hdV9c4k30lSSb7RWjtneOw9SXarqvckuS3JEUnWTfLF4VrWysj1qq5BBWDK8yFJADCJqmpxa83sKADEKb4AAAB0wgwqAAAAXTCDCgAAQBcEKgAAAF0QqAAAAHRBoAIAANAFgQoAAEAXBCoAAABd+F/a6+g3GUqv5wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "line_one = trip_lengths[trip_lengths['lineid'] == 4]\n", + "fig, ax = plt.subplots(figsize=(16,9))\n", + "line_one.plot(x='stops', y='scheduled', kind='bar', ax=ax,position=0, color='red')\n", + "line_one.plot(x='stops', y='observed', sharey=True, sharex=True, kind='bar', ax=ax, position=1, color='blue')\n", + "ax.set_title('Line 4 Distribution of Trip Lengths')\n", + "ax.yaxis.set_label('Number of trips')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I've managed to take out a solid chunk of trips that are too short, at the expense of generating a number of trips with more stops than are on that line...\n", + "What does one of those look like?" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
trainidsubwaylinetraindirectionstation_chartrip_idestimated_arrivalestimated_departureexact_arrexact_dep
0155YUSNorthVMC1178032019-07-17 18:51:04.0000002019-07-17 18:52:04.00000011
1155YUSNorthHWY1178032019-07-17 18:54:05.0000002019-07-17 18:54:05.00000011
2155YUSNorthPVL1178032019-07-17 18:56:07.0000002019-07-17 18:56:07.00000011
3155YUSNorthYUN1178032019-07-17 18:58:01.0000002019-07-17 18:58:01.00000011
4155YUSNorthFIW1178032019-07-17 19:00:03.0000002019-07-17 19:00:03.00000011
5155YUSNorthDNP1178032019-07-17 19:03:02.0000002019-07-17 19:03:02.00000011
6155YUSNorthSHW1178032019-07-17 19:04:59.5851432019-07-17 19:04:59.58514300
7155YUSNorthWIL1178032019-07-17 19:07:58.4971432019-07-17 19:07:58.49714300
8155YUSNorthYKD1178032019-07-17 19:09:47.0000002019-07-17 19:09:47.00000011
9155YUSNorthLWW1178032019-07-17 19:12:32.5154292019-07-17 19:12:47.00000001
10155YUSNorthGCN1178032019-07-17 19:14:41.8491432019-07-17 19:14:41.84914300
11155YUSNorthCVL1178032019-07-17 19:16:20.5737142019-07-17 19:16:20.57371400
12155YUSNorthSCW1178032019-07-17 19:19:50.0000002019-07-17 19:19:50.00000011
13155YUSNorthDUP1178032019-07-17 19:22:28.6285712019-07-17 19:22:28.62857100
14155YUSNorthSPA1178032019-07-17 19:23:24.2902862019-07-17 19:23:48.00000001
15155YUSNorthSGU1178032019-07-17 19:25:05.9760002019-07-17 19:25:17.00000001
16155YUSNorthMUS1178032019-07-17 19:26:49.3520002019-07-17 19:26:59.14400000
17155YUSNorthQPK1178032019-07-17 19:28:52.0000002019-07-17 19:28:52.00000011
18155YUSNorthSTP1178032019-07-17 19:30:18.0068572019-07-17 19:30:18.00685700
19155YUSNorthOSG1178032019-07-17 19:31:15.8582862019-07-17 19:31:15.85828600
20155YUSNorthSTA1178032019-07-17 19:32:08.9366862019-07-17 19:32:08.93668600
21155YUSNorthUNI1178032019-07-17 19:33:33.2336002019-07-17 19:33:52.00000001
22155YUSNorthKNG1178032019-07-17 19:34:40.6189942019-07-17 19:35:53.00000001
23155YUSNorthQUN1178032019-07-17 19:36:45.5174632019-07-17 19:36:55.00000001
24155YUSNorthDUN1178032019-07-17 19:37:43.1283432019-07-17 19:37:55.00000001
25155YUSNorthCOL1178032019-07-17 19:38:48.0603662019-07-17 19:38:55.00000001
26155YUSNorthWEL1178032019-07-17 19:39:51.1954512019-07-17 19:40:54.00000001
27155YUSNorthBLO1178032019-07-17 19:41:11.4596802019-07-17 19:42:16.00000001
28155YUSNorthROS1178032019-07-17 19:43:52.5504912019-07-17 19:43:52.55049100
29155YUSNorthSUM1178032019-07-17 19:44:44.7926402019-07-17 19:44:57.00000001
30155YUSNorthSTC1178032019-07-17 19:46:45.3992692019-07-17 19:46:45.39926900
31155YUSNorthDAV1178032019-07-17 19:47:59.0000002019-07-17 19:47:59.00000011
32155YUSNorthEGL1178032019-07-17 19:50:20.9804342019-07-17 19:51:59.00000001
33155YUSNorthLAW1178032019-07-17 19:55:18.7060112019-07-17 19:55:59.00000001
34155YUSNorthYKM1178032019-07-17 19:59:07.0000002019-07-17 19:59:07.00000011
35155YUSNorthSHP1178032019-07-17 20:02:37.0781262019-07-17 20:03:22.00000001
36155YUSNorthNYC1178032019-07-17 20:05:18.4562292019-07-17 20:06:00.00000001
37155YUSNorthFIN1178032019-07-17 20:09:45.0900112019-07-17 20:10:35.63972600
38155YUSNorthFIN2178032019-07-17 20:09:45.0900112019-07-17 20:10:35.63972600
\n", + "
" + ], + "text/plain": [ + " trainid subwayline traindirection station_char trip_id \\\n", + "0 155 YUS North VMC1 17803 \n", + "1 155 YUS North HWY1 17803 \n", + "2 155 YUS North PVL1 17803 \n", + "3 155 YUS North YUN1 17803 \n", + "4 155 YUS North FIW1 17803 \n", + "5 155 YUS North DNP1 17803 \n", + "6 155 YUS North SHW1 17803 \n", + "7 155 YUS North WIL1 17803 \n", + "8 155 YUS North YKD1 17803 \n", + "9 155 YUS North LWW1 17803 \n", + "10 155 YUS North GCN1 17803 \n", + "11 155 YUS North CVL1 17803 \n", + "12 155 YUS North SCW1 17803 \n", + "13 155 YUS North DUP1 17803 \n", + "14 155 YUS North SPA1 17803 \n", + "15 155 YUS North SGU1 17803 \n", + "16 155 YUS North MUS1 17803 \n", + "17 155 YUS North QPK1 17803 \n", + "18 155 YUS North STP1 17803 \n", + "19 155 YUS North OSG1 17803 \n", + "20 155 YUS North STA1 17803 \n", + "21 155 YUS North UNI1 17803 \n", + "22 155 YUS North KNG1 17803 \n", + "23 155 YUS North QUN1 17803 \n", + "24 155 YUS North DUN1 17803 \n", + "25 155 YUS North COL1 17803 \n", + "26 155 YUS North WEL1 17803 \n", + "27 155 YUS North BLO1 17803 \n", + "28 155 YUS North ROS1 17803 \n", + "29 155 YUS North SUM1 17803 \n", + "30 155 YUS North STC1 17803 \n", + "31 155 YUS North DAV1 17803 \n", + "32 155 YUS North EGL1 17803 \n", + "33 155 YUS North LAW1 17803 \n", + "34 155 YUS North YKM1 17803 \n", + "35 155 YUS North SHP1 17803 \n", + "36 155 YUS North NYC1 17803 \n", + "37 155 YUS North FIN1 17803 \n", + "38 155 YUS North FIN2 17803 \n", + "\n", + " estimated_arrival estimated_departure exact_arr exact_dep \n", + "0 2019-07-17 18:51:04.000000 2019-07-17 18:52:04.000000 1 1 \n", + "1 2019-07-17 18:54:05.000000 2019-07-17 18:54:05.000000 1 1 \n", + "2 2019-07-17 18:56:07.000000 2019-07-17 18:56:07.000000 1 1 \n", + "3 2019-07-17 18:58:01.000000 2019-07-17 18:58:01.000000 1 1 \n", + "4 2019-07-17 19:00:03.000000 2019-07-17 19:00:03.000000 1 1 \n", + "5 2019-07-17 19:03:02.000000 2019-07-17 19:03:02.000000 1 1 \n", + "6 2019-07-17 19:04:59.585143 2019-07-17 19:04:59.585143 0 0 \n", + "7 2019-07-17 19:07:58.497143 2019-07-17 19:07:58.497143 0 0 \n", + "8 2019-07-17 19:09:47.000000 2019-07-17 19:09:47.000000 1 1 \n", + "9 2019-07-17 19:12:32.515429 2019-07-17 19:12:47.000000 0 1 \n", + "10 2019-07-17 19:14:41.849143 2019-07-17 19:14:41.849143 0 0 \n", + "11 2019-07-17 19:16:20.573714 2019-07-17 19:16:20.573714 0 0 \n", + "12 2019-07-17 19:19:50.000000 2019-07-17 19:19:50.000000 1 1 \n", + "13 2019-07-17 19:22:28.628571 2019-07-17 19:22:28.628571 0 0 \n", + "14 2019-07-17 19:23:24.290286 2019-07-17 19:23:48.000000 0 1 \n", + "15 2019-07-17 19:25:05.976000 2019-07-17 19:25:17.000000 0 1 \n", + "16 2019-07-17 19:26:49.352000 2019-07-17 19:26:59.144000 0 0 \n", + "17 2019-07-17 19:28:52.000000 2019-07-17 19:28:52.000000 1 1 \n", + "18 2019-07-17 19:30:18.006857 2019-07-17 19:30:18.006857 0 0 \n", + "19 2019-07-17 19:31:15.858286 2019-07-17 19:31:15.858286 0 0 \n", + "20 2019-07-17 19:32:08.936686 2019-07-17 19:32:08.936686 0 0 \n", + "21 2019-07-17 19:33:33.233600 2019-07-17 19:33:52.000000 0 1 \n", + "22 2019-07-17 19:34:40.618994 2019-07-17 19:35:53.000000 0 1 \n", + "23 2019-07-17 19:36:45.517463 2019-07-17 19:36:55.000000 0 1 \n", + "24 2019-07-17 19:37:43.128343 2019-07-17 19:37:55.000000 0 1 \n", + "25 2019-07-17 19:38:48.060366 2019-07-17 19:38:55.000000 0 1 \n", + "26 2019-07-17 19:39:51.195451 2019-07-17 19:40:54.000000 0 1 \n", + "27 2019-07-17 19:41:11.459680 2019-07-17 19:42:16.000000 0 1 \n", + "28 2019-07-17 19:43:52.550491 2019-07-17 19:43:52.550491 0 0 \n", + "29 2019-07-17 19:44:44.792640 2019-07-17 19:44:57.000000 0 1 \n", + "30 2019-07-17 19:46:45.399269 2019-07-17 19:46:45.399269 0 0 \n", + "31 2019-07-17 19:47:59.000000 2019-07-17 19:47:59.000000 1 1 \n", + "32 2019-07-17 19:50:20.980434 2019-07-17 19:51:59.000000 0 1 \n", + "33 2019-07-17 19:55:18.706011 2019-07-17 19:55:59.000000 0 1 \n", + "34 2019-07-17 19:59:07.000000 2019-07-17 19:59:07.000000 1 1 \n", + "35 2019-07-17 20:02:37.078126 2019-07-17 20:03:22.000000 0 1 \n", + "36 2019-07-17 20:05:18.456229 2019-07-17 20:06:00.000000 0 1 \n", + "37 2019-07-17 20:09:45.090011 2019-07-17 20:10:35.639726 0 0 \n", + "38 2019-07-17 20:09:45.090011 2019-07-17 20:10:35.639726 0 0 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sql = '''WITH inferred_trips AS(SELECT trip_id, COUNT(1) as stops\n", + "FROM test_day_final\n", + "GROUP BY trip_id\n", + "HAVING COUNT(1) > 38\n", + "LIMIT 1)\n", + "SELECT test_day_final.* \n", + "FROM test_day_final\n", + "INNER JOIN inferred_trips USING (trip_id)\n", + "ORDER BY estimated_arrival'''\n", + "pandasql.read_sql(sql, con)" ] }, {