diff --git a/lasso/mtc.py b/lasso/mtc.py
index abdf978..087e22d 100644
--- a/lasso/mtc.py
+++ b/lasso/mtc.py
@@ -13,6 +13,8 @@
from sklearn.cluster import KMeans
from pyproj import CRS
from shapely.geometry import Point, LineString
+import osmnx as ox
+import networkx as nx
from .parameters import Parameters
from .logger import WranglerLogger
@@ -2821,4 +2823,410 @@ def _calculate_node_county(x):
"Finished Calculating node county variable: {}".format(network_variable)
)
- return roadway_network
\ No newline at end of file
+ return roadway_network
+
+
+def get_period_mode_trn_stops(transit_network: CubeTransit = None) -> pd.DataFrame:
+
+ # get transit line properties: line name, time period, and mode
+ trn_line_properties = pd.DataFrame(
+ {
+ "name": [k.replace('"', "") for k in transit_network.line_properties.keys()],
+ "time_period": [
+ k.replace('"', "").split("_")[2] for k in transit_network.line_properties.keys()
+ ],
+ "mode": [
+ v["USERA2"].replace('"', "") for v in transit_network.line_properties.values()
+ ],
+ }
+ )
+
+ # get transit stops' node ids
+ trn_line_stops = pd.DataFrame()
+ for line in transit_network.shapes.keys():
+ line_nodes = transit_network.shapes[line]
+ line_nodes = line_nodes[line_nodes["stop"] == True] # keep only stop nodes
+ line_stops = pd.DataFrame(
+ {"name": line.replace('"', ""), "stop": line_nodes["node_id"].to_list()}
+ )
+ trn_line_stops = pd.concat([trn_line_stops, line_stops])
+
+ # add transit line properties to trn_line_stops
+ trn_line_stops = pd.merge(trn_line_stops, trn_line_properties, how="left", on="name")
+
+ # keep only the unique pair of time_period - mode - stop
+ period_mode_trn_stops = trn_line_stops[["time_period", "mode", "stop"]].drop_duplicates()
+
+ return period_mode_trn_stops
+
+
+def estimate_maz_walk_time(
+ roadway_network: ModelRoadwayNetwork = None,
+ transit_network: CubeTransit = None,
+ stop_demand: pd.DataFrame = None,
+ direction: str = "access", # "access" or "egress"
+ parameters=None, # for getting taz-maz lookup
+) -> pd.DataFrame:
+
+ # specify direction-specific variables
+ if direction == "access":
+ dir_col_maz = "from_maz"
+ dir_col_taz = "from_taz"
+ dir_col_stop = "to_stop"
+ dir_col_node = "A" # for filtering directional maz connectors
+ dir_col_stop_demand = "boardings" # for stop demand % in corresponding taz
+ else:
+ dir_col_maz = "to_maz"
+ dir_col_taz = "to_taz"
+ dir_col_stop = "from_stop"
+ dir_col_node = "B"
+ dir_col_stop_demand = "alightings"
+
+ # project to a coordinate system that use ft as base unit
+ print("reproject roadway network")
+ links = roadway_network.links_df.copy().to_crs(epsg=2230)
+ nodes = roadway_network.nodes_df.copy().to_crs(epsg=2230)
+
+ ###############################################################
+ ## Part 1: for each maz, find transit stops within 1.5 miles ##
+ ###############################################################
+ # Create 1.5 miles (7920 foot) buffer for each maz
+ print("create 1.5 miles buffer for maz nodes")
+ maz_nodes = nodes[
+ (nodes["model_node_id"] < 900000)
+ & (nodes["model_node_id"] % 100000 < 90000)
+ & (nodes["model_node_id"] % 100000 >= 10000)
+ ].reset_index(drop=True)
+ buffer_geom = maz_nodes["geometry"].buffer(7920)
+ maz_buffer = gpd.GeoDataFrame(
+ maz_nodes[["model_node_id"]].rename(columns={"model_node_id": "maz"}),
+ geometry=buffer_geom,
+ crs=maz_nodes.crs,
+ )
+ print(f"# of maz: {len(maz_buffer)}")
+
+ # get transit stop node ids from transit_network, and add geometry from nodes
+ period_mode_trn_stops = get_period_mode_trn_stops(transit_network)
+ period_mode_trn_stops = gpd.GeoDataFrame(
+ pd.merge(
+ period_mode_trn_stops,
+ nodes[["model_node_id", "geometry"]],
+ how="left",
+ left_on="stop",
+ right_on="model_node_id",
+ ).drop(columns="model_node_id")
+ )
+
+ # spatial join to find transit stops in each maz
+ print("spatial join maz buffer and transit stop nodes")
+ print(f"# of transit stops: {len(period_mode_trn_stops)}")
+ maz_trn_stops = (
+ gpd.sjoin(period_mode_trn_stops, maz_buffer, how="inner", op="intersects")
+ .drop(columns=["index_right", "geometry"])
+ .rename(columns={"maz": dir_col_maz, "stop": dir_col_stop})
+ .reset_index(drop=True)
+ )
+
+ #######################################################
+ ## Part 2: find shortest path between maz-stop pairs ##
+ #######################################################
+ # walk accessibility should be the same across time periods
+ # (select unique maz-stop pairs to reduce runtime)
+ maz_stop_pairs = (
+ maz_trn_stops[[dir_col_maz, dir_col_stop]].drop_duplicates().reset_index(drop=True)
+ )
+ print(f"unique maz-stop pairs: {len(maz_stop_pairs)}")
+
+ # create walk network, exclude connectors (note: TAZ connectors are already with WALK_ACCESS = 0)
+ print("create walk network")
+ walk_net = links[
+ (links["walk_access"] == 1) & (links["cntype"] != "MAZ") & (links["cntype"] != "TAP")
+ ].reset_index(drop=True)
+
+ # add one-direction of MAZ connectors to the walk network
+ # (based on direction argument specified by the user)
+ maz_connectors = links[
+ (links["cntype"] == "MAZ")
+ & (links[dir_col_node] < 900000)
+ & (links[dir_col_node] % 100000 < 90000)
+ & (links[dir_col_node] % 100000 >= 10000)
+ ].reset_index(drop=True)
+ walk_net = pd.concat([walk_net, maz_connectors]).reset_index(drop=True)
+
+ # format walk_net dataframe
+ walk_net["u"] = walk_net["A"]
+ walk_net["v"] = walk_net["B"]
+ walk_net["key"] = walk_net.index + 1
+ walk_net = walk_net[["u", "v", "key", "A", "B", "distance", "geometry"]]
+
+ # create walk nodes
+ walk_nodes = nodes[nodes["walk_access"] == 1]
+ walk_nodes["x"] = walk_nodes["geometry"].x
+ walk_nodes["y"] = walk_nodes["geometry"].y
+ walk_nodes = walk_nodes[["model_node_id", "x", "y", "geometry"]]
+
+ # build walk network graph
+ walk_graph = ox.graph_from_gdfs(walk_nodes, walk_net)
+
+ print("build shortest path between maz and stop")
+ shortest_paths = {dir_col_maz: [], dir_col_stop: [], "distance": [], "path": []}
+ shortest_paths_fail = {dir_col_maz: [], dir_col_stop: []}
+
+ print(f"# of paths to be processed: {len(maz_stop_pairs)}")
+ print("build shortest paths ...")
+ for i in range(len(maz_stop_pairs)):
+ if i % 5000 == 0:
+ print(f"processing path #: {i + 1}")
+ # get two trip ends
+ maz_end = maz_stop_pairs.loc[i, dir_col_maz]
+ stop_end = maz_stop_pairs.loc[i, dir_col_stop]
+
+ try:
+ if direction == "access":
+ path_dist = nx.shortest_path_length(
+ walk_graph, maz_end, stop_end, weight="distance"
+ )
+ path = nx.shortest_path(walk_graph, maz_end, stop_end, weight="distance")
+ else:
+ path_dist = nx.shortest_path_length(
+ walk_graph, stop_end, maz_end, weight="distance"
+ )
+ path = nx.shortest_path(walk_graph, stop_end, maz_end, weight="distance")
+ shortest_paths[dir_col_maz].append(maz_end)
+ shortest_paths[dir_col_stop].append(stop_end)
+ shortest_paths["distance"].append(path_dist)
+ shortest_paths["path"].append(str(path))
+ except:
+ shortest_paths_fail[dir_col_maz].append(maz_end)
+ shortest_paths_fail[dir_col_stop].append(stop_end)
+
+ # convert shortest path results from dict to df
+ shortest_paths = pd.DataFrame.from_dict(shortest_paths)
+ shortest_paths_fail = pd.DataFrame.from_dict(shortest_paths_fail)
+
+ # remove maz-stop pairs that exceed 1.5 miles walk distance
+ shortest_paths = shortest_paths[shortest_paths["distance"] <= 1.5].reset_index(drop=True)
+
+ # calculate shortest walk time in minute (assume walk speed = 3 mph)
+ shortest_paths["walk_min"] = (shortest_paths["distance"] / 3) * 60
+
+ # calculate impedance and time-to-impedance ratio
+ def _calculate_impedance(x):
+ # 1 * a + 5 * b + 10 * c + 20 * d
+ a = min(x.walk_min, 5)
+ b = min(x.walk_min - 5, 5)
+ c = min(x.walk_min - 10, 10)
+ d = x.walk_min - 15
+ if x.walk_min >= 15:
+ return a + 5 * b + 10 * c + 20 * d
+ elif x.walk_min >= 10:
+ return a + 5 * b + 10 * c
+ elif x.walk_min >= 5:
+ return a + 5 * b
+ else:
+ return a
+ shortest_paths["impedance"] = shortest_paths.apply(lambda x: _calculate_impedance(x), axis=1)
+ shortest_paths["time_impedance_ratio"] = (
+ shortest_paths["walk_min"] / shortest_paths["impedance"]
+ )
+
+ # add taz info
+ maz_taz_lookup = pd.read_csv(parameters.taz_maz_crosswalk_file)
+ maz_taz_lookup = maz_taz_lookup[["MAZ_ORIGINAL", "TAZ_ORIGINAL"]].rename(
+ columns={"MAZ_ORIGINAL": dir_col_maz, "TAZ_ORIGINAL": dir_col_taz}
+ )
+ shortest_paths = pd.merge(shortest_paths, maz_taz_lookup, how="left", on=dir_col_maz)
+ shortest_paths[dir_col_taz] = shortest_paths[dir_col_taz].astype(int)
+
+ # add shortest path info back to maz_trn_stops
+ maz_trn_stops = pd.merge(
+ maz_trn_stops, shortest_paths, how="left", on=[dir_col_maz, dir_col_stop]
+ )
+ # some records will have null distance because those with > 1.5 walk distance was removed from shortest path
+ maz_trn_stops = maz_trn_stops[~maz_trn_stops["distance"].isnull()].reset_index(drop=True)
+
+ # expand maz_trn_stops to have records by skim set
+ # (note: maz_trn_stops already have time period & mode info)
+ maz_trn_stops_set1 = maz_trn_stops[maz_trn_stops["mode"] == "Local bus"].copy()
+ maz_trn_stops_set1["skim_set"] = 1
+ maz_trn_stops_set2 = maz_trn_stops[maz_trn_stops["mode"] != "Local bus"].copy()
+ maz_trn_stops_set2["skim_set"] = 2
+ maz_trn_stops_set3 = maz_trn_stops.copy()
+ maz_trn_stops_set3["skim_set"] = 3
+ maz_trn_stops_all_sets = pd.concat(
+ [maz_trn_stops_set1, maz_trn_stops_set2, maz_trn_stops_set3]
+ ).reset_index(drop=True)
+
+ # initialize df that keep results from all skim sets & time periods
+ result_maz_trn_stops = pd.DataFrame()
+
+ for skim_set in [1, 2, 3]:
+ for time_period in ["EA", "AM", "MD", "PM", "EV"]:
+ print(f"process skim set {skim_set}, time period: {time_period}")
+
+ # select maz_trn_stop for the given skim set & time period
+ maz_trn_stop_set_per = maz_trn_stops_all_sets[
+ (maz_trn_stops_all_sets["skim_set"] == skim_set)
+ & (maz_trn_stops_all_sets["time_period"] == time_period)
+ ].copy()
+
+ # select stop boardings/alightings volumes for the given skim set & time period
+ stop_demand = stop_demand.rename(columns={"stop": dir_col_stop})
+ if skim_set == 1:
+ stop_demand_set_per = stop_demand[
+ (stop_demand["mode"] == "local") & (stop_demand["time_period"] == time_period)
+ ]
+ elif skim_set == 2:
+ stop_demand_set_per = stop_demand[
+ (stop_demand["mode"] == "premium") & (stop_demand["time_period"] == time_period)
+ ]
+ else:
+ stop_demand_set_per = stop_demand[stop_demand["time_period"] == time_period]
+ stop_demand_set_per = stop_demand_set_per.drop(columns=["mode", "time_period"])
+
+ # add stop demand to maz_trn_stop_set_per
+ maz_trn_stop_set_per = pd.merge(
+ maz_trn_stop_set_per, stop_demand_set_per, how="left", on=dir_col_stop
+ )
+ # fill stop with zero demand with 1 (so that all stop remain in the record)
+ maz_trn_stop_set_per[dir_col_stop_demand] = maz_trn_stop_set_per[
+ dir_col_stop_demand
+ ].fillna(1.0)
+
+ # calculate total boarding / alighting demand for each taz
+ taz_demand = (
+ maz_trn_stop_set_per[[dir_col_stop, dir_col_taz, dir_col_stop_demand]]
+ .drop_duplicates()
+ .groupby([dir_col_taz])[dir_col_stop_demand]
+ .agg("sum")
+ .reset_index(name=f"taz_total_{dir_col_stop_demand}")
+ )
+
+ # add taz demand to maz_trn_stop_set_per
+ maz_trn_stop_set_per = pd.merge(
+ maz_trn_stop_set_per, taz_demand, how="left", on=dir_col_taz
+ )
+
+ # calculate bording/alighting share at each stop within its corresponding taz
+ maz_trn_stop_set_per["stop_taz_demand_share"] = (
+ maz_trn_stop_set_per[dir_col_stop_demand]
+ / maz_trn_stop_set_per[f"taz_total_{dir_col_stop_demand}"]
+ )
+
+ maz_trn_stop_set_per["stop_walk_time_weight"] = (
+ maz_trn_stop_set_per["stop_taz_demand_share"]
+ * maz_trn_stop_set_per["time_impedance_ratio"]
+ )
+
+ # calculate maz-level sum of "stop_walk_time_weight"
+ maz_weight_sum = (
+ maz_trn_stop_set_per[[dir_col_maz, "stop_walk_time_weight"]]
+ .groupby([dir_col_maz])["stop_walk_time_weight"]
+ .agg("sum")
+ .reset_index(name="maz_weight_sum")
+ )
+ maz_trn_stop_set_per = pd.merge(
+ maz_trn_stop_set_per, maz_weight_sum, how="left", on=dir_col_maz
+ )
+
+ maz_trn_stop_set_per["stop_weight"] = (
+ maz_trn_stop_set_per["stop_walk_time_weight"]
+ / maz_trn_stop_set_per["maz_weight_sum"]
+ )
+ maz_trn_stop_set_per["weighted_walk_min"] = (
+ maz_trn_stop_set_per["stop_weight"] * maz_trn_stop_set_per["walk_min"]
+ )
+
+ result_maz_trn_stops = pd.concat([result_maz_trn_stops, maz_trn_stop_set_per])
+
+ # aggregate to maz level to get estimated maz walk access time
+ est_maz_walk_time = (
+ result_maz_trn_stops.groupby(["skim_set", "time_period", dir_col_maz])["weighted_walk_min"]
+ .agg("sum")
+ .reset_index(name=f"est_maz_walk_{direction}_min")
+ )
+ est_maz_walk_time[f"est_maz_walk_{direction}_min"] = est_maz_walk_time[
+ f"est_maz_walk_{direction}_min"
+ ].round(3)
+
+ # optional return df: result_maz_trn_stops, shortest_paths_fail
+ return est_maz_walk_time
+
+
+def estimate_transit_taz_connectors(
+ maz_stop_walk_time: pd.DataFrame = None,
+ direction: str = "access",
+ trn_trip_list: pd.DataFrame = None,
+ parameters=None,
+):
+ # specify direction-specific variables
+ if direction == "access":
+ dir_col_maz = "from_maz"
+ dir_col_taz = "from_taz"
+ dir_col_stop = "to_stop"
+ else:
+ dir_col_maz = "to_maz"
+ dir_col_taz = "to_taz"
+ dir_col_stop = "from_stop"
+
+ # calculate maz-scale transit demand
+ maz_demand = (
+ trn_trip_list.groupby(["skim_set", "time_period", dir_col_maz])
+ .size()
+ .reset_index(name="maz_demand")
+ )
+
+ # add taz info to maz_demand
+ maz_taz_lookup = pd.read_csv(parameters.taz_maz_crosswalk_file)
+ maz_demand = (
+ pd.merge(
+ maz_demand,
+ maz_taz_lookup[["MAZ_ORIGINAL", "TAZ_ORIGINAL"]],
+ how="left",
+ left_on=dir_col_maz,
+ right_on="MAZ_ORIGINAL",
+ )
+ .drop(columns=["MAZ_ORIGINAL"])
+ .rename(columns={"TAZ_ORIGINAL": dir_col_taz})
+ )
+
+ # join maz-stop walk access/egress time data to maz_demand
+ walk_time_with_demand = pd.merge(
+ maz_stop_walk_time,
+ maz_demand,
+ how="left",
+ on=["skim_set", "time_period", dir_col_maz],
+ )
+
+ walk_time_with_demand = walk_time_with_demand[~walk_time_with_demand["maz_demand"].isnull()]
+ walk_time_with_demand[dir_col_taz] = walk_time_with_demand[dir_col_taz].astype(int)
+
+ # calculate sum of maz demand by stop by taz
+ taz_stop_demand = (
+ walk_time_with_demand.groupby(["skim_set", "time_period", dir_col_taz, dir_col_stop])[
+ "maz_demand"
+ ]
+ .agg("sum")
+ .reset_index(name="taz_stop_demand")
+ )
+ walk_time_with_demand = pd.merge(
+ walk_time_with_demand,
+ taz_stop_demand,
+ how="left",
+ on=["skim_set", "time_period", dir_col_taz, dir_col_stop],
+ )
+
+ walk_time_with_demand["demand_weighted_walk_min"] = (
+ walk_time_with_demand["walk_min"] * walk_time_with_demand["maz_demand"]
+ ) / walk_time_with_demand["taz_stop_demand"]
+
+ # aggregate to taz-stop level to get the final estimated taz-stop walk access/egress time
+ est_taz_connectors = (
+ walk_time_with_demand.groupby(["skim_set", "time_period", dir_col_taz, dir_col_stop])[
+ "demand_weighted_walk_min"
+ ]
+ .agg("sum")
+ .reset_index(name="est_walk_min")
+ )
+
+ return est_taz_connectors
diff --git a/lasso/parameters.py b/lasso/parameters.py
index 5c348cc..1ba0fb2 100644
--- a/lasso/parameters.py
+++ b/lasso/parameters.py
@@ -916,3 +916,7 @@ def __init__(self, **kwargs):
]
self.__dict__.update(kwargs)
+
+ self.taz_maz_crosswalk_file = os.path.join(
+ self.data_file_location, "lookups", "maz_data_withDensity.csv"
+ )
diff --git a/notebooks/create-comparison-assng-db.ipynb b/notebooks/create-comparison-assng-db.ipynb
new file mode 100644
index 0000000..6f18a1e
--- /dev/null
+++ b/notebooks/create-comparison-assng-db.ipynb
@@ -0,0 +1,1432 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " route_id | \n",
+ " route_name | \n",
+ " route_shortname | \n",
+ " route_longname | \n",
+ " usera1 | \n",
+ " usera2 | \n",
+ " mode | \n",
+ " mode_name | \n",
+ " mode_longname | \n",
+ " operator | \n",
+ " operator_name | \n",
+ " direction | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 5_1_EA_d0_s1 | \n",
+ " ACE | \n",
+ " NaN | \n",
+ " CE | \n",
+ " Commuter rail | \n",
+ " 133 | \n",
+ " Commuter Rail | \n",
+ " ACE | \n",
+ " 5 | \n",
+ " ACE | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 5_1_AM_d0_s1 | \n",
+ " ACE | \n",
+ " NaN | \n",
+ " CE | \n",
+ " Commuter rail | \n",
+ " 133 | \n",
+ " Commuter Rail | \n",
+ " ACE | \n",
+ " 5 | \n",
+ " ACE | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " 5_1_PM_d1_s2 | \n",
+ " ACE | \n",
+ " NaN | \n",
+ " CE | \n",
+ " Commuter rail | \n",
+ " 133 | \n",
+ " Commuter Rail | \n",
+ " ACE | \n",
+ " 5 | \n",
+ " ACE | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 131 | \n",
+ " 30_131_EA_d1_s359 | \n",
+ " G | \n",
+ " San Francisco - El Cerrito | \n",
+ " AC Transit | \n",
+ " Express bus | \n",
+ " 84 | \n",
+ " Express Bus | \n",
+ " AC Transit Transbay | \n",
+ " 30 | \n",
+ " AC Transit | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 131 | \n",
+ " 30_131_AM_d1_s359 | \n",
+ " G | \n",
+ " San Francisco - El Cerrito | \n",
+ " AC Transit | \n",
+ " Express bus | \n",
+ " 84 | \n",
+ " Express Bus | \n",
+ " AC Transit Transbay | \n",
+ " 30 | \n",
+ " AC Transit | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " route_id route_name route_shortname route_longname \\\n",
+ "0 1 5_1_EA_d0_s1 ACE NaN \n",
+ "1 1 5_1_AM_d0_s1 ACE NaN \n",
+ "2 1 5_1_PM_d1_s2 ACE NaN \n",
+ "3 131 30_131_EA_d1_s359 G San Francisco - El Cerrito \n",
+ "4 131 30_131_AM_d1_s359 G San Francisco - El Cerrito \n",
+ "\n",
+ " usera1 usera2 mode mode_name mode_longname \\\n",
+ "0 CE Commuter rail 133 Commuter Rail ACE \n",
+ "1 CE Commuter rail 133 Commuter Rail ACE \n",
+ "2 CE Commuter rail 133 Commuter Rail ACE \n",
+ "3 AC Transit Express bus 84 Express Bus AC Transit Transbay \n",
+ "4 AC Transit Express bus 84 Express Bus AC Transit Transbay \n",
+ "\n",
+ " operator operator_name direction \n",
+ "0 5 ACE 0 \n",
+ "1 5 ACE 0 \n",
+ "2 5 ACE 1 \n",
+ "3 30 AC Transit 1 \n",
+ "4 30 AC Transit 1 "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data_path = \"../data\"\n",
+ "trn_route_name_lookup = pd.read_csv(f\"{data_path}/trn_route_name_lookup_ver12.csv\")\n",
+ "trn_route_name_lookup = trn_route_name_lookup.drop(columns=[\"route\"])\n",
+ "trn_route_name_lookup.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### create summary for routes (except BART and Caltrain)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def create_non_rail_summary(approach, period):\n",
+ " assignment_file = f\"{data_path}/{approach}/assignment/boardings_by_line_{period.lower()}.csv\"\n",
+ " if approach == \"tap_approach\":\n",
+ " asgn_result = pd.read_csv(assignment_file)\n",
+ " else:\n",
+ " asgn_result = pd.read_csv(assignment_file, sep=\"\\t\")\n",
+ "\n",
+ " asgn_result = asgn_result.rename(columns={\"line_name\": \"route_name\"}).drop(columns=[\"mode\"])\n",
+ " asgn_result = pd.merge(asgn_result, trn_route_name_lookup, how=\"left\", on=\"route_name\")\n",
+ "\n",
+ " # remove records with operator 17 (Caltrain) & 26 (BART)\n",
+ " asgn_result = asgn_result[(asgn_result[\"operator\"] != 17) & (asgn_result[\"operator\"] != 26)]\n",
+ "\n",
+ " # organize to final format\n",
+ " asgn_result = asgn_result.rename(columns={\"operator\": \"operator_id\", \"operator_name\": \"operator\", \"total_boardings\": \"boardings\"})\n",
+ " asgn_result[\"source\"] = approach\n",
+ " asgn_result[\"period\"] = period\n",
+ " asgn_result = asgn_result[[\"source\", \"period\", \"operator_id\", \"operator\", \"route_id\", \"route_shortname\", \"route_longname\", \"boardings\"]]\n",
+ "\n",
+ " return asgn_result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "non_rail_summary = pd.DataFrame()\n",
+ "\n",
+ "for approach in [\"tap_approach\", \"taz_approach\"]:\n",
+ " for period in [\"EA\", \"AM\", \"MD\", \"PM\", \"EV\"]:\n",
+ " non_rail_period_approach_summary = create_non_rail_summary(approach, period)\n",
+ " non_rail_summary = pd.concat([non_rail_summary, non_rail_period_approach_summary])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 10 | \n",
+ " Emery Go-Round | \n",
+ " 198 | \n",
+ " Hollis | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 10 | \n",
+ " Emery Go-Round | \n",
+ " 201 | \n",
+ " Shellmound/Powell | \n",
+ " NaN | \n",
+ " 25.2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 12 | \n",
+ " Vallejo Transit | \n",
+ " 481 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 12 | \n",
+ " Vallejo Transit | \n",
+ " 481 | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 12 | \n",
+ " Vallejo Transit | \n",
+ " 482 | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source period operator_id operator route_id \\\n",
+ "0 tap_approach EA 10 Emery Go-Round 198 \n",
+ "1 tap_approach EA 10 Emery Go-Round 201 \n",
+ "2 tap_approach EA 12 Vallejo Transit 481 \n",
+ "3 tap_approach EA 12 Vallejo Transit 481 \n",
+ "4 tap_approach EA 12 Vallejo Transit 482 \n",
+ "\n",
+ " route stop_name boardings \n",
+ "0 Hollis NaN 0.0 \n",
+ "1 Shellmound/Powell NaN 25.2 \n",
+ "2 1 NaN 0.0 \n",
+ "3 1 NaN 0.0 \n",
+ "4 2 NaN 0.0 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# reformat\n",
+ "non_rail_summary = non_rail_summary.reset_index(drop=True)\n",
+ "non_rail_summary.loc[non_rail_summary[\"route_shortname\"].isnull(), \"route\"] = non_rail_summary[\"route_longname\"]\n",
+ "non_rail_summary.loc[non_rail_summary[\"route_longname\"].isnull(), \"route\"] = non_rail_summary[\"route_shortname\"]\n",
+ "non_rail_summary.loc[(~non_rail_summary[\"route_shortname\"].isnull()) & (~non_rail_summary[\"route_longname\"].isnull()), \"route\"] = non_rail_summary[\"route_shortname\"].astype(str) + \"_\" + non_rail_summary[\"route_longname\"].astype(str)\n",
+ "non_rail_summary[\"stop_name\"] = np.nan\n",
+ "non_rail_summary = non_rail_summary[[\"source\", \"period\", \"operator_id\", \"operator\", \"route_id\", \"route\", \"stop_name\", \"boardings\"]]\n",
+ "non_rail_summary.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### create summary for BART and Caltrain"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " model_node_id | \n",
+ " stop_name | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1027608 | \n",
+ " Embarcadero | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1027609 | \n",
+ " Montgomery St. | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1027610 | \n",
+ " Powell St. | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1027611 | \n",
+ " Civic Center/UN Plaza | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1027612 | \n",
+ " 16th St. Mission | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " model_node_id stop_name\n",
+ "0 1027608 Embarcadero\n",
+ "1 1027609 Montgomery St.\n",
+ "2 1027610 Powell St.\n",
+ "3 1027611 Civic Center/UN Plaza\n",
+ "4 1027612 16th St. Mission"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bart_nodes = pd.read_csv(f\"{data_path}/bart_nodes_with_name.csv\")\n",
+ "bart_nodes = bart_nodes.rename(columns={\"N\": \"model_node_id\", \"stop_nm\": \"stop_name\"})\n",
+ "bart_nodes = bart_nodes[[\"model_node_id\", \"stop_name\"]]\n",
+ "bart_nodes.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def create_rail_summary(approach, operator, period):\n",
+ " if operator == \"Caltrain\":\n",
+ " operator_id = 17\n",
+ " elif operator == \"BART\":\n",
+ " operator_id = 26\n",
+ " \n",
+ " route_id_name = {\n",
+ " \"route_id\": [154, 155, 156, 157, 158, 159, 193, 194, 195],\n",
+ " \"route\": [\n",
+ " \"Pittsburg/Bay Point - SFIA/Millbrae\",\n",
+ " \"Fremont - Richmond\",\n",
+ " \"Fremont - Daly City\",\n",
+ " \"Richmond - Daly City/Millbrae\",\n",
+ " \"Dublin/Pleasanton - Daly City\",\n",
+ " \"Coliseum - Oakland Int'l Airport\",\n",
+ " \"Bullet\",\n",
+ " \"Limited\",\n",
+ " \"Local\",\n",
+ " ]}\n",
+ " route_id_name_df = pd.DataFrame.from_dict(route_id_name)\n",
+ "\n",
+ " if approach == \"tap_approach\":\n",
+ " node_asgn_result = pd.read_csv(f\"{data_path}/{approach}/assignment/boardings_by_node_{period.lower()}.csv\", sep=\"\\t\")\n",
+ " elif approach == \"taz_approach\":\n",
+ " node_asgn_result = pd.read_csv(f\"{data_path}/{approach}/assignment/boardings_by_segment_{period.lower()}.csv\", sep=\"\\t\")\n",
+ " node_asgn_result = node_asgn_result[node_asgn_result[\"is_i_node_stop\"] == 1]\n",
+ " node_asgn_result = node_asgn_result.rename(columns={\"line_name\": \"route_name\"})\n",
+ " node_asgn_result = pd.merge(node_asgn_result, trn_route_name_lookup, how=\"left\", on=\"route_name\")\n",
+ " node_asgn_result = node_asgn_result.rename(columns={\"operator\": \"operator_id\", \"operator_name\": \"operator\"})\n",
+ " node_asgn_result = node_asgn_result[node_asgn_result[\"operator_id\"] == operator_id]\n",
+ "\n",
+ " node_asgn_result = pd.merge(node_asgn_result, route_id_name_df, how=\"left\", on=\"route_id\")\n",
+ "\n",
+ " node_asgn_result[\"source\"] = approach\n",
+ " node_asgn_result[\"period\"] = period\n",
+ "\n",
+ " node_asgn_result = node_asgn_result[[\"source\", \"period\", \"operator_id\", \"operator\", \"route_id\", \"route\", \"stop_name\", \"boardings\"]]\n",
+ " node_asgn_result = node_asgn_result.groupby([\"source\", \"period\", \"operator_id\", \"operator\", \"route_id\", \"route\", \"stop_name\"])[\"boardings\"].agg(\"sum\").reset_index(name=\"boardings\")\n",
+ " \n",
+ " return node_asgn_result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 12th St. Oakland City Center | \n",
+ " 56.188333 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 16th St. Mission | \n",
+ " 54.182210 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 19th St. Oakland | \n",
+ " 61.335000 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 24th St. Mission | \n",
+ " 45.117010 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " Balboa Park | \n",
+ " 74.661820 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source period operator_id operator route_id \\\n",
+ "0 tap_approach EA 26 BART 154 \n",
+ "1 tap_approach EA 26 BART 154 \n",
+ "2 tap_approach EA 26 BART 154 \n",
+ "3 tap_approach EA 26 BART 154 \n",
+ "4 tap_approach EA 26 BART 154 \n",
+ "\n",
+ " route stop_name \\\n",
+ "0 Pittsburg/Bay Point - SFIA/Millbrae 12th St. Oakland City Center \n",
+ "1 Pittsburg/Bay Point - SFIA/Millbrae 16th St. Mission \n",
+ "2 Pittsburg/Bay Point - SFIA/Millbrae 19th St. Oakland \n",
+ "3 Pittsburg/Bay Point - SFIA/Millbrae 24th St. Mission \n",
+ "4 Pittsburg/Bay Point - SFIA/Millbrae Balboa Park \n",
+ "\n",
+ " boardings \n",
+ "0 56.188333 \n",
+ "1 54.182210 \n",
+ "2 61.335000 \n",
+ "3 45.117010 \n",
+ "4 74.661820 "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bart_summary = pd.DataFrame()\n",
+ "\n",
+ "for approach in [\"tap_approach\", \"taz_approach\"]:\n",
+ " for period in [\"EA\", \"AM\", \"MD\", \"PM\", \"EV\"]:\n",
+ " bart_period_approach_summary = create_rail_summary(approach, \"BART\", period)\n",
+ " bart_summary = pd.concat([bart_summary, bart_period_approach_summary])\n",
+ "\n",
+ "bart_summary.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Hillsdale Caltrain | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Millbrae Caltrain | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Mt View Caltrain | \n",
+ " 2.99 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Palo Alto Caltrain | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " San Francisco Caltrain | \n",
+ " 0.00 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source period operator_id operator route_id route \\\n",
+ "0 tap_approach EA 17 Caltrain 193 Bullet \n",
+ "1 tap_approach EA 17 Caltrain 193 Bullet \n",
+ "2 tap_approach EA 17 Caltrain 193 Bullet \n",
+ "3 tap_approach EA 17 Caltrain 193 Bullet \n",
+ "4 tap_approach EA 17 Caltrain 193 Bullet \n",
+ "\n",
+ " stop_name boardings \n",
+ "0 Hillsdale Caltrain 0.00 \n",
+ "1 Millbrae Caltrain 0.00 \n",
+ "2 Mt View Caltrain 2.99 \n",
+ "3 Palo Alto Caltrain 0.00 \n",
+ "4 San Francisco Caltrain 0.00 "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "caltrain_summary = pd.DataFrame()\n",
+ "\n",
+ "for approach in [\"tap_approach\", \"taz_approach\"]:\n",
+ " for period in [\"EA\", \"AM\", \"MD\", \"PM\", \"EV\"]:\n",
+ " caltrain_period_approach_summary = create_rail_summary(approach, \"Caltrain\", period)\n",
+ " caltrain_summary = pd.concat([caltrain_summary, caltrain_period_approach_summary])\n",
+ "\n",
+ "caltrain_summary.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 12th St. Oakland City Center | \n",
+ " 56.188333 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 16th St. Mission | \n",
+ " 54.182210 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 19th St. Oakland | \n",
+ " 61.335000 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 24th St. Mission | \n",
+ " 45.117010 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " tap_approach | \n",
+ " EA | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " Balboa Park | \n",
+ " 74.661820 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " source period operator_id operator route_id \\\n",
+ "0 tap_approach EA 26 BART 154 \n",
+ "1 tap_approach EA 26 BART 154 \n",
+ "2 tap_approach EA 26 BART 154 \n",
+ "3 tap_approach EA 26 BART 154 \n",
+ "4 tap_approach EA 26 BART 154 \n",
+ "\n",
+ " route stop_name \\\n",
+ "0 Pittsburg/Bay Point - SFIA/Millbrae 12th St. Oakland City Center \n",
+ "1 Pittsburg/Bay Point - SFIA/Millbrae 16th St. Mission \n",
+ "2 Pittsburg/Bay Point - SFIA/Millbrae 19th St. Oakland \n",
+ "3 Pittsburg/Bay Point - SFIA/Millbrae 24th St. Mission \n",
+ "4 Pittsburg/Bay Point - SFIA/Millbrae Balboa Park \n",
+ "\n",
+ " boardings \n",
+ "0 56.188333 \n",
+ "1 54.182210 \n",
+ "2 61.335000 \n",
+ "3 45.117010 \n",
+ "4 74.661820 "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_long = pd.concat([bart_summary, caltrain_summary, non_rail_summary])\n",
+ "result_long.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "result_long.to_csv(\"../../outputs/assignment/boarding_comparison_v6.csv\", index=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## reshape result from long to wide format"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " tap_boardings | \n",
+ " taz_boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 12th St. Oakland City Center | \n",
+ " 1200.9943 | \n",
+ " 810.6908 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 16th St. Mission | \n",
+ " 582.8108 | \n",
+ " 392.6731 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 19th St. Oakland | \n",
+ " 1065.1420 | \n",
+ " 238.4674 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 24th St. Mission | \n",
+ " 1190.6400 | \n",
+ " 701.2632 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " Balboa Park | \n",
+ " 1301.0640 | \n",
+ " 609.8207 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "source period operator_id operator route_id \\\n",
+ "0 AM 26 BART 154 \n",
+ "1 AM 26 BART 154 \n",
+ "2 AM 26 BART 154 \n",
+ "3 AM 26 BART 154 \n",
+ "4 AM 26 BART 154 \n",
+ "\n",
+ "source route stop_name \\\n",
+ "0 Pittsburg/Bay Point - SFIA/Millbrae 12th St. Oakland City Center \n",
+ "1 Pittsburg/Bay Point - SFIA/Millbrae 16th St. Mission \n",
+ "2 Pittsburg/Bay Point - SFIA/Millbrae 19th St. Oakland \n",
+ "3 Pittsburg/Bay Point - SFIA/Millbrae 24th St. Mission \n",
+ "4 Pittsburg/Bay Point - SFIA/Millbrae Balboa Park \n",
+ "\n",
+ "source tap_boardings taz_boardings \n",
+ "0 1200.9943 810.6908 \n",
+ "1 582.8108 392.6731 \n",
+ "2 1065.1420 238.4674 \n",
+ "3 1190.6400 701.2632 \n",
+ "4 1301.0640 609.8207 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_wide_bart = pd.pivot_table(bart_summary, values=\"boardings\", \n",
+ " index=[\"period\", \"operator_id\", \"operator\", \"route_id\", \"route\", \"stop_name\"],\n",
+ " columns=[\"source\"],\n",
+ " aggfunc=\"sum\").reset_index().rename(columns={\"tap_approach\": \"tap_boardings\",\n",
+ " \"taz_approach\": \"taz_boardings\"})\n",
+ "result_wide_bart.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " tap_boardings | \n",
+ " taz_boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " AM | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " 22nd St Caltrain | \n",
+ " 282.52500 | \n",
+ " 756.62500 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " AM | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Hillsdale Caltrain | \n",
+ " 18.50638 | \n",
+ " 721.96240 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AM | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Menlo Park Caltrain | \n",
+ " 18.71667 | \n",
+ " 53.86667 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " AM | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Millbrae Caltrain | \n",
+ " 258.64738 | \n",
+ " 714.91720 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " AM | \n",
+ " 17 | \n",
+ " Caltrain | \n",
+ " 193 | \n",
+ " Bullet | \n",
+ " Mt View Caltrain | \n",
+ " 400.91035 | \n",
+ " 278.11073 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "source period operator_id operator route_id route stop_name \\\n",
+ "0 AM 17 Caltrain 193 Bullet 22nd St Caltrain \n",
+ "1 AM 17 Caltrain 193 Bullet Hillsdale Caltrain \n",
+ "2 AM 17 Caltrain 193 Bullet Menlo Park Caltrain \n",
+ "3 AM 17 Caltrain 193 Bullet Millbrae Caltrain \n",
+ "4 AM 17 Caltrain 193 Bullet Mt View Caltrain \n",
+ "\n",
+ "source tap_boardings taz_boardings \n",
+ "0 282.52500 756.62500 \n",
+ "1 18.50638 721.96240 \n",
+ "2 18.71667 53.86667 \n",
+ "3 258.64738 714.91720 \n",
+ "4 400.91035 278.11073 "
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_wide_caltrain = pd.pivot_table(caltrain_summary, values=\"boardings\", \n",
+ " index=[\"period\", \"operator_id\", \"operator\", \"route_id\", \"route\", \"stop_name\"],\n",
+ " columns=[\"source\"],\n",
+ " aggfunc=\"sum\").reset_index().rename(columns={\"tap_approach\": \"tap_boardings\",\n",
+ " \"taz_approach\": \"taz_boardings\"})\n",
+ "result_wide_caltrain.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " tap_boardings | \n",
+ " taz_boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " Santa Rosa CityBus | \n",
+ " 464 | \n",
+ " 9_9 Sebastopol Rd | \n",
+ " 157.33550 | \n",
+ " 4.650000 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " Santa Rosa CityBus | \n",
+ " 465 | \n",
+ " 10_10 Coddingtown | \n",
+ " 30.25169 | \n",
+ " 4.227143 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " Santa Rosa CityBus | \n",
+ " 466 | \n",
+ " 11_11 Fulton Rd | \n",
+ " 63.96000 | \n",
+ " 1.253333 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " Santa Rosa CityBus | \n",
+ " 467 | \n",
+ " 12_12 Roseland | \n",
+ " 85.72968 | \n",
+ " 0.485161 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " Santa Rosa CityBus | \n",
+ " 468 | \n",
+ " 14_14 County Center | \n",
+ " 170.66180 | \n",
+ " 18.825340 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "source period operator_id operator route_id route \\\n",
+ "0 AM 1 Santa Rosa CityBus 464 9_9 Sebastopol Rd \n",
+ "1 AM 1 Santa Rosa CityBus 465 10_10 Coddingtown \n",
+ "2 AM 1 Santa Rosa CityBus 466 11_11 Fulton Rd \n",
+ "3 AM 1 Santa Rosa CityBus 467 12_12 Roseland \n",
+ "4 AM 1 Santa Rosa CityBus 468 14_14 County Center \n",
+ "\n",
+ "source tap_boardings taz_boardings \n",
+ "0 157.33550 4.650000 \n",
+ "1 30.25169 4.227143 \n",
+ "2 63.96000 1.253333 \n",
+ "3 85.72968 0.485161 \n",
+ "4 170.66180 18.825340 "
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_wide_nonrail = pd.pivot_table(non_rail_summary, values=\"boardings\", \n",
+ " index=[\"period\", \"operator_id\", \"operator\", \"route_id\", \"route\"],\n",
+ " columns=[\"source\"],\n",
+ " aggfunc=\"sum\").reset_index().rename(columns={\"tap_approach\": \"tap_boardings\",\n",
+ " \"taz_approach\": \"taz_boardings\"})\n",
+ "result_wide_nonrail.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | source | \n",
+ " period | \n",
+ " operator_id | \n",
+ " operator | \n",
+ " route_id | \n",
+ " route | \n",
+ " stop_name | \n",
+ " tap_boardings | \n",
+ " taz_boardings | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 12th St. Oakland City Center | \n",
+ " 1200.9943 | \n",
+ " 810.6908 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 16th St. Mission | \n",
+ " 582.8108 | \n",
+ " 392.6731 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 19th St. Oakland | \n",
+ " 1065.1420 | \n",
+ " 238.4674 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " 24th St. Mission | \n",
+ " 1190.6400 | \n",
+ " 701.2632 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " AM | \n",
+ " 26 | \n",
+ " BART | \n",
+ " 154 | \n",
+ " Pittsburg/Bay Point - SFIA/Millbrae | \n",
+ " Balboa Park | \n",
+ " 1301.0640 | \n",
+ " 609.8207 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "source period operator_id operator route_id \\\n",
+ "0 AM 26 BART 154 \n",
+ "1 AM 26 BART 154 \n",
+ "2 AM 26 BART 154 \n",
+ "3 AM 26 BART 154 \n",
+ "4 AM 26 BART 154 \n",
+ "\n",
+ "source route stop_name \\\n",
+ "0 Pittsburg/Bay Point - SFIA/Millbrae 12th St. Oakland City Center \n",
+ "1 Pittsburg/Bay Point - SFIA/Millbrae 16th St. Mission \n",
+ "2 Pittsburg/Bay Point - SFIA/Millbrae 19th St. Oakland \n",
+ "3 Pittsburg/Bay Point - SFIA/Millbrae 24th St. Mission \n",
+ "4 Pittsburg/Bay Point - SFIA/Millbrae Balboa Park \n",
+ "\n",
+ "source tap_boardings taz_boardings \n",
+ "0 1200.9943 810.6908 \n",
+ "1 582.8108 392.6731 \n",
+ "2 1065.1420 238.4674 \n",
+ "3 1190.6400 701.2632 \n",
+ "4 1301.0640 609.8207 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_wide = pd.concat([result_wide_bart, result_wide_caltrain, result_wide_nonrail])\n",
+ "result_wide.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "result_wide.to_csv(\"../../outputs/assignment/boarding_comparison_v6_wide.csv\", index=False)"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "084a36dba6f23ac7a1f7ee017571da24a8de9c2d24087bcf43b216ef24ac300c"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.7.10 64-bit ('mtc_lasso': conda)",
+ "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"
+ },
+ "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/notebooks/create-comparison-skim-db.ipynb b/notebooks/create-comparison-skim-db.ipynb
new file mode 100644
index 0000000..fa33985
--- /dev/null
+++ b/notebooks/create-comparison-skim-db.ipynb
@@ -0,0 +1,4230 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import openmatrix as omx\n",
+ "import geopandas as gpd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " tap | \n",
+ " renum_tap | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 90001 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 90002 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 90003 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 90004 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 90005 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " tap renum_tap\n",
+ "0 90001 1\n",
+ "1 90002 2\n",
+ "2 90003 3\n",
+ "3 90004 4\n",
+ "4 90005 5"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data_path = \"../data\"\n",
+ "zone_seq = pd.read_csv(f\"{data_path}/mtc_final_network_zone_seq_ver12.csv\")\n",
+ "tap_seq = zone_seq[zone_seq[\"TAPSEQ\"] > 0].drop(columns=[\"TAZSEQ\", \"MAZSEQ\", \"EXTSEQ\"]).rename(columns={\"N\": \"tap\", \"TAPSEQ\": \"renum_tap\"}).reset_index(drop=True)\n",
+ "tap_seq.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " maz | \n",
+ " lon | \n",
+ " lat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10001 | \n",
+ " -122.441076 | \n",
+ " 37.750066 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10002 | \n",
+ " -122.438934 | \n",
+ " 37.750197 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10003 | \n",
+ " -122.436270 | \n",
+ " 37.756793 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 10004 | \n",
+ " -122.437049 | \n",
+ " 37.753528 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10005 | \n",
+ " -122.433959 | \n",
+ " 37.755725 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " maz lon lat\n",
+ "0 10001 -122.441076 37.750066\n",
+ "1 10002 -122.438934 37.750197\n",
+ "2 10003 -122.436270 37.756793\n",
+ "3 10004 -122.437049 37.753528\n",
+ "4 10005 -122.433959 37.755725"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "maz_nodes = gpd.read_file(f\"{data_path}/maz_nodes.gpkg\")\n",
+ "maz_nodes = maz_nodes.to_crs(4326)\n",
+ "maz_nodes[\"X\"] = maz_nodes[\"geometry\"].apply(lambda p: p.x)\n",
+ "maz_nodes[\"Y\"] = maz_nodes[\"geometry\"].apply(lambda p: p.y)\n",
+ "maz_nodes = maz_nodes[[\"N\", \"X\", \"Y\"]].rename(columns={\"N\": \"maz\", \"X\": \"lon\", \"Y\": \"lat\"})\n",
+ "maz_nodes.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Create skim db for TAP approach\n",
+ "#### import reformatted on-board survey record for the TAP approach"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " tap_d | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " 490309 | \n",
+ " 0.057 | \n",
+ " 0.190 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490040 | \n",
+ " 490462 | \n",
+ " 0.054 | \n",
+ " 0.088 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490074 | \n",
+ " 490016 | \n",
+ " 0.092 | \n",
+ " 0.021 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390570 | \n",
+ " 390327 | \n",
+ " 0.253 | \n",
+ " 0.319 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390659 | \n",
+ " 390605 | \n",
+ " 0.052 | \n",
+ " 0.042 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d period skim_set tap_o tap_d \\\n",
+ "0 11420___AC Transit___2018 413852 414639 EA 1 490058 490309 \n",
+ "1 11423___AC Transit___2018 424701 414651 EA 1 490040 490462 \n",
+ "2 11425___AC Transit___2018 418818 424101 EA 1 490074 490016 \n",
+ "3 11730___AC Transit___2018 322305 329001 EA 1 390570 390327 \n",
+ "4 11732___AC Transit___2018 310894 329001 EA 1 390659 390605 \n",
+ "\n",
+ " access_time egress_time \n",
+ "0 0.057 0.190 \n",
+ "1 0.054 0.088 \n",
+ "2 0.092 0.021 \n",
+ "3 0.253 0.319 \n",
+ "4 0.052 0.042 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tap_base = pd.read_csv(f\"{data_path}/tap_approach/tap_approach_base_table.csv\")\n",
+ "tap_base.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " tap_d | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " 490309 | \n",
+ " 3.42 | \n",
+ " 11.40 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490040 | \n",
+ " 490462 | \n",
+ " 3.24 | \n",
+ " 5.28 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490074 | \n",
+ " 490016 | \n",
+ " 5.52 | \n",
+ " 1.26 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390570 | \n",
+ " 390327 | \n",
+ " 15.18 | \n",
+ " 19.14 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390659 | \n",
+ " 390605 | \n",
+ " 3.12 | \n",
+ " 2.52 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d period skim_set tap_o tap_d \\\n",
+ "0 11420___AC Transit___2018 413852 414639 EA 1 490058 490309 \n",
+ "1 11423___AC Transit___2018 424701 414651 EA 1 490040 490462 \n",
+ "2 11425___AC Transit___2018 418818 424101 EA 1 490074 490016 \n",
+ "3 11730___AC Transit___2018 322305 329001 EA 1 390570 390327 \n",
+ "4 11732___AC Transit___2018 310894 329001 EA 1 390659 390605 \n",
+ "\n",
+ " access_time egress_time \n",
+ "0 3.42 11.40 \n",
+ "1 3.24 5.28 \n",
+ "2 5.52 1.26 \n",
+ "3 15.18 19.14 \n",
+ "4 3.12 2.52 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# change access & egress time unit from hours to minutes\n",
+ "tap_base[\"access_time\"] = tap_base[\"access_time\"] * 60\n",
+ "tap_base[\"egress_time\"] = tap_base[\"egress_time\"] * 60\n",
+ "tap_base.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " tap_d | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " renum_tap_o | \n",
+ " renum_tap_d | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " 490309 | \n",
+ " 3.42 | \n",
+ " 11.40 | \n",
+ " 3946 | \n",
+ " 4197 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490040 | \n",
+ " 490462 | \n",
+ " 3.24 | \n",
+ " 5.28 | \n",
+ " 3928 | \n",
+ " 4350 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490074 | \n",
+ " 490016 | \n",
+ " 5.52 | \n",
+ " 1.26 | \n",
+ " 3962 | \n",
+ " 3904 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390570 | \n",
+ " 390327 | \n",
+ " 15.18 | \n",
+ " 19.14 | \n",
+ " 3034 | \n",
+ " 2791 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390659 | \n",
+ " 390605 | \n",
+ " 3.12 | \n",
+ " 2.52 | \n",
+ " 3123 | \n",
+ " 3069 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d period skim_set tap_o tap_d \\\n",
+ "0 11420___AC Transit___2018 413852 414639 EA 1 490058 490309 \n",
+ "1 11423___AC Transit___2018 424701 414651 EA 1 490040 490462 \n",
+ "2 11425___AC Transit___2018 418818 424101 EA 1 490074 490016 \n",
+ "3 11730___AC Transit___2018 322305 329001 EA 1 390570 390327 \n",
+ "4 11732___AC Transit___2018 310894 329001 EA 1 390659 390605 \n",
+ "\n",
+ " access_time egress_time renum_tap_o renum_tap_d \n",
+ "0 3.42 11.40 3946 4197 \n",
+ "1 3.24 5.28 3928 4350 \n",
+ "2 5.52 1.26 3962 3904 \n",
+ "3 15.18 19.14 3034 2791 \n",
+ "4 3.12 2.52 3123 3069 "
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# add renumbered tap num\n",
+ "tap_base = pd.merge(tap_base, tap_seq, how=\"left\", left_on=\"tap_o\", right_on=\"tap\").drop(columns=[\"tap\"]).rename(columns={\"renum_tap\": \"renum_tap_o\"})\n",
+ "tap_base = pd.merge(tap_base, tap_seq, how=\"left\", left_on=\"tap_d\", right_on=\"tap\").drop(columns=[\"tap\"]).rename(columns={\"renum_tap\": \"renum_tap_d\"})\n",
+ "tap_base.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### add corresponding tap-to-tap skim value from omx matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "tap_skim_ea = omx.open_file(f\"{data_path}/tap_approach/skims/transit_skims_ea.omx\")\n",
+ "tap_skim_am = omx.open_file(f\"{data_path}/tap_approach/skims/transit_skims_am.omx\")\n",
+ "tap_skim_md = omx.open_file(f\"{data_path}/tap_approach/skims/transit_skims_md.omx\")\n",
+ "tap_skim_pm = omx.open_file(f\"{data_path}/tap_approach/skims/transit_skims_pm.omx\")\n",
+ "tap_skim_ev = omx.open_file(f\"{data_path}/tap_approach/skims/transit_skims_ev.omx\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- table name starts with `_BUS` is skim set 1\n",
+ "- table name starts with `_PREM` is skim set 2\n",
+ "- table name starts with `_ALLPEN` is skim set 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_tap_skim_value(period, skim_set, tap_o, tap_d):\n",
+ " # initialize result dictionary\n",
+ " table_names = [\"CAPPEN\", \"CRIVTT\", \"CROWD\", \"EAWT\", \"EBIVTT\", \"FARE\", \"FIRSTWAIT\", \"FRIVTT\", \"HRIVTT\", \"LBIVTT\", \"LINKREL\", \"LRIVTT\", \"TOTALIVTT\", \"TOTALWAIT\", \"TOTALWALK\", \"XFERS\", \"XFERWAIT\", \"XFERWALK\",]\n",
+ " result = {}\n",
+ "\n",
+ " # select which omx skim file to use\n",
+ " if period == \"EA\":\n",
+ " per_skim = tap_skim_ea\n",
+ " elif period == \"AM\":\n",
+ " per_skim = tap_skim_am\n",
+ " elif period == \"MD\":\n",
+ " per_skim = tap_skim_md\n",
+ " elif period == \"PM\":\n",
+ " per_skim = tap_skim_pm\n",
+ " elif period == \"EV\":\n",
+ " per_skim = tap_skim_ev\n",
+ " \n",
+ " # set string for filtering appropriate skim table based on skim_set argument\n",
+ " if skim_set == 1:\n",
+ " skim_set_str = \"BUS\"\n",
+ " elif skim_set == 2:\n",
+ " skim_set_str = \"PREM\"\n",
+ " elif skim_set == 3:\n",
+ " skim_set_str = \"ALLPEN\"\n",
+ "\n",
+ " # populate result dictionary\n",
+ " for table in table_names:\n",
+ " result[table] = per_skim[f\"{period.lower()}_{skim_set_str}_{table}\"][tap_o - 1, tap_d - 1] # -1 because matrix starts from index 0\n",
+ " \n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def add_tap_to_tap_skim_values(base_table):\n",
+ "\n",
+ " skim_value_list = []\n",
+ " for i in range(len(base_table)):\n",
+ " period = base_table.loc[i, \"period\"]\n",
+ " skim_set = base_table.loc[i, \"skim_set\"]\n",
+ " tap_o = base_table.loc[i, \"renum_tap_o\"]\n",
+ " tap_d = base_table.loc[i, \"renum_tap_d\"]\n",
+ " \n",
+ " skim_value_list.append(get_tap_skim_value(period, skim_set, tap_o, tap_d))\n",
+ "\n",
+ " skim_values = pd.DataFrame(skim_value_list)\n",
+ "\n",
+ " return pd.concat([base_table, skim_values], axis = 1)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "85209\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " tap_d | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " renum_tap_o | \n",
+ " ... | \n",
+ " HRIVTT | \n",
+ " LBIVTT | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " 490309 | \n",
+ " 3.42 | \n",
+ " 11.40 | \n",
+ " 3946 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 45.0 | \n",
+ " 16.571501 | \n",
+ " 3.0 | \n",
+ " 30.0 | \n",
+ " 15.911501 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490040 | \n",
+ " 490462 | \n",
+ " 3.24 | \n",
+ " 5.28 | \n",
+ " 3928 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 11.970170 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 11.970170 | \n",
+ " 30.0 | \n",
+ " 10.805839 | \n",
+ " 2.0 | \n",
+ " 15.0 | \n",
+ " 10.145839 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490074 | \n",
+ " 490016 | \n",
+ " 5.52 | \n",
+ " 1.26 | \n",
+ " 3962 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 10.733758 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 10.733758 | \n",
+ " 30.0 | \n",
+ " 2.304314 | \n",
+ " 1.0 | \n",
+ " 15.0 | \n",
+ " 1.644314 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390570 | \n",
+ " 390327 | \n",
+ " 15.18 | \n",
+ " 19.14 | \n",
+ " 3034 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 18.925690 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 18.925690 | \n",
+ " 15.0 | \n",
+ " 0.400000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390659 | \n",
+ " 390605 | \n",
+ " 3.12 | \n",
+ " 2.52 | \n",
+ " 3123 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 2.697566 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 2.697566 | \n",
+ " 15.0 | \n",
+ " 0.400000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 29 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d period skim_set tap_o tap_d \\\n",
+ "0 11420___AC Transit___2018 413852 414639 EA 1 490058 490309 \n",
+ "1 11423___AC Transit___2018 424701 414651 EA 1 490040 490462 \n",
+ "2 11425___AC Transit___2018 418818 424101 EA 1 490074 490016 \n",
+ "3 11730___AC Transit___2018 322305 329001 EA 1 390570 390327 \n",
+ "4 11732___AC Transit___2018 310894 329001 EA 1 390659 390605 \n",
+ "\n",
+ " access_time egress_time renum_tap_o ... HRIVTT LBIVTT LINKREL \\\n",
+ "0 3.42 11.40 3946 ... 0.0 0.000000 0.0 \n",
+ "1 3.24 5.28 3928 ... 0.0 11.970170 0.0 \n",
+ "2 5.52 1.26 3962 ... 0.0 10.733758 0.0 \n",
+ "3 15.18 19.14 3034 ... 0.0 18.925690 0.0 \n",
+ "4 3.12 2.52 3123 ... 0.0 2.697566 0.0 \n",
+ "\n",
+ " LRIVTT TOTALIVTT TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK \n",
+ "0 0.0 0.000000 45.0 16.571501 3.0 30.0 15.911501 \n",
+ "1 0.0 11.970170 30.0 10.805839 2.0 15.0 10.145839 \n",
+ "2 0.0 10.733758 30.0 2.304314 1.0 15.0 1.644314 \n",
+ "3 0.0 18.925690 15.0 0.400000 0.0 0.0 0.000000 \n",
+ "4 0.0 2.697566 15.0 0.400000 0.0 0.0 0.000000 \n",
+ "\n",
+ "[5 rows x 29 columns]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tap_approach_db = add_tap_to_tap_skim_values(tap_base)\n",
+ "print(len(tap_approach_db))\n",
+ "tap_approach_db.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " tap_d | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " renum_tap_o | \n",
+ " ... | \n",
+ " LBIVTT | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ " TOTAL_TIME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " 490309 | \n",
+ " 3.42 | \n",
+ " 11.40 | \n",
+ " 3946 | \n",
+ " ... | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 45.0 | \n",
+ " 16.571501 | \n",
+ " 3.0 | \n",
+ " 30.0 | \n",
+ " 15.911501 | \n",
+ " 75.731501 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490040 | \n",
+ " 490462 | \n",
+ " 3.24 | \n",
+ " 5.28 | \n",
+ " 3928 | \n",
+ " ... | \n",
+ " 11.970170 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 11.970170 | \n",
+ " 30.0 | \n",
+ " 10.805839 | \n",
+ " 2.0 | \n",
+ " 15.0 | \n",
+ " 10.145839 | \n",
+ " 60.636009 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490074 | \n",
+ " 490016 | \n",
+ " 5.52 | \n",
+ " 1.26 | \n",
+ " 3962 | \n",
+ " ... | \n",
+ " 10.733758 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 10.733758 | \n",
+ " 30.0 | \n",
+ " 2.304314 | \n",
+ " 1.0 | \n",
+ " 15.0 | \n",
+ " 1.644314 | \n",
+ " 49.158072 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390570 | \n",
+ " 390327 | \n",
+ " 15.18 | \n",
+ " 19.14 | \n",
+ " 3034 | \n",
+ " ... | \n",
+ " 18.925690 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 18.925690 | \n",
+ " 15.0 | \n",
+ " 0.400000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 68.245690 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390659 | \n",
+ " 390605 | \n",
+ " 3.12 | \n",
+ " 2.52 | \n",
+ " 3123 | \n",
+ " ... | \n",
+ " 2.697566 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 2.697566 | \n",
+ " 15.0 | \n",
+ " 0.400000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 23.337566 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 30 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d period skim_set tap_o tap_d \\\n",
+ "0 11420___AC Transit___2018 413852 414639 EA 1 490058 490309 \n",
+ "1 11423___AC Transit___2018 424701 414651 EA 1 490040 490462 \n",
+ "2 11425___AC Transit___2018 418818 424101 EA 1 490074 490016 \n",
+ "3 11730___AC Transit___2018 322305 329001 EA 1 390570 390327 \n",
+ "4 11732___AC Transit___2018 310894 329001 EA 1 390659 390605 \n",
+ "\n",
+ " access_time egress_time renum_tap_o ... LBIVTT LINKREL LRIVTT \\\n",
+ "0 3.42 11.40 3946 ... 0.000000 0.0 0.0 \n",
+ "1 3.24 5.28 3928 ... 11.970170 0.0 0.0 \n",
+ "2 5.52 1.26 3962 ... 10.733758 0.0 0.0 \n",
+ "3 15.18 19.14 3034 ... 18.925690 0.0 0.0 \n",
+ "4 3.12 2.52 3123 ... 2.697566 0.0 0.0 \n",
+ "\n",
+ " TOTALIVTT TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK TOTAL_TIME \n",
+ "0 0.000000 45.0 16.571501 3.0 30.0 15.911501 75.731501 \n",
+ "1 11.970170 30.0 10.805839 2.0 15.0 10.145839 60.636009 \n",
+ "2 10.733758 30.0 2.304314 1.0 15.0 1.644314 49.158072 \n",
+ "3 18.925690 15.0 0.400000 0.0 0.0 0.000000 68.245690 \n",
+ "4 2.697566 15.0 0.400000 0.0 0.0 0.000000 23.337566 \n",
+ "\n",
+ "[5 rows x 30 columns]"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# add total time column\n",
+ "tap_approach_db[\"TOTAL_TIME\"] = tap_approach_db[\"access_time\"] + tap_approach_db[\"egress_time\"] + tap_approach_db[\"TOTALIVTT\"] + tap_approach_db[\"TOTALWAIT\"] + tap_approach_db[\"XFERWALK\"]\n",
+ "tap_approach_db.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " tap_d | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " renum_tap_o | \n",
+ " ... | \n",
+ " LBIVTT | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ " TOTAL_TIME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " 490309 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 3946 | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 66 | \n",
+ " 3295___AC Transit___2018 | \n",
+ " 310449 | \n",
+ " 311366 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 391021 | \n",
+ " 390524 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 3485 | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 137 | \n",
+ " 671___LAVTA___2018 | \n",
+ " 312402 | \n",
+ " 317158 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390242 | \n",
+ " 390959 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 2706 | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 220 | \n",
+ " 1326___SF Muni___2017 | \n",
+ " 17323 | \n",
+ " 13034 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 90279 | \n",
+ " 90151 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 279 | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 413 | \n",
+ " 2012___SF Muni___2017 | \n",
+ " 118507 | \n",
+ " 14635 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 190192 | \n",
+ " 90108 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 768 | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 30 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d period skim_set tap_o \\\n",
+ "0 11420___AC Transit___2018 413852 414639 EA 1 490058 \n",
+ "66 3295___AC Transit___2018 310449 311366 EA 1 391021 \n",
+ "137 671___LAVTA___2018 312402 317158 EA 1 390242 \n",
+ "220 1326___SF Muni___2017 17323 13034 EA 1 90279 \n",
+ "413 2012___SF Muni___2017 118507 14635 EA 1 190192 \n",
+ "\n",
+ " tap_d access_time egress_time renum_tap_o ... LBIVTT LINKREL \\\n",
+ "0 490309 NaN NaN 3946 ... NaN NaN \n",
+ "66 390524 NaN NaN 3485 ... NaN NaN \n",
+ "137 390959 NaN NaN 2706 ... NaN NaN \n",
+ "220 90151 NaN NaN 279 ... NaN NaN \n",
+ "413 90108 NaN NaN 768 ... NaN NaN \n",
+ "\n",
+ " LRIVTT TOTALIVTT TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK \\\n",
+ "0 NaN 0.0 NaN NaN NaN NaN NaN \n",
+ "66 NaN 0.0 NaN NaN NaN NaN NaN \n",
+ "137 NaN 0.0 NaN NaN NaN NaN NaN \n",
+ "220 NaN 0.0 NaN NaN NaN NaN NaN \n",
+ "413 NaN 0.0 NaN NaN NaN NaN NaN \n",
+ "\n",
+ " TOTAL_TIME \n",
+ "0 NaN \n",
+ "66 NaN \n",
+ "137 NaN \n",
+ "220 NaN \n",
+ "413 NaN \n",
+ "\n",
+ "[5 rows x 30 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# if TOTALIVTT == 0, set TOTAL_TIME = \"NA\"\n",
+ "# for walk-only paths, set all skim values to null\n",
+ "for column_name in [\"access_time\", \"egress_time\", \"CAPPEN\", \"CRIVTT\", \"CROWD\", \"EAWT\", \"EBIVTT\", \"FARE\", \"FIRSTWAIT\", \"FRIVTT\", \"HRIVTT\", \"LBIVTT\", \"LINKREL\", \"LRIVTT\", \"TOTALWAIT\", \"TOTALWALK\", \"XFERS\", \"XFERWAIT\", \"XFERWALK\", \"TOTAL_TIME\"]:\n",
+ " tap_approach_db.loc[tap_approach_db[\"TOTALIVTT\"] == 0, column_name] = np.nan\n",
+ "temp = tap_approach_db[tap_approach_db[\"TOTALIVTT\"] == 0]\n",
+ "temp.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### add perceived time info\n",
+ "- Settings for TAP run:\n",
+ " - initial_wait_perception_factor = 1.5\n",
+ " - transfer_wait_perception_factor = 3.0\n",
+ " - walk_perception_factor = 2.0\n",
+ " - in_vehicle_perception_factor = 1.0\n",
+ " - initial_boarding_penalty = 10\n",
+ " - transfer_boarding_penalty = 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "TAP_INITIAL_WAIT_PERCEPTION_FACTOR = 1.5\n",
+ "TAP_TRANSFER_WAIT_PERCEPTION_FACTOR = 3.0\n",
+ "TAP_WALK_PERCEPTION_FACTOR = 2.0\n",
+ "TAP_IN_VEHICLE_PERCEPTION_FACTOR = 1.0\n",
+ "TAP_INITIAL_BOARDING_PENALTY = 10\n",
+ "TAP_TRANSFER_BOARDING_PENALTY = 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# add perception total time\n",
+ "tap_approach_db[\"TOTAL_PERCEIVED_TIME\"] = TAP_INITIAL_WAIT_PERCEPTION_FACTOR * tap_approach_db[\"FIRSTWAIT\"] + TAP_TRANSFER_WAIT_PERCEPTION_FACTOR * tap_approach_db[\"XFERWAIT\"] + TAP_WALK_PERCEPTION_FACTOR * (tap_approach_db[\"access_time\"] + tap_approach_db[\"egress_time\"] + tap_approach_db[\"XFERWALK\"]) + TAP_IN_VEHICLE_PERCEPTION_FACTOR * tap_approach_db[\"TOTALIVTT\"] + TAP_INITIAL_BOARDING_PENALTY + TAP_TRANSFER_BOARDING_PENALTY * tap_approach_db[\"XFERS\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " skim_set | \n",
+ " tap_o | \n",
+ " ... | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ " TOTAL_TIME | \n",
+ " TOTAL_PERCEIVED_TIME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " -122.299767 | \n",
+ " 37.904587 | \n",
+ " -122.319763 | \n",
+ " 37.979455 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490058 | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.000000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " -122.326702 | \n",
+ " 37.921951 | \n",
+ " -122.321789 | \n",
+ " 37.986542 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490040 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 11.970170 | \n",
+ " 30.0 | \n",
+ " 10.805839 | \n",
+ " 2.0 | \n",
+ " 15.0 | \n",
+ " 10.145839 | \n",
+ " 60.636009 | \n",
+ " 146.801847 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " -122.362677 | \n",
+ " 37.937884 | \n",
+ " -122.328843 | \n",
+ " 37.990794 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 490074 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 10.733758 | \n",
+ " 30.0 | \n",
+ " 2.304314 | \n",
+ " 1.0 | \n",
+ " 15.0 | \n",
+ " 1.644314 | \n",
+ " 49.158072 | \n",
+ " 115.082385 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " -122.111420 | \n",
+ " 37.698752 | \n",
+ " -122.230930 | \n",
+ " 37.798295 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390570 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 18.925690 | \n",
+ " 15.0 | \n",
+ " 0.400000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 68.245690 | \n",
+ " 120.065690 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " -122.230286 | \n",
+ " 37.788432 | \n",
+ " -122.230930 | \n",
+ " 37.798295 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " 390659 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 2.697566 | \n",
+ " 15.0 | \n",
+ " 0.400000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 23.337566 | \n",
+ " 46.477566 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 35 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d maz_o_lon maz_o_lat \\\n",
+ "0 11420___AC Transit___2018 413852 414639 -122.299767 37.904587 \n",
+ "1 11423___AC Transit___2018 424701 414651 -122.326702 37.921951 \n",
+ "2 11425___AC Transit___2018 418818 424101 -122.362677 37.937884 \n",
+ "3 11730___AC Transit___2018 322305 329001 -122.111420 37.698752 \n",
+ "4 11732___AC Transit___2018 310894 329001 -122.230286 37.788432 \n",
+ "\n",
+ " maz_d_lon maz_d_lat period skim_set tap_o ... LINKREL LRIVTT \\\n",
+ "0 -122.319763 37.979455 EA 1 490058 ... NaN NaN \n",
+ "1 -122.321789 37.986542 EA 1 490040 ... 0.0 0.0 \n",
+ "2 -122.328843 37.990794 EA 1 490074 ... 0.0 0.0 \n",
+ "3 -122.230930 37.798295 EA 1 390570 ... 0.0 0.0 \n",
+ "4 -122.230930 37.798295 EA 1 390659 ... 0.0 0.0 \n",
+ "\n",
+ " TOTALIVTT TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK TOTAL_TIME \\\n",
+ "0 0.000000 NaN NaN NaN NaN NaN NaN \n",
+ "1 11.970170 30.0 10.805839 2.0 15.0 10.145839 60.636009 \n",
+ "2 10.733758 30.0 2.304314 1.0 15.0 1.644314 49.158072 \n",
+ "3 18.925690 15.0 0.400000 0.0 0.0 0.000000 68.245690 \n",
+ "4 2.697566 15.0 0.400000 0.0 0.0 0.000000 23.337566 \n",
+ "\n",
+ " TOTAL_PERCEIVED_TIME \n",
+ "0 NaN \n",
+ "1 146.801847 \n",
+ "2 115.082385 \n",
+ "3 120.065690 \n",
+ "4 46.477566 \n",
+ "\n",
+ "[5 rows x 35 columns]"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## add maz coordinates\n",
+ "tap_approach_db = pd.merge(tap_approach_db, maz_nodes, how=\"left\", left_on=\"maz_o\", right_on=\"maz\")\n",
+ "tap_approach_db = tap_approach_db.rename(columns={\"lon\": \"maz_o_lon\", \"lat\": \"maz_o_lat\"}).drop(columns=\"maz\")\n",
+ "tap_approach_db = pd.merge(tap_approach_db, maz_nodes, how=\"left\", left_on=\"maz_d\", right_on=\"maz\")\n",
+ "tap_approach_db = tap_approach_db.rename(columns={\"lon\": \"maz_d_lon\", \"lat\": \"maz_d_lat\"}).drop(columns=\"maz\")\n",
+ "tap_approach_db = tap_approach_db[['unique_ID', 'maz_o', 'maz_d', 'maz_o_lon',\n",
+ " 'maz_o_lat', 'maz_d_lon', 'maz_d_lat', 'period', 'skim_set', 'tap_o', 'tap_d',\n",
+ " 'access_time', 'egress_time', 'renum_tap_o', 'renum_tap_d', 'CAPPEN',\n",
+ " 'CRIVTT', 'CROWD', 'EAWT', 'EBIVTT', 'FARE', 'FIRSTWAIT', 'FRIVTT',\n",
+ " 'HRIVTT', 'LBIVTT', 'LINKREL', 'LRIVTT', 'TOTALIVTT', 'TOTALWAIT',\n",
+ " 'TOTALWALK', 'XFERS', 'XFERWAIT', 'XFERWALK', 'TOTAL_TIME', 'TOTAL_PERCEIVED_TIME']]\n",
+ "tap_approach_db.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Create skim db for TAZ approach\n",
+ "#### import TAZ lookups"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " maz | \n",
+ " taz | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10001 | \n",
+ " 56 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10002 | \n",
+ " 56 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10003 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 10004 | \n",
+ " 53 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10005 | \n",
+ " 48 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " maz taz\n",
+ "0 10001 56\n",
+ "1 10002 56\n",
+ "2 10003 10\n",
+ "3 10004 53\n",
+ "4 10005 48"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cube_taz_lookup = pd.read_csv(f\"{data_path}/maz_data_withDensity.csv\")\n",
+ "cube_taz_lookup = cube_taz_lookup[[\"MAZ_ORIGINAL\", \"TAZ_ORIGINAL\"]].rename(columns={\"MAZ_ORIGINAL\": \"maz\", \"TAZ_ORIGINAL\": \"taz\"})\n",
+ "cube_taz_lookup.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " emme_taz | \n",
+ " cube_taz | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " emme_taz cube_taz\n",
+ "0 1 1\n",
+ "1 2 2\n",
+ "2 3 3\n",
+ "3 4 4\n",
+ "4 5 5"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "emme_taz_lookup = pd.read_csv(f\"{data_path}/taz_approach/emme_taz_transit_network_node_id_crosswalk.csv\").rename(columns={\"emme_node_id\": \"emme_taz\", \"model_node_id\": \"cube_taz\"})\n",
+ "emme_taz_lookup.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### import reformatted on-board survey record for the TAZ approach"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " taz_o | \n",
+ " taz_d | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 404 | \n",
+ " 3620 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " PM | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 2345 | \n",
+ " 2878 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " AM | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 2971 | \n",
+ " 2138 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " PM | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 2312 | \n",
+ " 2137 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " AM | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 2077 | \n",
+ " 2481 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " MD | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID taz_o taz_d maz_o maz_d period skim_set\n",
+ "0 1___AC Transit___2018 404 3620 11514 425106 PM 3\n",
+ "1 10___AC Transit___2018 2345 2878 316876 324992 AM 1\n",
+ "2 100___AC Transit___2018 2971 2138 318567 318470 PM 1\n",
+ "3 1000___AC Transit___2018 2312 2137 327175 325899 AM 1\n",
+ "4 10000___AC Transit___2018 2077 2481 323825 318288 MD 1"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "taz_base = pd.read_csv(f\"{data_path}/taz_approach/taz_approach_base_table.csv\").drop(columns=[\"taz_o\", \"taz_d\"])\n",
+ "taz_base = pd.merge(taz_base, cube_taz_lookup, how=\"left\", left_on=\"maz_o\", right_on=\"maz\").drop(columns=\"maz\").rename(columns={\"taz\": \"cube_taz_o\"})\n",
+ "taz_base = pd.merge(taz_base, cube_taz_lookup, how=\"left\", left_on=\"maz_d\", right_on=\"maz\").drop(columns=\"maz\").rename(columns={\"taz\": \"cube_taz_d\"})\n",
+ "taz_base = pd.merge(taz_base, emme_taz_lookup, how=\"left\", left_on=\"cube_taz_o\", right_on=\"cube_taz\").drop(columns=\"cube_taz\").rename(columns={\"emme_taz\": \"emme_taz_o\"})\n",
+ "taz_base = pd.merge(taz_base, emme_taz_lookup, how=\"left\", left_on=\"cube_taz_d\", right_on=\"cube_taz\").drop(columns=\"cube_taz\").rename(columns={\"emme_taz\": \"emme_taz_d\"})\n",
+ "taz_base = taz_base[[\"unique_ID\", \"emme_taz_o\", \"emme_taz_d\", \"maz_o\", \"maz_d\", \"period\", \"skim_set\"]].rename(columns={\"emme_taz_o\": \"taz_o\", \"emme_taz_d\": \"taz_d\"})\n",
+ "taz_base.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### add estimated (1) walk access time for maz_o (2) walk egress time for maz_d"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " skim_set | \n",
+ " period | \n",
+ " maz_o | \n",
+ " access_time | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10001 | \n",
+ " 5.319 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10002 | \n",
+ " 5.387 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10003 | \n",
+ " 7.442 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10004 | \n",
+ " 5.349 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10005 | \n",
+ " 6.454 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " skim_set period maz_o access_time\n",
+ "0 1 AM 10001 5.319\n",
+ "1 1 AM 10002 5.387\n",
+ "2 1 AM 10003 7.442\n",
+ "3 1 AM 10004 5.349\n",
+ "4 1 AM 10005 6.454"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "est_maz_walk_access_time = pd.read_csv(f\"{data_path}/taz_approach/estimated_maz_access_walk_time.csv\")\n",
+ "est_maz_walk_access_time = est_maz_walk_access_time.rename(columns={\"time_period\": \"period\", \"from_maz\": \"maz_o\", \"est_maz_walk_access_min\": \"access_time\"})\n",
+ "est_maz_walk_access_time.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " skim_set | \n",
+ " period | \n",
+ " maz_d | \n",
+ " egress_time | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10001 | \n",
+ " 5.878 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10002 | \n",
+ " 6.346 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10003 | \n",
+ " 6.819 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10004 | \n",
+ " 5.268 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1 | \n",
+ " AM | \n",
+ " 10005 | \n",
+ " 5.868 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " skim_set period maz_d egress_time\n",
+ "0 1 AM 10001 5.878\n",
+ "1 1 AM 10002 6.346\n",
+ "2 1 AM 10003 6.819\n",
+ "3 1 AM 10004 5.268\n",
+ "4 1 AM 10005 5.868"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "est_maz_walk_egress_time = pd.read_csv(f\"{data_path}/taz_approach/estimated_maz_egress_walk_time.csv\")\n",
+ "est_maz_walk_egress_time = est_maz_walk_egress_time.rename(columns={\"time_period\": \"period\", \"to_maz\": \"maz_d\", \"est_maz_walk_egress_min\": \"egress_time\"})\n",
+ "est_maz_walk_egress_time.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " taz_o | \n",
+ " taz_d | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 404 | \n",
+ " 3620 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " 7.719 | \n",
+ " 5.306 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 2345 | \n",
+ " 2878 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " 6.181 | \n",
+ " 3.450 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 2971 | \n",
+ " 2138 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " 2.991 | \n",
+ " 7.930 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 2312 | \n",
+ " 2137 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " 2.293 | \n",
+ " 6.646 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 2077 | \n",
+ " 2481 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " 9.902 | \n",
+ " 5.191 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID taz_o taz_d maz_o maz_d period skim_set \\\n",
+ "0 1___AC Transit___2018 404 3620 11514 425106 PM 3 \n",
+ "1 10___AC Transit___2018 2345 2878 316876 324992 AM 1 \n",
+ "2 100___AC Transit___2018 2971 2138 318567 318470 PM 1 \n",
+ "3 1000___AC Transit___2018 2312 2137 327175 325899 AM 1 \n",
+ "4 10000___AC Transit___2018 2077 2481 323825 318288 MD 1 \n",
+ "\n",
+ " access_time egress_time \n",
+ "0 7.719 5.306 \n",
+ "1 6.181 3.450 \n",
+ "2 2.991 7.930 \n",
+ "3 2.293 6.646 \n",
+ "4 9.902 5.191 "
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "taz_base = pd.merge(taz_base, est_maz_walk_access_time, how=\"left\", on=[\"period\", \"skim_set\", \"maz_o\"])\n",
+ "taz_base = pd.merge(taz_base, est_maz_walk_egress_time, how=\"left\", on=[\"period\", \"skim_set\", \"maz_d\"])\n",
+ "taz_base.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### add corresponding taz-to-taz skim value from omx matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "taz_skim_ea = omx.open_file(f\"{data_path}/taz_approach/skims/transit_skims_ea.omx\")\n",
+ "taz_skim_am = omx.open_file(f\"{data_path}/taz_approach/skims/transit_skims_am.omx\")\n",
+ "taz_skim_md = omx.open_file(f\"{data_path}/taz_approach/skims/transit_skims_md.omx\")\n",
+ "taz_skim_pm = omx.open_file(f\"{data_path}/taz_approach/skims/transit_skims_pm.omx\")\n",
+ "taz_skim_ev = omx.open_file(f\"{data_path}/taz_approach/skims/transit_skims_ev.omx\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_taz_skim_value(period, skim_set, taz_o, taz_d):\n",
+ " # initialize result dictionary\n",
+ " table_names = [\"CAPPEN\", \"CRIVTT\", \"CROWD\", \"EAWT\", \"EBIVTT\", \"FARE\", \"FIRSTWAIT\", \"FRIVTT\", \"HRIVTT\", \"LBIVTT\", \"LINKREL\", \"LRIVTT\", \"TOTALIVTT\", \"TOTALWAIT\", \"TOTALWALK\", \"XFERS\", \"XFERWAIT\", \"XFERWALK\",]\n",
+ " result = {}\n",
+ "\n",
+ " # select which omx skim file to use\n",
+ " if period == \"EA\":\n",
+ " per_skim = taz_skim_ea\n",
+ " elif period == \"AM\":\n",
+ " per_skim = taz_skim_am\n",
+ " elif period == \"MD\":\n",
+ " per_skim = taz_skim_md\n",
+ " elif period == \"PM\":\n",
+ " per_skim = taz_skim_pm\n",
+ " elif period == \"EV\":\n",
+ " per_skim = taz_skim_ev\n",
+ " \n",
+ " # set string for filtering appropriate skim table based on skim_set argument\n",
+ " if skim_set == 1:\n",
+ " skim_set_str = \"BUS\"\n",
+ " elif skim_set == 2:\n",
+ " skim_set_str = \"PREM\"\n",
+ " elif skim_set == 3:\n",
+ " skim_set_str = \"ALLPEN\"\n",
+ "\n",
+ " # populate result dictionary\n",
+ " for table in table_names:\n",
+ " result[table] = per_skim[f\"{period.lower()}_{skim_set_str}_{table}\"][taz_o - 1, taz_d - 1] # -1 because matrix starts from index 0\n",
+ " \n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def add_taz_to_taz_skim_values(base_table):\n",
+ "\n",
+ " skim_value_list = []\n",
+ " for i in range(len(base_table)):\n",
+ " period = base_table.loc[i, \"period\"]\n",
+ " skim_set = base_table.loc[i, \"skim_set\"]\n",
+ " taz_o = base_table.loc[i, \"taz_o\"]\n",
+ " taz_d = base_table.loc[i, \"taz_d\"]\n",
+ " \n",
+ " skim_value_list.append(get_taz_skim_value(period, skim_set, taz_o, taz_d))\n",
+ "\n",
+ " skim_values = pd.DataFrame(skim_value_list)\n",
+ "\n",
+ " return pd.concat([base_table, skim_values], axis = 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "97842\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " taz_o | \n",
+ " taz_d | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " CAPPEN | \n",
+ " ... | \n",
+ " HRIVTT | \n",
+ " LBIVTT | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 404 | \n",
+ " 3620 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " 7.719 | \n",
+ " 5.306 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 34.0 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 34.000000 | \n",
+ " 7.500000 | \n",
+ " 1.743429 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 1.743429 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 2345 | \n",
+ " 2878 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " 6.181 | \n",
+ " 3.450 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 11.932483 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 11.932483 | \n",
+ " 3.586207 | \n",
+ " 14.267323 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 14.267323 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 2971 | \n",
+ " 2138 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " 2.991 | \n",
+ " 7.930 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 4.464317 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 4.464317 | \n",
+ " 3.750000 | \n",
+ " 34.519989 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 34.519989 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 2312 | \n",
+ " 2137 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " 2.293 | \n",
+ " 6.646 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 4.559168 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 4.559168 | \n",
+ " 3.586207 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 2077 | \n",
+ " 2481 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " 9.902 | \n",
+ " 5.191 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 2.984965 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 2.984965 | \n",
+ " 7.500000 | \n",
+ " 33.521255 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 33.521255 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 27 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID taz_o taz_d maz_o maz_d period skim_set \\\n",
+ "0 1___AC Transit___2018 404 3620 11514 425106 PM 3 \n",
+ "1 10___AC Transit___2018 2345 2878 316876 324992 AM 1 \n",
+ "2 100___AC Transit___2018 2971 2138 318567 318470 PM 1 \n",
+ "3 1000___AC Transit___2018 2312 2137 327175 325899 AM 1 \n",
+ "4 10000___AC Transit___2018 2077 2481 323825 318288 MD 1 \n",
+ "\n",
+ " access_time egress_time CAPPEN ... HRIVTT LBIVTT LINKREL LRIVTT \\\n",
+ "0 7.719 5.306 0.0 ... 34.0 0.000000 0.0 0.0 \n",
+ "1 6.181 3.450 0.0 ... 0.0 11.932483 0.0 0.0 \n",
+ "2 2.991 7.930 0.0 ... 0.0 4.464317 0.0 0.0 \n",
+ "3 2.293 6.646 0.0 ... 0.0 4.559168 0.0 0.0 \n",
+ "4 9.902 5.191 0.0 ... 0.0 2.984965 0.0 0.0 \n",
+ "\n",
+ " TOTALIVTT TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK \n",
+ "0 34.000000 7.500000 1.743429 0.0 0.0 1.743429 \n",
+ "1 11.932483 3.586207 14.267323 0.0 0.0 14.267323 \n",
+ "2 4.464317 3.750000 34.519989 0.0 0.0 34.519989 \n",
+ "3 4.559168 3.586207 0.000000 0.0 0.0 0.000000 \n",
+ "4 2.984965 7.500000 33.521255 0.0 0.0 33.521255 \n",
+ "\n",
+ "[5 rows x 27 columns]"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "taz_approach_db = add_taz_to_taz_skim_values(taz_base)\n",
+ "print(len(taz_approach_db))\n",
+ "taz_approach_db.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " taz_o | \n",
+ " taz_d | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " CAPPEN | \n",
+ " ... | \n",
+ " LBIVTT | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ " TOTAL_TIME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 404 | \n",
+ " 3620 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " 7.719 | \n",
+ " 5.306 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 34.000000 | \n",
+ " 7.500000 | \n",
+ " 1.743429 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 1.743429 | \n",
+ " 56.268429 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 2345 | \n",
+ " 2878 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " 6.181 | \n",
+ " 3.450 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 11.932483 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 11.932483 | \n",
+ " 3.586207 | \n",
+ " 14.267323 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 14.267323 | \n",
+ " 39.417012 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 2971 | \n",
+ " 2138 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " 2.991 | \n",
+ " 7.930 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 4.464317 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 4.464317 | \n",
+ " 3.750000 | \n",
+ " 34.519989 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 34.519989 | \n",
+ " 53.655306 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 2312 | \n",
+ " 2137 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " 2.293 | \n",
+ " 6.646 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 4.559168 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 4.559168 | \n",
+ " 3.586207 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 17.084375 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 2077 | \n",
+ " 2481 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " 9.902 | \n",
+ " 5.191 | \n",
+ " 0.0 | \n",
+ " ... | \n",
+ " 2.984965 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 2.984965 | \n",
+ " 7.500000 | \n",
+ " 33.521255 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 33.521255 | \n",
+ " 59.099220 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 28 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID taz_o taz_d maz_o maz_d period skim_set \\\n",
+ "0 1___AC Transit___2018 404 3620 11514 425106 PM 3 \n",
+ "1 10___AC Transit___2018 2345 2878 316876 324992 AM 1 \n",
+ "2 100___AC Transit___2018 2971 2138 318567 318470 PM 1 \n",
+ "3 1000___AC Transit___2018 2312 2137 327175 325899 AM 1 \n",
+ "4 10000___AC Transit___2018 2077 2481 323825 318288 MD 1 \n",
+ "\n",
+ " access_time egress_time CAPPEN ... LBIVTT LINKREL LRIVTT \\\n",
+ "0 7.719 5.306 0.0 ... 0.000000 0.0 0.0 \n",
+ "1 6.181 3.450 0.0 ... 11.932483 0.0 0.0 \n",
+ "2 2.991 7.930 0.0 ... 4.464317 0.0 0.0 \n",
+ "3 2.293 6.646 0.0 ... 4.559168 0.0 0.0 \n",
+ "4 9.902 5.191 0.0 ... 2.984965 0.0 0.0 \n",
+ "\n",
+ " TOTALIVTT TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK TOTAL_TIME \n",
+ "0 34.000000 7.500000 1.743429 0.0 0.0 1.743429 56.268429 \n",
+ "1 11.932483 3.586207 14.267323 0.0 0.0 14.267323 39.417012 \n",
+ "2 4.464317 3.750000 34.519989 0.0 0.0 34.519989 53.655306 \n",
+ "3 4.559168 3.586207 0.000000 0.0 0.0 0.000000 17.084375 \n",
+ "4 2.984965 7.500000 33.521255 0.0 0.0 33.521255 59.099220 \n",
+ "\n",
+ "[5 rows x 28 columns]"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# add total time column\n",
+ "taz_approach_db[\"TOTAL_TIME\"] = taz_approach_db[\"access_time\"] + taz_approach_db[\"egress_time\"] + taz_approach_db[\"TOTALIVTT\"] + taz_approach_db[\"TOTALWAIT\"] + taz_approach_db[\"XFERWALK\"]\n",
+ "taz_approach_db.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " taz_o | \n",
+ " taz_d | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " period | \n",
+ " skim_set | \n",
+ " access_time | \n",
+ " egress_time | \n",
+ " CAPPEN | \n",
+ " ... | \n",
+ " LBIVTT | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ " TOTAL_TIME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 16 | \n",
+ " 10011___AC Transit___2018 | \n",
+ " 2876 | \n",
+ " 2681 | \n",
+ " 319133 | \n",
+ " 312527 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 39 | \n",
+ " 10033___AC Transit___2018 | \n",
+ " 1243 | \n",
+ " 2242 | \n",
+ " 212251 | \n",
+ " 314907 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 45 | \n",
+ " 10039___AC Transit___2018 | \n",
+ " 2212 | \n",
+ " 2499 | \n",
+ " 330901 | \n",
+ " 313992 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 51 | \n",
+ " 10044___AC Transit___2018 | \n",
+ " 3571 | \n",
+ " 3570 | \n",
+ " 420964 | \n",
+ " 415454 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 57 | \n",
+ " 1005___AC Transit___2018 | \n",
+ " 2363 | \n",
+ " 2136 | \n",
+ " 327261 | \n",
+ " 315627 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " ... | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0.0 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 28 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID taz_o taz_d maz_o maz_d period skim_set \\\n",
+ "16 10011___AC Transit___2018 2876 2681 319133 312527 MD 1 \n",
+ "39 10033___AC Transit___2018 1243 2242 212251 314907 MD 1 \n",
+ "45 10039___AC Transit___2018 2212 2499 330901 313992 MD 1 \n",
+ "51 10044___AC Transit___2018 3571 3570 420964 415454 MD 1 \n",
+ "57 1005___AC Transit___2018 2363 2136 327261 315627 AM 1 \n",
+ "\n",
+ " access_time egress_time CAPPEN ... LBIVTT LINKREL LRIVTT TOTALIVTT \\\n",
+ "16 NaN NaN NaN ... NaN NaN NaN 0.0 \n",
+ "39 NaN NaN NaN ... NaN NaN NaN 0.0 \n",
+ "45 NaN NaN NaN ... NaN NaN NaN 0.0 \n",
+ "51 NaN NaN NaN ... NaN NaN NaN 0.0 \n",
+ "57 NaN NaN NaN ... NaN NaN NaN 0.0 \n",
+ "\n",
+ " TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK TOTAL_TIME \n",
+ "16 NaN NaN NaN NaN NaN NaN \n",
+ "39 NaN NaN NaN NaN NaN NaN \n",
+ "45 NaN NaN NaN NaN NaN NaN \n",
+ "51 NaN NaN NaN NaN NaN NaN \n",
+ "57 NaN NaN NaN NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 28 columns]"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# if TOTALIVTT == 0, set TOTAL_TIME = \"NA\"\n",
+ "# for walk-only paths, set all skim values to null\n",
+ "for column_name in [\"access_time\", \"egress_time\", \"CAPPEN\", \"CRIVTT\", \"CROWD\", \"EAWT\", \"EBIVTT\", \"FARE\", \"FIRSTWAIT\", \"FRIVTT\", \"HRIVTT\", \"LBIVTT\", \"LINKREL\", \"LRIVTT\", \"TOTALWAIT\", \"TOTALWALK\", \"XFERS\", \"XFERWAIT\", \"XFERWALK\", \"TOTAL_TIME\"]:\n",
+ " taz_approach_db.loc[taz_approach_db[\"TOTALIVTT\"] == 0, column_name] = np.nan\n",
+ "temp = taz_approach_db[taz_approach_db[\"TOTALIVTT\"] == 0]\n",
+ "temp.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### add perceived time info\n",
+ "- Settings for TAZ run:\n",
+ " - initial_wait_perception_factor = 1.5\n",
+ " - transfer_wait_perception_factor = 3.0\n",
+ " - walk_perception_factor = 2.0\n",
+ " - in_vehicle_perception_factor = 1.0\n",
+ " - initial_boarding_penalty = 10\n",
+ " - transfer_boarding_penalty = 40"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "TAZ_INITIAL_WAIT_PERCEPTION_FACTOR = 1.5\n",
+ "TAZ_TRANSFER_WAIT_PERCEPTION_FACTOR = 3.0\n",
+ "TAZ_WALK_PERCEPTION_FACTOR = 2.0\n",
+ "TAZ_IN_VEHICLE_PERCEPTION_FACTOR = 1.0\n",
+ "TAZ_INITIAL_BOARDING_PENALTY = 10\n",
+ "TAZ_TRANSFER_BOARDING_PENALTY = 40"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# add perception total time\n",
+ "taz_approach_db[\"TOTAL_PERCEIVED_TIME\"] = TAZ_INITIAL_WAIT_PERCEPTION_FACTOR * taz_approach_db[\"FIRSTWAIT\"] + TAZ_TRANSFER_WAIT_PERCEPTION_FACTOR * taz_approach_db[\"XFERWAIT\"] + TAZ_WALK_PERCEPTION_FACTOR * (taz_approach_db[\"access_time\"] + taz_approach_db[\"egress_time\"] + taz_approach_db[\"XFERWALK\"]) + TAZ_IN_VEHICLE_PERCEPTION_FACTOR * taz_approach_db[\"TOTALIVTT\"] + TAZ_INITIAL_BOARDING_PENALTY + TAZ_TRANSFER_BOARDING_PENALTY * taz_approach_db[\"XFERS\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " taz_o | \n",
+ " taz_d | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " ... | \n",
+ " LINKREL | \n",
+ " LRIVTT | \n",
+ " TOTALIVTT | \n",
+ " TOTALWAIT | \n",
+ " TOTALWALK | \n",
+ " XFERS | \n",
+ " XFERWAIT | \n",
+ " XFERWALK | \n",
+ " TOTAL_TIME | \n",
+ " TOTAL_PERCEIVED_TIME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 404 | \n",
+ " 3620 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " -122.409795 | \n",
+ " 37.773544 | \n",
+ " -122.345279 | \n",
+ " 37.934689 | \n",
+ " PM | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 34.000000 | \n",
+ " 7.500000 | \n",
+ " 1.743429 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 1.743429 | \n",
+ " 56.268429 | \n",
+ " 84.786859 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 2345 | \n",
+ " 2878 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " -122.283143 | \n",
+ " 37.814792 | \n",
+ " -122.199787 | \n",
+ " 37.766251 | \n",
+ " AM | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 11.932483 | \n",
+ " 3.586207 | \n",
+ " 14.267323 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 14.267323 | \n",
+ " 39.417012 | \n",
+ " 75.108438 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 2971 | \n",
+ " 2138 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " -122.177856 | \n",
+ " 37.714332 | \n",
+ " -122.165258 | \n",
+ " 37.745239 | \n",
+ " PM | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 4.464317 | \n",
+ " 3.750000 | \n",
+ " 34.519989 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 34.519989 | \n",
+ " 53.655306 | \n",
+ " 110.971295 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 2312 | \n",
+ " 2137 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " -122.197990 | \n",
+ " 37.765282 | \n",
+ " -122.163331 | \n",
+ " 37.737274 | \n",
+ " AM | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 4.559168 | \n",
+ " 3.586207 | \n",
+ " 0.000000 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.000000 | \n",
+ " 17.084375 | \n",
+ " 37.816478 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 2077 | \n",
+ " 2481 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " -122.188702 | \n",
+ " 37.793200 | \n",
+ " -122.247606 | \n",
+ " 37.755097 | \n",
+ " MD | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 2.984965 | \n",
+ " 7.500000 | \n",
+ " 33.521255 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 33.521255 | \n",
+ " 59.099220 | \n",
+ " 121.463476 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 33 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID taz_o taz_d maz_o maz_d maz_o_lon \\\n",
+ "0 1___AC Transit___2018 404 3620 11514 425106 -122.409795 \n",
+ "1 10___AC Transit___2018 2345 2878 316876 324992 -122.283143 \n",
+ "2 100___AC Transit___2018 2971 2138 318567 318470 -122.177856 \n",
+ "3 1000___AC Transit___2018 2312 2137 327175 325899 -122.197990 \n",
+ "4 10000___AC Transit___2018 2077 2481 323825 318288 -122.188702 \n",
+ "\n",
+ " maz_o_lat maz_d_lon maz_d_lat period ... LINKREL LRIVTT TOTALIVTT \\\n",
+ "0 37.773544 -122.345279 37.934689 PM ... 0.0 0.0 34.000000 \n",
+ "1 37.814792 -122.199787 37.766251 AM ... 0.0 0.0 11.932483 \n",
+ "2 37.714332 -122.165258 37.745239 PM ... 0.0 0.0 4.464317 \n",
+ "3 37.765282 -122.163331 37.737274 AM ... 0.0 0.0 4.559168 \n",
+ "4 37.793200 -122.247606 37.755097 MD ... 0.0 0.0 2.984965 \n",
+ "\n",
+ " TOTALWAIT TOTALWALK XFERS XFERWAIT XFERWALK TOTAL_TIME \\\n",
+ "0 7.500000 1.743429 0.0 0.0 1.743429 56.268429 \n",
+ "1 3.586207 14.267323 0.0 0.0 14.267323 39.417012 \n",
+ "2 3.750000 34.519989 0.0 0.0 34.519989 53.655306 \n",
+ "3 3.586207 0.000000 0.0 0.0 0.000000 17.084375 \n",
+ "4 7.500000 33.521255 0.0 0.0 33.521255 59.099220 \n",
+ "\n",
+ " TOTAL_PERCEIVED_TIME \n",
+ "0 84.786859 \n",
+ "1 75.108438 \n",
+ "2 110.971295 \n",
+ "3 37.816478 \n",
+ "4 121.463476 \n",
+ "\n",
+ "[5 rows x 33 columns]"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## add maz coordinates\n",
+ "taz_approach_db = pd.merge(taz_approach_db, maz_nodes, how=\"left\", left_on=\"maz_o\", right_on=\"maz\")\n",
+ "taz_approach_db = taz_approach_db.rename(columns={\"lon\": \"maz_o_lon\", \"lat\": \"maz_o_lat\"}).drop(columns=\"maz\")\n",
+ "taz_approach_db = pd.merge(taz_approach_db, maz_nodes, how=\"left\", left_on=\"maz_d\", right_on=\"maz\")\n",
+ "taz_approach_db = taz_approach_db.rename(columns={\"lon\": \"maz_d_lon\", \"lat\": \"maz_d_lat\"}).drop(columns=\"maz\")\n",
+ "taz_approach_db = taz_approach_db[['unique_ID', 'taz_o', 'taz_d', 'maz_o', 'maz_d', 'maz_o_lon',\n",
+ " 'maz_o_lat', 'maz_d_lon', 'maz_d_lat', 'period', 'skim_set',\n",
+ " 'access_time', 'egress_time', 'CAPPEN',\n",
+ " 'CRIVTT', 'CROWD', 'EAWT', 'EBIVTT', 'FARE', 'FIRSTWAIT', 'FRIVTT',\n",
+ " 'HRIVTT', 'LBIVTT', 'LINKREL', 'LRIVTT', 'TOTALIVTT', 'TOTALWAIT',\n",
+ " 'TOTALWALK', 'XFERS', 'XFERWAIT', 'XFERWALK', 'TOTAL_TIME', 'TOTAL_PERCEIVED_TIME']]\n",
+ "taz_approach_db.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### create `path_found` variable"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "tap_path_found = tap_approach_db.copy()\n",
+ "tap_path_found = tap_path_found[[\"unique_ID\", \"TOTALIVTT\"]].rename(columns={\"TOTALIVTT\": \"tap_TOTALIVTT\"})\n",
+ "taz_path_found = taz_approach_db.copy()\n",
+ "taz_path_found = taz_path_found[[\"unique_ID\", \"TOTALIVTT\"]].rename(columns={\"TOTALIVTT\": \"taz_TOTALIVTT\"})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " path_found | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " TAZ_ONLY | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID path_found\n",
+ "0 1___AC Transit___2018 TAZ_ONLY\n",
+ "1 10___AC Transit___2018 BOTH\n",
+ "2 100___AC Transit___2018 BOTH\n",
+ "3 1000___AC Transit___2018 BOTH\n",
+ "4 10000___AC Transit___2018 BOTH"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "path_found = pd.merge(taz_path_found, tap_path_found, how=\"left\", on=\"unique_ID\")\n",
+ "path_found[\"tap_TOTALIVTT\"] = path_found[\"tap_TOTALIVTT\"].fillna(0)\n",
+ "path_found.loc[(path_found[\"tap_TOTALIVTT\"] == 0) & (path_found[\"taz_TOTALIVTT\"] == 0), \"path_found\"] = \"NEITHER\"\n",
+ "path_found.loc[(path_found[\"tap_TOTALIVTT\"] == 0) & (path_found[\"taz_TOTALIVTT\"] > 0), \"path_found\"] = \"TAZ_ONLY\"\n",
+ "path_found.loc[(path_found[\"tap_TOTALIVTT\"] > 0) & (path_found[\"taz_TOTALIVTT\"] == 0), \"path_found\"] = \"TAP_ONLY\"\n",
+ "path_found.loc[(path_found[\"tap_TOTALIVTT\"] > 0) & (path_found[\"taz_TOTALIVTT\"] > 0), \"path_found\"] = \"BOTH\"\n",
+ "path_found = path_found[[\"unique_ID\", \"path_found\"]]\n",
+ "path_found.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Convert to long format\n",
+ "#### tap approach in long format"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " skim_set | \n",
+ " skim_table | \n",
+ " tap_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 11420___AC Transit___2018 | \n",
+ " 413852 | \n",
+ " 414639 | \n",
+ " -122.299767 | \n",
+ " 37.904587 | \n",
+ " -122.319763 | \n",
+ " 37.979455 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 11423___AC Transit___2018 | \n",
+ " 424701 | \n",
+ " 414651 | \n",
+ " -122.326702 | \n",
+ " 37.921951 | \n",
+ " -122.321789 | \n",
+ " 37.986542 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 3.24 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 11425___AC Transit___2018 | \n",
+ " 418818 | \n",
+ " 424101 | \n",
+ " -122.362677 | \n",
+ " 37.937884 | \n",
+ " -122.328843 | \n",
+ " 37.990794 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 5.52 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 11730___AC Transit___2018 | \n",
+ " 322305 | \n",
+ " 329001 | \n",
+ " -122.111420 | \n",
+ " 37.698752 | \n",
+ " -122.230930 | \n",
+ " 37.798295 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 15.18 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 11732___AC Transit___2018 | \n",
+ " 310894 | \n",
+ " 329001 | \n",
+ " -122.230286 | \n",
+ " 37.788432 | \n",
+ " -122.230930 | \n",
+ " 37.798295 | \n",
+ " EA | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 3.12 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d maz_o_lon maz_o_lat \\\n",
+ "0 11420___AC Transit___2018 413852 414639 -122.299767 37.904587 \n",
+ "1 11423___AC Transit___2018 424701 414651 -122.326702 37.921951 \n",
+ "2 11425___AC Transit___2018 418818 424101 -122.362677 37.937884 \n",
+ "3 11730___AC Transit___2018 322305 329001 -122.111420 37.698752 \n",
+ "4 11732___AC Transit___2018 310894 329001 -122.230286 37.788432 \n",
+ "\n",
+ " maz_d_lon maz_d_lat period skim_set skim_table tap_value \n",
+ "0 -122.319763 37.979455 EA 1 access_time NaN \n",
+ "1 -122.321789 37.986542 EA 1 access_time 3.24 \n",
+ "2 -122.328843 37.990794 EA 1 access_time 5.52 \n",
+ "3 -122.230930 37.798295 EA 1 access_time 15.18 \n",
+ "4 -122.230930 37.798295 EA 1 access_time 3.12 "
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tap_approach_db_long = tap_approach_db.drop(columns=[\"tap_o\", \"tap_d\", \"renum_tap_o\", \"renum_tap_d\"])\n",
+ "tap_approach_db_long = pd.melt(tap_approach_db_long, \n",
+ " id_vars=[\"unique_ID\", \"maz_o\", \"maz_d\", \"maz_o_lon\", \"maz_o_lat\", \"maz_d_lon\", \"maz_d_lat\", \"period\", \"skim_set\"], \n",
+ " value_vars=[\"access_time\", \"egress_time\", \"CAPPEN\", \"CRIVTT\", \"CROWD\", \"EAWT\", \"EBIVTT\", \"FARE\", \"FIRSTWAIT\", \"FRIVTT\", \"HRIVTT\", \"LBIVTT\", \"LINKREL\", \"LRIVTT\", \"TOTALIVTT\", \"TOTALWAIT\", \"TOTALWALK\", \"XFERS\", \"XFERWAIT\", \"XFERWALK\", \"TOTAL_TIME\", \"TOTAL_PERCEIVED_TIME\"],\n",
+ " ignore_index=False)\n",
+ "tap_approach_db_long = tap_approach_db_long.rename(columns={\"variable\": \"skim_table\", \"value\": \"tap_value\"})\n",
+ "tap_approach_db_long.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### taz approach in long format"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " skim_set | \n",
+ " skim_table | \n",
+ " taz_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " -122.409795 | \n",
+ " 37.773544 | \n",
+ " -122.345279 | \n",
+ " 37.934689 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " access_time | \n",
+ " 7.719 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " -122.283143 | \n",
+ " 37.814792 | \n",
+ " -122.199787 | \n",
+ " 37.766251 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 6.181 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " -122.177856 | \n",
+ " 37.714332 | \n",
+ " -122.165258 | \n",
+ " 37.745239 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.991 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " -122.197990 | \n",
+ " 37.765282 | \n",
+ " -122.163331 | \n",
+ " 37.737274 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.293 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " -122.188702 | \n",
+ " 37.793200 | \n",
+ " -122.247606 | \n",
+ " 37.755097 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 9.902 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d maz_o_lon maz_o_lat \\\n",
+ "0 1___AC Transit___2018 11514 425106 -122.409795 37.773544 \n",
+ "1 10___AC Transit___2018 316876 324992 -122.283143 37.814792 \n",
+ "2 100___AC Transit___2018 318567 318470 -122.177856 37.714332 \n",
+ "3 1000___AC Transit___2018 327175 325899 -122.197990 37.765282 \n",
+ "4 10000___AC Transit___2018 323825 318288 -122.188702 37.793200 \n",
+ "\n",
+ " maz_d_lon maz_d_lat period skim_set skim_table taz_value \n",
+ "0 -122.345279 37.934689 PM 3 access_time 7.719 \n",
+ "1 -122.199787 37.766251 AM 1 access_time 6.181 \n",
+ "2 -122.165258 37.745239 PM 1 access_time 2.991 \n",
+ "3 -122.163331 37.737274 AM 1 access_time 2.293 \n",
+ "4 -122.247606 37.755097 MD 1 access_time 9.902 "
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "taz_approach_db_long = taz_approach_db.drop(columns=[\"taz_o\", \"taz_d\"])\n",
+ "taz_approach_db_long = pd.melt(taz_approach_db_long, \n",
+ " id_vars=[\"unique_ID\", \"maz_o\", \"maz_d\", \"maz_o_lon\", \"maz_o_lat\", \"maz_d_lon\", \"maz_d_lat\", \"period\", \"skim_set\"], \n",
+ " value_vars=[\"access_time\", \"egress_time\", \"CAPPEN\", \"CRIVTT\", \"CROWD\", \"EAWT\", \"EBIVTT\", \"FARE\", \"FIRSTWAIT\", \"FRIVTT\", \"HRIVTT\", \"LBIVTT\", \"LINKREL\", \"LRIVTT\", \"TOTALIVTT\", \"TOTALWAIT\", \"TOTALWALK\", \"XFERS\", \"XFERWAIT\", \"XFERWALK\", \"TOTAL_TIME\", \"TOTAL_PERCEIVED_TIME\"],\n",
+ " ignore_index=False)\n",
+ "taz_approach_db_long = taz_approach_db_long.rename(columns={\"variable\": \"skim_table\", \"value\": \"taz_value\"})\n",
+ "taz_approach_db_long.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Combine results of both approaches into a single database"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " skim_set | \n",
+ " skim_table | \n",
+ " taz_value | \n",
+ " tap_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " -122.409795 | \n",
+ " 37.773544 | \n",
+ " -122.345279 | \n",
+ " 37.934689 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " access_time | \n",
+ " 7.719 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " -122.283143 | \n",
+ " 37.814792 | \n",
+ " -122.199787 | \n",
+ " 37.766251 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 6.181 | \n",
+ " 22.38 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " -122.177856 | \n",
+ " 37.714332 | \n",
+ " -122.165258 | \n",
+ " 37.745239 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.991 | \n",
+ " 2.88 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " -122.197990 | \n",
+ " 37.765282 | \n",
+ " -122.163331 | \n",
+ " 37.737274 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.293 | \n",
+ " 2.88 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " -122.188702 | \n",
+ " 37.793200 | \n",
+ " -122.247606 | \n",
+ " 37.755097 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 9.902 | \n",
+ " 9.84 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 10001___AC Transit___2018 | \n",
+ " 312489 | \n",
+ " 330362 | \n",
+ " -122.286719 | \n",
+ " 37.778156 | \n",
+ " -122.075637 | \n",
+ " 37.609550 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 5.376 | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 10002___AC Transit___2018 | \n",
+ " 316488 | \n",
+ " 314634 | \n",
+ " -122.204659 | \n",
+ " 37.785926 | \n",
+ " -122.161125 | \n",
+ " 37.791154 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 7.014 | \n",
+ " 7.86 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 10003___AC Transit___2018 | \n",
+ " 314999 | \n",
+ " 312527 | \n",
+ " -122.012347 | \n",
+ " 37.588927 | \n",
+ " -121.898255 | \n",
+ " 37.511935 | \n",
+ " MD | \n",
+ " 3 | \n",
+ " access_time | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 10004___AC Transit___2018 | \n",
+ " 319567 | \n",
+ " 322475 | \n",
+ " -122.218050 | \n",
+ " 37.789919 | \n",
+ " -122.241402 | \n",
+ " 37.767258 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 5.210 | \n",
+ " 4.14 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 10005___AC Transit___2018 | \n",
+ " 312905 | \n",
+ " 319173 | \n",
+ " -122.100097 | \n",
+ " 37.632123 | \n",
+ " -122.059526 | \n",
+ " 37.632255 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 8.378 | \n",
+ " 6.48 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID maz_o maz_d maz_o_lon maz_o_lat \\\n",
+ "0 1___AC Transit___2018 11514 425106 -122.409795 37.773544 \n",
+ "1 10___AC Transit___2018 316876 324992 -122.283143 37.814792 \n",
+ "2 100___AC Transit___2018 318567 318470 -122.177856 37.714332 \n",
+ "3 1000___AC Transit___2018 327175 325899 -122.197990 37.765282 \n",
+ "4 10000___AC Transit___2018 323825 318288 -122.188702 37.793200 \n",
+ "5 10001___AC Transit___2018 312489 330362 -122.286719 37.778156 \n",
+ "6 10002___AC Transit___2018 316488 314634 -122.204659 37.785926 \n",
+ "7 10003___AC Transit___2018 314999 312527 -122.012347 37.588927 \n",
+ "8 10004___AC Transit___2018 319567 322475 -122.218050 37.789919 \n",
+ "9 10005___AC Transit___2018 312905 319173 -122.100097 37.632123 \n",
+ "\n",
+ " maz_d_lon maz_d_lat period skim_set skim_table taz_value tap_value \n",
+ "0 -122.345279 37.934689 PM 3 access_time 7.719 NaN \n",
+ "1 -122.199787 37.766251 AM 1 access_time 6.181 22.38 \n",
+ "2 -122.165258 37.745239 PM 1 access_time 2.991 2.88 \n",
+ "3 -122.163331 37.737274 AM 1 access_time 2.293 2.88 \n",
+ "4 -122.247606 37.755097 MD 1 access_time 9.902 9.84 \n",
+ "5 -122.075637 37.609550 MD 1 access_time 5.376 NaN \n",
+ "6 -122.161125 37.791154 MD 1 access_time 7.014 7.86 \n",
+ "7 -121.898255 37.511935 MD 3 access_time NaN NaN \n",
+ "8 -122.241402 37.767258 MD 1 access_time 5.210 4.14 \n",
+ "9 -122.059526 37.632255 MD 1 access_time 8.378 6.48 "
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "skim_comparison_db = pd.merge(taz_approach_db_long, tap_approach_db_long, how=\"outer\", on=[\"unique_ID\", \"maz_o\", \"maz_d\", \"maz_o_lon\", \"maz_o_lat\", \"maz_d_lon\", \"maz_d_lat\", \"period\", \"skim_set\", \"skim_table\"])\n",
+ "skim_comparison_db.head(10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " operator | \n",
+ " route | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " skim_set | \n",
+ " skim_table | \n",
+ " tap_value | \n",
+ " taz_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___72M Point Richmond to Oakland Amtrak | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " -122.409795 | \n",
+ " 37.773544 | \n",
+ " -122.345279 | \n",
+ " 37.934689 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " access_time | \n",
+ " NaN | \n",
+ " 7.719 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___1 Berkeley BART to Bay Fair BART | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " -122.283143 | \n",
+ " 37.814792 | \n",
+ " -122.199787 | \n",
+ " 37.766251 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 22.38 | \n",
+ " 6.181 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___1 Berkeley BART to Bay Fair BART | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " -122.177856 | \n",
+ " 37.714332 | \n",
+ " -122.165258 | \n",
+ " 37.745239 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.88 | \n",
+ " 2.991 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___1 Berkeley BART to Bay Fair BART | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " -122.197990 | \n",
+ " 37.765282 | \n",
+ " -122.163331 | \n",
+ " 37.737274 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.88 | \n",
+ " 2.293 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___19 Downtown Oakland Fruitvale BART | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " -122.188702 | \n",
+ " 37.793200 | \n",
+ " -122.247606 | \n",
+ " 37.755097 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 9.84 | \n",
+ " 9.902 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID operator \\\n",
+ "0 1___AC Transit___2018 AC Transit \n",
+ "1 10___AC Transit___2018 AC Transit \n",
+ "2 100___AC Transit___2018 AC Transit \n",
+ "3 1000___AC Transit___2018 AC Transit \n",
+ "4 10000___AC Transit___2018 AC Transit \n",
+ "\n",
+ " route maz_o maz_d \\\n",
+ "0 AC TRANSIT___72M Point Richmond to Oakland Amtrak 11514 425106 \n",
+ "1 AC TRANSIT___1 Berkeley BART to Bay Fair BART 316876 324992 \n",
+ "2 AC TRANSIT___1 Berkeley BART to Bay Fair BART 318567 318470 \n",
+ "3 AC TRANSIT___1 Berkeley BART to Bay Fair BART 327175 325899 \n",
+ "4 AC TRANSIT___19 Downtown Oakland Fruitvale BART 323825 318288 \n",
+ "\n",
+ " maz_o_lon maz_o_lat maz_d_lon maz_d_lat period skim_set skim_table \\\n",
+ "0 -122.409795 37.773544 -122.345279 37.934689 PM 3 access_time \n",
+ "1 -122.283143 37.814792 -122.199787 37.766251 AM 1 access_time \n",
+ "2 -122.177856 37.714332 -122.165258 37.745239 PM 1 access_time \n",
+ "3 -122.197990 37.765282 -122.163331 37.737274 AM 1 access_time \n",
+ "4 -122.188702 37.793200 -122.247606 37.755097 MD 1 access_time \n",
+ "\n",
+ " tap_value taz_value \n",
+ "0 NaN 7.719 \n",
+ "1 22.38 6.181 \n",
+ "2 2.88 2.991 \n",
+ "3 2.88 2.293 \n",
+ "4 9.84 9.902 "
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## add survey operator & route info\n",
+ "survey_info = pd.read_csv(f\"{data_path}/survey_operator_route.csv\", encoding = \"ISO-8859-1\")\n",
+ "skim_comparison_db = pd.merge(skim_comparison_db, survey_info, how=\"left\", on=\"unique_ID\")\n",
+ "skim_comparison_db = skim_comparison_db[[\"unique_ID\", \"operator\", \"route\", \"maz_o\", \"maz_d\", \"maz_o_lon\", \"maz_o_lat\", \"maz_d_lon\", \"maz_d_lat\", \"period\", \"skim_set\", \"skim_table\", \"tap_value\", \"taz_value\"]]\n",
+ "skim_comparison_db.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " unique_ID | \n",
+ " operator | \n",
+ " route | \n",
+ " maz_o | \n",
+ " maz_d | \n",
+ " maz_o_lon | \n",
+ " maz_o_lat | \n",
+ " maz_d_lon | \n",
+ " maz_d_lat | \n",
+ " period | \n",
+ " skim_set | \n",
+ " skim_table | \n",
+ " tap_value | \n",
+ " taz_value | \n",
+ " path_found | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___72M Point Richmond to Oakland Amtrak | \n",
+ " 11514 | \n",
+ " 425106 | \n",
+ " -122.409795 | \n",
+ " 37.773544 | \n",
+ " -122.345279 | \n",
+ " 37.934689 | \n",
+ " PM | \n",
+ " 3 | \n",
+ " access_time | \n",
+ " NaN | \n",
+ " 7.719 | \n",
+ " TAZ_ONLY | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___1 Berkeley BART to Bay Fair BART | \n",
+ " 316876 | \n",
+ " 324992 | \n",
+ " -122.283143 | \n",
+ " 37.814792 | \n",
+ " -122.199787 | \n",
+ " 37.766251 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 22.38 | \n",
+ " 6.181 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 100___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___1 Berkeley BART to Bay Fair BART | \n",
+ " 318567 | \n",
+ " 318470 | \n",
+ " -122.177856 | \n",
+ " 37.714332 | \n",
+ " -122.165258 | \n",
+ " 37.745239 | \n",
+ " PM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.88 | \n",
+ " 2.991 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1000___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___1 Berkeley BART to Bay Fair BART | \n",
+ " 327175 | \n",
+ " 325899 | \n",
+ " -122.197990 | \n",
+ " 37.765282 | \n",
+ " -122.163331 | \n",
+ " 37.737274 | \n",
+ " AM | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 2.88 | \n",
+ " 2.293 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000___AC Transit___2018 | \n",
+ " AC Transit | \n",
+ " AC TRANSIT___19 Downtown Oakland Fruitvale BART | \n",
+ " 323825 | \n",
+ " 318288 | \n",
+ " -122.188702 | \n",
+ " 37.793200 | \n",
+ " -122.247606 | \n",
+ " 37.755097 | \n",
+ " MD | \n",
+ " 1 | \n",
+ " access_time | \n",
+ " 9.84 | \n",
+ " 9.902 | \n",
+ " BOTH | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " unique_ID operator \\\n",
+ "0 1___AC Transit___2018 AC Transit \n",
+ "1 10___AC Transit___2018 AC Transit \n",
+ "2 100___AC Transit___2018 AC Transit \n",
+ "3 1000___AC Transit___2018 AC Transit \n",
+ "4 10000___AC Transit___2018 AC Transit \n",
+ "\n",
+ " route maz_o maz_d \\\n",
+ "0 AC TRANSIT___72M Point Richmond to Oakland Amtrak 11514 425106 \n",
+ "1 AC TRANSIT___1 Berkeley BART to Bay Fair BART 316876 324992 \n",
+ "2 AC TRANSIT___1 Berkeley BART to Bay Fair BART 318567 318470 \n",
+ "3 AC TRANSIT___1 Berkeley BART to Bay Fair BART 327175 325899 \n",
+ "4 AC TRANSIT___19 Downtown Oakland Fruitvale BART 323825 318288 \n",
+ "\n",
+ " maz_o_lon maz_o_lat maz_d_lon maz_d_lat period skim_set skim_table \\\n",
+ "0 -122.409795 37.773544 -122.345279 37.934689 PM 3 access_time \n",
+ "1 -122.283143 37.814792 -122.199787 37.766251 AM 1 access_time \n",
+ "2 -122.177856 37.714332 -122.165258 37.745239 PM 1 access_time \n",
+ "3 -122.197990 37.765282 -122.163331 37.737274 AM 1 access_time \n",
+ "4 -122.188702 37.793200 -122.247606 37.755097 MD 1 access_time \n",
+ "\n",
+ " tap_value taz_value path_found \n",
+ "0 NaN 7.719 TAZ_ONLY \n",
+ "1 22.38 6.181 BOTH \n",
+ "2 2.88 2.991 BOTH \n",
+ "3 2.88 2.293 BOTH \n",
+ "4 9.84 9.902 BOTH "
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## add path_found variable\n",
+ "skim_comparison_db = pd.merge(skim_comparison_db, path_found, how=\"left\", on=\"unique_ID\")\n",
+ "skim_comparison_db.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "skim_comparison_db.to_csv(\"../../outputs/skim/skim_comparison.csv\", index=False)"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "cf0ffc98cd3e6798b44bd672d9c6bf770a14d666c17f5c600d9c32eba9236d3d"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.9.5 64-bit ('serpm': conda)",
+ "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"
+ },
+ "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}