Skip to content

Commit

Permalink
Merge pull request #1102 from cal-itp/quarterly-metrics-q1
Browse files Browse the repository at this point in the history
Quarterly performance metrics Q1 2024
  • Loading branch information
tiffanychu90 authored May 8, 2024

Verified

This commit was signed with the committer’s verified signature.
lukbukkit Lukas Arnold
2 parents 85cfeaa + a3283ee commit 4290b2c
Showing 12 changed files with 84 additions and 736 deletions.
2 changes: 2 additions & 0 deletions _shared_utils/shared_utils/rt_dates.py
Original file line number Diff line number Diff line change
@@ -83,6 +83,8 @@ def get_week(month: Literal["apr2023", "oct2023"], exclude_wed: bool) -> list:
"Q2_2023": "2023-04-12",
"Q3_2023": "2023-07-12",
"Q4_2023": "2023-10-11",
"Q1_2024": "2024-01-17",
"Q2_2024": "2024-04-17",
}

MONTH_DICT = {
Git LFS file not shown
Git LFS file not shown
64 changes: 18 additions & 46 deletions quarterly_performance_objective/A1_scheduled_route_level_df.py
Original file line number Diff line number Diff line change
@@ -29,49 +29,20 @@ def shape_geom_to_route_geom(
analysis_date: str
) -> gpd.GeoDataFrame:
"""
Merge routes and trips to get line geometry.
Get longest shape for route-direction and tag
what category it is for parallel routes.
"""
cols_to_keep = ["route_id", "shape_id", "geometry"]
operator_cols = ["feed_key", "name"]

df = gtfs_schedule_wrangling.get_trips_with_geom(
analysis_date,
trip_cols = operator_cols + [
"trip_id",
"shape_id","shape_array_key",
"route_id", "route_type"
],
exclude_me = ["Amtrak Schedule", "*Flex"],
crs = geography_utils.CA_StatePlane
# make sure units are in feet
)

# Merge trips with the shape's line geom, and get it to shape_id level
df = (df[operator_cols + cols_to_keep + ["route_type"]]
.drop_duplicates(subset=operator_cols + ["shape_id"])
.reset_index(drop=True)
)

# Now, get it from shape_id level to route_id level
routes = create_parallel_corridors.process_transit_routes(
df, operator_cols = operator_cols
)

# Add gtfs_dataset_name back
feed_gtfs_data_crosswalk = helpers.import_scheduled_trips(
analysis_date,
columns = ["feed_key", "gtfs_dataset_key"],
get_pandas = True
longest_shape = gtfs_schedule_wrangling.longest_shape_by_route_direction(
analysis_date
).rename(columns = {"schedule_gtfs_dataset_key": "gtfs_dataset_key"})

routes2 = pd.merge(
routes,
feed_gtfs_data_crosswalk,
on = "feed_key",
how = "inner"
operator_cols = ["feed_key", "gtfs_dataset_key"]

routes = create_parallel_corridors.process_transit_routes(
longest_shape, operator_cols = operator_cols
)

return routes2
return routes


def aggregate_trip_service_to_route_level(
@@ -148,23 +119,24 @@ def add_district(route_df: gpd.GeoDataFrame,

start = datetime.datetime.now()

route_cols = ["gtfs_dataset_key", "feed_key", "name", "route_id"]
route_cols_no_name = ["gtfs_dataset_key", "feed_key", "route_id"]
route_cols = route_cols_no_name + ["name"]

# Merge to get shape_level geometry, then pare down to route-level geometry
route_geom = shape_geom_to_route_geom(
# Get longest shape by route-direction
routes = shape_geom_to_route_geom(
ANALYSIS_DATE)

# Add district
route_geom_with_district = add_district(route_geom, route_cols)

# Add district
route_geom_with_district = add_district(routes, route_cols_no_name)
# Get route-level service
route_service = aggregate_trip_service_to_route_level(ANALYSIS_DATE, route_cols)

# Merge service hours with route-level geometry and district
gdf = pd.merge(
route_geom_with_district,
route_service,
on = route_cols,
on = route_cols_no_name,
how = "left",
validate = "1:1"
)
44 changes: 10 additions & 34 deletions quarterly_performance_objective/A4_add_route_speeds.py
Original file line number Diff line number Diff line change
@@ -10,28 +10,24 @@
from loguru import logger

from calitp_data_analysis import utils
from shared_utils import rt_utils, schedule_rt_utils
from segment_speed_utils import gtfs_schedule_wrangling
from segment_speed_utils.project_vars import SEGMENT_GCS, GTFS_DATA_DICT
from update_vars import BUS_SERVICE_GCS, ANALYSIS_DATE
from segment_speed_utils.project_vars import SEGMENT_GCS


def aggregate_trip_speeds_to_route(
analysis_date: str,
route_cols: list
):
) -> pd.DataFrame:
"""
Start with trip speeds and aggregate to route-level.
Instead of using route_speeds (which aggregates to
route-direction-time_of_day and uses source_record_id),
let's just use trip-level speeds.
Also, back out the operator's median speed, and use
that as the target speed for a given route.
"""
TRIP_SPEED_FILE = GTFS_DATA_DICT.rt_stop_times.trip_speeds_single_summary
MAX_SPEED = GTFS_DATA_DICT.rt_stop_times.max_speed

speeds = pd.read_parquet(
f"{SEGMENT_GCS}trip_summary/trip_speeds_{analysis_date}.parquet",
columns = route_cols + ["trip_instance_key", "speed_mph"]
f"{SEGMENT_GCS}{TRIP_SPEED_FILE}_{analysis_date}.parquet",
columns = route_cols + ["trip_instance_key", "speed_mph"],
filters = [[("speed_mph", "<=", MAX_SPEED)]]
)

speeds_by_route = (speeds.groupby(route_cols,
@@ -42,21 +38,6 @@ def aggregate_trip_speeds_to_route(
}).reset_index()
.rename(columns = {"trip_instance_key": "n_trips"})
)
'''
system_median = (speeds.groupby("schedule_gtfs_dataset_key",
observed=True, group_keys=False)
.agg({"speed_mph": "median"})
.reset_index()
.rename(columns = {"speed_mph": "system_speed_median"})
)
speeds_by_route2 = pd.merge(
speeds_by_route,
system_median,
on = "schedule_gtfs_dataset_key",
how = "inner"
)
'''

return speeds_by_route

@@ -126,14 +107,9 @@ def speed_to_delay_estimate(
indicator = True
)

MERGE_CATEGORIES = {
"both": "rt_and_sched",
"left_only": "schedule_only",
"right_only": "rt_only"
}

final = final.assign(
rt_sched_category = final._merge.map(MERGE_CATEGORIES)
rt_sched_category = final._merge.map(
gtfs_schedule_wrangling.sched_rt_category_dict)
).drop(columns = "_merge")

TARGET_SPEEDS = {
2 changes: 1 addition & 1 deletion quarterly_performance_objective/Makefile
Original file line number Diff line number Diff line change
@@ -4,4 +4,4 @@ quarterly_performance_report:
python A2_generate_routes_on_shn_data.py
python A3_categorize_routes.py
python A4_add_route_speeds.py
#cd ../ && make build_quarterly_performance_metrics -f Makefile
Loading

0 comments on commit 4290b2c

Please sign in to comment.