This notebook is contains a set of timetable visualizations built with open data published by Caltrain. You can view the project on GitHub.
from collections import defaultdict
from gtfslib.dao import Dao
from gtfslib.model import CalendarDate, Route, Trip
from gtfslib.utils import fmttime
from ipy_table import make_table
from itertools import tee
import networkx as nx
from nxpd import draw
import pandas as pd
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2,s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def transpose(list_of_lists):
return list(map(list, zip(*list_of_lists)))
dao = Dao()
# Feed includes service from 2016
dao.load_gtfs("./data/Caltrain-2016-08-18.zip", disable_normalization=True)
fltr = (
(CalendarDate.date=="2016-06-08") &
(Trip.direction_id=="1") &
Route.route_id.in_([
'Bu-16APR', # Baby Bullet
'Li-16APR', # Limited
'Lo-16APR' # Local
]))
# Sort by stop time since all trips begin at the same stop
def trip_sort(trip):
start = trip.stop_times[0]
return start.arrival_time or start.departure_time
trips = sorted([t for t in dao.trips(fltr=fltr)], key=trip_sort)
patterns = set()
for trip in trips:
pattern = tuple(st.stop_id for st in trip.stop_times)
patterns.add(pattern)
G = nx.DiGraph()
# Build a pattern graph
for pattern in patterns:
for a, b in pairwise(pattern):
G.add_edge(a, b)
# Label nodes with stop names
for stop_id, data in G.nodes(data=True):
stop = dao.stop(stop_id)
data["label"] = stop.stop_name.split("Caltrain")[0].strip()
df = pd.read_csv("./data/2016 Average Weekday Passenger Counts by Train.csv")
ridership = {}
for _, row in df.iterrows():
trip_short_name = str(row["trip_short_name"])
stop_name = row["stop_name"]
if trip_short_name not in ridership:
ridership[trip_short_name] = {}
ridership[trip_short_name][stop_name] = dict(row)
# This only works if the patterns form a directed-acyclic graph
header = [G.node[stop_id]["label"] for stop_id in nx.topological_sort(G)]
draw(G, show='ipynb')
def build_trip_row(trip, cell_func):
row = [trip.trip_short_name]
stop_ridership = ridership[trip.trip_short_name]
# assumes one visit per stop
stimes_by_stop_name = {G.node[st.stop_id]["label"]: st for st in trip.stop_times}
for stop_name in header:
if stop_name in stop_ridership and stop_name in stimes_by_stop_name:
stime = stimes_by_stop_name[stop_name]
riders = stop_ridership[stop_name]
value = cell_func(stime, riders)
row.append(value or "-")
else:
row.append("-")
return row
def build_trip_rows(cell_func):
rows = []
for trip in trips:
if trip.trip_short_name not in ridership:
continue
rows.append(build_trip_row(trip, cell_func))
return rows
def build_timetable(cell_func):
return [[""]+header] + build_trip_rows(cell_func)
def stop_time(stime, riders):
return fmttime(stime.arrival_time or stime.departure_time)
make_table(transpose(build_timetable(stop_time)))
102 | 104 | 206 | 208 | 210 | 312 | 314 | 216 | 218 | 220 | 322 | 324 | 226 | 228 | 230 | 332 | 134 | 236 | 138 | 142 | 146 | 150 | 152 | 254 | 156 | 258 | 360 | 262 | 264 | 366 | 268 | 370 | 272 | 274 | 376 | 278 | 380 | 282 | 284 | 386 | 288 | 190 | 192 | 194 | 196 | 198 | |
San Francisco | 4:55:00 | 5:25:00 | 6:06:00 | 6:24:00 | 6:44:00 | 6:56:00 | 7:12:00 | 7:19:00 | 7:24:00 | 7:44:00 | 7:56:00 | 8:12:00 | 8:19:00 | 8:24:00 | 8:44:00 | 8:56:00 | 9:00:00 | 9:37:00 | 10:00:00 | 11:00:00 | 12:00:00 | 13:00:00 | 14:00:00 | 14:37:00 | 15:00:00 | 15:37:00 | 16:10:00 | 16:19:00 | 16:28:00 | 16:33:00 | 16:55:00 | 17:12:00 | 17:20:00 | 17:28:00 | 17:33:00 | 17:55:00 | 18:12:00 | 18:20:00 | 18:28:00 | 18:33:00 | 18:55:00 | 19:33:00 | 20:40:00 | 21:40:00 | 22:40:00 | 24:01:00 |
22nd St | 5:00:00 | 5:30:00 | 6:11:00 | 6:29:00 | 6:50:00 | 7:02:00 | 7:18:00 | 7:25:00 | 7:29:00 | 7:50:00 | 8:02:00 | 8:18:00 | 8:25:00 | 8:29:00 | 8:50:00 | 9:02:00 | 9:05:00 | - | 10:05:00 | 11:05:00 | 12:05:00 | 13:05:00 | 14:05:00 | - | 15:05:00 | - | - | - | 16:33:00 | - | - | - | - | 17:33:00 | - | - | - | - | 18:33:00 | - | - | 19:38:00 | 20:45:00 | 21:45:00 | 22:45:00 | 24:06:00 |
Bayshore | 5:05:00 | 5:35:00 | - | 6:35:00 | - | - | - | - | 7:35:00 | - | - | - | - | 8:35:00 | - | - | 9:10:00 | - | 10:10:00 | 11:10:00 | 12:10:00 | 13:10:00 | 14:10:00 | - | 15:12:00 | - | - | - | 16:41:00 | - | - | - | - | 17:41:00 | - | - | - | - | 18:41:00 | - | - | 19:43:00 | 20:50:00 | 21:50:00 | 22:50:00 | 24:11:00 |
So. San Francisco | 5:11:00 | 5:41:00 | - | 6:41:00 | - | - | - | - | 7:41:00 | - | - | - | - | 8:41:00 | - | - | 9:15:00 | - | 10:15:00 | 11:15:00 | 12:15:00 | 13:15:00 | 14:15:00 | - | 15:17:00 | - | - | - | 16:49:00 | - | 17:08:00 | - | - | 17:49:00 | - | 18:08:00 | - | - | 18:49:00 | - | 19:08:00 | 19:49:00 | 20:56:00 | 21:56:00 | 22:56:00 | 24:17:00 |
San Bruno | 5:15:00 | 5:45:00 | - | 6:44:00 | - | - | - | 7:37:00 | 7:44:00 | - | - | - | 8:37:00 | 8:44:00 | - | - | 9:18:00 | 9:52:00 | 10:18:00 | 11:18:00 | 12:18:00 | 13:18:00 | 14:18:00 | 14:52:00 | 15:21:00 | 15:52:00 | - | 16:33:00 | 16:53:00 | - | - | - | 17:35:00 | 17:53:00 | - | - | - | 18:35:00 | 18:53:00 | - | - | 19:53:00 | 21:00:00 | 22:00:00 | 23:00:00 | 24:21:00 |
Millbrae | 5:19:00 | 5:49:00 | 6:24:00 | 6:49:00 | 7:02:00 | 7:17:00 | 7:32:00 | - | 7:49:00 | 8:02:00 | 8:17:00 | 8:32:00 | - | 8:49:00 | 9:02:00 | 9:17:00 | 9:22:00 | 9:56:00 | 10:22:00 | 11:22:00 | 12:22:00 | 13:22:00 | 14:22:00 | 14:56:00 | 15:25:00 | 15:56:00 | 16:26:00 | - | 16:57:00 | 16:50:00 | 17:14:00 | 17:30:00 | - | 17:57:00 | 17:50:00 | 18:14:00 | 18:30:00 | - | 18:57:00 | 18:50:00 | 19:14:00 | 19:57:00 | 21:05:00 | 22:05:00 | 23:05:00 | 24:25:00 |
Burlingame | 5:23:00 | 5:53:00 | 6:28:00 | 6:53:00 | - | - | - | 7:44:00 | 7:53:00 | - | - | - | 8:44:00 | 8:53:00 | - | - | 9:27:00 | 10:01:00 | 10:27:00 | 11:27:00 | 12:27:00 | 13:27:00 | 14:27:00 | 15:01:00 | 15:30:00 | 16:01:00 | - | 16:38:00 | 17:01:00 | - | - | - | 17:42:00 | 18:01:00 | - | - | - | 18:42:00 | 19:01:00 | - | - | 20:01:00 | 21:09:00 | 22:09:00 | 23:09:00 | 24:29:00 |
San Mateo | 5:28:00 | 5:58:00 | 6:32:00 | 6:56:00 | 7:09:00 | - | - | 7:48:00 | 7:56:00 | 8:09:00 | - | - | 8:48:00 | 8:56:00 | 9:09:00 | - | 9:30:00 | 10:04:00 | 10:30:00 | 11:30:00 | 12:30:00 | 13:30:00 | 14:30:00 | 15:04:00 | 15:33:00 | 16:04:00 | - | 16:43:00 | 17:06:00 | 16:59:00 | - | - | 17:45:00 | 18:06:00 | 17:59:00 | - | - | 18:45:00 | 19:06:00 | 18:59:00 | - | 20:06:00 | 21:13:00 | 22:13:00 | 23:13:00 | 24:34:00 |
Hayward Park | 5:31:00 | 6:01:00 | - | 7:00:00 | - | - | - | - | 8:00:00 | - | - | - | - | 9:00:00 | - | - | 9:33:00 | - | 10:33:00 | 11:33:00 | 12:33:00 | 13:33:00 | 14:33:00 | - | 15:36:00 | - | - | - | 17:09:00 | - | - | - | - | 18:09:00 | - | - | - | - | 19:09:00 | - | - | 20:09:00 | 21:16:00 | 22:16:00 | 23:16:00 | 24:37:00 |
Hillsdale | 5:34:00 | 6:04:00 | 6:36:00 | 7:04:00 | - | - | 7:42:00 | 7:52:00 | 8:04:00 | - | - | 8:42:00 | 8:52:00 | 9:04:00 | - | - | 9:37:00 | 10:08:00 | 10:37:00 | 11:37:00 | 12:37:00 | 13:37:00 | 14:37:00 | 15:08:00 | 15:40:00 | 16:08:00 | 16:36:00 | 16:48:00 | 17:13:00 | - | 17:24:00 | 17:40:00 | 17:50:00 | 18:13:00 | - | 18:24:00 | 18:40:00 | 18:50:00 | 19:13:00 | - | 19:24:00 | 20:12:00 | 21:20:00 | 22:20:00 | 23:20:00 | 24:40:00 |
Belmont | 5:37:00 | 6:07:00 | - | 7:07:00 | - | - | - | - | 8:07:00 | - | - | - | - | 9:07:00 | - | - | 9:41:00 | 10:11:00 | 10:41:00 | 11:41:00 | 12:41:00 | 13:41:00 | 14:41:00 | 15:11:00 | 15:44:00 | 16:11:00 | - | - | 17:16:00 | - | - | - | - | 18:16:00 | - | - | - | - | 19:16:00 | - | - | 20:15:00 | 21:24:00 | 22:24:00 | 23:24:00 | 24:43:00 |
San Carlos | 5:40:00 | 6:10:00 | 6:40:00 | 7:11:00 | 7:16:00 | - | - | 7:58:00 | 8:11:00 | 8:16:00 | - | - | 8:58:00 | 9:11:00 | 9:16:00 | - | 9:44:00 | 10:14:00 | 10:44:00 | 11:44:00 | 12:44:00 | 13:44:00 | 14:44:00 | 15:14:00 | 15:47:00 | 16:14:00 | - | 16:52:00 | 17:20:00 | - | - | - | 17:55:00 | 18:20:00 | - | - | - | 18:55:00 | 19:20:00 | - | - | 20:18:00 | 21:27:00 | 22:27:00 | 23:27:00 | 24:46:00 |
Redwood City | 5:45:00 | 6:15:00 | 6:45:00 | 7:15:00 | 7:22:00 | 7:32:00 | - | - | 8:15:00 | 8:22:00 | 8:32:00 | - | - | 9:15:00 | 9:22:00 | 9:32:00 | 9:48:00 | 10:20:00 | 10:48:00 | 11:48:00 | 12:48:00 | 13:48:00 | 14:48:00 | 15:20:00 | 15:51:00 | 16:20:00 | - | - | 17:24:00 | 17:08:00 | 17:30:00 | - | - | 18:24:00 | 18:08:00 | 18:30:00 | - | - | 19:24:00 | 19:08:00 | 19:30:00 | 20:23:00 | 21:31:00 | 22:31:00 | 23:31:00 | 24:51:00 |
Menlo Park | 5:50:00 | 6:20:00 | 6:50:00 | - | 7:28:00 | 7:38:00 | - | 8:06:00 | - | 8:28:00 | 8:38:00 | - | 9:06:00 | - | 9:28:00 | 9:38:00 | 9:53:00 | 10:26:00 | 10:53:00 | 11:53:00 | 12:53:00 | 13:53:00 | 14:53:00 | 15:26:00 | 15:56:00 | 16:26:00 | - | - | 17:30:00 | - | 17:36:00 | - | - | 18:30:00 | - | 18:36:00 | - | - | 19:30:00 | - | 19:36:00 | 20:28:00 | 21:36:00 | 22:36:00 | 23:36:00 | 24:56:00 |
Palo Alto | 5:53:00 | 6:23:00 | 6:53:00 | 7:22:00 | 7:32:00 | 7:41:00 | 7:54:00 | 8:09:00 | 8:22:00 | 8:32:00 | 8:41:00 | 8:54:00 | 9:09:00 | 9:22:00 | 9:32:00 | 9:41:00 | 9:58:00 | 10:30:00 | 10:58:00 | 11:58:00 | 12:58:00 | 13:58:00 | 14:58:00 | 15:30:00 | 16:01:00 | 16:30:00 | 16:47:00 | 17:02:00 | - | 17:16:00 | 17:40:00 | 17:52:00 | 18:04:00 | - | 18:16:00 | 18:40:00 | 18:52:00 | 19:04:00 | - | 19:16:00 | 19:40:00 | 20:31:00 | 21:40:00 | 22:40:00 | 23:40:00 | 24:59:00 |
California Ave | 5:57:00 | 6:27:00 | 6:57:00 | - | 7:35:00 | - | - | - | - | 8:35:00 | - | - | - | - | 9:35:00 | - | 10:01:00 | 10:34:00 | 11:01:00 | 12:01:00 | 13:01:00 | 14:01:00 | 15:01:00 | 15:34:00 | 16:04:00 | 16:34:00 | - | 17:06:00 | - | - | 17:44:00 | - | 18:08:00 | - | - | 18:44:00 | - | 19:08:00 | - | - | 19:44:00 | 20:35:00 | 21:44:00 | 22:44:00 | 23:44:00 | 25:03:00 |
San Antonio | 6:01:00 | 6:31:00 | - | - | 7:40:00 | - | - | - | - | 8:40:00 | - | - | - | - | 9:40:00 | - | 10:06:00 | 10:38:00 | 11:06:00 | 12:06:00 | 13:06:00 | 14:06:00 | 15:06:00 | 15:38:00 | 16:09:00 | 16:38:00 | - | - | - | - | 17:48:00 | - | - | - | - | 18:48:00 | - | - | - | - | 19:48:00 | 20:39:00 | 21:48:00 | 22:48:00 | 23:48:00 | 25:07:00 |
Mt View | 6:05:00 | 6:35:00 | 7:03:00 | - | 7:44:00 | 7:49:00 | 8:01:00 | 8:17:00 | - | 8:44:00 | 8:49:00 | 9:01:00 | 9:17:00 | - | 9:44:00 | 9:49:00 | 10:10:00 | 10:43:00 | 11:10:00 | 12:10:00 | 13:10:00 | 14:10:00 | 15:10:00 | 15:43:00 | 16:13:00 | 16:43:00 | 16:54:00 | 17:12:00 | 17:38:00 | - | 17:52:00 | 17:59:00 | 18:14:00 | 18:38:00 | - | 18:52:00 | 18:59:00 | 19:14:00 | 19:38:00 | - | 19:52:00 | 20:43:00 | 21:52:00 | 22:52:00 | 23:52:00 | 25:11:00 |
Sunnyvale | 6:10:00 | 6:40:00 | - | - | 7:49:00 | - | - | - | - | 8:49:00 | - | - | - | - | 9:49:00 | - | 10:15:00 | 10:48:00 | 11:15:00 | 12:15:00 | 13:15:00 | 14:15:00 | 15:15:00 | 15:48:00 | 16:18:00 | 16:48:00 | - | 17:17:00 | 17:43:00 | 17:26:00 | 17:57:00 | - | 18:20:00 | 18:43:00 | 18:26:00 | 18:57:00 | - | 19:20:00 | 19:43:00 | 19:26:00 | 19:57:00 | 20:48:00 | 21:57:00 | 22:57:00 | 23:57:00 | 25:16:00 |
Lawrence | 6:14:00 | 6:44:00 | 7:08:00 | - | 7:55:00 | - | - | 8:24:00 | - | 8:55:00 | - | - | 9:24:00 | - | 9:55:00 | - | 10:20:00 | 10:52:00 | 11:20:00 | 12:20:00 | 13:20:00 | 14:20:00 | 15:20:00 | 15:52:00 | 16:23:00 | 16:52:00 | - | - | - | - | 18:03:00 | - | - | 18:47:00 | - | 19:03:00 | - | - | - | - | 20:03:00 | 20:52:00 | 22:01:00 | 23:01:00 | 24:01:00 | 25:20:00 |
Santa Clara | 6:19:00 | 6:49:00 | - | 7:36:00 | 8:02:00 | - | - | - | 8:36:00 | 9:02:00 | - | - | - | 9:36:00 | 10:02:00 | - | 10:25:00 | 10:57:00 | 11:25:00 | 12:25:00 | 13:25:00 | 14:25:00 | 15:25:00 | 15:57:00 | 16:28:00 | 16:57:00 | - | - | 17:52:00 | - | 18:10:00 | - | - | 18:52:00 | - | 19:10:00 | - | - | 19:52:00 | - | 20:10:00 | 20:57:00 | 22:06:00 | 23:06:00 | 24:06:00 | 25:25:00 |
College Park | - | - | - | - | 8:05:00 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 16:32:00 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
San Jose Diridon | 6:28:00 | 6:58:00 | 7:20:00 | 7:45:00 | 8:11:00 | 8:03:00 | 8:16:00 | 8:34:00 | 8:45:00 | 9:10:00 | 9:03:00 | 9:16:00 | 9:34:00 | 9:45:00 | 10:10:00 | 10:03:00 | 10:34:00 | 11:04:00 | 11:34:00 | 12:34:00 | 13:34:00 | 14:34:00 | 15:34:00 | 16:04:00 | 16:38:00 | 17:04:00 | 17:09:00 | 17:28:00 | 18:00:00 | 17:36:00 | 18:20:00 | 18:14:00 | 18:30:00 | 19:00:00 | 18:36:00 | 19:20:00 | 19:14:00 | 19:30:00 | 20:00:00 | 19:36:00 | 20:18:00 | 21:06:00 | 22:13:00 | 23:13:00 | 24:13:00 | 25:34:00 |
Tamien | - | 7:05:00 | - | 7:52:00 | 8:18:00 | - | - | - | 8:52:00 | 9:17:00 | - | - | - | 9:52:00 | 10:17:00 | - | - | 11:11:00 | - | - | - | - | - | 16:11:00 | 16:45:00 | 17:11:00 | - | - | - | 17:43:00 | 18:26:00 | - | - | 19:06:00 | 18:43:00 | 19:26:00 | - | - | - | 19:43:00 | 20:25:00 | - | 22:20:00 | 23:20:00 | - | - |
Capitol | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 16:52:00 | - | - | - | - | - | 18:33:00 | - | - | 19:13:00 | - | - | - | - | - | - | - | - | - | - | - | - |
Blossom Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 16:58:00 | - | - | - | - | - | 18:39:00 | - | - | 19:19:00 | - | - | - | - | - | - | - | - | - | - | - | - |
Morgan Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 17:11:00 | - | - | - | - | - | 18:52:00 | - | - | 19:32:00 | - | - | - | - | - | - | - | - | - | - | - | - |
San Martin | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 17:17:00 | - | - | - | - | - | 18:58:00 | - | - | 19:38:00 | - | - | - | - | - | - | - | - | - | - | - | - |
Gilroy | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 17:30:00 | - | - | - | - | - | 19:11:00 | - | - | 19:51:00 | - | - | - | - | - | - | - | - | - | - | - | - |
def boardings(stime, riders): return round(riders["boardings"])
make_table(transpose(build_timetable(boardings)))
102 | 104 | 206 | 208 | 210 | 312 | 314 | 216 | 218 | 220 | 322 | 324 | 226 | 228 | 230 | 332 | 134 | 236 | 138 | 142 | 146 | 150 | 152 | 254 | 156 | 258 | 360 | 262 | 264 | 366 | 268 | 370 | 272 | 274 | 376 | 278 | 380 | 282 | 284 | 386 | 288 | 190 | 192 | 194 | 196 | 198 | |
San Francisco | 17 | 24 | 112 | 33 | 181 | 219 | 306 | 161 | 83 | 425 | 397 | 357 | 193 | 142 | 369 | 367 | 154 | 254 | 188 | 179 | 151 | 169 | 175 | 192 | 158 | 277 | 490 | 394 | 109 | 618 | 614 | 791 | 727 | 225 | 886 | 780 | 697 | 523 | 136 | 604 | 559 | 429 | 407 | 242 | 171 | 83 |
22nd St | 7 | 9 | 57 | 17 | 96 | 117 | 144 | 64 | 25 | 140 | 144 | 143 | 79 | 33 | 142 | 143 | 55 | - | 45 | 22 | 18 | 11 | 12 | - | 11 | - | - | - | 21 | - | - | - | - | 30 | - | - | - | - | 20 | - | - | 17 | 19 | 10 | 12 | 7 |
Bayshore | 4 | 4 | - | 19 | - | - | - | - | 36 | - | - | - | - | 31 | - | - | 22 | - | 12 | 8 | 9 | 8 | 8 | - | 11 | - | - | - | 13 | - | - | - | - | 8 | - | - | - | - | 5 | - | - | 4 | 4 | 3 | 2 | 1 |
So. San Francisco | 6 | 8 | - | 9 | - | - | - | - | 20 | - | - | - | - | 15 | - | - | 9 | - | 6 | 5 | 5 | 6 | 10 | - | 20 | - | - | - | 40 | - | 44 | - | - | 33 | - | 18 | - | - | 11 | - | 7 | 6 | 4 | 3 | 3 | 1 |
San Bruno | 6 | 8 | - | 26 | - | - | - | 55 | 29 | - | - | - | 33 | 18 | - | - | 17 | 10 | 15 | 5 | 11 | 9 | 13 | 8 | 10 | 15 | - | 14 | 17 | - | - | - | 30 | 12 | - | - | - | 19 | 8 | - | - | 5 | 5 | 5 | 3 | 2 |
Millbrae | 8 | 36 | 84 | 59 | 83 | 157 | 115 | - | 89 | 115 | 129 | 117 | - | 72 | 90 | 78 | 74 | 59 | 70 | 66 | 48 | 64 | 63 | 43 | 83 | 79 | 87 | - | 88 | 103 | 67 | 79 | - | 92 | 110 | 82 | 53 | - | 61 | 62 | 43 | 68 | 43 | 35 | 26 | 15 |
Burlingame | 4 | 11 | 22 | 24 | - | - | - | 66 | 47 | - | - | - | 40 | 35 | - | - | 25 | 12 | 12 | 12 | 9 | 11 | 9 | 9 | 12 | 11 | - | 19 | 24 | - | - | - | 25 | 13 | - | - | - | 15 | 9 | - | - | 9 | 8 | 6 | 3 | 1 |
San Mateo | 7 | 19 | 32 | 26 | 131 | - | - | 69 | 31 | 82 | - | - | 64 | 22 | 50 | - | 26 | 19 | 19 | 13 | 18 | 15 | 15 | 13 | 59 | 25 | - | 23 | 34 | 42 | - | - | 44 | 30 | 60 | - | - | 27 | 14 | 22 | - | 17 | 15 | 15 | 7 | 6 |
Hayward Park | 3 | 10 | - | 21 | - | - | - | - | 26 | - | - | - | - | 18 | - | - | 8 | - | 7 | 3 | 6 | 8 | 11 | - | 13 | - | - | - | 36 | - | - | - | - | 19 | - | - | - | - | 7 | - | - | 2 | 5 | 2 | 1 | 1 |
Hillsdale | 8 | 10 | 37 | 39 | - | - | 114 | 69 | 56 | - | - | 88 | 37 | 37 | - | - | 32 | 10 | 12 | 12 | 16 | 13 | 12 | 9 | 80 | 14 | 47 | 28 | 80 | - | 37 | 33 | 30 | 46 | - | 43 | 30 | 15 | 18 | - | 12 | 14 | 12 | 5 | 2 | - |
Belmont | 6 | 8 | - | 34 | - | - | - | - | 58 | - | - | - | - | 35 | - | - | 15 | 9 | 8 | 8 | 8 | 6 | 8 | 6 | 14 | 7 | - | - | 31 | - | - | - | - | 24 | - | - | - | - | 10 | - | - | 8 | 7 | 5 | 1 | - |
San Carlos | 8 | 7 | 24 | 29 | 46 | - | - | 65 | 34 | 42 | - | - | 39 | 24 | 24 | - | 13 | 19 | 11 | 6 | 7 | 9 | 8 | 9 | 18 | 26 | - | 36 | 65 | - | - | - | 50 | 27 | - | - | - | 19 | 11 | - | - | 6 | 5 | 5 | 3 | 1 |
Redwood City | 10 | 15 | 22 | 35 | 39 | 44 | - | - | 50 | 57 | 54 | - | - | 32 | 37 | 25 | 27 | 57 | 17 | 18 | 18 | 15 | 22 | 28 | 54 | 79 | - | - | 124 | 147 | 82 | - | - | 79 | 112 | 50 | - | - | 31 | 30 | 25 | 21 | 22 | 16 | 5 | 1 |
Menlo Park | 4 | 6 | 16 | - | 38 | 12 | - | 31 | - | 20 | 14 | - | 18 | - | 15 | 13 | 8 | 5 | 10 | 11 | 17 | 14 | 19 | 14 | 68 | 56 | - | - | 115 | - | 60 | - | - | 66 | - | 21 | - | - | 13 | - | 16 | 10 | 9 | 4 | 2 | 1 |
Palo Alto | 6 | 5 | 13 | 20 | 34 | 8 | 26 | 14 | 13 | 53 | 11 | 18 | 18 | 6 | 40 | 6 | 12 | 11 | 15 | 17 | 24 | 46 | 67 | 79 | 232 | 195 | 195 | 188 | - | 319 | 246 | 144 | 89 | - | 143 | 121 | 44 | 41 | - | 43 | 80 | 51 | 37 | 17 | 10 | 4 |
California Ave | 1 | 4 | 8 | - | 19 | - | - | - | - | 17 | - | - | - | - | 11 | - | 2 | 4 | 4 | 6 | 9 | 11 | 17 | 13 | 44 | 35 | - | 85 | - | - | 88 | - | 46 | - | - | 33 | - | 15 | - | - | 23 | 14 | 10 | 3 | 2 | - |
San Antonio | 3 | 2 | - | - | 18 | - | - | - | - | 10 | - | - | - | - | 8 | - | 3 | 1 | 2 | 4 | 6 | 7 | 4 | 6 | 22 | 9 | - | - | - | - | 38 | - | - | - | - | 23 | - | - | - | - | 7 | 5 | 4 | 1 | 1 | 1 |
Mt View | 4 | 1 | 7 | - | 22 | 6 | 8 | 10 | - | 5 | 11 | 4 | 8 | - | 5 | 7 | 4 | 4 | 4 | 4 | 6 | 11 | 10 | 14 | 64 | 35 | 23 | 43 | 53 | - | 47 | 27 | 27 | 34 | - | 11 | 12 | 14 | 10 | - | 8 | 12 | 5 | 2 | 2 | - |
Sunnyvale | 1 | 3 | - | - | 19 | - | - | - | - | 8 | - | - | - | - | 4 | - | 1 | 1 | 2 | 3 | 3 | 3 | 8 | 8 | 31 | 13 | - | 22 | 20 | 31 | 35 | - | 12 | 12 | 28 | 7 | - | 4 | 4 | 3 | 7 | 5 | 2 | 2 | 1 | - |
Lawrence | 1 | - | 1 | - | 6 | - | - | 4 | - | 3 | - | - | 10 | - | 2 | - | 1 | - | 1 | 2 | 3 | 3 | 4 | 3 | 45 | 8 | - | - | - | - | 46 | - | - | 7 | - | 4 | - | - | - | - | - | 2 | 2 | - | - | - |
Santa Clara | - | - | - | 6 | 1 | - | - | - | 2 | 1 | - | - | - | 1 | 1 | - | 1 | - | - | 1 | 1 | - | 1 | 2 | 16 | 3 | - | - | 4 | - | 17 | - | - | 3 | - | 2 | - | - | 2 | - | - | 1 | 1 | - | - | - |
College Park | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 32 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
San Jose Diridon | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 5 | 24 | - | - | - | - | 43 | 80 | - | - | 6 | 8 | 15 | - | - | - | 4 | - | - | 2 | - | - | - |
Tamien | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 7 | - | - | - | - | - | 5 | - | - | 3 | - | - | - | - | - | - | - | - | - | - | - | - |
Capitol | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 3 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
Blossom Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 3 | - | - | - | - | - | 1 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
Morgan Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
San Martin | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
Gilroy | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
def alightings(stime, riders): return round(riders["alightings"])
make_table(transpose(build_timetable(alightings)))
102 | 104 | 206 | 208 | 210 | 312 | 314 | 216 | 218 | 220 | 322 | 324 | 226 | 228 | 230 | 332 | 134 | 236 | 138 | 142 | 146 | 150 | 152 | 254 | 156 | 258 | 360 | 262 | 264 | 366 | 268 | 370 | 272 | 274 | 376 | 278 | 380 | 282 | 284 | 386 | 288 | 190 | 192 | 194 | 196 | 198 | |
San Francisco | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
22nd St | - | - | 1 | - | - | 3 | 1 | - | 2 | 3 | 1 | 2 | - | - | 2 | 1 | 3 | - | 1 | - | - | - | - | - | 1 | - | - | - | 3 | - | - | - | - | 2 | - | - | - | - | 1 | - | - | 1 | 1 | - | 1 | - |
Bayshore | - | - | - | - | - | - | - | - | 2 | - | - | - | - | 3 | - | - | 1 | - | - | - | - | 1 | - | - | 1 | - | - | - | 2 | - | - | - | - | 11 | - | - | - | - | 9 | - | - | 6 | 2 | 2 | - | - |
So. San Francisco | - | 3 | - | 4 | - | - | - | - | 19 | - | - | - | - | 32 | - | - | 11 | - | 5 | 2 | 3 | 3 | 4 | - | 10 | - | - | - | 12 | - | 13 | - | - | 15 | - | 16 | - | - | 10 | - | 7 | 7 | 6 | 3 | 2 | 2 |
San Bruno | - | 1 | - | 1 | - | - | - | 8 | 3 | - | - | - | 21 | 4 | - | - | 3 | 3 | 5 | 4 | 5 | 8 | 4 | 7 | 5 | 11 | - | 32 | 12 | - | - | - | 70 | 12 | - | - | - | 42 | 7 | - | - | 15 | 17 | 7 | 1 | 2 |
Millbrae | 2 | 1 | 4 | 4 | 5 | 8 | 11 | - | 8 | 16 | 6 | 7 | - | 9 | 12 | 12 | 5 | 3 | 5 | 4 | 7 | 4 | 5 | 10 | 6 | 17 | 18 | - | 5 | 36 | 31 | 41 | - | 9 | 69 | 50 | 44 | - | 9 | 43 | 35 | 23 | 17 | 9 | 5 | 1 |
Burlingame | - | 2 | 1 | 3 | - | - | - | 17 | 11 | - | - | - | 19 | 12 | - | - | 17 | 12 | 12 | 5 | 9 | 12 | 9 | 9 | 13 | 15 | - | 32 | 20 | - | - | - | 98 | 30 | - | - | - | 83 | 26 | - | - | 38 | 16 | 13 | 8 | 5 |
San Mateo | 1 | 2 | 5 | 11 | 13 | - | - | 20 | 15 | 53 | - | - | 53 | 25 | 56 | - | 31 | 24 | 18 | 18 | 12 | 17 | 27 | 15 | 18 | 26 | - | 54 | 14 | 44 | - | - | 122 | 22 | 91 | - | - | 104 | 14 | 72 | - | 45 | 29 | 13 | 11 | 8 |
Hayward Park | - | 4 | - | 9 | - | - | - | - | 20 | - | - | - | - | 24 | - | - | 22 | - | 11 | 8 | 5 | 6 | 5 | - | 6 | - | - | - | 17 | - | - | - | - | 28 | - | - | - | - | 18 | - | - | 8 | 11 | 5 | 3 | 4 |
Hillsdale | 1 | 1 | 13 | 11 | - | - | 76 | 31 | 30 | - | - | 62 | 23 | 31 | - | - | 27 | 18 | 17 | 15 | 15 | 19 | 23 | 25 | 28 | 36 | 95 | 47 | 48 | - | 154 | 149 | 74 | 50 | - | 183 | 144 | 60 | 37 | - | 110 | 47 | 41 | 23 | 13 | 7 |
Belmont | 1 | 4 | - | 12 | - | - | - | - | 27 | - | - | - | - | 15 | - | - | 12 | 6 | 11 | 8 | 8 | 11 | 11 | 9 | 14 | 19 | - | - | 26 | - | - | - | - | 48 | - | - | - | - | 28 | - | - | 21 | 13 | 7 | 6 | 3 |
San Carlos | 2 | 3 | 22 | 18 | 29 | - | - | 43 | 16 | 38 | - | - | 26 | 19 | 51 | - | 20 | 12 | 18 | 10 | 11 | 12 | 12 | 11 | 21 | 19 | - | 42 | 20 | - | - | - | 93 | 20 | - | - | - | 75 | 13 | - | - | 22 | 11 | 11 | 10 | 4 |
Redwood City | 10 | 14 | 36 | 50 | 48 | 119 | - | - | 73 | 75 | 153 | - | - | 75 | 77 | 126 | 48 | 43 | 55 | 38 | 37 | 36 | 43 | 35 | 44 | 44 | - | - | 50 | 120 | 88 | - | - | 33 | 205 | 124 | - | - | 25 | 139 | 79 | 50 | 47 | 29 | 20 | 15 |
Menlo Park | 4 | 9 | 27 | - | 114 | 59 | - | 59 | - | 74 | 65 | - | 51 | - | 43 | 39 | 18 | 31 | 33 | 18 | 20 | 13 | 18 | 10 | 34 | 23 | - | - | 45 | - | 64 | - | - | 30 | - | 78 | - | - | 21 | - | 41 | 23 | 19 | 16 | 9 | 2 |
Palo Alto | 28 | 59 | 131 | 187 | 134 | 145 | 320 | 173 | 266 | 209 | 244 | 336 | 133 | 203 | 167 | 225 | 123 | 136 | 94 | 94 | 70 | 58 | 50 | 42 | 58 | 40 | 99 | 35 | - | 78 | 75 | 129 | 63 | - | 158 | 91 | 128 | 38 | - | 89 | 65 | 43 | 47 | 34 | 25 | 10 |
California Ave | 6 | 9 | 22 | - | 62 | - | - | - | - | 178 | - | - | - | - | 135 | - | 41 | 39 | 21 | 18 | 12 | 17 | 16 | 14 | 27 | 22 | - | 45 | - | - | 74 | - | 59 | - | - | 74 | - | 47 | - | - | 39 | 25 | 27 | 18 | 10 | 5 |
San Antonio | 3 | 8 | - | - | 35 | - | - | - | - | 61 | - | - | - | - | 49 | - | 12 | 19 | 14 | 12 | 18 | 22 | 17 | 16 | 24 | 33 | - | - | - | - | 119 | - | - | - | - | 111 | - | - | - | - | 61 | 22 | 25 | 15 | 11 | 4 |
Mt View | 14 | 20 | 85 | - | 83 | 146 | 217 | 120 | - | 128 | 210 | 254 | 118 | - | 103 | 189 | 59 | 50 | 38 | 42 | 40 | 39 | 43 | 37 | 81 | 79 | 202 | 96 | 134 | - | 150 | 295 | 106 | 100 | - | 112 | 265 | 61 | 49 | - | 97 | 85 | 87 | 51 | 36 | 12 |
Sunnyvale | 7 | 16 | - | - | 53 | - | - | - | - | 77 | - | - | - | - | 54 | - | 17 | 17 | 21 | 25 | 24 | 33 | 48 | 48 | 86 | 108 | - | 229 | 105 | 339 | 173 | - | 242 | 72 | 345 | 156 | - | 117 | 29 | 210 | 95 | 74 | 72 | 42 | 23 | 11 |
Lawrence | 3 | 6 | 35 | - | 28 | - | - | 92 | - | 31 | - | - | 70 | - | 20 | - | 10 | 12 | 12 | 8 | 10 | 9 | 19 | 14 | 40 | 40 | - | - | - | - | 97 | - | - | 41 | - | 61 | - | - | - | - | 36 | 25 | 22 | 11 | 6 | 5 |
Santa Clara | 11 | 9 | - | 40 | 13 | - | - | - | 54 | 14 | - | - | - | 40 | 12 | - | 13 | 14 | 17 | 22 | 20 | 24 | 33 | 32 | 67 | 82 | - | - | 147 | - | 77 | - | - | 85 | - | 59 | - | - | 40 | - | 29 | 25 | 23 | 14 | 13 | 7 |
College Park | - | - | - | - | 101 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 31 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
San Jose Diridon | 23 | 13 | 54 | 43 | 11 | 83 | 87 | 47 | 51 | 19 | 81 | 66 | 22 | 26 | 17 | 48 | 20 | 34 | 51 | 54 | 65 | 94 | 109 | 81 | 149 | 176 | 429 | 241 | 214 | 350 | 64 | 459 | 153 | 83 | 303 | 53 | 255 | 63 | 36 | 134 | 70 | 101 | 75 | 50 | 41 | 19 |
Tamien | - | 6 | - | 3 | 3 | - | - | - | 1 | 1 | - | - | - | 4 | - | - | - | 2 | - | - | - | - | - | 45 | 79 | 100 | - | - | - | 336 | 96 | - | - | 22 | 175 | 43 | - | - | - | 81 | 24 | - | 21 | 9 | - | - |
Capitol | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 17 | - | - | - | - | - | 29 | - | - | 10 | - | - | - | - | - | - | - | - | - | - | - | - |
Blossom Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 50 | - | - | - | - | - | 50 | - | - | 9 | - | - | - | - | - | - | - | - | - | - | - | - |
Morgan Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 82 | - | - | - | - | - | 66 | - | - | 15 | - | - | - | - | - | - | - | - | - | - | - | - |
San Martin | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 39 | - | - | - | - | - | 27 | - | - | 2 | - | - | - | - | - | - | - | - | - | - | - | - |
Gilroy | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 99 | - | - | - | - | - | 62 | - | - | 16 | - | - | - | - | - | - | - | - | - | - | - | - |
def boardings_and_alightings(stime, riders):
return "+%d/-%d" % (round(riders["boardings"]), round(riders["alightings"]))
make_table(transpose(build_timetable(boardings_and_alightings)))
102 | 104 | 206 | 208 | 210 | 312 | 314 | 216 | 218 | 220 | 322 | 324 | 226 | 228 | 230 | 332 | 134 | 236 | 138 | 142 | 146 | 150 | 152 | 254 | 156 | 258 | 360 | 262 | 264 | 366 | 268 | 370 | 272 | 274 | 376 | 278 | 380 | 282 | 284 | 386 | 288 | 190 | 192 | 194 | 196 | 198 | |
San Francisco | +17/-0 | +24/-0 | +112/-0 | +33/-0 | +181/-0 | +219/-0 | +306/-0 | +161/-0 | +83/-0 | +425/-0 | +397/-0 | +357/-0 | +193/-0 | +142/-0 | +369/-0 | +367/-0 | +154/-0 | +254/-0 | +188/-0 | +179/-0 | +151/-0 | +169/-0 | +175/-0 | +192/-0 | +158/-0 | +277/-0 | +490/-0 | +394/-0 | +109/-0 | +618/-0 | +614/-0 | +791/-0 | +727/-0 | +225/-0 | +886/-0 | +780/-0 | +697/-0 | +523/-0 | +136/-0 | +604/-0 | +559/-0 | +429/-0 | +407/-0 | +242/-0 | +171/-0 | +83/-0 |
22nd St | +7/-0 | +9/-0 | +57/-1 | +17/-0 | +96/-0 | +117/-3 | +144/-1 | +64/-0 | +25/-2 | +140/-3 | +144/-1 | +143/-2 | +79/-0 | +33/-0 | +142/-2 | +143/-1 | +55/-3 | - | +45/-1 | +22/-0 | +18/-0 | +11/-0 | +12/-0 | - | +11/-1 | - | - | - | +21/-3 | - | - | - | - | +30/-2 | - | - | - | - | +20/-1 | - | - | +17/-1 | +19/-1 | +10/-0 | +12/-1 | +7/-0 |
Bayshore | +4/-0 | +4/-0 | - | +19/-0 | - | - | - | - | +36/-2 | - | - | - | - | +31/-3 | - | - | +22/-1 | - | +12/-0 | +8/-0 | +9/-0 | +8/-1 | +8/-0 | - | +11/-1 | - | - | - | +13/-2 | - | - | - | - | +8/-11 | - | - | - | - | +5/-9 | - | - | +4/-6 | +4/-2 | +3/-2 | +2/-0 | +1/-0 |
So. San Francisco | +6/-0 | +8/-3 | - | +9/-4 | - | - | - | - | +20/-19 | - | - | - | - | +15/-32 | - | - | +9/-11 | - | +6/-5 | +5/-2 | +5/-3 | +6/-3 | +10/-4 | - | +20/-10 | - | - | - | +40/-12 | - | +44/-13 | - | - | +33/-15 | - | +18/-16 | - | - | +11/-10 | - | +7/-7 | +6/-7 | +4/-6 | +3/-3 | +3/-2 | +1/-2 |
San Bruno | +6/-0 | +8/-1 | - | +26/-1 | - | - | - | +55/-8 | +29/-3 | - | - | - | +33/-21 | +18/-4 | - | - | +17/-3 | +10/-3 | +15/-5 | +5/-4 | +11/-5 | +9/-8 | +13/-4 | +8/-7 | +10/-5 | +15/-11 | - | +14/-32 | +17/-12 | - | - | - | +30/-70 | +12/-12 | - | - | - | +19/-42 | +8/-7 | - | - | +5/-15 | +5/-17 | +5/-7 | +3/-1 | +2/-2 |
Millbrae | +8/-2 | +36/-1 | +84/-4 | +59/-4 | +83/-5 | +157/-8 | +115/-11 | - | +89/-8 | +115/-16 | +129/-6 | +117/-7 | - | +72/-9 | +90/-12 | +78/-12 | +74/-5 | +59/-3 | +70/-5 | +66/-4 | +48/-7 | +64/-4 | +63/-5 | +43/-10 | +83/-6 | +79/-17 | +87/-18 | - | +88/-5 | +103/-36 | +67/-31 | +79/-41 | - | +92/-9 | +110/-69 | +82/-50 | +53/-44 | - | +61/-9 | +62/-43 | +43/-35 | +68/-23 | +43/-17 | +35/-9 | +26/-5 | +15/-1 |
Burlingame | +4/-0 | +11/-2 | +22/-1 | +24/-3 | - | - | - | +66/-17 | +47/-11 | - | - | - | +40/-19 | +35/-12 | - | - | +25/-17 | +12/-12 | +12/-12 | +12/-5 | +9/-9 | +11/-12 | +9/-9 | +9/-9 | +12/-13 | +11/-15 | - | +19/-32 | +24/-20 | - | - | - | +25/-98 | +13/-30 | - | - | - | +15/-83 | +9/-26 | - | - | +9/-38 | +8/-16 | +6/-13 | +3/-8 | +1/-5 |
San Mateo | +7/-1 | +19/-2 | +32/-5 | +26/-11 | +131/-13 | - | - | +69/-20 | +31/-15 | +82/-53 | - | - | +64/-53 | +22/-25 | +50/-56 | - | +26/-31 | +19/-24 | +19/-18 | +13/-18 | +18/-12 | +15/-17 | +15/-27 | +13/-15 | +59/-18 | +25/-26 | - | +23/-54 | +34/-14 | +42/-44 | - | - | +44/-122 | +30/-22 | +60/-91 | - | - | +27/-104 | +14/-14 | +22/-72 | - | +17/-45 | +15/-29 | +15/-13 | +7/-11 | +6/-8 |
Hayward Park | +3/-0 | +10/-4 | - | +21/-9 | - | - | - | - | +26/-20 | - | - | - | - | +18/-24 | - | - | +8/-22 | - | +7/-11 | +3/-8 | +6/-5 | +8/-6 | +11/-5 | - | +13/-6 | - | - | - | +36/-17 | - | - | - | - | +19/-28 | - | - | - | - | +7/-18 | - | - | +2/-8 | +5/-11 | +2/-5 | +1/-3 | +1/-4 |
Hillsdale | +8/-1 | +10/-1 | +37/-13 | +39/-11 | - | - | +114/-76 | +69/-31 | +56/-30 | - | - | +88/-62 | +37/-23 | +37/-31 | - | - | +32/-27 | +10/-18 | +12/-17 | +12/-15 | +16/-15 | +13/-19 | +12/-23 | +9/-25 | +80/-28 | +14/-36 | +47/-95 | +28/-47 | +80/-48 | - | +37/-154 | +33/-149 | +30/-74 | +46/-50 | - | +43/-183 | +30/-144 | +15/-60 | +18/-37 | - | +12/-110 | +14/-47 | +12/-41 | +5/-23 | +2/-13 | +0/-7 |
Belmont | +6/-1 | +8/-4 | - | +34/-12 | - | - | - | - | +58/-27 | - | - | - | - | +35/-15 | - | - | +15/-12 | +9/-6 | +8/-11 | +8/-8 | +8/-8 | +6/-11 | +8/-11 | +6/-9 | +14/-14 | +7/-19 | - | - | +31/-26 | - | - | - | - | +24/-48 | - | - | - | - | +10/-28 | - | - | +8/-21 | +7/-13 | +5/-7 | +1/-6 | +0/-3 |
San Carlos | +8/-2 | +7/-3 | +24/-22 | +29/-18 | +46/-29 | - | - | +65/-43 | +34/-16 | +42/-38 | - | - | +39/-26 | +24/-19 | +24/-51 | - | +13/-20 | +19/-12 | +11/-18 | +6/-10 | +7/-11 | +9/-12 | +8/-12 | +9/-11 | +18/-21 | +26/-19 | - | +36/-42 | +65/-20 | - | - | - | +50/-93 | +27/-20 | - | - | - | +19/-75 | +11/-13 | - | - | +6/-22 | +5/-11 | +5/-11 | +3/-10 | +1/-4 |
Redwood City | +10/-10 | +15/-14 | +22/-36 | +35/-50 | +39/-48 | +44/-119 | - | - | +50/-73 | +57/-75 | +54/-153 | - | - | +32/-75 | +37/-77 | +25/-126 | +27/-48 | +57/-43 | +17/-55 | +18/-38 | +18/-37 | +15/-36 | +22/-43 | +28/-35 | +54/-44 | +79/-44 | - | - | +124/-50 | +147/-120 | +82/-88 | - | - | +79/-33 | +112/-205 | +50/-124 | - | - | +31/-25 | +30/-139 | +25/-79 | +21/-50 | +22/-47 | +16/-29 | +5/-20 | +1/-15 |
Menlo Park | +4/-4 | +6/-9 | +16/-27 | - | +38/-114 | +12/-59 | - | +31/-59 | - | +20/-74 | +14/-65 | - | +18/-51 | - | +15/-43 | +13/-39 | +8/-18 | +5/-31 | +10/-33 | +11/-18 | +17/-20 | +14/-13 | +19/-18 | +14/-10 | +68/-34 | +56/-23 | - | - | +115/-45 | - | +60/-64 | - | - | +66/-30 | - | +21/-78 | - | - | +13/-21 | - | +16/-41 | +10/-23 | +9/-19 | +4/-16 | +2/-9 | +1/-2 |
Palo Alto | +6/-28 | +5/-59 | +13/-131 | +20/-187 | +34/-134 | +8/-145 | +26/-320 | +14/-173 | +13/-266 | +53/-209 | +11/-244 | +18/-336 | +18/-133 | +6/-203 | +40/-167 | +6/-225 | +12/-123 | +11/-136 | +15/-94 | +17/-94 | +24/-70 | +46/-58 | +67/-50 | +79/-42 | +232/-58 | +195/-40 | +195/-99 | +188/-35 | - | +319/-78 | +246/-75 | +144/-129 | +89/-63 | - | +143/-158 | +121/-91 | +44/-128 | +41/-38 | - | +43/-89 | +80/-65 | +51/-43 | +37/-47 | +17/-34 | +10/-25 | +4/-10 |
California Ave | +1/-6 | +4/-9 | +8/-22 | - | +19/-62 | - | - | - | - | +17/-178 | - | - | - | - | +11/-135 | - | +2/-41 | +4/-39 | +4/-21 | +6/-18 | +9/-12 | +11/-17 | +17/-16 | +13/-14 | +44/-27 | +35/-22 | - | +85/-45 | - | - | +88/-74 | - | +46/-59 | - | - | +33/-74 | - | +15/-47 | - | - | +23/-39 | +14/-25 | +10/-27 | +3/-18 | +2/-10 | +0/-5 |
San Antonio | +3/-3 | +2/-8 | - | - | +18/-35 | - | - | - | - | +10/-61 | - | - | - | - | +8/-49 | - | +3/-12 | +1/-19 | +2/-14 | +4/-12 | +6/-18 | +7/-22 | +4/-17 | +6/-16 | +22/-24 | +9/-33 | - | - | - | - | +38/-119 | - | - | - | - | +23/-111 | - | - | - | - | +7/-61 | +5/-22 | +4/-25 | +1/-15 | +1/-11 | +1/-4 |
Mt View | +4/-14 | +1/-20 | +7/-85 | - | +22/-83 | +6/-146 | +8/-217 | +10/-120 | - | +5/-128 | +11/-210 | +4/-254 | +8/-118 | - | +5/-103 | +7/-189 | +4/-59 | +4/-50 | +4/-38 | +4/-42 | +6/-40 | +11/-39 | +10/-43 | +14/-37 | +64/-81 | +35/-79 | +23/-202 | +43/-96 | +53/-134 | - | +47/-150 | +27/-295 | +27/-106 | +34/-100 | - | +11/-112 | +12/-265 | +14/-61 | +10/-49 | - | +8/-97 | +12/-85 | +5/-87 | +2/-51 | +2/-36 | +0/-12 |
Sunnyvale | +1/-7 | +3/-16 | - | - | +19/-53 | - | - | - | - | +8/-77 | - | - | - | - | +4/-54 | - | +1/-17 | +1/-17 | +2/-21 | +3/-25 | +3/-24 | +3/-33 | +8/-48 | +8/-48 | +31/-86 | +13/-108 | - | +22/-229 | +20/-105 | +31/-339 | +35/-173 | - | +12/-242 | +12/-72 | +28/-345 | +7/-156 | - | +4/-117 | +4/-29 | +3/-210 | +7/-95 | +5/-74 | +2/-72 | +2/-42 | +1/-23 | +0/-11 |
Lawrence | +1/-3 | +0/-6 | +1/-35 | - | +6/-28 | - | - | +4/-92 | - | +3/-31 | - | - | +10/-70 | - | +2/-20 | - | +1/-10 | +0/-12 | +1/-12 | +2/-8 | +3/-10 | +3/-9 | +4/-19 | +3/-14 | +45/-40 | +8/-40 | - | - | - | - | +46/-97 | - | - | +7/-41 | - | +4/-61 | - | - | - | - | +0/-36 | +2/-25 | +2/-22 | +0/-11 | +0/-6 | +0/-5 |
Santa Clara | +0/-11 | +0/-9 | - | +6/-40 | +1/-13 | - | - | - | +2/-54 | +1/-14 | - | - | - | +1/-40 | +1/-12 | - | +1/-13 | +0/-14 | +0/-17 | +1/-22 | +1/-20 | +0/-24 | +1/-33 | +2/-32 | +16/-67 | +3/-82 | - | - | +4/-147 | - | +17/-77 | - | - | +3/-85 | - | +2/-59 | - | - | +2/-40 | - | +0/-29 | +1/-25 | +1/-23 | +0/-14 | +0/-13 | +0/-7 |
College Park | - | - | - | - | +0/-101 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | +32/-31 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
San Jose Diridon | +0/-23 | +0/-13 | +0/-54 | +0/-43 | +0/-11 | +0/-83 | +0/-87 | +0/-47 | +0/-51 | +0/-19 | +0/-81 | +0/-66 | +0/-22 | +0/-26 | +0/-17 | +0/-48 | +0/-20 | +0/-34 | +0/-51 | +0/-54 | +0/-65 | +0/-94 | +0/-109 | +5/-81 | +24/-149 | +0/-176 | +0/-429 | +0/-241 | +0/-214 | +43/-350 | +80/-64 | +0/-459 | +0/-153 | +6/-83 | +8/-303 | +15/-53 | +0/-255 | +0/-63 | +0/-36 | +4/-134 | +0/-70 | +0/-101 | +2/-75 | +0/-50 | +0/-41 | +0/-19 |
Tamien | - | +0/-6 | - | +0/-3 | +0/-3 | - | - | - | +0/-1 | +0/-1 | - | - | - | +0/-4 | +0/-0 | - | - | +0/-2 | - | - | - | - | - | +0/-45 | +7/-79 | +0/-100 | - | - | - | +0/-336 | +5/-96 | - | - | +3/-22 | +0/-175 | +0/-43 | - | - | - | +0/-81 | +0/-24 | - | +0/-21 | +0/-9 | - | - |
Capitol | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | +3/-17 | - | - | - | - | - | +0/-29 | - | - | +0/-10 | - | - | - | - | - | - | - | - | - | - | - | - |
Blossom Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | +3/-50 | - | - | - | - | - | +1/-50 | - | - | +0/-9 | - | - | - | - | - | - | - | - | - | - | - | - |
Morgan Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | +0/-82 | - | - | - | - | - | +0/-66 | - | - | +0/-15 | - | - | - | - | - | - | - | - | - | - | - | - |
San Martin | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | +0/-39 | - | - | - | - | - | +0/-27 | - | - | +0/-2 | - | - | - | - | - | - | - | - | - | - | - | - |
Gilroy | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | +0/-99 | - | - | - | - | - | +0/-62 | - | - | +0/-16 | - | - | - | - | - | - | - | - | - | - | - | - |
def onboard(stime, riders): return round(riders["onboard"])
make_table(transpose(build_timetable(onboard)))
102 | 104 | 206 | 208 | 210 | 312 | 314 | 216 | 218 | 220 | 322 | 324 | 226 | 228 | 230 | 332 | 134 | 236 | 138 | 142 | 146 | 150 | 152 | 254 | 156 | 258 | 360 | 262 | 264 | 366 | 268 | 370 | 272 | 274 | 376 | 278 | 380 | 282 | 284 | 386 | 288 | 190 | 192 | 194 | 196 | 198 | |
San Francisco | 17 | 24 | 112 | 33 | 181 | 219 | 306 | 161 | 83 | 425 | 397 | 357 | 193 | 142 | 369 | 367 | 154 | 254 | 188 | 179 | 151 | 169 | 175 | 192 | 158 | 277 | 490 | 394 | 109 | 618 | 614 | 791 | 727 | 225 | 886 | 780 | 697 | 523 | 136 | 604 | 559 | 429 | 407 | 242 | 171 | 83 |
22nd St | 24 | 33 | 168 | 50 | 277 | 333 | 449 | 225 | 107 | 562 | 540 | 498 | 271 | 175 | 508 | 509 | 207 | - | 231 | 201 | 169 | 180 | 187 | - | 167 | - | - | - | 128 | - | - | - | - | 252 | - | - | - | - | 155 | - | - | 445 | 426 | 252 | 182 | 90 |
Bayshore | 28 | 37 | - | 69 | - | - | - | - | 140 | - | - | - | - | 204 | - | - | 228 | - | 243 | 208 | 178 | 187 | 194 | - | 177 | - | - | - | 139 | - | - | - | - | 250 | - | - | - | - | 151 | - | - | 444 | 428 | 253 | 183 | 90 |
So. San Francisco | 34 | 43 | - | 74 | - | - | - | - | 142 | - | - | - | - | 187 | - | - | 226 | - | 244 | 211 | 180 | 189 | 201 | - | 187 | - | - | - | 166 | - | 645 | - | - | 267 | - | 783 | - | - | 152 | - | 558 | 442 | 426 | 252 | 184 | 89 |
San Bruno | 40 | 50 | - | 99 | - | - | - | 273 | 168 | - | - | - | 283 | 201 | - | - | 240 | 261 | 255 | 212 | 185 | 190 | 210 | 192 | 192 | 281 | - | 376 | 172 | - | - | - | 687 | 267 | - | - | - | 500 | 154 | - | - | 433 | 414 | 250 | 186 | 89 |
Millbrae | 46 | 84 | 248 | 153 | 355 | 482 | 553 | - | 249 | 662 | 663 | 608 | - | 264 | 586 | 575 | 309 | 318 | 320 | 274 | 226 | 250 | 268 | 225 | 269 | 344 | 559 | - | 254 | 685 | 680 | 829 | - | 350 | 927 | 814 | 705 | - | 205 | 623 | 566 | 478 | 440 | 276 | 207 | 103 |
Burlingame | 50 | 93 | 269 | 174 | - | - | - | 321 | 284 | - | - | - | 304 | 287 | - | - | 318 | 317 | 320 | 280 | 226 | 248 | 268 | 226 | 268 | 340 | - | 363 | 258 | - | - | - | 614 | 333 | - | - | - | 432 | 188 | - | - | 449 | 432 | 269 | 201 | 99 |
San Mateo | 56 | 111 | 296 | 189 | 473 | - | - | 371 | 300 | 691 | - | - | 315 | 283 | 580 | - | 313 | 312 | 320 | 276 | 232 | 246 | 256 | 225 | 309 | 339 | - | 333 | 278 | 682 | - | - | 535 | 341 | 896 | - | - | 355 | 189 | 573 | - | 421 | 418 | 271 | 197 | 97 |
Hayward Park | 59 | 116 | - | 201 | - | - | - | - | 306 | - | - | - | - | 278 | - | - | 299 | - | 316 | 272 | 234 | 248 | 262 | - | 316 | - | - | - | 297 | - | - | - | - | 332 | - | - | - | - | 179 | - | - | 415 | 412 | 268 | 194 | 94 |
Hillsdale | 66 | 126 | 320 | 229 | - | - | 591 | 409 | 332 | - | - | 633 | 329 | 283 | - | - | 304 | 304 | 312 | 269 | 235 | 242 | 250 | 207 | 368 | 318 | 512 | 314 | 330 | - | 564 | 713 | 490 | 328 | - | 674 | 591 | 309 | 160 | - | 469 | 382 | 383 | 250 | 183 | 87 |
Belmont | 72 | 129 | - | 251 | - | - | - | - | 363 | - | - | - | - | 303 | - | - | 307 | 307 | 309 | 269 | 234 | 237 | 247 | 204 | 368 | 306 | - | - | 335 | - | - | - | - | 304 | - | - | - | - | 143 | - | - | 369 | 377 | 249 | 178 | 85 |
San Carlos | 78 | 133 | 323 | 262 | 489 | - | - | 432 | 381 | 694 | - | - | 341 | 309 | 554 | - | 301 | 314 | 302 | 265 | 230 | 234 | 244 | 202 | 365 | 313 | - | 308 | 380 | - | - | - | 447 | 311 | - | - | - | 253 | 141 | - | - | 353 | 371 | 243 | 171 | 81 |
Redwood City | 78 | 133 | 309 | 246 | 480 | 407 | - | - | 358 | 676 | 564 | - | - | 266 | 514 | 474 | 280 | 327 | 264 | 245 | 211 | 213 | 223 | 194 | 375 | 347 | - | - | 453 | 710 | 558 | - | - | 357 | 803 | 601 | - | - | 147 | 464 | 415 | 324 | 346 | 230 | 157 | 68 |
Menlo Park | 78 | 131 | 298 | - | 404 | 360 | - | 404 | - | 622 | 513 | - | 308 | - | 486 | 449 | 270 | 302 | 241 | 238 | 208 | 214 | 223 | 199 | 408 | 380 | - | - | 524 | - | 555 | - | - | 393 | - | 544 | - | - | 138 | - | 391 | 311 | 336 | 219 | 150 | 66 |
Palo Alto | 56 | 76 | 180 | 79 | 304 | 224 | 296 | 246 | 105 | 466 | 280 | 316 | 193 | 68 | 359 | 230 | 159 | 176 | 162 | 161 | 162 | 202 | 241 | 236 | 582 | 535 | 608 | 461 | - | 950 | 725 | 727 | 473 | - | 788 | 574 | 508 | 256 | - | 418 | 406 | 319 | 327 | 202 | 135 | 61 |
California Ave | 52 | 71 | 165 | - | 261 | - | - | - | - | 306 | - | - | - | - | 235 | - | 120 | 141 | 145 | 149 | 159 | 196 | 242 | 235 | 599 | 548 | - | 501 | - | - | 740 | - | 461 | - | - | 533 | - | 224 | - | - | 389 | 308 | 310 | 187 | 127 | 56 |
San Antonio | 52 | 65 | - | - | 244 | - | - | - | - | 255 | - | - | - | - | 194 | - | 111 | 123 | 133 | 141 | 147 | 181 | 229 | 225 | 597 | 524 | - | - | - | - | 660 | - | - | - | - | 445 | - | - | - | - | 335 | 290 | 289 | 173 | 116 | 53 |
Mt View | 42 | 46 | 87 | - | 183 | 83 | 87 | 136 | - | 131 | 81 | 66 | 83 | - | 96 | 48 | 57 | 78 | 99 | 104 | 113 | 153 | 196 | 202 | 580 | 480 | 429 | 448 | 443 | - | 557 | 459 | 382 | 326 | - | 344 | 255 | 176 | 99 | - | 246 | 218 | 207 | 124 | 82 | 41 |
Sunnyvale | 36 | 32 | - | - | 149 | - | - | - | - | 62 | - | - | - | - | 46 | - | 41 | 62 | 79 | 81 | 91 | 124 | 156 | 162 | 525 | 386 | - | 241 | 358 | 643 | 419 | - | 153 | 266 | 470 | 195 | - | 63 | 74 | 211 | 158 | 148 | 137 | 84 | 60 | 30 |
Lawrence | 33 | 27 | 54 | - | 127 | - | - | 47 | - | 34 | - | - | 22 | - | 28 | - | 32 | 51 | 68 | 75 | 84 | 118 | 141 | 151 | 530 | 354 | - | - | - | - | 367 | - | - | 231 | - | 138 | - | - | - | - | 122 | 125 | 116 | 73 | 54 | 26 |
Santa Clara | 23 | 19 | - | 46 | 115 | - | - | - | 53 | 20 | - | - | - | 30 | 17 | - | 20 | 37 | 51 | 54 | 65 | 94 | 109 | 121 | 478 | 276 | - | - | 214 | - | 308 | - | - | 149 | - | 81 | - | - | 36 | - | 94 | 101 | 94 | 59 | 41 | 19 |
College Park | - | - | - | - | 13 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 479 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
San Jose Diridon | - | 6 | - | 3 | 3 | - | - | - | 1 | 1 | - | - | - | 4 | - | - | - | 2 | - | - | - | - | - | 45 | 354 | 100 | - | - | - | 336 | 323 | - | - | 72 | 175 | 43 | - | - | - | 81 | 24 | - | 21 | 9 | - | - |
Tamien | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 282 | - | - | - | - | - | 232 | - | - | 52 | - | - | - | - | - | - | - | - | - | - | - | - |
Capitol | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 267 | - | - | - | - | - | 204 | - | - | 42 | - | - | - | - | - | - | - | - | - | - | - | - |
Blossom Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 220 | - | - | - | - | - | 155 | - | - | 33 | - | - | - | - | - | - | - | - | - | - | - | - |
Morgan Hill | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 138 | - | - | - | - | - | 89 | - | - | 18 | - | - | - | - | - | - | - | - | - | - | - | - |
San Martin | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 99 | - | - | - | - | - | 62 | - | - | 16 | - | - | - | - | - | - | - | - | - | - | - | - |
Gilroy | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |