diff --git a/Makefile b/Makefile index 5d64b8d18..e45d6d4e1 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ build_portfolio_site: git add portfolio/$(site)/*.yml portfolio/$(site)/*.md git add portfolio/$(site)/*.ipynb git add portfolio/sites/$(site).yml - #make production_portfolio + make production_portfolio build_competitive_corridors: @@ -39,8 +39,8 @@ build_ntd_report: make build_portfolio_site build_route_speeds: - $(eval override site = route_speeds) - cd rt_segment_speeds / && make pip install -r requirements.txt && cd .. + $(eval export site = route_speeds) + cd rt_segment_speeds / && pip install -r requirements.txt && cd .. cd rt_segment_speeds/ && python deploy_portfolio_yaml.py && cd .. make build_portfolio_site diff --git a/_shared_utils/shared_utils/rt_dates.py b/_shared_utils/shared_utils/rt_dates.py index c9f8501bd..396ce1d4d 100644 --- a/_shared_utils/shared_utils/rt_dates.py +++ b/_shared_utils/shared_utils/rt_dates.py @@ -3,6 +3,8 @@ GCS: gs://calitp-analytics-data/data-analyses/rt_delay/cached_views/ """ +from typing import Literal + # HQTAs and RT speedmaps DATES = { "feb2022": "2022-02-08", @@ -48,13 +50,25 @@ "nov2023": "2023-11-15", "dec2023": "2023-12-13", "jan2024": "2024-01-17", + "feb2024": "2024-02-14", } -y2023_dates = [DATES[f"{m}2023"] for m in ["dec", "nov", "oct", "sep", "aug", "jul", "jun", "may", "apr", "mar"]] -y2024_dates = [v for k, v in DATES.items() if "2024" in k] +y2023_dates = [ + v for k, v in DATES.items() if k.endswith("2023") and not any(substring in k for substring in ["jan", "feb"]) +] + +y2024_dates = [v for k, v in DATES.items() if k.endswith("2024")] + + +def get_week(month: Literal["apr2023", "oct2023"], exclude_wed: bool) -> list: + if exclude_wed: + return [v for k, v in DATES.items() if month in k and not k.endswith(month)] + else: + return [v for k, v in DATES.items() if month in k] + -apr_week = [v for k, v in DATES.items() if "apr2023" in k] -oct_week = [v for k, v in DATES.items() if "oct2023" in k] +apr_week = get_week(month="apr2023", exclude_wed=False) +oct_week = get_week(month="oct2023", exclude_wed=False) # Planning and Modal Advisory Committee (PMAC) - quarterly diff --git a/gtfs_funnel/download_vehicle_positions.py b/gtfs_funnel/download_vehicle_positions.py index 4fc4afe6c..d15d01d92 100644 --- a/gtfs_funnel/download_vehicle_positions.py +++ b/gtfs_funnel/download_vehicle_positions.py @@ -105,6 +105,8 @@ def loop_through_batches_and_download_vp( df.to_parquet( f"{SEGMENT_GCS}vp_raw_{analysis_date}_batch{i}.parquet") + del df + time1 = datetime.datetime.now() logger.info(f"exported batch {i} to GCS: {time1 - time0}") diff --git a/gtfs_funnel/logs/download_data.log b/gtfs_funnel/logs/download_data.log index 3559fef6f..9a49e16df 100644 --- a/gtfs_funnel/logs/download_data.log +++ b/gtfs_funnel/logs/download_data.log @@ -270,3 +270,19 @@ 2024-01-18 09:14:47.261 | INFO | __main__:download_one_day:29 - # operators to run: 169 2024-01-18 09:14:47.261 | INFO | __main__:download_one_day:33 - *********** Download st data *********** 2024-01-18 09:15:55.924 | INFO | __main__:download_one_day:56 - execution time: 0:01:10.033714 +2024-02-15 09:20:58.545 | INFO | __main__:download_one_day:46 - Analysis date: 2024-02-14 +2024-02-15 09:21:01.201 | INFO | __main__:download_one_day:53 - # operators to run: 202 +2024-02-15 09:21:01.202 | INFO | __main__:download_one_day:56 - *********** Download trips data *********** +2024-02-15 09:21:23.365 | INFO | __main__:download_one_day:86 - execution time: 0:00:24.802016 +2024-02-15 09:21:37.056 | INFO | __main__:download_one_day:23 - Analysis date: 2024-02-14 +2024-02-15 09:21:39.062 | INFO | __main__:download_one_day:30 - # operators to run: 202 +2024-02-15 09:21:39.062 | INFO | __main__:download_one_day:33 - *********** Download stops data *********** +2024-02-15 09:21:47.027 | INFO | __main__:download_one_day:64 - execution time: 0:00:09.969948 +2024-02-15 09:22:00.563 | INFO | __main__:download_one_day:22 - Analysis date: 2024-02-14 +2024-02-15 09:22:02.703 | INFO | __main__:download_one_day:29 - # operators to run: 202 +2024-02-15 09:22:02.704 | INFO | __main__:download_one_day:33 - *********** Download routelines data *********** +2024-02-15 09:23:28.505 | INFO | __main__:download_one_day:63 - execution time: 0:01:27.941276 +2024-02-15 09:23:45.261 | INFO | __main__:download_one_day:21 - Analysis date: 2024-02-14 +2024-02-15 09:23:46.825 | INFO | __main__:download_one_day:29 - # operators to run: 169 +2024-02-15 09:23:46.826 | INFO | __main__:download_one_day:33 - *********** Download st data *********** +2024-02-15 09:25:01.209 | INFO | __main__:download_one_day:56 - execution time: 0:01:15.946993 diff --git a/gtfs_funnel/logs/download_vp_v2.log b/gtfs_funnel/logs/download_vp_v2.log index 0fba3bae8..cf8af9340 100644 --- a/gtfs_funnel/logs/download_vp_v2.log +++ b/gtfs_funnel/logs/download_vp_v2.log @@ -174,3 +174,14 @@ 2024-01-18 09:25:33.713 | INFO | __main__::110 - export concatenated vp: 0:02:07.041294 2024-01-18 09:28:08.669 | INFO | __main__::132 - remove batched parquets 2024-01-18 09:28:08.670 | INFO | __main__::135 - execution time: 0:04:48.117366 +2024-02-15 09:25:16.954 | INFO | __main__::146 - Analysis date: 2024-02-14 +2024-02-15 09:26:49.716 | INFO | __main__:loop_through_batches_and_download_vp:109 - exported batch 0 to GCS: 0:01:32.752392 +2024-02-15 09:27:37.016 | INFO | __main__:loop_through_batches_and_download_vp:109 - exported batch 1 to GCS: 0:00:47.299499 +2024-02-15 09:30:29.353 | INFO | __main__:loop_through_batches_and_download_vp:109 - exported batch 2 to GCS: 0:02:52.335775 +2024-02-15 09:31:56.048 | INFO | __main__:loop_through_batches_and_download_vp:109 - exported batch 3 to GCS: 0:01:26.673852 +2024-02-15 09:31:57.359 | INFO | __main__::153 - execution time: 0:06:40.395352 +2024-02-15 09:32:26.114 | INFO | __main__::95 - Analysis date: 2024-02-14 +2024-02-15 09:32:31.685 | INFO | __main__::103 - concat and filter batched data: 0:00:05.570464 +2024-02-15 09:34:43.337 | INFO | __main__::110 - export concatenated vp: 0:02:11.652166 +2024-02-15 09:37:09.512 | INFO | __main__::132 - remove batched parquets +2024-02-15 09:37:09.513 | INFO | __main__::135 - execution time: 0:04:43.398413 diff --git a/gtfs_funnel/logs/vp_preprocessing.log b/gtfs_funnel/logs/vp_preprocessing.log index ff5561883..40872d22d 100644 --- a/gtfs_funnel/logs/vp_preprocessing.log +++ b/gtfs_funnel/logs/vp_preprocessing.log @@ -3,4 +3,12 @@ 2024-01-27 14:27:17.221 | INFO | __main__::136 - 2023-11-15: condense vp for trip-direction 0:07:23.319808 2024-01-27 14:39:49.578 | INFO | __main__::144 - 2023-11-15: prepare vp to use in nearest neighbor: 0:12:32.357147 2024-01-27 14:46:57.364 | INFO | __main__::136 - 2023-10-11: condense vp for trip-direction 0:07:07.785109 -2024-01-27 14:58:58.072 | INFO | __main__::144 - 2023-10-11: prepare vp to use in nearest neighbor: 0:12:00.707961 \ No newline at end of file +2024-01-27 14:58:58.072 | INFO | __main__::144 - 2023-10-11: prepare vp to use in nearest neighbor: 0:12:00.707961 +2024-02-15 12:35:27.737 | INFO | __main__::169 - 2024-02-14: pare down vp: 0:01:27.967360 +2024-02-15 12:40:05.610 | INFO | __main__:attach_prior_vp_add_direction:89 - persist vp gddf: 0:02:46.966446 +2024-02-15 12:42:39.989 | INFO | __main__:attach_prior_vp_add_direction:121 - np vectorize arrays for direction: 0:02:34.378961 +2024-02-15 12:42:45.707 | INFO | __main__::193 - 2024-02-14: export vp direction: 0:05:27.063384 +2024-02-15 12:43:43.624 | INFO | __main__::199 - 2024-02-14: export usable vp with direction: 0:00:57.917219 +2024-02-15 12:43:43.624 | INFO | __main__::202 - 2024-02-14: vp_direction script execution time: 0:06:24.980603 +2024-02-15 12:50:35.377 | INFO | __main__::142 - 2024-02-14: condense vp for trip-direction 0:06:37.853370 +2024-02-15 13:02:43.454 | INFO | __main__::150 - 2024-02-14: prepare vp to use in nearest neighbor: 0:12:08.077021 diff --git a/gtfs_funnel/update_vars.py b/gtfs_funnel/update_vars.py index b651660ea..07a14fb20 100644 --- a/gtfs_funnel/update_vars.py +++ b/gtfs_funnel/update_vars.py @@ -6,7 +6,7 @@ rt_dates.oct_week + rt_dates.apr_week) analysis_date_list = [ - rt_dates.DATES["jan2024"] + rt_dates.DATES["feb2024"] ] CONFIG_PATH = Path("config.yml") diff --git a/gtfs_funnel/vp_condenser.py b/gtfs_funnel/vp_condenser.py index d84dac9ed..d54b7d777 100644 --- a/gtfs_funnel/vp_condenser.py +++ b/gtfs_funnel/vp_condenser.py @@ -15,7 +15,6 @@ from segment_speed_utils import vp_transform, wrangle_shapes from segment_speed_utils.project_vars import SEGMENT_GCS - def condense_vp_to_linestring( analysis_date: str, dict_inputs: dict @@ -103,6 +102,7 @@ def prepare_vp_for_all_directions( ] results = [compute(i)[0] for i in dfs] + gdf = pd.concat( results, axis=0, ignore_index=True ).sort_values( @@ -118,7 +118,7 @@ def prepare_vp_for_all_directions( ) del gdf - + return @@ -140,7 +140,7 @@ def prepare_vp_for_all_directions( time1 = datetime.datetime.now() logger.info( - f"{analysis_date}: condense vp for trip-direction " + f"{analysis_date}: condense vp for trip " f"{time1 - start}" ) diff --git a/high_quality_transit_areas/A1_download_rail_ferry_brt_stops.py b/high_quality_transit_areas/A1_download_rail_ferry_brt_stops.py index b26c53850..3caa178bc 100644 --- a/high_quality_transit_areas/A1_download_rail_ferry_brt_stops.py +++ b/high_quality_transit_areas/A1_download_rail_ferry_brt_stops.py @@ -23,7 +23,7 @@ def filter_trips_to_route_type(analysis_date: str, trips = helpers.import_scheduled_trips( analysis_date, columns = ["feed_key", "name", "trip_id", - "route_id", "route_type"], + "route_id", "route_type", "route_desc"], ) if isinstance(route_types, list): @@ -33,6 +33,7 @@ def filter_trips_to_route_type(analysis_date: str, trips_subset = filter_to_brt_trips(trips) trips_subset = (trips_subset + .drop(columns = "route_desc") .drop_duplicates() .reset_index(drop=True) ) @@ -52,7 +53,7 @@ def filter_to_brt_trips(trips: pd.DataFrame) -> pd.DataFrame: ["METRO SILVER LINE", "METRO ORANGE LINE", "METRO J LINE", "METRO G LINE" ]}, - "Bay Area 511 Muni Schedule": {"route_short_name": + "Bay Area 511 Muni Schedule": {"route_id": ['49']}, # Omni BRT -- too infrequent! #"OmniTrans Schedule": {"route_short_name": ["sbX"]} diff --git a/high_quality_transit_areas/A2_combine_stops.py b/high_quality_transit_areas/A2_combine_stops.py index 999be7ed9..bb004bf80 100644 --- a/high_quality_transit_areas/A2_combine_stops.py +++ b/high_quality_transit_areas/A2_combine_stops.py @@ -54,12 +54,12 @@ #client = Client("dask-scheduler.dask.svc.cluster.local:8786") - logger.add("./logs/A2_combine_stops.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"A2_combine_stops Analysis Date: {analysis_date}") start = datetime.datetime.now() # Rail @@ -99,9 +99,6 @@ ferry_stops ], axis=0, ignore_index=True) - logger.info("concatenated datasets") - - # Export to GCS utils.geoparquet_gcs_export( rail_brt_ferry, @@ -110,6 +107,6 @@ ) end = datetime.datetime.now() - logger.info(f"execution time: {end-start}") + logger.info(f"A2_combine_stops execution time: {end-start}") #client.close() \ No newline at end of file diff --git a/high_quality_transit_areas/B1_create_hqta_segments.py b/high_quality_transit_areas/B1_create_hqta_segments.py index ee07c2bcc..c0a698860 100644 --- a/high_quality_transit_areas/B1_create_hqta_segments.py +++ b/high_quality_transit_areas/B1_create_hqta_segments.py @@ -28,7 +28,7 @@ import operators_for_hqta from calitp_data_analysis import geography_utils, utils -from shared_utils import rt_utils, geog_utils_to_add +from shared_utils import rt_utils from segment_speed_utils import helpers, gtfs_schedule_wrangling from utilities import GCS_FILE_PATH from update_vars import analysis_date @@ -188,7 +188,7 @@ def select_shapes_and_segment( axis=1, ) - segmented = geog_utils_to_add.explode_segments( + segmented = geography_utils.explode_segments( ready_for_segmenting, group_cols = ["route_key"], segment_col = "segment_geometry" @@ -273,12 +273,12 @@ def find_primary_direction_across_hqta_segments( if __name__=="__main__": - logger.add("./logs/B1_create_hqta_segments.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"B1_create_hqta_segments Analysis date: {analysis_date}") start = dt.datetime.now() @@ -319,4 +319,4 @@ def find_primary_direction_across_hqta_segments( logger.info(f"cut segments: {time2 - time1}") end = dt.datetime.now() - logger.info(f"total execution time: {end - start}") \ No newline at end of file + logger.info(f"B1_create_hqta_segments execution time: {end - start}") \ No newline at end of file diff --git a/high_quality_transit_areas/B2_sjoin_stops_to_segments.py b/high_quality_transit_areas/B2_sjoin_stops_to_segments.py index 506621276..1115ee586 100644 --- a/high_quality_transit_areas/B2_sjoin_stops_to_segments.py +++ b/high_quality_transit_areas/B2_sjoin_stops_to_segments.py @@ -210,12 +210,12 @@ def sjoin_stops_and_stop_times_to_hqta_segments( #from dask.distributed import Client #client = Client("dask-scheduler.dask.svc.cluster.local:8786") - logger.add("./logs/B2_sjoin_stops_to_segments.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"B2_sjoin_stops_to_segments Analysis date: {analysis_date}") start = dt.datetime.now() @@ -255,6 +255,6 @@ def sjoin_stops_and_stop_times_to_hqta_segments( ) end = dt.datetime.now() - logger.info(f"Execution time: {end-start}") + logger.info(f"B2_sjoin_stops_to_segments execution time: {end-start}") #client.close() diff --git a/high_quality_transit_areas/C1_prep_pairwise_intersections.py b/high_quality_transit_areas/C1_prep_pairwise_intersections.py index b008ea693..c76719025 100644 --- a/high_quality_transit_areas/C1_prep_pairwise_intersections.py +++ b/high_quality_transit_areas/C1_prep_pairwise_intersections.py @@ -82,12 +82,12 @@ def sjoin_against_other_operators( #from dask.distributed import Client #client = Client("dask-scheduler.dask.svc.cluster.local:8786") - logger.add("./logs/C1_prep_pairwise_intersections.log", retention = "3 months") + logger.add("./logs/hqta_processing.log", retention = "3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"C1_prep_pairwise_intersections Analysis date: {analysis_date}") start = dt.datetime.now() corridors = prep_bus_corridors() @@ -145,6 +145,6 @@ def sjoin_against_other_operators( ) end = dt.datetime.now() - logger.info(f"execution time: {end-start}") + logger.info(f"C1_prep_pairwise_intersections execution time: {end-start}") #client.close() \ No newline at end of file diff --git a/high_quality_transit_areas/C2_get_intersections.py b/high_quality_transit_areas/C2_get_intersections.py index 9bf66d4a8..cdfa23c68 100644 --- a/high_quality_transit_areas/C2_get_intersections.py +++ b/high_quality_transit_areas/C2_get_intersections.py @@ -101,12 +101,12 @@ def find_intersections(pairs_table: gpd.GeoDataFrame) -> gpd.GeoDataFrame: #from dask.distributed import Client #client = Client("dask-scheduler.dask.svc.cluster.local:8786") - logger.add("./logs/C2_find_intersections.log", retention = "3 months") + logger.add("./logs/hqta_processing.log", retention = "3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"C2_find_intersections Analysis date: {analysis_date}") start = dt.datetime.now() @@ -130,6 +130,6 @@ def find_intersections(pairs_table: gpd.GeoDataFrame) -> gpd.GeoDataFrame: ) end = dt.datetime.now() - logger.info(f"execution time: {end-start}") + logger.info(f"C2_find_intersections execution time: {end-start}") #client.close() \ No newline at end of file diff --git a/high_quality_transit_areas/C3_create_bus_hqta_types.py b/high_quality_transit_areas/C3_create_bus_hqta_types.py index febb7b00d..d78dc8462 100644 --- a/high_quality_transit_areas/C3_create_bus_hqta_types.py +++ b/high_quality_transit_areas/C3_create_bus_hqta_types.py @@ -119,12 +119,12 @@ def create_stops_along_corridors(all_stops: gpd.GeoDataFrame) -> gpd.GeoDataFram #from dask.distributed import Client #client = Client("dask-scheduler.dask.svc.cluster.local:8786") - logger.add("./logs/C3_create_bus_hqta_types.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"C3_create_bus_hqta_types Analysis date: {analysis_date}") start = dt.datetime.now() # Start with the gdf of all the hqta_segments @@ -162,6 +162,6 @@ def create_stops_along_corridors(all_stops: gpd.GeoDataFrame) -> gpd.GeoDataFram ) end = dt.datetime.now() - logger.info(f"execution time: {end-start}") + logger.info(f"C3_create_bus_hqta_types execution time: {end-start}") #client.close() \ No newline at end of file diff --git a/high_quality_transit_areas/D1_assemble_hqta_points.py b/high_quality_transit_areas/D1_assemble_hqta_points.py index 5d7ae4cfd..9d240534f 100644 --- a/high_quality_transit_areas/D1_assemble_hqta_points.py +++ b/high_quality_transit_areas/D1_assemble_hqta_points.py @@ -201,12 +201,12 @@ def final_processing(gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: if __name__=="__main__": - logger.add("./logs/D1_assemble_hqta_points.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"D1_assemble_hqta_points Analysis date: {analysis_date}") start = dt.datetime.now() rail_ferry_brt = rail_ferry_brt_extract.get_rail_ferry_brt_extract().to_crs( @@ -267,4 +267,4 @@ def final_processing(gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: logger.info("export as geoparquet") end = dt.datetime.now() - logger.info(f"execution time: {end-start}") \ No newline at end of file + logger.info(f"D1_assemble_hqta_points execution time: {end-start}") \ No newline at end of file diff --git a/high_quality_transit_areas/D2_assemble_hqta_polygons.py b/high_quality_transit_areas/D2_assemble_hqta_polygons.py index 7f01666a8..5a4539b26 100644 --- a/high_quality_transit_areas/D2_assemble_hqta_polygons.py +++ b/high_quality_transit_areas/D2_assemble_hqta_polygons.py @@ -127,12 +127,12 @@ def final_processing(gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: if __name__=="__main__": - logger.add("./logs/D2_assemble_hqta_polygons.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"D2_assemble_hqta_polygons Analysis date: {analysis_date}") start = dt.datetime.now() hqta_points = catalog.hqta_points.read().to_crs(PROJECT_CRS) @@ -168,4 +168,4 @@ def final_processing(gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame: logger.info("export as geoparquet") end = dt.datetime.now() - logger.info(f"execution time: {end-start}") \ No newline at end of file + logger.info(f"D2_assemble_hqta_polygons execution time: {end-start}") \ No newline at end of file diff --git a/high_quality_transit_areas/logs/A2_combine_stops.log b/high_quality_transit_areas/logs/A2_combine_stops.log deleted file mode 100644 index 4c684b6b7..000000000 --- a/high_quality_transit_areas/logs/A2_combine_stops.log +++ /dev/null @@ -1,18 +0,0 @@ -2023-11-16 09:12:04.029 | INFO | __main__::62 - Analysis date: 2023-11-15 -2023-11-16 09:12:14.463 | INFO | __main__::70 - grabbed rail: 0:00:10.394794 -2023-11-16 09:12:23.893 | INFO | __main__::79 - grabbed brt: 0:00:09.429984 -2023-11-16 09:12:34.655 | INFO | __main__::86 - grabbed ferry: 0:00:10.762521 -2023-11-16 09:12:37.548 | INFO | __main__::102 - concatenated datasets -2023-11-16 09:12:37.784 | INFO | __main__::113 - execution time: 0:00:33.716302 -2023-12-14 09:35:54.946 | INFO | __main__::62 - Analysis date: 2023-12-13 -2023-12-14 09:36:06.859 | INFO | __main__::70 - grabbed rail: 0:00:11.884315 -2023-12-14 09:36:19.097 | INFO | __main__::79 - grabbed brt: 0:00:12.238391 -2023-12-14 09:36:30.851 | INFO | __main__::86 - grabbed ferry: 0:00:11.753123 -2023-12-14 09:36:33.691 | INFO | __main__::102 - concatenated datasets -2023-12-14 09:36:33.911 | INFO | __main__::113 - execution time: 0:00:38.935897 -2024-01-18 09:58:24.526 | INFO | __main__::62 - Analysis date: 2024-01-17 -2024-01-18 09:58:34.242 | INFO | __main__::70 - grabbed rail: 0:00:09.696271 -2024-01-18 09:58:44.295 | INFO | __main__::79 - grabbed brt: 0:00:10.053002 -2024-01-18 09:58:52.667 | INFO | __main__::86 - grabbed ferry: 0:00:08.372523 -2024-01-18 09:58:55.391 | INFO | __main__::102 - concatenated datasets -2024-01-18 09:58:55.639 | INFO | __main__::113 - execution time: 0:00:31.093727 diff --git a/high_quality_transit_areas/logs/B1_create_hqta_segments.log b/high_quality_transit_areas/logs/B1_create_hqta_segments.log deleted file mode 100644 index 88046c7da..000000000 --- a/high_quality_transit_areas/logs/B1_create_hqta_segments.log +++ /dev/null @@ -1,12 +0,0 @@ -2023-11-16 09:12:55.591 | INFO | __main__::285 - Analysis date: 2023-11-15 -2023-11-16 09:13:04.502 | INFO | __main__::302 - merge routes to trips: 0:00:08.895632 -2023-11-16 09:17:22.521 | INFO | __main__::321 - cut segments: 0:04:18.018810 -2023-11-16 09:17:22.522 | INFO | __main__::324 - total execution time: 0:04:26.915290 -2023-12-14 10:08:38.661 | INFO | __main__::283 - Analysis date: 2023-12-13 -2023-12-14 10:08:44.979 | INFO | __main__::300 - merge routes to trips: 0:00:06.316979 -2023-12-14 10:13:20.976 | INFO | __main__::321 - cut segments: 0:04:35.996986 -2023-12-14 10:13:20.977 | INFO | __main__::324 - total execution time: 0:04:42.315076 -2024-01-18 09:59:08.541 | INFO | __main__::281 - Analysis date: 2024-01-17 -2024-01-18 09:59:13.575 | INFO | __main__::298 - merge routes to trips: 0:00:04.987542 -2024-01-18 10:02:53.782 | INFO | __main__::319 - cut segments: 0:03:40.206635 -2024-01-18 10:02:53.782 | INFO | __main__::322 - total execution time: 0:03:45.194697 diff --git a/high_quality_transit_areas/logs/B2_sjoin_stops_to_segments.log b/high_quality_transit_areas/logs/B2_sjoin_stops_to_segments.log deleted file mode 100644 index a0e75ee7d..000000000 --- a/high_quality_transit_areas/logs/B2_sjoin_stops_to_segments.log +++ /dev/null @@ -1,6 +0,0 @@ -2023-11-16 09:21:06.274 | INFO | __main__::222 - Analysis date: 2023-11-15 -2023-11-16 09:21:58.902 | INFO | __main__::261 - Execution time: 0:00:52.626940 -2023-12-14 10:14:11.102 | INFO | __main__::219 - Analysis date: 2023-12-13 -2023-12-14 10:14:57.210 | INFO | __main__::258 - Execution time: 0:00:46.106794 -2024-01-18 10:03:07.367 | INFO | __main__::219 - Analysis date: 2024-01-17 -2024-01-18 10:03:43.325 | INFO | __main__::258 - Execution time: 0:00:35.921890 diff --git a/high_quality_transit_areas/logs/C1_prep_pairwise_intersections.log b/high_quality_transit_areas/logs/C1_prep_pairwise_intersections.log deleted file mode 100644 index 291605834..000000000 --- a/high_quality_transit_areas/logs/C1_prep_pairwise_intersections.log +++ /dev/null @@ -1,12 +0,0 @@ -2023-11-16 09:23:55.300 | INFO | __main__::127 - Analysis date: 2023-11-15 -2023-11-16 09:23:56.741 | INFO | __main__::136 - get pairwise table: 0:00:01.400203 -2023-11-16 09:24:01.574 | INFO | __main__::160 - compute for pairwise/subset_corridors: 0:00:04.833240 -2023-11-16 09:24:02.965 | INFO | __main__::171 - execution time: 0:00:07.624411 -2023-12-14 10:43:56.242 | INFO | __main__::129 - Analysis date: 2023-12-13 -2023-12-14 10:44:05.846 | INFO | __main__::146 - get pairwise table: 0:00:09.604118 -2023-12-14 10:44:06.184 | INFO | __main__::169 - compute for pairwise/subset_corridors: 0:00:00.337070 -2023-12-14 10:44:08.442 | INFO | __main__::181 - execution time: 0:00:12.199743 -2024-01-18 10:03:57.160 | INFO | __main__::90 - Analysis date: 2024-01-17 -2024-01-18 10:04:01.395 | INFO | __main__::113 - get pairwise table: 0:00:04.232979 -2024-01-18 10:04:01.821 | INFO | __main__::136 - compute for pairwise/subset_corridors: 0:00:00.425803 -2024-01-18 10:04:03.627 | INFO | __main__::148 - execution time: 0:00:06.465340 diff --git a/high_quality_transit_areas/logs/C2_find_intersections.log b/high_quality_transit_areas/logs/C2_find_intersections.log deleted file mode 100644 index 273409460..000000000 --- a/high_quality_transit_areas/logs/C2_find_intersections.log +++ /dev/null @@ -1,12 +0,0 @@ -2023-11-16 09:24:21.052 | INFO | __main__::109 - Analysis date: 2023-11-15 -2023-11-16 09:24:24.182 | INFO | __main__::119 - attach geometry to pairwise table: 0:00:03.116253 -2023-11-16 09:24:29.962 | INFO | __main__::124 - find intersections: 0:00:05.779966 -2023-11-16 09:24:31.893 | INFO | __main__::133 - execution time: 0:00:10.827747 -2023-12-14 10:17:02.744 | INFO | __main__::109 - Analysis date: 2023-12-13 -2023-12-14 10:17:06.880 | INFO | __main__::119 - attach geometry to pairwise table: 0:00:04.082272 -2023-12-14 10:17:24.571 | INFO | __main__::124 - find intersections: 0:00:17.691495 -2023-12-14 10:17:28.030 | INFO | __main__::133 - execution time: 0:00:25.231894 -2024-01-18 10:04:16.701 | INFO | __main__::109 - Analysis date: 2024-01-17 -2024-01-18 10:04:19.984 | INFO | __main__::119 - attach geometry to pairwise table: 0:00:03.232511 -2024-01-18 10:04:35.528 | INFO | __main__::124 - find intersections: 0:00:15.544019 -2024-01-18 10:04:38.796 | INFO | __main__::133 - execution time: 0:00:22.044455 diff --git a/high_quality_transit_areas/logs/C3_create_bus_hqta_types.log b/high_quality_transit_areas/logs/C3_create_bus_hqta_types.log deleted file mode 100644 index 620b3e934..000000000 --- a/high_quality_transit_areas/logs/C3_create_bus_hqta_types.log +++ /dev/null @@ -1,15 +0,0 @@ -2023-11-16 09:24:49.245 | INFO | __main__::126 - Analysis date: 2023-11-15 -2023-11-16 09:24:56.539 | INFO | __main__::136 - grab all stops -2023-11-16 09:24:56.639 | INFO | __main__::140 - create major stop bus -2023-11-16 09:24:59.957 | INFO | __main__::144 - create hq corridor bus -2023-11-16 09:25:00.637 | INFO | __main__::160 - execution time: 0:00:11.304229 -2023-12-14 10:20:37.223 | INFO | __main__::127 - Analysis date: 2023-12-13 -2023-12-14 10:20:57.783 | INFO | __main__::141 - grab all stops -2023-12-14 10:21:01.558 | INFO | __main__::145 - create major stop bus -2023-12-14 10:21:08.062 | INFO | __main__::149 - create hq corridor bus -2023-12-14 10:21:09.112 | INFO | __main__::165 - execution time: 0:00:31.888009 -2024-01-18 10:06:16.612 | INFO | __main__::127 - Analysis date: 2024-01-17 -2024-01-18 10:06:30.683 | INFO | __main__::141 - grab all stops -2024-01-18 10:06:33.691 | INFO | __main__::145 - create major stop bus -2024-01-18 10:06:37.507 | INFO | __main__::149 - create hq corridor bus -2024-01-18 10:06:38.463 | INFO | __main__::165 - execution time: 0:00:21.850209 diff --git a/high_quality_transit_areas/logs/D1_assemble_hqta_points.log b/high_quality_transit_areas/logs/D1_assemble_hqta_points.log deleted file mode 100644 index 0960b8a23..000000000 --- a/high_quality_transit_areas/logs/D1_assemble_hqta_points.log +++ /dev/null @@ -1,21 +0,0 @@ -2023-11-16 09:25:18.203 | INFO | __main__::204 - Analysis date: 2023-11-15 -2023-11-16 09:25:21.935 | INFO | __main__::228 - combined points: 0:00:03.710776 -2023-11-16 09:25:30.009 | INFO | __main__::234 - add route info: 0:00:08.074760 -2023-11-16 09:25:37.501 | INFO | __main__::242 - add agency names: 0:00:07.492050 -2023-11-16 09:25:37.883 | INFO | __main__::252 - export as geoparquet in date folder -2023-11-16 09:25:38.046 | INFO | __main__::261 - export as geoparquet -2023-11-16 09:25:38.048 | INFO | __main__::264 - execution time: 0:00:19.824551 -2023-12-14 10:26:15.076 | INFO | __main__::208 - Analysis date: 2023-12-13 -2023-12-14 10:26:21.487 | INFO | __main__::233 - combined points: 0:00:06.410131 -2023-12-14 10:26:35.452 | INFO | __main__::239 - add route info: 0:00:13.965701 -2023-12-14 10:26:45.190 | INFO | __main__::247 - add agency names: 0:00:09.737943 -2023-12-14 10:26:46.192 | INFO | __main__::257 - export as geoparquet in date folder -2023-12-14 10:26:46.783 | INFO | __main__::266 - export as geoparquet -2023-12-14 10:26:46.783 | INFO | __main__::269 - execution time: 0:00:31.706894 -2024-01-18 10:07:51.262 | INFO | __main__::208 - Analysis date: 2024-01-17 -2024-01-18 10:07:56.698 | INFO | __main__::233 - combined points: 0:00:05.373480 -2024-01-18 10:08:08.129 | INFO | __main__::239 - add route info: 0:00:11.430715 -2024-01-18 10:08:17.929 | INFO | __main__::247 - add agency names: 0:00:09.800166 -2024-01-18 10:08:18.739 | INFO | __main__::257 - export as geoparquet in date folder -2024-01-18 10:08:19.260 | INFO | __main__::266 - export as geoparquet -2024-01-18 10:08:19.260 | INFO | __main__::269 - execution time: 0:00:27.935665 diff --git a/high_quality_transit_areas/logs/D2_assemble_hqta_polygons.log b/high_quality_transit_areas/logs/D2_assemble_hqta_polygons.log deleted file mode 100644 index ffeb6e55a..000000000 --- a/high_quality_transit_areas/logs/D2_assemble_hqta_polygons.log +++ /dev/null @@ -1,16 +0,0 @@ -2023-11-16 09:25:57.825 | INFO | __main__::144 - Analysis date: 2023-11-15 -2023-11-16 09:26:15.876 | INFO | __main__::155 - filter and buffer: 0:00:18.027566 -2023-11-16 09:26:17.123 | INFO | __main__::168 - export as geoparquet in date folder -2023-11-16 09:26:17.866 | INFO | __main__::177 - export as geoparquet -2023-11-16 09:26:17.867 | INFO | __main__::180 - execution time: 0:00:20.019029 -2023-12-14 10:29:28.741 | INFO | __main__::136 - Analysis date: 2023-12-13 -2023-12-14 10:33:10.264 | INFO | __main__::135 - Analysis date: 2023-12-13 -2023-12-14 10:33:38.110 | INFO | __main__::146 - filter and buffer: 0:00:27.845491 -2023-12-14 10:33:40.391 | INFO | __main__::159 - export as geoparquet in date folder -2023-12-14 10:33:41.851 | INFO | __main__::168 - export as geoparquet -2023-12-14 10:33:41.853 | INFO | __main__::171 - execution time: 0:00:31.588813 -2024-01-18 10:08:32.637 | INFO | __main__::135 - Analysis date: 2024-01-17 -2024-01-18 10:08:55.437 | INFO | __main__::146 - filter and buffer: 0:00:22.788275 -2024-01-18 10:08:57.364 | INFO | __main__::159 - export as geoparquet in date folder -2024-01-18 10:08:58.529 | INFO | __main__::168 - export as geoparquet -2024-01-18 10:08:58.529 | INFO | __main__::171 - execution time: 0:00:25.880307 diff --git a/high_quality_transit_areas/logs/hqta_processing.log b/high_quality_transit_areas/logs/hqta_processing.log new file mode 100644 index 000000000..3b87190ee --- /dev/null +++ b/high_quality_transit_areas/logs/hqta_processing.log @@ -0,0 +1,51 @@ +2024-02-15 10:39:37.404 | INFO | __main__::62 - Analysis date: 2024-02-14 +2024-02-15 10:39:53.615 | INFO | __main__::70 - grabbed rail: 0:00:16.209130 +2024-02-15 10:40:08.900 | INFO | __main__::79 - grabbed brt: 0:00:15.285392 +2024-02-15 10:40:23.528 | INFO | __main__::86 - grabbed ferry: 0:00:14.627469 +2024-02-15 10:40:27.034 | INFO | __main__::102 - concatenated datasets +2024-02-15 10:40:27.290 | INFO | __main__::113 - execution time: 0:00:49.884562 +2024-02-15 10:41:59.689 | INFO | __main__::281 - Analysis date: 2024-02-14 +2024-02-15 10:42:06.502 | INFO | __main__::298 - merge routes to trips: 0:00:06.811228 +2024-02-15 10:48:36.857 | INFO | __main__::319 - cut segments: 0:06:30.354741 +2024-02-15 10:48:36.858 | INFO | __main__::322 - total execution time: 0:06:37.166630 +2024-02-15 10:48:55.584 | INFO | __main__::218 - Analysis date: 2024-02-14 +2024-02-15 10:49:39.341 | INFO | __main__::258 - Execution time: 0:00:43.7553602024-02-15 11:12:10.529 | INFO | __main__::123 - operators_for_hqta Analysis date: 2024-02-14 +2024-02-15 11:12:11.884 | INFO | __main__::132 - get list of cached ITP IDs: 0:00:01.322261 +2024-02-15 11:12:13.731 | INFO | __main__::148 - check files for completeness, save as json: 0:00:01.846775 +2024-02-15 11:12:13.731 | INFO | __main__::151 - operators_for_hqta execution time: 0:00:03.169393 +2024-02-15 11:12:29.212 | INFO | __main__::62 - A2_combine_stops Analysis Date: 2024-02-14 +2024-02-15 11:12:42.921 | INFO | __main__::70 - grabbed rail: 0:00:13.707923 +2024-02-15 11:12:56.621 | INFO | __main__::79 - grabbed brt: 0:00:13.700660 +2024-02-15 11:13:08.412 | INFO | __main__::86 - grabbed ferry: 0:00:11.790357 +2024-02-15 11:13:11.728 | INFO | __main__::110 - A2_combine_stops execution time: 0:00:42.515868 +2024-02-15 11:13:25.690 | INFO | __main__::281 - B1_create_hqta_segments Analysis date: 2024-02-14 +2024-02-15 11:13:31.067 | INFO | __main__::298 - merge routes to trips: 0:00:05.376384 +2024-02-15 11:17:26.810 | INFO | __main__::319 - cut segments: 0:03:55.742468 +2024-02-15 11:17:26.810 | INFO | __main__::322 - B1_create_hqta_segments execution time: 0:04:01.119368 +2024-02-15 11:17:40.815 | INFO | __main__::218 - B2_sjoin_stops_to_segments Analysis date: 2024-02-14 +2024-02-15 11:18:13.209 | INFO | __main__::258 - B2_sjoin_stops_to_segments execution time: 0:00:32.393811 +2024-02-15 11:18:28.611 | INFO | __main__::90 - C1_prep_pairwise_intersections Analysis date: 2024-02-14 +2024-02-15 11:18:35.802 | INFO | __main__::113 - get pairwise table: 0:00:07.190876 +2024-02-15 11:18:36.183 | INFO | __main__::136 - compute for pairwise/subset_corridors: 0:00:00.381023 +2024-02-15 11:18:38.070 | INFO | __main__::148 - C1_prep_pairwise_intersections execution time: 0:00:09.459173 +2024-02-15 11:18:51.793 | INFO | __main__::109 - C2_find_intersections Analysis date: 2024-02-14 +2024-02-15 11:18:58.127 | INFO | __main__::119 - attach geometry to pairwise table: 0:00:06.332460 +2024-02-15 11:19:14.113 | INFO | __main__::124 - find intersections: 0:00:15.986460 +2024-02-15 11:19:17.140 | INFO | __main__::133 - C2_find_intersections execution time: 0:00:25.345916 +2024-02-15 11:19:30.961 | INFO | __main__::127 - C3_create_bus_hqta_types Analysis date: 2024-02-14 +2024-02-15 11:19:46.819 | INFO | __main__::141 - grab all stops +2024-02-15 11:19:49.936 | INFO | __main__::145 - create major stop bus +2024-02-15 11:19:53.686 | INFO | __main__::149 - create hq corridor bus +2024-02-15 11:19:54.723 | INFO | __main__::165 - C3_create_bus_hqta_types execution time: 0:00:23.759924 +2024-02-15 11:20:10.567 | INFO | __main__::209 - D1_assemble_hqta_points Analysis date: 2024-02-14 +2024-02-15 11:20:15.564 | INFO | __main__::234 - combined points: 0:00:04.997074 +2024-02-15 11:20:28.853 | INFO | __main__::240 - add route info: 0:00:13.288940 +2024-02-15 11:20:38.686 | INFO | __main__::248 - add agency names: 0:00:09.832929 +2024-02-15 11:20:39.357 | INFO | __main__::258 - export as geoparquet in date folder +2024-02-15 11:20:39.906 | INFO | __main__::267 - export as geoparquet +2024-02-15 11:20:39.907 | INFO | __main__::270 - D1_assemble_hqta_points execution time: 0:00:29.339672 +2024-02-15 11:20:53.679 | INFO | __main__::135 - D2_assemble_hqta_polygons Analysis date: 2024-02-14 +2024-02-15 11:21:20.489 | INFO | __main__::146 - filter and buffer: 0:00:26.810481 +2024-02-15 11:21:22.772 | INFO | __main__::159 - export as geoparquet in date folder +2024-02-15 11:21:24.051 | INFO | __main__::168 - export as geoparquet +2024-02-15 11:21:24.052 | INFO | __main__::171 - D2_assemble_hqta_polygons execution time: 0:00:30.373503 diff --git a/high_quality_transit_areas/logs/operators_for_hqta.log b/high_quality_transit_areas/logs/operators_for_hqta.log deleted file mode 100644 index 282969884..000000000 --- a/high_quality_transit_areas/logs/operators_for_hqta.log +++ /dev/null @@ -1,12 +0,0 @@ -2023-11-16 09:11:42.834 | INFO | __main__::123 - Analysis date: 2023-11-15 -2023-11-16 09:11:45.514 | INFO | __main__::132 - get list of cached ITP IDs: 0:00:02.655308 -2023-11-16 09:11:46.692 | INFO | __main__::148 - check files for completeness, save as json: 0:00:01.177435 -2023-11-16 09:11:46.692 | INFO | __main__::151 - execution time: 0:00:03.833200 -2023-12-14 09:35:32.946 | INFO | __main__::123 - Analysis date: 2023-12-13 -2023-12-14 09:35:35.757 | INFO | __main__::132 - get list of cached ITP IDs: 0:00:02.791287 -2023-12-14 09:35:37.905 | INFO | __main__::148 - check files for completeness, save as json: 0:00:02.148186 -2023-12-14 09:35:37.906 | INFO | __main__::151 - execution time: 0:00:04.940026 -2024-01-18 09:58:06.172 | INFO | __main__::123 - Analysis date: 2024-01-17 -2024-01-18 09:58:08.424 | INFO | __main__::132 - get list of cached ITP IDs: 0:00:02.234068 -2024-01-18 09:58:10.428 | INFO | __main__::148 - check files for completeness, save as json: 0:00:02.003955 -2024-01-18 09:58:10.428 | INFO | __main__::151 - execution time: 0:00:04.238378 diff --git a/high_quality_transit_areas/operators_for_hqta.py b/high_quality_transit_areas/operators_for_hqta.py index 29a083dae..91a9bed17 100644 --- a/high_quality_transit_areas/operators_for_hqta.py +++ b/high_quality_transit_areas/operators_for_hqta.py @@ -115,12 +115,12 @@ def check_for_completeness( if __name__=="__main__": - logger.add("./logs/operators_for_hqta.log", retention="3 months") + logger.add("./logs/hqta_processing.log", retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - logger.info(f"Analysis date: {analysis_date}") + logger.info(f"operators_for_hqta Analysis date: {analysis_date}") start = dt.datetime.now() # These are all the IDs that have some cached files in GCS @@ -148,7 +148,7 @@ def check_for_completeness( logger.info(f"check files for completeness, save as json: {time2-time1}") end = dt.datetime.now() - logger.info(f"execution time: {end-start}") + logger.info(f"operators_for_hqta execution time: {end-start}") diff --git a/high_quality_transit_areas/update_vars.py b/high_quality_transit_areas/update_vars.py index d37d6b82f..3e8e02ac9 100644 --- a/high_quality_transit_areas/update_vars.py +++ b/high_quality_transit_areas/update_vars.py @@ -1,6 +1,6 @@ from shared_utils import rt_utils, rt_dates -analysis_date = rt_dates.DATES["jan2024"] +analysis_date = rt_dates.DATES["feb2024"] COMPILED_CACHED_VIEWS = f"{rt_utils.GCS_FILE_PATH}compiled_cached_views/" TEMP_GCS = f"{rt_utils.GCS_FILE_PATH}temp/" diff --git a/high_quality_transit_areas/valid_hqta_operators.json b/high_quality_transit_areas/valid_hqta_operators.json index 73b469bf8..e96deb5f8 100644 --- a/high_quality_transit_areas/valid_hqta_operators.json +++ b/high_quality_transit_areas/valid_hqta_operators.json @@ -1 +1 @@ -{"VALID_FEED_KEYS": {"Alhambra Schedule": "63cda8c6bbe285fdee43b0fc5db77cf8", "Amador Schedule": "4ce9825a6c3607c50c5192c90f768239", "Anaheim Resort Schedule": "b67d81e7df9f4caac2ba20286f01146c", "Antelope Valley Transit Authority Schedule": "e3412a6ad35e38ed650bc89aabefc8f9", "Arcadia Schedule": "5c01ed273e9f985d555cc2d02151fdb2", "Arvin Schedule": "7c0ba48c48f7ccd9b07a7c5d1151b4be", "Auburn Schedule": "6a5f537fa23a799706529745dbdbabaa", "Avalon Schedule": "18f7d4c859520bb5ccb2475d599fc2d8", "Baldwin Park Schedule": "0994a6114f881944475caafc3a8996eb", "Banning Pass Schedule": "b9a191f594d451d8b245884b61eec402", "Bay Area 511 AC Transit Schedule": "3ed66c11d38d2d3e5a610c6d1b34ec2a", "Bay Area 511 ACE Schedule": "597aee77f08e4799555e350a3cd5da2b", "Bay Area 511 BART Schedule": "f50113d666d27573c8b99721a7ec5d9d", "Bay Area 511 Caltrain Schedule": "2a9ce9d241f926b9c2b93b918e3fa51c", "Bay Area 511 Capitol Corridor Schedule": "e3c7393dfcc45fb6025e65d51398bd79", "Bay Area 511 Commute.org Schedule": "107b556632e4eebbbaa062dce316edc2", "Bay Area 511 County Connection Schedule": "2aa353e11dbf4ca87f156324bdcd11ab", "Bay Area 511 Dumbarton Express Schedule": "0a8c86da361241493a1dc2cf31bb6e0f", "Bay Area 511 Emery Go-Round Schedule": "35edcadbdeeb6bdd6a29a90677870d54", "Bay Area 511 Fairfield and Suisun Transit Schedule": "ad5caa91630ce8fe2d8bd7eca0657cc2", "Bay Area 511 Golden Gate Ferry Schedule": "1df9f9a60e2e12b638ffdef78f4b5e49", "Bay Area 511 Golden Gate Transit Schedule": "17519771aeb14e1874dd4015e87c62d5", "Bay Area 511 MVGO Schedule": "b6556289ed5faba35f5a6e17adf943c1", "Bay Area 511 Marin Schedule": "744ef5b993e7939f50c0a01cbf0148b9", "Bay Area 511 Mission Bay Schedule": "ab8ee18c67481a87850f508bc43dba43", "Bay Area 511 Muni Schedule": "a54b3af296fc9ecf295244b8047f861d", "Bay Area 511 Petaluma Schedule": "f744fee4856fcd946fe2c3952e2d286e", "Bay Area 511 Rio Vista Delta Breeze Schedule": "31a4b45aa9c6e4b386d0205ca80253e7", "Bay Area 511 SFO AirTrain Schedule": "55d8763ca8845a4efa50e40a9b972e1c", "Bay Area 511 SamTrans Schedule": "50c57de0aa5a17d745926d99b95fc28a", "Bay Area 511 San Francisco Bay Ferry Schedule": "9afe602959b2c80a5a371c2cca2f0b58", "Bay Area 511 Santa Clara Transit Schedule": "c3e50751074542e56b1ca6352c8c53ab", "Bay Area 511 Santa Rosa CityBus Schedule": "f39d68191789fc375e4750bfd10d597a", "Bay Area 511 SolTrans Schedule": "2b09f4c332861b1f2e0190f52aea1bb3", "Bay Area 511 Sonoma-Marin Area Rail Transit Schedule": "ff1e2c730b22a1c4aa37e7761d3255f6", "Bay Area 511 South San Francisco Shuttle Schedule": "ba630a129e34a8006799c2ee831e0e5d", "Bay Area 511 Treasure Island Ferry Schedule": "f2e6494b19a54d1e74643a515e5eb67d", "Bay Area 511 Tri Delta Schedule": "448e3f441fef94d57d32de8e1f05484a", "Bay Area 511 Tri-Valley Wheels Schedule": "a19cbdd982b19fb736cbfd5f66b29bc0", "Bay Area 511 Union City Transit Schedule": "ed7a212f2a38fd8734244030b40e4d07", "Bay Area 511 Vacaville City Coach Schedule": "5f6419482992db6e978d7ba2e408a74e", "Bay Area 511 Vine Transit Schedule": "9e6f92fd957b990c6008a7c76f3cebbb", "Bay Area 511 WestCAT Schedule": "79b538f8de5df3e9d916f7cd08afd4ab", "Beach Cities GMV Schedule": "b8a975cb0f8727e5a69a8934120534da", "Bear Schedule": "ea95c8dcb56129084dd7f5c4a119043e", "Beaumont Pass Schedule": "9da9e09185024f6bab03cc278de9886f", "Bell Gardens Schedule": "2dbcd03b82840a4b52d23828bc1fa12d", "Bellflower Bus Schedule": "63160ef89ac5a4523edde8241bdd3905", "Big Blue Bus Schedule": "4f9888472a8dad0f66bdbbd002312789", "BruinBus Schedule": "550c03554447b27ed6d94f6a1a9074fa", "Burbank Schedule": "cc6a68a39d22c29b49116584971e69a8", "Calabasas Schedule": "a8be1c96aa131a4c2271ed7048621074", "Calaveras Schedule": "838cd930bc3c5729243a61473213c6ed", "Cerritos on Wheels Schedule": "21bc6603eb89f87bfd6f9cbf86eb3ead", "Clean Air Express Schedule": "fc9e0920a9316e0dce752fdc160631b1", "Clovis Schedule": "a260afd3431d1b11bb52b577f8496079", "Commerce Schedule": "e2413128e10f674f1f445606be7d7f0a", "Corona Schedule": "dd440b1b2e4c105089c2d3254797cf13", "County Express Schedule": "c83f711290e5c31d451b6baefe527449", "Cudahy Schedule": "28d7992b079bbee059f51f5efec0edb9", "Culver City Schedule": "a6c95be16ecdae7e1c67b0af7eaeece8", "Curry Public Transit Schedule": "b4f03b635700560adc7a42440da146f2", "Delano Schedule": "cc8fa3f993eb2ddd62fc25f8d2a4f100", "Desert Roadrunner GMV Schedule": "b7358e3e54b1beaff2e2865186d53f4b", "Desert Roadrunner Schedule": "21b1880b14e2a5ed44178c6bdf817f09", "DowneyLINK GMV Schedule": "16907949a95f7afd88877e0f7546b2b8", "Eastern Sierra Schedule": "1b06d457b2be007ca1ca5ddcb5b0cd48", "El Dorado Schedule": "7519b1626b959b0fc517692b19431065", "El Monte Schedule": "773df1360d8ea58a94f1edf1389d7e90", "El Segundo Schedule": "79a12e2b0dc13e28cadceb02b67f2e84", "Elk Grove Schedule": "432c47868de169086e77d99f180b2212", "Flixbus Schedule": "c1f8fb4146874d7a15f5d39bc82bd136", "Fresno Schedule": "0b4f0b23718a0323b4b421d5f791ac0f", "G Trans Schedule": "2b834569e7f25ef28951e43d33a80a91", "GET Schedule": "c535a8170c7482780ea8f350859186fc", "Get Around Town Express Schedule": "c4295a1d95ed2bd4d9363a578000fd6a", "Glendale Schedule": "3ddde0eff9e10d1890b63994c9069a28", "Glenn Schedule": "43c8182daffb505a203d3326039951e1", "Go West Schedule": "b17c3a5b12a0f35116fc1ccbfe3f7377", "Grapeline Schedule": "73d901b57c7bd4864867d7f646118126", "Guadalupe Flyer Schedule": "5fa9af4d48e6413b60311e0ff676e657", "Havasu Landing Ferry Schedule": "5e87eda2c4c74832b576d8cc71daaef6", "Humboldt Schedule": "6bbaf3d2d76320e191547c85b2b5b483", "Huntington Schedule": "570a2010bbdafdeb65c6b2cade7267b7", "Kern Schedule": "d6e278a9183778c1cad84d65ed43a9a8", "Kings Schedule": "1e2952dd387b24f59cff4b05bc209bca", "LA DOT Schedule": "52600e5cf2ac73573921e2b1a5edd055", "LA Metro Bus Schedule": "82dd924efb837dcc0cd2c9ad2fb0f418", "LA Metro Rail Schedule": "a321aeae3869213e1ff728ef5e4530a2", "LADPW Schedule": "dceccbf372ba48fe8e399210e815a266", "LAX FlyAway Schedule": "21fa0b125d801eb5058da2ec5d748bda", "La Campana Schedule": "bf1af24c3bdcaa8f2dbb49b04bb749bc", "La Puente Schedule": "a965fb6f80747bf09f6550c52132a6ad", "Laguna Beach Schedule": "9bf604636f479b0b35c90eaff198e257", "Lake Schedule": "f1f7d2d19dbfb627a0a87ef42b11baae", "Lassen Flex": "c7cea554a5e958c1a6dae5d4f6ccdd6a", "Lassen Schedule": "55407fafa4579761cd7481c32f0d73df", "Lawndale Beat GMV Schedule": "3bf57f560af2e8ac0337b9f5ee526a40", "Lawndale Schedule": "2e77282f2d32aa83771b479304e315aa", "Lompoc Schedule": "8b2db7f63f83f1cd8b6f4783d22cf3f1", "Long Beach Schedule": "55131247c268aa4db21111cc3d9f963b", "Lynwood Schedule": "cbf2c1990bf0dbd9e8e762258daa916d", "Madera County Connection Schedule": "1e4c48029ae0cc822383ff59a526eda0", "Madera Metro Schedule": "d5ed5c6d7c25ebd77b99655a3dcf2c05", "Manteca Schedule": "afced1bd22f810e3512f8d1f2c564178", "Maywood Schedule": "c5887b6f39e29f9167a051612cd2b413", "Mendocino Schedule": "443230c6e1a639351f1aaf8cbdcf4480", "Merced GMV Schedule": "1829e7ea0a508381a298cb716bafb0d4", "Merced Schedule": "7a4bf0aaccd7aa130db46358ebdb5c26", "Metrolink Schedule": "1fc19f46e82ceb8c94281566b39a6669", "Montebello Schedule": "c661339d3e18aea9cd1772c3d3f6b26e", "Monterey Salinas Schedule": "7c49fd422169f7fcdfbbf83b0f81174f", "Morongo Basin Schedule": "3561fcdc346fea0b0076b5d3c520e4fb", "Morro Bay Cal-ITP Schedule": "0b6ae9e85ac91e1ac07ab7feb1a07025", "Mountain Transit Schedule": "d3d074aed7bfa659d40c82224d9fb65c", "Needles Schedule": "da49c06375c9e7147372ed4e0b22cb51", "Nevada County Schedule": "f7a2121f01eef823fb9018028a5c7f41", "North County Schedule": "5541f14a535f524a15f0b29c709ff8a9", "Norwalk Avail Schedule": "100287571bdd6fc29130f859003839c3", "OCTA Schedule": "4221b013a6d2b4e7edc8b4e2c5205e9b", "OmniTrans Schedule": "cf48679daf4bb84ab047eb3545235017", "Oregon POINT": "22aec1c6d914f1b56fa7d1d28b38fa9d", "Palos Verdes PTA Schedule": "8a1a28f1e315cb292cda0174f83bf168", "Pasadena Schedule": "dcd1f8fac657a30d665b52f4162b5b42", "Placer Schedule": "d27025eb857bab5c61a25b71c28046bc", "Plumas Schedule": "2f1fe743e8fa808f894eda037f1d323d", "PresidiGo Schedule": "aa4dd6132506fb6e79f3aa47f7d30c25", "Redding Schedule": "78b0708ceb49c07351f4e148520a4616", "Redwood Coast Schedule": "8ba295b256104176edafa35cec721b00", "Riverside Schedule": "1d3f8d3254f9599f50c1a2cba341221f", "Rosemead Schedule": "8d3f3a5dc869aa8651eab0d48f5aab73", "Roseville Schedule": "eb84a676e532815c20460372738db529", "SBMTD Schedule": "fbe9b7630531147f65807aaf927a1199", "SLO Schedule": "c3b4339d1086c444cd346c593bc0146e", "SLORTA Schedule": "bac571e36ad1d7d2ae3faec83599b05a", "Sacramento Schedule": "7a1f20927610bf432cff2c09ecc3751e", "Sage Stage Schedule": "748268ad11a5e83db5e4782e822e5998", "San Diego Schedule": "db8c6e0cf5ece2a8cdb5bdc71d049bd1", "San Joaquin Schedule": "d05e80a25025ae25c084c286e7175e0f", "Santa Clarita Schedule": "08970be297b350485ab0c2df6611d93a", "Santa Cruz Schedule": "1f76a02f85f8116d02cf1a9e8e8c0435", "Santa Maria Schedule": "5392e99b9f95a8f2cae17074b0592ae2", "Santa Ynez Mecatran Schedule": "638d90ba5ade8b25240024e6cae907e9", "Sierra Madre Schedule": "7497b2e09bb02196cf45d9ab664529e3", "Siskiyou Schedule": "f12e4782e7a1751f1c1e8dfb2a24861d", "South County Transit Link Schedule": "d2da5f9228647ca4de8fc50e0e70f1ec", "Spirit Bus Passio Schedule": "aa0ed6bbdfb0ba4a9fc1ffaf032eb550", "StanRTA Schedule": "20d4af635fd58ea03fd6716da16b5752", "Stanford Schedule": "2cd865d982bdf94dfb26098a0d711dc4", "SunLine Avail Schedule": "acb4406d86c941ffce5dc80c99a8894a", "TART, North Lake Tahoe Schedule": "f873cced24e0672a7d77f3cfae5f9236", "TCRTA TripShot Schedule": "590899c01b7f133c0f6afff59b5d9139", "Tahoe Transportation District GMV Schedule": "ab281d4512b4829b8fc5d75343dfa1cb", "Tahoe Transportation District Schedule": "2c81de89a7463d5ca5df230d0ceb40fd", "Tehama Schedule": "66595856a15545c6b6ca45a69d119675", "Torrance Schedule": "8c50b8f4196a981d7da3abb13571b7fe", "Tracy Schedule": "002790c3b23889605c337dc8129ee1c2", "Trinity Schedule": "9b9530af631a95abeb38f9e087238001", "Turlock Schedule": "a200a4de5134e969beada4855e80f31f", "Unitrans Schedule": "494b3dc95537496ab45385043087219c", "VCTC GMV Schedule": "981e8b8493a87fdec6f615e7d25d4fa3", "Victor Valley GMV Schedule": "86595d761a9417f9adbaaadb398ad032", "Victor Valley Schedule": "2cd77eafa44d59fca296c41401c87293", "Visalia Schedule": "bcafab0e50124b12c66b0eee024b0269", "YARTS Schedule": "20e4b67650c2363b1e26b21ec725ab17", "Yolobus Schedule": "326ef13938b53754ff8d4056f074c6a5", "Yuba-Sutter Schedule": "a4991a26e70a2082454203f78dab8b74", "Yuma Schedule": "cb17eac6579cda46a96179f6f29a807c", "eTrans Schedule": "34d23ec988be15989fd45f6d3c69d11d"}} \ No newline at end of file +{"VALID_FEED_KEYS": {"Alhambra Schedule": "63cda8c6bbe285fdee43b0fc5db77cf8", "Amador Schedule": "4ce9825a6c3607c50c5192c90f768239", "Anaheim Resort Schedule": "32e4be1aea096994ee6f2f701b940a84", "Antelope Valley Transit Authority Schedule": "989d48ae6ae192c64c185646b6a6ae06", "Arcadia Schedule": "beb80985c23670c8a6476f23be07c202", "Arvin Schedule": "7c0ba48c48f7ccd9b07a7c5d1151b4be", "Auburn Schedule": "6a5f537fa23a799706529745dbdbabaa", "B-Line Schedule": "408d5281150088de69df641d7275410c", "Baldwin Park Schedule": "0994a6114f881944475caafc3a8996eb", "Banning Pass Schedule": "b9a191f594d451d8b245884b61eec402", "Bay Area 511 AC Transit Schedule": "3ed66c11d38d2d3e5a610c6d1b34ec2a", "Bay Area 511 ACE Schedule": "b26450ddb2c9172f1ab428cac72b3fb1", "Bay Area 511 BART Schedule": "8dc55a4a9d5c0e79e1340c00aec39091", "Bay Area 511 Caltrain Schedule": "2a9ce9d241f926b9c2b93b918e3fa51c", "Bay Area 511 Capitol Corridor Schedule": "e3c7393dfcc45fb6025e65d51398bd79", "Bay Area 511 Commute.org Schedule": "107b556632e4eebbbaa062dce316edc2", "Bay Area 511 County Connection Schedule": "2aa353e11dbf4ca87f156324bdcd11ab", "Bay Area 511 Dumbarton Express Schedule": "0a8c86da361241493a1dc2cf31bb6e0f", "Bay Area 511 Emery Go-Round Schedule": "56b15cc305dc8faeef2038774ad04109", "Bay Area 511 Fairfield and Suisun Transit Schedule": "ad5caa91630ce8fe2d8bd7eca0657cc2", "Bay Area 511 Golden Gate Ferry Schedule": "1df9f9a60e2e12b638ffdef78f4b5e49", "Bay Area 511 Golden Gate Transit Schedule": "9b31e3b031eef08ad80a87fe9ee29a0f", "Bay Area 511 MVGO Schedule": "b6556289ed5faba35f5a6e17adf943c1", "Bay Area 511 Marin Schedule": "744ef5b993e7939f50c0a01cbf0148b9", "Bay Area 511 Mission Bay Schedule": "ab8ee18c67481a87850f508bc43dba43", "Bay Area 511 Muni Schedule": "36cb7395061d5a38f2beeae8b1bcda0a", "Bay Area 511 Petaluma Schedule": "f744fee4856fcd946fe2c3952e2d286e", "Bay Area 511 Rio Vista Delta Breeze Schedule": "31a4b45aa9c6e4b386d0205ca80253e7", "Bay Area 511 SFO AirTrain Schedule": "55d8763ca8845a4efa50e40a9b972e1c", "Bay Area 511 SamTrans Schedule": "63e5c9c9f32aa643153dc4c6f26dac4b", "Bay Area 511 San Francisco Bay Ferry Schedule": "9afe602959b2c80a5a371c2cca2f0b58", "Bay Area 511 Santa Clara Transit Schedule": "75035c6932793bce0fe2d1c7f326ff79", "Bay Area 511 Santa Rosa CityBus Schedule": "1c2ff7bc8106da093aba16b3313e7129", "Bay Area 511 SolTrans Schedule": "25a58143f929c56022d161730343b51e", "Bay Area 511 Sonoma County Transit Schedule": "a59f867c13011a6ac908f776d51fdaea", "Bay Area 511 Sonoma-Marin Area Rail Transit Schedule": "ff1e2c730b22a1c4aa37e7761d3255f6", "Bay Area 511 South San Francisco Shuttle Schedule": "ba630a129e34a8006799c2ee831e0e5d", "Bay Area 511 Treasure Island Ferry Schedule": "119794b290ff1f99e5e9e113fbaa847a", "Bay Area 511 Tri Delta Schedule": "448e3f441fef94d57d32de8e1f05484a", "Bay Area 511 Tri-Valley Wheels Schedule": "a19cbdd982b19fb736cbfd5f66b29bc0", "Bay Area 511 Union City Transit Schedule": "ed7a212f2a38fd8734244030b40e4d07", "Bay Area 511 Vacaville City Coach Schedule": "5f6419482992db6e978d7ba2e408a74e", "Bay Area 511 Vine Transit Schedule": "5f484f169dde5ea2418f66738625777c", "Bay Area 511 WestCAT Schedule": "79b538f8de5df3e9d916f7cd08afd4ab", "Beach Cities GMV Schedule": "03568759e0fd897a68c9847794bacd6b", "Bear Schedule": "ea95c8dcb56129084dd7f5c4a119043e", "Beaumont Pass Schedule": "9da9e09185024f6bab03cc278de9886f", "Bell Gardens Schedule": "2dbcd03b82840a4b52d23828bc1fa12d", "Bellflower Bus Schedule": "63160ef89ac5a4523edde8241bdd3905", "Big Blue Bus Schedule": "4f9888472a8dad0f66bdbbd002312789", "BruinBus Schedule": "2cbe665ac64413246fda0871305d4fa5", "Burbank Schedule": "cc6a68a39d22c29b49116584971e69a8", "Calabasas Schedule": "a8be1c96aa131a4c2271ed7048621074", "Calaveras Schedule": "838cd930bc3c5729243a61473213c6ed", "Cerritos on Wheels Schedule": "e8b76578f756d3549e979b9f4221efcd", "Clovis Schedule": "a260afd3431d1b11bb52b577f8496079", "Commerce Schedule": "21079b3359aec64e8d5794b2f5ad8754", "Corona Schedule": "dd440b1b2e4c105089c2d3254797cf13", "County Express Schedule": "c83f711290e5c31d451b6baefe527449", "Cudahy Schedule": "28d7992b079bbee059f51f5efec0edb9", "Culver City Schedule": "a6c95be16ecdae7e1c67b0af7eaeece8", "Curry Public Transit Schedule": "b4f03b635700560adc7a42440da146f2", "Delano Schedule": "cc8fa3f993eb2ddd62fc25f8d2a4f100", "Desert Roadrunner GMV Schedule": "b7358e3e54b1beaff2e2865186d53f4b", "Desert Roadrunner Schedule": "21b1880b14e2a5ed44178c6bdf817f09", "DowneyLINK GMV Schedule": "16907949a95f7afd88877e0f7546b2b8", "Eastern Sierra Schedule": "e6e9970a5a71f9cc7744715c74dc4be5", "El Monte Schedule": "773df1360d8ea58a94f1edf1389d7e90", "El Segundo Schedule": "79a12e2b0dc13e28cadceb02b67f2e84", "Elk Grove Schedule": "e242a070135c77d6b29532710535ceac", "Flixbus Schedule": "0be541db97cfd882b514113d0b07331e", "Fresno County Schedule": "4fa9d5ffeaf91b69907c157823bbd630", "Fresno Schedule": "0b4f0b23718a0323b4b421d5f791ac0f", "GET Schedule": "43b5d727ce3c6284343d1c4c68021d5d", "Get Around Town Express Schedule": "aa76a2c389737d128e7cb47645dbff56", "Glendale Schedule": "3ddde0eff9e10d1890b63994c9069a28", "Glendora Schedule": "589baf4d91dd3c977d4e3ceb8577ab80", "Glenn Schedule": "43c8182daffb505a203d3326039951e1", "Go West Schedule": "b17c3a5b12a0f35116fc1ccbfe3f7377", "Grapeline Schedule": "73d901b57c7bd4864867d7f646118126", "Guadalupe Flyer Schedule": "5fa9af4d48e6413b60311e0ff676e657", "Havasu Landing Ferry Schedule": "5e87eda2c4c74832b576d8cc71daaef6", "Humboldt Schedule": "be03a73d3aec05cd63e4f202bff14be2", "Huntington Schedule": "570a2010bbdafdeb65c6b2cade7267b7", "Inglewood Schedule": "2243361a94f531aebfc3238755efafe0", "Kern Schedule": "d6e278a9183778c1cad84d65ed43a9a8", "Kings Schedule": "1e2952dd387b24f59cff4b05bc209bca", "LA DOT Schedule": "027d34cc5f198c0f977336eb11b022fd", "LA Metro Bus Schedule": "abeff52a3d6c1b064b1476e76efcd7eb", "LA Metro Rail Schedule": "ab5ba8c779e385d1b45720811c3055db", "LADPW Schedule": "dceccbf372ba48fe8e399210e815a266", "LAX FlyAway Schedule": "2fa463c64a2cad71ce1a13f9e6d0347f", "La Campana Schedule": "bf1af24c3bdcaa8f2dbb49b04bb749bc", "La Puente Schedule": "a965fb6f80747bf09f6550c52132a6ad", "Laguna Beach Schedule": "9bf604636f479b0b35c90eaff198e257", "Lake Schedule": "f1f7d2d19dbfb627a0a87ef42b11baae", "Lassen Flex": "c7cea554a5e958c1a6dae5d4f6ccdd6a", "Lassen Schedule": "55407fafa4579761cd7481c32f0d73df", "Lawndale Beat GMV Schedule": "3bf57f560af2e8ac0337b9f5ee526a40", "Lawndale Schedule": "2e77282f2d32aa83771b479304e315aa", "Lompoc Schedule": "8b2db7f63f83f1cd8b6f4783d22cf3f1", "Long Beach Schedule": "f21ba74c076985b449546c2d95c37c71", "Lynwood Schedule": "cbf2c1990bf0dbd9e8e762258daa916d", "Madera County Connection Schedule": "285a03115de490eeeb9dd92401f79d86", "Madera Metro Schedule": "726a476a7c2917a2cd7c94a409c5d0c5", "Manteca Schedule": "afced1bd22f810e3512f8d1f2c564178", "Maywood Schedule": "c5887b6f39e29f9167a051612cd2b413", "Mendocino Schedule": "7fc04b7067ee87146419f488d96925e2", "Merced GMV Schedule": "f9647f4843bc626496ce0713d3515c12", "Merced Schedule": "7a4bf0aaccd7aa130db46358ebdb5c26", "Metrolink Schedule": "1fc19f46e82ceb8c94281566b39a6669", "Montebello Schedule": "224bf24f6aa76263b3fc0da4bb7d8742", "Monterey Salinas Schedule": "2732f33e387ba4cf18db112652f27e82", "Morongo Basin Schedule": "3561fcdc346fea0b0076b5d3c520e4fb", "Morro Bay Cal-ITP Schedule": "0b6ae9e85ac91e1ac07ab7feb1a07025", "Mountain Transit Schedule": "d3d074aed7bfa659d40c82224d9fb65c", "Needles Schedule": "da49c06375c9e7147372ed4e0b22cb51", "Nevada County Schedule": "f7a2121f01eef823fb9018028a5c7f41", "North County Schedule": "5541f14a535f524a15f0b29c709ff8a9", "Norwalk Avail Schedule": "100287571bdd6fc29130f859003839c3", "OCTA Schedule": "fc78f3d0dd81deaafc8579658a601979", "OmniTrans Schedule": "cf48679daf4bb84ab047eb3545235017", "Oregon POINT": "22aec1c6d914f1b56fa7d1d28b38fa9d", "Palos Verdes PTA Schedule": "a8f962b2a267af7219934c633f70010e", "Pasadena Schedule": "2fe2507b367e9b7de273638253b12736", "Placer Schedule": "0f541ed38d1f1d7ca7e5644ca897df8f", "Plumas Schedule": "2f1fe743e8fa808f894eda037f1d323d", "PresidiGo Schedule": "aa4dd6132506fb6e79f3aa47f7d30c25", "Redding Schedule": "7473dd848115dab4c7398ae2c9bed32e", "Redwood Coast Schedule": "87c96d5026263d6986f2cabe6892390c", "Riverside Schedule": "1d3f8d3254f9599f50c1a2cba341221f", "Rosemead Schedule": "8d3f3a5dc869aa8651eab0d48f5aab73", "Roseville Schedule": "eb84a676e532815c20460372738db529", "SBMTD Schedule": "4c1d21267c7623c3ab3a53e594545e09", "SLO Schedule": "c3b4339d1086c444cd346c593bc0146e", "SLORTA Schedule": "bac571e36ad1d7d2ae3faec83599b05a", "Sacramento Schedule": "7a1f20927610bf432cff2c09ecc3751e", "Sage Stage Schedule": "36172c7bc5b28993bc16550722793a97", "San Diego Schedule": "db8c6e0cf5ece2a8cdb5bdc71d049bd1", "San Joaquin Schedule": "5b28e1f173801414d73b6e6d38eb037c", "Santa Clarita Schedule": "257cc2d386f044176b9df3c5caeda7fc", "Santa Maria Schedule": "14dee63047914f25fd449d8d072976f9", "Santa Ynez Mecatran Schedule": "638d90ba5ade8b25240024e6cae907e9", "Sierra Madre Schedule": "7497b2e09bb02196cf45d9ab664529e3", "Siskiyou Schedule": "f12e4782e7a1751f1c1e8dfb2a24861d", "South County Transit Link Schedule": "d2da5f9228647ca4de8fc50e0e70f1ec", "Spirit Bus Passio Schedule": "8b5212e73c76745636af5441bdc53126", "Stanford Schedule": "2cd865d982bdf94dfb26098a0d711dc4", "SunLine Avail Schedule": "acb4406d86c941ffce5dc80c99a8894a", "TART, North Lake Tahoe Schedule": "21279ca99b580876dde7723241a35cc1", "TCRTA TripShot Schedule": "b2f31e68f5540ba1f004fec60d7210d1", "Tahoe Transportation District GMV Schedule": "c7bfff694a904987a1536a3b5b283da2", "Tahoe Transportation District Schedule": "2c81de89a7463d5ca5df230d0ceb40fd", "Tehama Schedule": "b9e75e0e9b59f047993303b0e6661d06", "Torrance Schedule": "8c50b8f4196a981d7da3abb13571b7fe", "Tracy Schedule": "002790c3b23889605c337dc8129ee1c2", "Trinity Schedule": "62fd7a2e33ec8ee826a52b39ce876c1a", "Turlock Schedule": "a200a4de5134e969beada4855e80f31f", "Unitrans Schedule": "9e0f4e4dc580d7b1e9c7d0b74affb2a3", "VCTC GMV Schedule": "739b9aee397417176e0a2e787314de32", "Victor Valley GMV Schedule": "ead053d8e591aa10163c0144bf142815", "Victor Valley Schedule": "1127081b46abe8fc5bf6e0961765b3d0", "Visalia Schedule": "da71b7bad5421e2141005ecfcb4fbd3c", "YARTS Schedule": "20e4b67650c2363b1e26b21ec725ab17", "Yolobus Schedule": "9097af5e9a0e3909ca754a46ca037919", "Yosemite Valley Shuttle Schedule": "f5c7576953c56581626ecf780e87684c", "Yuba-Sutter Schedule": "a9eee46a1213e1bdf5b3268ebdb5a380", "Yuma Schedule": "cb17eac6579cda46a96179f6f29a807c", "eTrans Schedule": "34d23ec988be15989fd45f6d3c69d11d"}} \ No newline at end of file diff --git a/open_data/update_vars.py b/open_data/update_vars.py index dbf5a2262..42be4729f 100644 --- a/open_data/update_vars.py +++ b/open_data/update_vars.py @@ -1,7 +1,7 @@ from pathlib import Path from shared_utils import rt_dates -analysis_date = rt_dates.DATES["jan2024"] +analysis_date = rt_dates.DATES["feb2024"] GCS_FILE_PATH = "gs://calitp-analytics-data/data-analyses/" COMPILED_CACHED_VIEWS = f"{GCS_FILE_PATH}rt_delay/compiled_cached_views/" diff --git a/portfolio/route_speeds/_toc.yml b/portfolio/route_speeds/_toc.yml index e69518d2b..52854df0c 100644 --- a/portfolio/route_speeds/_toc.yml +++ b/portfolio/route_speeds/_toc.yml @@ -6,7 +6,9 @@ parts: - file: name_avalon-schedule/0__28_route_averages__name_avalon-schedule.ipynb - file: name_banning-pass-schedule/0__28_route_averages__name_banning-pass-schedule.ipynb - file: name_bay-area-511-ac-transit-schedule/0__28_route_averages__name_bay-area-511-ac-transit-schedule.ipynb + - file: name_bay-area-511-ace-schedule/0__28_route_averages__name_bay-area-511-ace-schedule.ipynb - file: name_bay-area-511-caltrain-schedule/0__28_route_averages__name_bay-area-511-caltrain-schedule.ipynb + - file: name_bay-area-511-capitol-corridor-schedule/0__28_route_averages__name_bay-area-511-capitol-corridor-schedule.ipynb - file: name_bay-area-511-county-connection-schedule/0__28_route_averages__name_bay-area-511-county-connection-schedule.ipynb - file: name_bay-area-511-dumbarton-express-schedule/0__28_route_averages__name_bay-area-511-dumbarton-express-schedule.ipynb - file: name_bay-area-511-fairfield-and-suisun-transit-schedule/0__28_route_averages__name_bay-area-511-fairfield-and-suisun-transit-schedule.ipynb diff --git a/portfolio/route_speeds/name_antelope-valley-transit-authority-schedule/0__28_route_averages__name_antelope-valley-transit-authority-schedule.ipynb b/portfolio/route_speeds/name_antelope-valley-transit-authority-schedule/0__28_route_averages__name_antelope-valley-transit-authority-schedule.ipynb index 10dcd6a55..5c2aee906 100644 --- a/portfolio/route_speeds/name_antelope-valley-transit-authority-schedule/0__28_route_averages__name_antelope-valley-transit-authority-schedule.ipynb +++ b/portfolio/route_speeds/name_antelope-valley-transit-authority-schedule/0__28_route_averages__name_antelope-valley-transit-authority-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c1ec522ffb56c5219e4f5cd2da63c5a4fa542a228df3bc87831141ad70c1e93 -size 725154 +oid sha256:748a8dff61bca3cf182e4e1ff2d558f0692f7f88fa75a101220865954b4a347a +size 813922 diff --git a/portfolio/route_speeds/name_avalon-schedule/0__28_route_averages__name_avalon-schedule.ipynb b/portfolio/route_speeds/name_avalon-schedule/0__28_route_averages__name_avalon-schedule.ipynb index 437ee1d1e..9b6074b0b 100644 --- a/portfolio/route_speeds/name_avalon-schedule/0__28_route_averages__name_avalon-schedule.ipynb +++ b/portfolio/route_speeds/name_avalon-schedule/0__28_route_averages__name_avalon-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:073a354648221d385a2da25413f4e6727e6ea818fc3c3821779c8a0dbce47ab8 -size 39961 +oid sha256:329a454a2fd924f094b7b07cefeceef220feeaf9e508f233fdf9c104b94bace0 +size 39292 diff --git a/portfolio/route_speeds/name_banning-pass-schedule/0__28_route_averages__name_banning-pass-schedule.ipynb b/portfolio/route_speeds/name_banning-pass-schedule/0__28_route_averages__name_banning-pass-schedule.ipynb index f51c762bd..bdc55f005 100644 --- a/portfolio/route_speeds/name_banning-pass-schedule/0__28_route_averages__name_banning-pass-schedule.ipynb +++ b/portfolio/route_speeds/name_banning-pass-schedule/0__28_route_averages__name_banning-pass-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c733bf03fa0005337f1c27ea505c250cce3ee7fe5216e0d7aa01420a7cfd60d9 -size 91082 +oid sha256:fe92c65751d055e39e8d077d9a28d416c581d9b05100a41fb5cc558b7604c709 +size 130504 diff --git a/portfolio/route_speeds/name_bay-area-511-ac-transit-schedule/0__28_route_averages__name_bay-area-511-ac-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-ac-transit-schedule/0__28_route_averages__name_bay-area-511-ac-transit-schedule.ipynb index e85277b32..d00225392 100644 --- a/portfolio/route_speeds/name_bay-area-511-ac-transit-schedule/0__28_route_averages__name_bay-area-511-ac-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-ac-transit-schedule/0__28_route_averages__name_bay-area-511-ac-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a54eb6feccdcde55a783e9a88ef0a9fce0078237785fb6ab3c0a216b3d1825b -size 4481548 +oid sha256:c430d992c0fe1557e7c43c8fccd48ef43160aed05682fa3ce6dfde3be1a375b8 +size 5480767 diff --git a/portfolio/route_speeds/name_bay-area-511-ace-schedule/0__28_route_averages__name_bay-area-511-ace-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-ace-schedule/0__28_route_averages__name_bay-area-511-ace-schedule.ipynb new file mode 100644 index 000000000..546a11074 --- /dev/null +++ b/portfolio/route_speeds/name_bay-area-511-ace-schedule/0__28_route_averages__name_bay-area-511-ace-schedule.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3efaf79efa1b7f3b0e1aa62d1ce08eb9dafdbfafd1d6917e0b69e4a0aaf4ea9 +size 33342 diff --git a/portfolio/route_speeds/name_bay-area-511-caltrain-schedule/0__28_route_averages__name_bay-area-511-caltrain-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-caltrain-schedule/0__28_route_averages__name_bay-area-511-caltrain-schedule.ipynb index 9bdcf7df4..cbb1a0bd2 100644 --- a/portfolio/route_speeds/name_bay-area-511-caltrain-schedule/0__28_route_averages__name_bay-area-511-caltrain-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-caltrain-schedule/0__28_route_averages__name_bay-area-511-caltrain-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b64c40854b08959ff36c398df1cd745b8bd95e7fb01dfb9de04b92752f5e2414 -size 88603 +oid sha256:51fb44965f969089df5a1b3572819b47e675e57dfb1a7a36ad26259af274ea37 +size 237310 diff --git a/portfolio/route_speeds/name_bay-area-511-capitol-corridor-schedule/0__28_route_averages__name_bay-area-511-capitol-corridor-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-capitol-corridor-schedule/0__28_route_averages__name_bay-area-511-capitol-corridor-schedule.ipynb new file mode 100644 index 000000000..60670157d --- /dev/null +++ b/portfolio/route_speeds/name_bay-area-511-capitol-corridor-schedule/0__28_route_averages__name_bay-area-511-capitol-corridor-schedule.ipynb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70bd38900d04d502f6d2628d998510028433e54e4ca63fde97a7b2560901213c +size 38332 diff --git a/portfolio/route_speeds/name_bay-area-511-county-connection-schedule/0__28_route_averages__name_bay-area-511-county-connection-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-county-connection-schedule/0__28_route_averages__name_bay-area-511-county-connection-schedule.ipynb index ec73db47c..115553185 100644 --- a/portfolio/route_speeds/name_bay-area-511-county-connection-schedule/0__28_route_averages__name_bay-area-511-county-connection-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-county-connection-schedule/0__28_route_averages__name_bay-area-511-county-connection-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:952ea05d45756694ed21c82605d569730f19cedd77f52630a6367d11bb9ef59e -size 1386254 +oid sha256:f1f55e310737d82bce35a71280f3c8ce0ef61999accb33b3e2f7fee8ef4b7721 +size 1683548 diff --git a/portfolio/route_speeds/name_bay-area-511-dumbarton-express-schedule/0__28_route_averages__name_bay-area-511-dumbarton-express-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-dumbarton-express-schedule/0__28_route_averages__name_bay-area-511-dumbarton-express-schedule.ipynb index 6972e71a3..601cd50e1 100644 --- a/portfolio/route_speeds/name_bay-area-511-dumbarton-express-schedule/0__28_route_averages__name_bay-area-511-dumbarton-express-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-dumbarton-express-schedule/0__28_route_averages__name_bay-area-511-dumbarton-express-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99e8a37b1d544ad531009596762b49ccc4dfe42bd416585699dbebae817a2272 -size 120090 +oid sha256:74654ab2d5e955c68528c9019b0ceac53758993a19174629b9d515253df35919 +size 133085 diff --git a/portfolio/route_speeds/name_bay-area-511-fairfield-and-suisun-transit-schedule/0__28_route_averages__name_bay-area-511-fairfield-and-suisun-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-fairfield-and-suisun-transit-schedule/0__28_route_averages__name_bay-area-511-fairfield-and-suisun-transit-schedule.ipynb index 131583d59..ac80ae60d 100644 --- a/portfolio/route_speeds/name_bay-area-511-fairfield-and-suisun-transit-schedule/0__28_route_averages__name_bay-area-511-fairfield-and-suisun-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-fairfield-and-suisun-transit-schedule/0__28_route_averages__name_bay-area-511-fairfield-and-suisun-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bdd91ceee1ecebc82e562cddb2d431955e33e3528fe85c5dcb432e4b0dbff17c -size 273578 +oid sha256:b18f2f6d39423ad2aa54d4d07ff382461f2f679287632791d0dd4d081c4eadfd +size 337670 diff --git a/portfolio/route_speeds/name_bay-area-511-golden-gate-transit-schedule/0__28_route_averages__name_bay-area-511-golden-gate-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-golden-gate-transit-schedule/0__28_route_averages__name_bay-area-511-golden-gate-transit-schedule.ipynb index 39b51491d..aa31e2aa7 100644 --- a/portfolio/route_speeds/name_bay-area-511-golden-gate-transit-schedule/0__28_route_averages__name_bay-area-511-golden-gate-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-golden-gate-transit-schedule/0__28_route_averages__name_bay-area-511-golden-gate-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eaa6931fd32ea65dc5739a1bd9114b350873f0047de6a3db11343cdf60a1db94 -size 425201 +oid sha256:b0c9807a516a0555d741cdba9d27ef02c0e76d993fd7b6c7a760a65525677854 +size 434121 diff --git a/portfolio/route_speeds/name_bay-area-511-marin-schedule/0__28_route_averages__name_bay-area-511-marin-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-marin-schedule/0__28_route_averages__name_bay-area-511-marin-schedule.ipynb index f8d81eda6..b5a10faa3 100644 --- a/portfolio/route_speeds/name_bay-area-511-marin-schedule/0__28_route_averages__name_bay-area-511-marin-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-marin-schedule/0__28_route_averages__name_bay-area-511-marin-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7902a3ede061b54d5c2ba51c2314e8dbd7dbf660e92e091f48ed97d253cb3f1a -size 864856 +oid sha256:b96ea5ea14e40bda44951aeb26e7fc58acd7a948fd113d18f1ded40dba3d77c5 +size 957439 diff --git a/portfolio/route_speeds/name_bay-area-511-muni-schedule/0__28_route_averages__name_bay-area-511-muni-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-muni-schedule/0__28_route_averages__name_bay-area-511-muni-schedule.ipynb index 7d144b65d..7b79b5ef9 100644 --- a/portfolio/route_speeds/name_bay-area-511-muni-schedule/0__28_route_averages__name_bay-area-511-muni-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-muni-schedule/0__28_route_averages__name_bay-area-511-muni-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d158d77740d26b9083b376513ca76b536af04a740e1949188f70450a13d6c4c -size 2808191 +oid sha256:14a04506c7f9524dbccb467496ad7d55be6be68cc71c5af51694fc1986ee832b +size 3120772 diff --git a/portfolio/route_speeds/name_bay-area-511-mvgo-schedule/0__28_route_averages__name_bay-area-511-mvgo-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-mvgo-schedule/0__28_route_averages__name_bay-area-511-mvgo-schedule.ipynb index 646420044..5b87dda0c 100644 --- a/portfolio/route_speeds/name_bay-area-511-mvgo-schedule/0__28_route_averages__name_bay-area-511-mvgo-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-mvgo-schedule/0__28_route_averages__name_bay-area-511-mvgo-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec349ea4c2b724b6cf2547a6d432a97553fb82873137be05c478aa50da2a6241 -size 88914 +oid sha256:2a6bb7679c59f29be49cac5d3da44e8b2bd1990732a6328610d2dd0d56cc21c9 +size 100169 diff --git a/portfolio/route_speeds/name_bay-area-511-petaluma-schedule/0__28_route_averages__name_bay-area-511-petaluma-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-petaluma-schedule/0__28_route_averages__name_bay-area-511-petaluma-schedule.ipynb index bd7b56543..291feafc5 100644 --- a/portfolio/route_speeds/name_bay-area-511-petaluma-schedule/0__28_route_averages__name_bay-area-511-petaluma-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-petaluma-schedule/0__28_route_averages__name_bay-area-511-petaluma-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:14ee6e63af0a29d3cba6ead3f8a444544684eed580f652ba6c78af08454b583e -size 201608 +oid sha256:458425f8b01a2cf243e6f5e58a8db83227e1d19ea9dc48c52b9d2a23b0122181 +size 195315 diff --git a/portfolio/route_speeds/name_bay-area-511-samtrans-schedule/0__28_route_averages__name_bay-area-511-samtrans-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-samtrans-schedule/0__28_route_averages__name_bay-area-511-samtrans-schedule.ipynb index 386e8510a..dc0d1de62 100644 --- a/portfolio/route_speeds/name_bay-area-511-samtrans-schedule/0__28_route_averages__name_bay-area-511-samtrans-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-samtrans-schedule/0__28_route_averages__name_bay-area-511-samtrans-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6b5f9dc4b4b80aa3fd101e707b16b04372f48808e1ed7f7db85a24cdaf7b926 -size 2249835 +oid sha256:e6ba196c51816955d302c6eaa4a68d0daa2a1af74c63576e4ee2ccb7fee372be +size 2620995 diff --git a/portfolio/route_speeds/name_bay-area-511-san-francisco-bay-ferry-schedule/0__28_route_averages__name_bay-area-511-san-francisco-bay-ferry-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-san-francisco-bay-ferry-schedule/0__28_route_averages__name_bay-area-511-san-francisco-bay-ferry-schedule.ipynb index a71d5a6f4..7be9261c2 100644 --- a/portfolio/route_speeds/name_bay-area-511-san-francisco-bay-ferry-schedule/0__28_route_averages__name_bay-area-511-san-francisco-bay-ferry-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-san-francisco-bay-ferry-schedule/0__28_route_averages__name_bay-area-511-san-francisco-bay-ferry-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9aabb6943a6edf75bc7b216b1d737e1eca0d2f7ce9e4f61c67673936a17b8df4 -size 57182 +oid sha256:366776201fe593f803083b7ec02ec1b08c499fdca6436ef94066ecadbe6d1905 +size 20228 diff --git a/portfolio/route_speeds/name_bay-area-511-santa-clara-transit-schedule/0__28_route_averages__name_bay-area-511-santa-clara-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-santa-clara-transit-schedule/0__28_route_averages__name_bay-area-511-santa-clara-transit-schedule.ipynb index 7a5ea507b..864a54ebf 100644 --- a/portfolio/route_speeds/name_bay-area-511-santa-clara-transit-schedule/0__28_route_averages__name_bay-area-511-santa-clara-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-santa-clara-transit-schedule/0__28_route_averages__name_bay-area-511-santa-clara-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ec670244590aa7f5986e8c99bf73cf3fc9a525b92b21e90bf2eb7436c9165f2 -size 2894409 +oid sha256:682c74f43b068b9d49a653ff3bb75a23acd72e944a24a730e782c7ab806a7a73 +size 3241343 diff --git a/portfolio/route_speeds/name_bay-area-511-santa-rosa-citybus-schedule/0__28_route_averages__name_bay-area-511-santa-rosa-citybus-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-santa-rosa-citybus-schedule/0__28_route_averages__name_bay-area-511-santa-rosa-citybus-schedule.ipynb index 7c5a19a85..9e1cc3b29 100644 --- a/portfolio/route_speeds/name_bay-area-511-santa-rosa-citybus-schedule/0__28_route_averages__name_bay-area-511-santa-rosa-citybus-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-santa-rosa-citybus-schedule/0__28_route_averages__name_bay-area-511-santa-rosa-citybus-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:037cd8bd1dc87617b22b050219f7ba1b925835c9b77497dc7e63e79b72ebbac7 -size 399129 +oid sha256:ec2198dda9676e2941d10e56378719ae5933a90cf59ea2a4438e3a27cc1d47b3 +size 439936 diff --git a/portfolio/route_speeds/name_bay-area-511-soltrans-schedule/0__28_route_averages__name_bay-area-511-soltrans-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-soltrans-schedule/0__28_route_averages__name_bay-area-511-soltrans-schedule.ipynb index e071cefe9..da3e125ae 100644 --- a/portfolio/route_speeds/name_bay-area-511-soltrans-schedule/0__28_route_averages__name_bay-area-511-soltrans-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-soltrans-schedule/0__28_route_averages__name_bay-area-511-soltrans-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fcee56a5f23699102255fe3d1d46f8339de0196fe6ccaf8b4a0a83cce7fc2247 -size 528185 +oid sha256:f6deb716e5d7fa9d5d1bed0fed59ba4020f99a34f0e42e250bf25aa2a0b75b2e +size 646686 diff --git a/portfolio/route_speeds/name_bay-area-511-sonoma-marin-area-rail-transit-schedule/0__28_route_averages__name_bay-area-511-sonoma-marin-area-rail-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-sonoma-marin-area-rail-transit-schedule/0__28_route_averages__name_bay-area-511-sonoma-marin-area-rail-transit-schedule.ipynb index 46eda2b47..55fca9955 100644 --- a/portfolio/route_speeds/name_bay-area-511-sonoma-marin-area-rail-transit-schedule/0__28_route_averages__name_bay-area-511-sonoma-marin-area-rail-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-sonoma-marin-area-rail-transit-schedule/0__28_route_averages__name_bay-area-511-sonoma-marin-area-rail-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fb2d391199520a2c06ffa4de1ffe8d654deb1b9343927554dd758bc8731efb6 -size 25119 +oid sha256:bf0610de1dc40c3950a8fc611b97b48b733745d78209c0ebef2a02e4064d7763 +size 77338 diff --git a/portfolio/route_speeds/name_bay-area-511-tri-delta-schedule/0__28_route_averages__name_bay-area-511-tri-delta-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-tri-delta-schedule/0__28_route_averages__name_bay-area-511-tri-delta-schedule.ipynb index 1f5926b43..41d6ef924 100644 --- a/portfolio/route_speeds/name_bay-area-511-tri-delta-schedule/0__28_route_averages__name_bay-area-511-tri-delta-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-tri-delta-schedule/0__28_route_averages__name_bay-area-511-tri-delta-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0bd68888c72514146e4d7c36ac1925b80089d9a6a0c986b1858f4eab5098e9f -size 665384 +oid sha256:d6c36896f0f73fd7d3c1e9d29766ed125e90e588b202114a5c3cddcc314333c7 +size 748840 diff --git a/portfolio/route_speeds/name_bay-area-511-tri-valley-wheels-schedule/0__28_route_averages__name_bay-area-511-tri-valley-wheels-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-tri-valley-wheels-schedule/0__28_route_averages__name_bay-area-511-tri-valley-wheels-schedule.ipynb index 207273ab6..bf6438805 100644 --- a/portfolio/route_speeds/name_bay-area-511-tri-valley-wheels-schedule/0__28_route_averages__name_bay-area-511-tri-valley-wheels-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-tri-valley-wheels-schedule/0__28_route_averages__name_bay-area-511-tri-valley-wheels-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74a606bcb35f1ae35ce7e70cd48aabd93ae6e041eb6f96e16b27b5339c2db3b6 -size 666180 +oid sha256:79c9482b06098839f06996023a43e3c2f0d4f7ef48e1df40b821bfddebca96ed +size 792989 diff --git a/portfolio/route_speeds/name_bay-area-511-union-city-transit-schedule/0__28_route_averages__name_bay-area-511-union-city-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-union-city-transit-schedule/0__28_route_averages__name_bay-area-511-union-city-transit-schedule.ipynb index 3e8ded804..72dd45167 100644 --- a/portfolio/route_speeds/name_bay-area-511-union-city-transit-schedule/0__28_route_averages__name_bay-area-511-union-city-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-union-city-transit-schedule/0__28_route_averages__name_bay-area-511-union-city-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ce58b2bbf3a15d5e94fa6de2ec44d5a7c347d6b0aa31dffb17c9ae30fe2dc6e -size 238547 +oid sha256:446e36961c872c58fd254887b1bb11235039d779de9271f60a715659c9a72989 +size 261603 diff --git a/portfolio/route_speeds/name_bay-area-511-vine-transit-schedule/0__28_route_averages__name_bay-area-511-vine-transit-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-vine-transit-schedule/0__28_route_averages__name_bay-area-511-vine-transit-schedule.ipynb index ff28dceab..d05bca594 100644 --- a/portfolio/route_speeds/name_bay-area-511-vine-transit-schedule/0__28_route_averages__name_bay-area-511-vine-transit-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-vine-transit-schedule/0__28_route_averages__name_bay-area-511-vine-transit-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eaac294f68d2852e126dbd0f58f1072f81e165b554ef51f6f5c5c5fa3e64e2f9 -size 223194 +oid sha256:11826e36cb61f099b2b0d7dbe94eb5d69701728faa0bab490a4e40b3dce2cfe7 +size 335372 diff --git a/portfolio/route_speeds/name_bay-area-511-westcat-schedule/0__28_route_averages__name_bay-area-511-westcat-schedule.ipynb b/portfolio/route_speeds/name_bay-area-511-westcat-schedule/0__28_route_averages__name_bay-area-511-westcat-schedule.ipynb index b21d92a0b..2e607d7f3 100644 --- a/portfolio/route_speeds/name_bay-area-511-westcat-schedule/0__28_route_averages__name_bay-area-511-westcat-schedule.ipynb +++ b/portfolio/route_speeds/name_bay-area-511-westcat-schedule/0__28_route_averages__name_bay-area-511-westcat-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:401fe5934581d781f1f92b1ed5ef0380b3bbac2d27c14c808fea42f4ac3e941c -size 376427 +oid sha256:885aa52907fc1381a86bf6485c1dad21530b71b572a02514bffaecfc0b1a174c +size 464415 diff --git a/portfolio/route_speeds/name_beach-cities-gmv-schedule/0__28_route_averages__name_beach-cities-gmv-schedule.ipynb b/portfolio/route_speeds/name_beach-cities-gmv-schedule/0__28_route_averages__name_beach-cities-gmv-schedule.ipynb index 95856db22..332f668b9 100644 --- a/portfolio/route_speeds/name_beach-cities-gmv-schedule/0__28_route_averages__name_beach-cities-gmv-schedule.ipynb +++ b/portfolio/route_speeds/name_beach-cities-gmv-schedule/0__28_route_averages__name_beach-cities-gmv-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5206c56b89bcc9c4a7f03e7f3174437aed6db4ae0c1ac8a2e35bf83d26217040 -size 109963 +oid sha256:cb80f4f14ea3250cb03b287ad2aa8a8c761bea4643d23d359cdaf73ed321af09 +size 120144 diff --git a/portfolio/route_speeds/name_bear-schedule/0__28_route_averages__name_bear-schedule.ipynb b/portfolio/route_speeds/name_bear-schedule/0__28_route_averages__name_bear-schedule.ipynb index 9fa3fbc93..4cb1cf2fe 100644 --- a/portfolio/route_speeds/name_bear-schedule/0__28_route_averages__name_bear-schedule.ipynb +++ b/portfolio/route_speeds/name_bear-schedule/0__28_route_averages__name_bear-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02d96c35de58d31eb11e71e5ad3433c3346511821a3c08aa8549a04b5c176e39 -size 134409 +oid sha256:257e24c341a13c6e67cedaffe27fa45d00ca99c990997db1e53b9cc173534214 +size 129371 diff --git a/portfolio/route_speeds/name_beaumont-pass-schedule/0__28_route_averages__name_beaumont-pass-schedule.ipynb b/portfolio/route_speeds/name_beaumont-pass-schedule/0__28_route_averages__name_beaumont-pass-schedule.ipynb index 757cd0b46..f978f3360 100644 --- a/portfolio/route_speeds/name_beaumont-pass-schedule/0__28_route_averages__name_beaumont-pass-schedule.ipynb +++ b/portfolio/route_speeds/name_beaumont-pass-schedule/0__28_route_averages__name_beaumont-pass-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdb18ede09267606a95a9ac44a1c39933de6f4cbc2460890e490bce95a1bf8c3 -size 203511 +oid sha256:aca4a43182762779789abf903339bc7c1a623649ff229fc345d089fc1b081a99 +size 282514 diff --git a/portfolio/route_speeds/name_big-blue-bus-schedule/0__28_route_averages__name_big-blue-bus-schedule.ipynb b/portfolio/route_speeds/name_big-blue-bus-schedule/0__28_route_averages__name_big-blue-bus-schedule.ipynb index 09ea52527..374bb4c75 100644 --- a/portfolio/route_speeds/name_big-blue-bus-schedule/0__28_route_averages__name_big-blue-bus-schedule.ipynb +++ b/portfolio/route_speeds/name_big-blue-bus-schedule/0__28_route_averages__name_big-blue-bus-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0aad5a6a289f89602bb9e1a4c6c6898e8977ea1f707ab02d580a747bf39171a3 -size 813437 +oid sha256:c1c05a79a5ce4d6fba6bb4446c619e2548cbd1b2340638abb5b9f196b8340b37 +size 894016 diff --git a/portfolio/route_speeds/name_bruinbus-schedule/0__28_route_averages__name_bruinbus-schedule.ipynb b/portfolio/route_speeds/name_bruinbus-schedule/0__28_route_averages__name_bruinbus-schedule.ipynb index dcb132db6..8c079c47d 100644 --- a/portfolio/route_speeds/name_bruinbus-schedule/0__28_route_averages__name_bruinbus-schedule.ipynb +++ b/portfolio/route_speeds/name_bruinbus-schedule/0__28_route_averages__name_bruinbus-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:07494c8ff02bcaf5bd66926a75bf958a8a9073145f7182ac7e9d927aa5ce7edb -size 34173 +oid sha256:4768618026673a68f38c3ba1afcbe246b198a7743f73fd7c54f0ffc2bd9b5edc +size 34214 diff --git a/portfolio/route_speeds/name_burbank-schedule/0__28_route_averages__name_burbank-schedule.ipynb b/portfolio/route_speeds/name_burbank-schedule/0__28_route_averages__name_burbank-schedule.ipynb index 0b0eca747..e056082ed 100644 --- a/portfolio/route_speeds/name_burbank-schedule/0__28_route_averages__name_burbank-schedule.ipynb +++ b/portfolio/route_speeds/name_burbank-schedule/0__28_route_averages__name_burbank-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2498ac1119e826431040043ec9f7a197817324b72bc6708a82b7d5b788e3c3bd -size 64791 +oid sha256:08b1894852151b223a6b2d65b2c84283af4b34ccb5d16a73ad0f9dc8f8f6ddfa +size 68909 diff --git a/portfolio/route_speeds/name_commerce-schedule/0__28_route_averages__name_commerce-schedule.ipynb b/portfolio/route_speeds/name_commerce-schedule/0__28_route_averages__name_commerce-schedule.ipynb index ad2316075..f4952df8b 100644 --- a/portfolio/route_speeds/name_commerce-schedule/0__28_route_averages__name_commerce-schedule.ipynb +++ b/portfolio/route_speeds/name_commerce-schedule/0__28_route_averages__name_commerce-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b1bf25edcd0ccbc3ec26ba5eb8fe04cba6f14ec21ba830dbf62e46e16ecf0b2 -size 149011 +oid sha256:a59b1a10223e69e6a650df69475394ac023be10a471521a99c3f8b7045314cbe +size 151181 diff --git a/portfolio/route_speeds/name_culver-city-schedule/0__28_route_averages__name_culver-city-schedule.ipynb b/portfolio/route_speeds/name_culver-city-schedule/0__28_route_averages__name_culver-city-schedule.ipynb index 024736918..378bc8405 100644 --- a/portfolio/route_speeds/name_culver-city-schedule/0__28_route_averages__name_culver-city-schedule.ipynb +++ b/portfolio/route_speeds/name_culver-city-schedule/0__28_route_averages__name_culver-city-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71b6d26cce86a988040c02b73651b1293571a5a74d8913a830b70e54aa36b7f8 -size 402336 +oid sha256:afd16c0aca9105372f7c019308c0887d44aaa1c8fd95757de33a411f2660b1c3 +size 467156 diff --git a/portfolio/route_speeds/name_desert-roadrunner-gmv-schedule/0__28_route_averages__name_desert-roadrunner-gmv-schedule.ipynb b/portfolio/route_speeds/name_desert-roadrunner-gmv-schedule/0__28_route_averages__name_desert-roadrunner-gmv-schedule.ipynb index d1b1919c0..1b7c3c39d 100644 --- a/portfolio/route_speeds/name_desert-roadrunner-gmv-schedule/0__28_route_averages__name_desert-roadrunner-gmv-schedule.ipynb +++ b/portfolio/route_speeds/name_desert-roadrunner-gmv-schedule/0__28_route_averages__name_desert-roadrunner-gmv-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:667b354c36060f2a34ab6009eff94abb8d0087e0eb1e1524da54485fc612e8b0 -size 40300 +oid sha256:3cb7505e38ef1c804e5d85e30baf6c33dbfba57d65dd28c651045c14db4de2ac +size 57140 diff --git a/portfolio/route_speeds/name_eastern-sierra-schedule/0__28_route_averages__name_eastern-sierra-schedule.ipynb b/portfolio/route_speeds/name_eastern-sierra-schedule/0__28_route_averages__name_eastern-sierra-schedule.ipynb index 3f43a137b..ec08e76e7 100644 --- a/portfolio/route_speeds/name_eastern-sierra-schedule/0__28_route_averages__name_eastern-sierra-schedule.ipynb +++ b/portfolio/route_speeds/name_eastern-sierra-schedule/0__28_route_averages__name_eastern-sierra-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:156fb920959e117547daa550cd0155a0808913e61a081a9c1d1c11e16155786d -size 160285 +oid sha256:cecaa4225da392244723c31d144d44d4deff98f080fbd9aad88237726fb02245 +size 161742 diff --git a/portfolio/route_speeds/name_elk-grove-schedule/0__28_route_averages__name_elk-grove-schedule.ipynb b/portfolio/route_speeds/name_elk-grove-schedule/0__28_route_averages__name_elk-grove-schedule.ipynb index f059b9b08..add54a1ae 100644 --- a/portfolio/route_speeds/name_elk-grove-schedule/0__28_route_averages__name_elk-grove-schedule.ipynb +++ b/portfolio/route_speeds/name_elk-grove-schedule/0__28_route_averages__name_elk-grove-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8ffb8d030c384b92bcc5bf8bb74d1b689460865c3d33463046b631abaf401c35 -size 584253 +oid sha256:59db95f8402b2e710a3b86f591de83b022e64bf09b71d63a79d52bad4aa8d95e +size 664273 diff --git a/portfolio/route_speeds/name_etrans-schedule/0__28_route_averages__name_etrans-schedule.ipynb b/portfolio/route_speeds/name_etrans-schedule/0__28_route_averages__name_etrans-schedule.ipynb index bd3cb7e93..08458ef94 100644 --- a/portfolio/route_speeds/name_etrans-schedule/0__28_route_averages__name_etrans-schedule.ipynb +++ b/portfolio/route_speeds/name_etrans-schedule/0__28_route_averages__name_etrans-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d02339870fceb2d1b24aae0550202ae6b8052a7e37393d2ab655698a8514f0de -size 52984 +oid sha256:bc7e7c8771ebf97b447d98c55418dabcd35c0b8546fe035736852e7a4ed9a73e +size 62421 diff --git a/portfolio/route_speeds/name_fresno-schedule/0__28_route_averages__name_fresno-schedule.ipynb b/portfolio/route_speeds/name_fresno-schedule/0__28_route_averages__name_fresno-schedule.ipynb index 951386691..58a7d93a9 100644 --- a/portfolio/route_speeds/name_fresno-schedule/0__28_route_averages__name_fresno-schedule.ipynb +++ b/portfolio/route_speeds/name_fresno-schedule/0__28_route_averages__name_fresno-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a24619aff96d820c2c6eff86b626d8848f993f40d9396133e91ed7d8dde42a5 -size 732992 +oid sha256:0caabad8a379e57282de18c5337006e3c7224d87350af75d140a1e89f3df2b70 +size 788660 diff --git a/portfolio/route_speeds/name_get-schedule/0__28_route_averages__name_get-schedule.ipynb b/portfolio/route_speeds/name_get-schedule/0__28_route_averages__name_get-schedule.ipynb index a8cdd7868..6a9dc68c3 100644 --- a/portfolio/route_speeds/name_get-schedule/0__28_route_averages__name_get-schedule.ipynb +++ b/portfolio/route_speeds/name_get-schedule/0__28_route_averages__name_get-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e35b0d68220943686bc4161368088f0580aa6910261f81bf725eca7f69083a4 -size 691395 +oid sha256:4af5a1cd1c521e5c84aaeb5c08960fc2d6cb1868b374e24f240205a5e58c48d3 +size 800031 diff --git a/portfolio/route_speeds/name_humboldt-schedule/0__28_route_averages__name_humboldt-schedule.ipynb b/portfolio/route_speeds/name_humboldt-schedule/0__28_route_averages__name_humboldt-schedule.ipynb index 7f7263564..672345f17 100644 --- a/portfolio/route_speeds/name_humboldt-schedule/0__28_route_averages__name_humboldt-schedule.ipynb +++ b/portfolio/route_speeds/name_humboldt-schedule/0__28_route_averages__name_humboldt-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8ad4ba58a9ed1afae45f77fdf6f3818cec28c69faaae01ecc35fbf80c860e814 -size 206154 +oid sha256:3559bb98f0a1ac5b7f507f0ce0ee02c75f270d5f3415ee46445971b0e5e93cdd +size 344705 diff --git a/portfolio/route_speeds/name_kings-schedule/0__28_route_averages__name_kings-schedule.ipynb b/portfolio/route_speeds/name_kings-schedule/0__28_route_averages__name_kings-schedule.ipynb index 5ea84ecb7..3c00911e5 100644 --- a/portfolio/route_speeds/name_kings-schedule/0__28_route_averages__name_kings-schedule.ipynb +++ b/portfolio/route_speeds/name_kings-schedule/0__28_route_averages__name_kings-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3bad3ce403f98981c6800cc374357e851dd0f1d3392da31d318cf81b458d6b6 -size 315423 +oid sha256:df76399693628ae5b9412a2818ad36d35d08e482b2b46d51f1d569d6c69672b1 +size 370710 diff --git a/portfolio/route_speeds/name_la-dot-schedule/0__28_route_averages__name_la-dot-schedule.ipynb b/portfolio/route_speeds/name_la-dot-schedule/0__28_route_averages__name_la-dot-schedule.ipynb index b728ae825..8ef6deab2 100644 --- a/portfolio/route_speeds/name_la-dot-schedule/0__28_route_averages__name_la-dot-schedule.ipynb +++ b/portfolio/route_speeds/name_la-dot-schedule/0__28_route_averages__name_la-dot-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea1a286a7e097cdc06c05cb03bef720172921638d6b755c34b4f73014475ecac -size 1969641 +oid sha256:b5d3537352ee523680111488eb0af3c2f655422554f2f25ea562a155661c26ad +size 2119508 diff --git a/portfolio/route_speeds/name_la-metro-bus-schedule/0__28_route_averages__name_la-metro-bus-schedule.ipynb b/portfolio/route_speeds/name_la-metro-bus-schedule/0__28_route_averages__name_la-metro-bus-schedule.ipynb index a71ef699b..fedcc3523 100644 --- a/portfolio/route_speeds/name_la-metro-bus-schedule/0__28_route_averages__name_la-metro-bus-schedule.ipynb +++ b/portfolio/route_speeds/name_la-metro-bus-schedule/0__28_route_averages__name_la-metro-bus-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f1e3604322de95c318354eb0d5849d5f2f9516937783d7fc58bca6bdc65c3629 -size 5777778 +oid sha256:f2a1678a997b435e70ebe38fa55f526ab0a457a8f04ee40f29aab085023d9607 +size 6403956 diff --git a/portfolio/route_speeds/name_la-metro-rail-schedule/0__28_route_averages__name_la-metro-rail-schedule.ipynb b/portfolio/route_speeds/name_la-metro-rail-schedule/0__28_route_averages__name_la-metro-rail-schedule.ipynb index 57f889a4a..cf28b38a7 100644 --- a/portfolio/route_speeds/name_la-metro-rail-schedule/0__28_route_averages__name_la-metro-rail-schedule.ipynb +++ b/portfolio/route_speeds/name_la-metro-rail-schedule/0__28_route_averages__name_la-metro-rail-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4182e582d5af3fe621306ad8a3d565bdcab8eaf03c53107b234322152fbfb00e -size 208577 +oid sha256:58184b1b34f4d4dec1ef02fa0efde484d080e0f4ca6a696289baab9ff9f3c2a5 +size 242288 diff --git a/portfolio/route_speeds/name_lake-schedule/0__28_route_averages__name_lake-schedule.ipynb b/portfolio/route_speeds/name_lake-schedule/0__28_route_averages__name_lake-schedule.ipynb index 15103b511..7ff364779 100644 --- a/portfolio/route_speeds/name_lake-schedule/0__28_route_averages__name_lake-schedule.ipynb +++ b/portfolio/route_speeds/name_lake-schedule/0__28_route_averages__name_lake-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ed81225fc8aea5f281de5041ba6b6638a5a76fee8e9be4af9ce98ec4453f115 -size 243472 +oid sha256:b8f4f1b99fed2e30901639662212726ff0de7b5362faa35767662f5214cf0b93 +size 336438 diff --git a/portfolio/route_speeds/name_lawndale-beat-gmv-schedule/0__28_route_averages__name_lawndale-beat-gmv-schedule.ipynb b/portfolio/route_speeds/name_lawndale-beat-gmv-schedule/0__28_route_averages__name_lawndale-beat-gmv-schedule.ipynb index d000084b4..d11c487c5 100644 --- a/portfolio/route_speeds/name_lawndale-beat-gmv-schedule/0__28_route_averages__name_lawndale-beat-gmv-schedule.ipynb +++ b/portfolio/route_speeds/name_lawndale-beat-gmv-schedule/0__28_route_averages__name_lawndale-beat-gmv-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a2b10b115bfc6ccc545e06dc15734f053a5feacf787ab02109ab8f7a1c9dc96a -size 36297 +oid sha256:43a00a27af84a00d2267c7fe09104cd22204158fa5870076ff5deb37398e7d10 +size 39788 diff --git a/portfolio/route_speeds/name_long-beach-schedule/0__28_route_averages__name_long-beach-schedule.ipynb b/portfolio/route_speeds/name_long-beach-schedule/0__28_route_averages__name_long-beach-schedule.ipynb index a20b02b98..af3ce0d3e 100644 --- a/portfolio/route_speeds/name_long-beach-schedule/0__28_route_averages__name_long-beach-schedule.ipynb +++ b/portfolio/route_speeds/name_long-beach-schedule/0__28_route_averages__name_long-beach-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f7bb28899c9c8d0fab905e9efe3039ae752a1ac45d3b74b0a5050f32e33c683 -size 1588155 +oid sha256:d82db16924cacebc896aad5c6368330350768877ca3d0a5a4a2c83b3251632e8 +size 1795813 diff --git a/portfolio/route_speeds/name_madera-county-connection-schedule/0__28_route_averages__name_madera-county-connection-schedule.ipynb b/portfolio/route_speeds/name_madera-county-connection-schedule/0__28_route_averages__name_madera-county-connection-schedule.ipynb index 836a4b116..880f9e86e 100644 --- a/portfolio/route_speeds/name_madera-county-connection-schedule/0__28_route_averages__name_madera-county-connection-schedule.ipynb +++ b/portfolio/route_speeds/name_madera-county-connection-schedule/0__28_route_averages__name_madera-county-connection-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e111b9a995a97ee2d57c2f39062baa90faa41933a955f6e96fe2300b35dfbd8d -size 109004 +oid sha256:982493aaea487cf431fa5e11fda3d05a24c8c7552a66492d44ebdee28d21644a +size 215582 diff --git a/portfolio/route_speeds/name_mendocino-schedule/0__28_route_averages__name_mendocino-schedule.ipynb b/portfolio/route_speeds/name_mendocino-schedule/0__28_route_averages__name_mendocino-schedule.ipynb index b13020273..a67c5bbf4 100644 --- a/portfolio/route_speeds/name_mendocino-schedule/0__28_route_averages__name_mendocino-schedule.ipynb +++ b/portfolio/route_speeds/name_mendocino-schedule/0__28_route_averages__name_mendocino-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:811678ac40aa9d9b40eb07e88ea8107847a9fcd137400c82f0f87a432f4843fb -size 256663 +oid sha256:9628b86f3b5fb8e5415470555681e414ac1c6862a4233354baac6f544b96ddf6 +size 318523 diff --git a/portfolio/route_speeds/name_monterey-salinas-schedule/0__28_route_averages__name_monterey-salinas-schedule.ipynb b/portfolio/route_speeds/name_monterey-salinas-schedule/0__28_route_averages__name_monterey-salinas-schedule.ipynb index 4fa220e8c..39cf0b4ba 100644 --- a/portfolio/route_speeds/name_monterey-salinas-schedule/0__28_route_averages__name_monterey-salinas-schedule.ipynb +++ b/portfolio/route_speeds/name_monterey-salinas-schedule/0__28_route_averages__name_monterey-salinas-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b95cc51078792bf89cd7cc41acc1352e09f5e4249ff6116883c01bfccf555ad1 -size 1497242 +oid sha256:781b3351b55a6676d1c73f2e1f26e62f20a0f99073d09e14cb39f2708cec6316 +size 1593110 diff --git a/portfolio/route_speeds/name_nevada-county-schedule/0__28_route_averages__name_nevada-county-schedule.ipynb b/portfolio/route_speeds/name_nevada-county-schedule/0__28_route_averages__name_nevada-county-schedule.ipynb index 770a8d9e5..f952f4c87 100644 --- a/portfolio/route_speeds/name_nevada-county-schedule/0__28_route_averages__name_nevada-county-schedule.ipynb +++ b/portfolio/route_speeds/name_nevada-county-schedule/0__28_route_averages__name_nevada-county-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81143f5b2ab535c614c630b60b088a8d19bb7a7d27d0a066b97beedeb25b7754 -size 236462 +oid sha256:7ac4cd6ca0283687425d64f9599dbff63e23af248b7e840467ff8f6370982403 +size 331351 diff --git a/portfolio/route_speeds/name_north-county-schedule/0__28_route_averages__name_north-county-schedule.ipynb b/portfolio/route_speeds/name_north-county-schedule/0__28_route_averages__name_north-county-schedule.ipynb index c883bb6db..63c6078cf 100644 --- a/portfolio/route_speeds/name_north-county-schedule/0__28_route_averages__name_north-county-schedule.ipynb +++ b/portfolio/route_speeds/name_north-county-schedule/0__28_route_averages__name_north-county-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6093dc65ea10f2f9f6ee71dfe795f188bebe18583c8e6437acbada7cd1af635 -size 1567699 +oid sha256:717ce6c23223b73d10e45c6f67b6054b90f1c3ef40a39a865effd8d8a7787b76 +size 1828438 diff --git a/portfolio/route_speeds/name_norwalk-avail-schedule/0__28_route_averages__name_norwalk-avail-schedule.ipynb b/portfolio/route_speeds/name_norwalk-avail-schedule/0__28_route_averages__name_norwalk-avail-schedule.ipynb index 077887d4f..ec3738927 100644 --- a/portfolio/route_speeds/name_norwalk-avail-schedule/0__28_route_averages__name_norwalk-avail-schedule.ipynb +++ b/portfolio/route_speeds/name_norwalk-avail-schedule/0__28_route_averages__name_norwalk-avail-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddcf3d82dedb07c157bad27d71454dbde2a974f07c89b946207fbdf1b2020e9a -size 185892 +oid sha256:affe4999e337cd442a582acdae53f562a0dc3e837808383a42e85ce2fe7d8f01 +size 207168 diff --git a/portfolio/route_speeds/name_octa-schedule/0__28_route_averages__name_octa-schedule.ipynb b/portfolio/route_speeds/name_octa-schedule/0__28_route_averages__name_octa-schedule.ipynb index dd8dec88c..55cbfeb58 100644 --- a/portfolio/route_speeds/name_octa-schedule/0__28_route_averages__name_octa-schedule.ipynb +++ b/portfolio/route_speeds/name_octa-schedule/0__28_route_averages__name_octa-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94e8f3da75dbdd884441d601adee732b0ed47338b5b05d5d19f1fd5690e6d3ce -size 2627682 +oid sha256:9531614e2594ec34141c9e4008788589a79dfc6e8b8d5da831617ff9b523cf1b +size 2968207 diff --git a/portfolio/route_speeds/name_omnitrans-schedule/0__28_route_averages__name_omnitrans-schedule.ipynb b/portfolio/route_speeds/name_omnitrans-schedule/0__28_route_averages__name_omnitrans-schedule.ipynb index ee1f9c100..5ab83c1f8 100644 --- a/portfolio/route_speeds/name_omnitrans-schedule/0__28_route_averages__name_omnitrans-schedule.ipynb +++ b/portfolio/route_speeds/name_omnitrans-schedule/0__28_route_averages__name_omnitrans-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d81552408ec414a4c3e2ae49514202c42d3ba764d48a4739784850a5f52f8ea8 -size 561198 +oid sha256:00e9fbbdf37b9958979486f5fb7a635692bb953234e9e95fff427ce2cf68ae50 +size 677924 diff --git a/portfolio/route_speeds/name_pasadena-schedule/0__28_route_averages__name_pasadena-schedule.ipynb b/portfolio/route_speeds/name_pasadena-schedule/0__28_route_averages__name_pasadena-schedule.ipynb index 65d377f15..f4f307d92 100644 --- a/portfolio/route_speeds/name_pasadena-schedule/0__28_route_averages__name_pasadena-schedule.ipynb +++ b/portfolio/route_speeds/name_pasadena-schedule/0__28_route_averages__name_pasadena-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:141bd2010884a634fad8ec442d3f06ef6011c1b31adcccb21e019eeed2bed6cc -size 314088 +oid sha256:a786d11f22e81bace90132c523754ca38870d3031197c2dc72f74ca638dbba1b +size 364178 diff --git a/portfolio/route_speeds/name_presidigo-schedule/0__28_route_averages__name_presidigo-schedule.ipynb b/portfolio/route_speeds/name_presidigo-schedule/0__28_route_averages__name_presidigo-schedule.ipynb index af10787fe..46a082c44 100644 --- a/portfolio/route_speeds/name_presidigo-schedule/0__28_route_averages__name_presidigo-schedule.ipynb +++ b/portfolio/route_speeds/name_presidigo-schedule/0__28_route_averages__name_presidigo-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a831b302d8367aa7dbcc9b2e44c5a7d2ee05d00fe070e30862fe36c22c83f78 -size 64680 +oid sha256:dcfb95e87386b6943abed19fa8c6aefb062629d9d893f00f08350f69c906ebb4 +size 69232 diff --git a/portfolio/route_speeds/name_redding-schedule/0__28_route_averages__name_redding-schedule.ipynb b/portfolio/route_speeds/name_redding-schedule/0__28_route_averages__name_redding-schedule.ipynb index 95bb5a97a..9c055cc81 100644 --- a/portfolio/route_speeds/name_redding-schedule/0__28_route_averages__name_redding-schedule.ipynb +++ b/portfolio/route_speeds/name_redding-schedule/0__28_route_averages__name_redding-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c930b4710cee1bc480327881a5f1444583c4e0616a5cea15ba573e3c46851431 -size 471370 +oid sha256:94f02151e88dd5cdda1b28f1fd78d2036943370ed5bcd2d6cbcac27009696ed9 +size 494755 diff --git a/portfolio/route_speeds/name_redwood-coast-schedule/0__28_route_averages__name_redwood-coast-schedule.ipynb b/portfolio/route_speeds/name_redwood-coast-schedule/0__28_route_averages__name_redwood-coast-schedule.ipynb index 78a6f0362..5ae2131dc 100644 --- a/portfolio/route_speeds/name_redwood-coast-schedule/0__28_route_averages__name_redwood-coast-schedule.ipynb +++ b/portfolio/route_speeds/name_redwood-coast-schedule/0__28_route_averages__name_redwood-coast-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:661f80316bd862a8135d56f83fbc5f2497d23ca64e77d44f836bbb781c05624a -size 196971 +oid sha256:4326bcafbceddfd6aca5c84a2fcde6b57a14a337b404e049fa247d7481cf59f7 +size 258194 diff --git a/portfolio/route_speeds/name_riverside-schedule/0__28_route_averages__name_riverside-schedule.ipynb b/portfolio/route_speeds/name_riverside-schedule/0__28_route_averages__name_riverside-schedule.ipynb index d5e29d642..1ba185554 100644 --- a/portfolio/route_speeds/name_riverside-schedule/0__28_route_averages__name_riverside-schedule.ipynb +++ b/portfolio/route_speeds/name_riverside-schedule/0__28_route_averages__name_riverside-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fc08df43c590f43b5bc80bb8ed5001e310a4f8aea13becbc11e9978e23f4970 -size 1496122 +oid sha256:a5ba7673d1b3a414323d503e821e503b16a16c36850598d28657c584d007c635 +size 1731250 diff --git a/portfolio/route_speeds/name_sacramento-schedule/0__28_route_averages__name_sacramento-schedule.ipynb b/portfolio/route_speeds/name_sacramento-schedule/0__28_route_averages__name_sacramento-schedule.ipynb index 37828ef4e..e14c14343 100644 --- a/portfolio/route_speeds/name_sacramento-schedule/0__28_route_averages__name_sacramento-schedule.ipynb +++ b/portfolio/route_speeds/name_sacramento-schedule/0__28_route_averages__name_sacramento-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd5d3c9b6e3396bc4eedefa1824e86a5d957c884027c9df800d89d7d0eca7968 -size 1594690 +oid sha256:f9c2ff76d56085898670c364047bd82e80dffcf9be31055700229b68b66c4942 +size 1890170 diff --git a/portfolio/route_speeds/name_san-diego-schedule/0__28_route_averages__name_san-diego-schedule.ipynb b/portfolio/route_speeds/name_san-diego-schedule/0__28_route_averages__name_san-diego-schedule.ipynb index 1918e08aa..4b1ace54c 100644 --- a/portfolio/route_speeds/name_san-diego-schedule/0__28_route_averages__name_san-diego-schedule.ipynb +++ b/portfolio/route_speeds/name_san-diego-schedule/0__28_route_averages__name_san-diego-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:902cc271cac375f79a9ad6908965029d89986aba6d4525f29e367ffdb738d92e -size 4339329 +oid sha256:bec231b72473b614dd836f89b1acc5178389a3ce75c07bb647c7cb46079f42ae +size 4811591 diff --git a/portfolio/route_speeds/name_san-joaquin-schedule/0__28_route_averages__name_san-joaquin-schedule.ipynb b/portfolio/route_speeds/name_san-joaquin-schedule/0__28_route_averages__name_san-joaquin-schedule.ipynb index d91a7a845..bbdebfc40 100644 --- a/portfolio/route_speeds/name_san-joaquin-schedule/0__28_route_averages__name_san-joaquin-schedule.ipynb +++ b/portfolio/route_speeds/name_san-joaquin-schedule/0__28_route_averages__name_san-joaquin-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:18bdc253b7f66643d8309d942164915261ea27d95d50211447fbd55fdd94033d -size 1248491 +oid sha256:3a0618a4ef242cfadd1bf210e1a2613f065b78661d0e360fc86c3ac4d7c469ac +size 1548126 diff --git a/portfolio/route_speeds/name_santa-clarita-schedule/0__28_route_averages__name_santa-clarita-schedule.ipynb b/portfolio/route_speeds/name_santa-clarita-schedule/0__28_route_averages__name_santa-clarita-schedule.ipynb index 015d6d470..1781f5ea6 100644 --- a/portfolio/route_speeds/name_santa-clarita-schedule/0__28_route_averages__name_santa-clarita-schedule.ipynb +++ b/portfolio/route_speeds/name_santa-clarita-schedule/0__28_route_averages__name_santa-clarita-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b017c969889e9417e3e22d6741c3c9fb97ee3e47bef98bdda338bb2bc0985fd7 -size 836664 +oid sha256:40e661db1e7095864e6c64dea5b04ad60834b166ce44d754f101831c735faad0 +size 1026569 diff --git a/portfolio/route_speeds/name_santa-cruz-schedule/0__28_route_averages__name_santa-cruz-schedule.ipynb b/portfolio/route_speeds/name_santa-cruz-schedule/0__28_route_averages__name_santa-cruz-schedule.ipynb index 231775623..8f151c36d 100644 --- a/portfolio/route_speeds/name_santa-cruz-schedule/0__28_route_averages__name_santa-cruz-schedule.ipynb +++ b/portfolio/route_speeds/name_santa-cruz-schedule/0__28_route_averages__name_santa-cruz-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dfc6be939dfeada6fd82db934de4072f6f21210dddf89122cdce44ad9e78d7e9 -size 520891 +oid sha256:4c0f5c94835f1e07cab419a3fef269314e6ec958926acd6cbab122c9bf97d870 +size 534617 diff --git a/portfolio/route_speeds/name_santa-maria-schedule/0__28_route_averages__name_santa-maria-schedule.ipynb b/portfolio/route_speeds/name_santa-maria-schedule/0__28_route_averages__name_santa-maria-schedule.ipynb index 2156f0c54..068614c43 100644 --- a/portfolio/route_speeds/name_santa-maria-schedule/0__28_route_averages__name_santa-maria-schedule.ipynb +++ b/portfolio/route_speeds/name_santa-maria-schedule/0__28_route_averages__name_santa-maria-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8b251628dee9081412ea7e4f6eedd188add4e41f29cb89ea9cfe788f9635161 -size 46677 +oid sha256:e87cc589fbb86f0285cdefb00bdc81d0e955a7445e39f185f5ef092afd9bd575 +size 48603 diff --git a/portfolio/route_speeds/name_santa-ynez-mecatran-schedule/0__28_route_averages__name_santa-ynez-mecatran-schedule.ipynb b/portfolio/route_speeds/name_santa-ynez-mecatran-schedule/0__28_route_averages__name_santa-ynez-mecatran-schedule.ipynb index e56c84a0b..496750715 100644 --- a/portfolio/route_speeds/name_santa-ynez-mecatran-schedule/0__28_route_averages__name_santa-ynez-mecatran-schedule.ipynb +++ b/portfolio/route_speeds/name_santa-ynez-mecatran-schedule/0__28_route_averages__name_santa-ynez-mecatran-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:770b0bdc8876b003ad73e70be208dab1f6d800f74d067531bbd059334f5ffdda -size 70526 +oid sha256:b38d8e61f4290aa0689def4fdc72ebd05a791b82590191b5754faa2ca31e49e3 +size 77369 diff --git a/portfolio/route_speeds/name_sbmtd-schedule/0__28_route_averages__name_sbmtd-schedule.ipynb b/portfolio/route_speeds/name_sbmtd-schedule/0__28_route_averages__name_sbmtd-schedule.ipynb index a04b4e310..205583b1f 100644 --- a/portfolio/route_speeds/name_sbmtd-schedule/0__28_route_averages__name_sbmtd-schedule.ipynb +++ b/portfolio/route_speeds/name_sbmtd-schedule/0__28_route_averages__name_sbmtd-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca19eabdef22b27727c37d0f9f04c47c306c2251246913348d541205165b20fd -size 950606 +oid sha256:9f64fc41e081c8dd4ccf4d6ec7bbe825078bc1d399467aa3d859c88d32da4164 +size 1023362 diff --git a/portfolio/route_speeds/name_slorta-schedule/0__28_route_averages__name_slorta-schedule.ipynb b/portfolio/route_speeds/name_slorta-schedule/0__28_route_averages__name_slorta-schedule.ipynb index 821409e22..78027d19f 100644 --- a/portfolio/route_speeds/name_slorta-schedule/0__28_route_averages__name_slorta-schedule.ipynb +++ b/portfolio/route_speeds/name_slorta-schedule/0__28_route_averages__name_slorta-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b5764f82a7ab840f6bbe65abbca578a360d5b6a361e03f137e3452f7d04011f -size 125808 +oid sha256:08ddc2b7d806e138fbd9e65b89240861b63f26d892218dbf77f3c5bd0d47c04c +size 181969 diff --git a/portfolio/route_speeds/name_stanrta-schedule/0__28_route_averages__name_stanrta-schedule.ipynb b/portfolio/route_speeds/name_stanrta-schedule/0__28_route_averages__name_stanrta-schedule.ipynb index 35e5ba679..2ba462932 100644 --- a/portfolio/route_speeds/name_stanrta-schedule/0__28_route_averages__name_stanrta-schedule.ipynb +++ b/portfolio/route_speeds/name_stanrta-schedule/0__28_route_averages__name_stanrta-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4911d719b57a37c8b553a4c6d60e644c01041135408fd3e280b7e9a661dc9d1 -size 793092 +oid sha256:849d02091a7fd21b8c1e53f24672b272e464240e45d1914a51972619518767db +size 837799 diff --git a/portfolio/route_speeds/name_tahoe-transportation-district-gmv-schedule/0__28_route_averages__name_tahoe-transportation-district-gmv-schedule.ipynb b/portfolio/route_speeds/name_tahoe-transportation-district-gmv-schedule/0__28_route_averages__name_tahoe-transportation-district-gmv-schedule.ipynb index b283b1c26..303b0beea 100644 --- a/portfolio/route_speeds/name_tahoe-transportation-district-gmv-schedule/0__28_route_averages__name_tahoe-transportation-district-gmv-schedule.ipynb +++ b/portfolio/route_speeds/name_tahoe-transportation-district-gmv-schedule/0__28_route_averages__name_tahoe-transportation-district-gmv-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2e05f569abee2b66d266cb021f61f50ed9af387adbc317004af53c74e7bfc27 -size 38494 +oid sha256:8ede27f1ce52eebfd7f1cf917a9d04a15d120b46e0e95edb72e62aed6fd3bb03 +size 70162 diff --git a/portfolio/route_speeds/name_torrance-schedule/0__28_route_averages__name_torrance-schedule.ipynb b/portfolio/route_speeds/name_torrance-schedule/0__28_route_averages__name_torrance-schedule.ipynb index 598446a00..02d255d4d 100644 --- a/portfolio/route_speeds/name_torrance-schedule/0__28_route_averages__name_torrance-schedule.ipynb +++ b/portfolio/route_speeds/name_torrance-schedule/0__28_route_averages__name_torrance-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d4ea13227df9176456dad51b252780d859498be3e67a831cbb41523638357b61 -size 501064 +oid sha256:e18dae9bc6c2d8c1d8533067bfdfa20c21ba230f192142ccf529e258080c3bd1 +size 588923 diff --git a/portfolio/route_speeds/name_turlock-schedule/0__28_route_averages__name_turlock-schedule.ipynb b/portfolio/route_speeds/name_turlock-schedule/0__28_route_averages__name_turlock-schedule.ipynb index 46f7b5470..68a08393a 100644 --- a/portfolio/route_speeds/name_turlock-schedule/0__28_route_averages__name_turlock-schedule.ipynb +++ b/portfolio/route_speeds/name_turlock-schedule/0__28_route_averages__name_turlock-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b91846edd0f6a18ce3bbaa606da2fdca88c0e50ce5b880942d08f2dc0e74b6ba -size 245052 +oid sha256:effb15329c31505d3421531c823b57203fba7b48acbf52bb70f411c5830a478c +size 250994 diff --git a/portfolio/route_speeds/name_unitrans-schedule/0__28_route_averages__name_unitrans-schedule.ipynb b/portfolio/route_speeds/name_unitrans-schedule/0__28_route_averages__name_unitrans-schedule.ipynb index 2b29574fb..c48845c39 100644 --- a/portfolio/route_speeds/name_unitrans-schedule/0__28_route_averages__name_unitrans-schedule.ipynb +++ b/portfolio/route_speeds/name_unitrans-schedule/0__28_route_averages__name_unitrans-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:838b2991e100d9f9fa3f00fad60387b8e6e0cc33a8edcd6d50b8fad3083cbb5d -size 554215 +oid sha256:097f49eb498ba285d73598d6a168e6714254506aa77cb3d2d122357588e55316 +size 401585 diff --git a/portfolio/route_speeds/name_vctc-gmv-schedule/0__28_route_averages__name_vctc-gmv-schedule.ipynb b/portfolio/route_speeds/name_vctc-gmv-schedule/0__28_route_averages__name_vctc-gmv-schedule.ipynb index 3a466edc9..47deaa82a 100644 --- a/portfolio/route_speeds/name_vctc-gmv-schedule/0__28_route_averages__name_vctc-gmv-schedule.ipynb +++ b/portfolio/route_speeds/name_vctc-gmv-schedule/0__28_route_averages__name_vctc-gmv-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4fdbf2f396322572b15ddf41ff81d43bf4f2e9ae05cde254c542fa8c1d313a01 -size 1168115 +oid sha256:ee6062ab28ecb0b97ddbd096c28c23ff675d24492740c5cf12dabc94880cf1a1 +size 1545579 diff --git a/portfolio/route_speeds/name_victor-valley-gmv-schedule/0__28_route_averages__name_victor-valley-gmv-schedule.ipynb b/portfolio/route_speeds/name_victor-valley-gmv-schedule/0__28_route_averages__name_victor-valley-gmv-schedule.ipynb index a56779022..5df235343 100644 --- a/portfolio/route_speeds/name_victor-valley-gmv-schedule/0__28_route_averages__name_victor-valley-gmv-schedule.ipynb +++ b/portfolio/route_speeds/name_victor-valley-gmv-schedule/0__28_route_averages__name_victor-valley-gmv-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:553e6e3151af952f6c3f400d7550efc4a35415dc0b511444de92bdbac7e2ac9c -size 1172260 +oid sha256:af7481436348b87fb9886c1084109e36a223a0534af0fe811ea17cf9b28890e7 +size 1519071 diff --git a/portfolio/route_speeds/name_visalia-schedule/0__28_route_averages__name_visalia-schedule.ipynb b/portfolio/route_speeds/name_visalia-schedule/0__28_route_averages__name_visalia-schedule.ipynb index 4ab7d7fe5..0c3e3694c 100644 --- a/portfolio/route_speeds/name_visalia-schedule/0__28_route_averages__name_visalia-schedule.ipynb +++ b/portfolio/route_speeds/name_visalia-schedule/0__28_route_averages__name_visalia-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2fd11fe7a167f316efc967d8d01e6c7e86836c3f1bfc40d5a4c56846cc05f60f -size 368458 +oid sha256:2b33d6979a5d58d6b1da3106099fe342ec08520d032f837ba3c2c2f2de4a15cd +size 410997 diff --git a/portfolio/route_speeds/name_yolobus-schedule/0__28_route_averages__name_yolobus-schedule.ipynb b/portfolio/route_speeds/name_yolobus-schedule/0__28_route_averages__name_yolobus-schedule.ipynb index 47f272a35..5c65b5352 100644 --- a/portfolio/route_speeds/name_yolobus-schedule/0__28_route_averages__name_yolobus-schedule.ipynb +++ b/portfolio/route_speeds/name_yolobus-schedule/0__28_route_averages__name_yolobus-schedule.ipynb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c938e6ccb29b7cabe5419265c93121fafb6b22874cd6cdd99e731628a4a367a -size 284186 +oid sha256:135e779e055c8d097e02e708750a5ee400b4191b21c755941a7c62ecf97c1398 +size 388359 diff --git a/portfolio/sites/route_speeds.yml b/portfolio/sites/route_speeds.yml index 4a6eaa157..e384e531f 100644 --- a/portfolio/sites/route_speeds.yml +++ b/portfolio/sites/route_speeds.yml @@ -14,9 +14,15 @@ parts: - caption: Bay Area 511 AC Transit Schedule params: name: Bay Area 511 AC Transit Schedule + - caption: Bay Area 511 ACE Schedule + params: + name: Bay Area 511 ACE Schedule - caption: Bay Area 511 Caltrain Schedule params: name: Bay Area 511 Caltrain Schedule + - caption: Bay Area 511 Capitol Corridor Schedule + params: + name: Bay Area 511 Capitol Corridor Schedule - caption: Bay Area 511 County Connection Schedule params: name: Bay Area 511 County Connection Schedule diff --git a/rt_segment_speeds/28_route_averages.ipynb b/rt_segment_speeds/28_route_averages.ipynb index 8c448db84..181071334 100644 --- a/rt_segment_speeds/28_route_averages.ipynb +++ b/rt_segment_speeds/28_route_averages.ipynb @@ -126,14 +126,19 @@ " \n", " snakecase_ycol = y_col.replace('_', ' ')\n", " \n", - " chart = (alt.Chart(df)\n", - " .mark_bar(width=15)\n", - " .encode(\n", + " #https://stackoverflow.com/questions/26454649/python-round-up-to-the-nearest-ten\n", + " max_speed = round(df.speed_mph.max(), -1)\n", + " \n", + " chart = (\n", + " alt.Chart(df)\n", + " #.mark_bar(width=15)\n", + " .mark_line()\n", + " .encode(\n", " x = alt.X(\"yearmonthdate(service_date):O\", title = \"Date\",\n", " axis = alt.Axis(format = '%b %Y')\n", " ),\n", " y = alt.Y(f\"{y_col}:Q\", title = snakecase_ycol,\n", - " #scale = alt.Scale(domain=[0, 50])\n", + " scale = alt.Scale(domain=[0, max(max_speed, 45)])\n", " ),\n", " color = alt.Color(\n", " \"time_period:N\", title = \"\",\n", @@ -142,8 +147,8 @@ " tooltip = [\"route_id\", \"direction_id\", \n", " \"time_period\", y_col]\n", " ).facet(\n", - " column = alt.Column(\"time_period:O\", title=\"Time Period\"),\n", - " row = alt.Row(\"direction_id:N\", title=\"Direction\")\n", + " column = alt.Column(\"direction_id:N\", title=\"Direction\"),\n", + " row = alt.Row(\"route_id:O\", title=\"Route\")\n", " ).interactive()\n", " )\n", " \n", @@ -201,12 +206,14 @@ "metadata": {}, "outputs": [], "source": [ + "'''\n", "chart = dual_chart(\n", " df, \n", " control_field = \"route_id\", \n", " y_col = \"speed_mph\"\n", ")\n", - "\n", + "'''\n", + "chart = base_chart(df, \"speed_mph\")\n", "chart" ] }, diff --git a/rt_segment_speeds/29_speed_cutoffs.ipynb b/rt_segment_speeds/29_speed_cutoffs.ipynb new file mode 100644 index 000000000..009a7dd73 --- /dev/null +++ b/rt_segment_speeds/29_speed_cutoffs.ipynb @@ -0,0 +1,247 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "57afbef8-a9a4-4426-a1db-22b8d2ffc017", + "metadata": {}, + "source": [ + "# Filter low trip speeds from route averages\n", + "\n", + "Look at the distribution of speeds at the trip-level.\n", + "\n", + "**Filter out sec_elapsed**\n", + "This doesn't change the distribution much, but we should do this to be consistent. To create `vp_usable`, we exclude trips whose (max-min) timestamp is <= 10 minutes. Obviously these trips could have had timestamps that met that condition and still actually produced less than 10 minutes of vp. Exclude them now.\n", + "\n", + "**Filter out extra long trips**\n", + "Notice in histograms that we have very long tails, very high `meters_elapsed` and `sec_elapsed`. We should set a maximum trip time threshold, around 3 hrs, and we'll get rid of the long tails. These long tails are what's contributing to very low speeds. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad537f7d-5836-4ec9-9d00-064d848975b1", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "from segment_speed_utils import helpers\n", + "from segment_speed_utils.project_vars import SEGMENT_GCS, analysis_date\n", + "\n", + "dict_inputs = helpers.get_parameters(\"./scripts/config.yml\", \"stop_segments\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14cd76cd-b3c1-4e04-9197-e72be9744d54", + "metadata": {}, + "outputs": [], + "source": [ + "analysis_date" + ] + }, + { + "cell_type": "markdown", + "id": "ca5e2061-b888-47d2-9895-675008af8b18", + "metadata": {}, + "source": [ + "## Average Trip Speeds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "265e668b-2f70-4c12-af7d-a2ec64871708", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_parquet(\n", + " f\"{SEGMENT_GCS}{dict_inputs['trip_speeds_single_summary']}_{analysis_date}.parquet\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d62a4c5-a628-404a-92c5-17e565162e19", + "metadata": {}, + "outputs": [], + "source": [ + "def make_histogram(df, col): \n", + " fig, ax = plt.subplots(figsize=(3, 2))\n", + " if col == \"speed_mph\":\n", + " bins = range(0, 80, 5)\n", + " ax1 = df[col].hist(bins = bins)\n", + " ax1.set_title(\"Speed\")\n", + " elif col == \"meters_elapsed\":\n", + " bins = range(\n", + " 0, int(round(df.meters_elapsed.max(), 0)), \n", + " 1_609 * 5 # increments of 5 miles\n", + " )\n", + " ax2 = df[col].hist(bins = bins)\n", + " ax2.set_title(\"Meters\")\n", + "\n", + " elif col == \"sec_elapsed\":\n", + " bins = range(\n", + " 0, int(round(df.sec_elapsed.max(), 0)), \n", + " 60 * 30 # increments of 60 min\n", + " )\n", + " \n", + " ax3 = df[col].hist(bins = bins)\n", + " ax3.set_title(\"Seconds\")\n", + "\n", + "\n", + "def get_stats(df: pd.DataFrame):\n", + " print(\"----------- Speed -----------\")\n", + " col = \"speed_mph\"\n", + " print(df[col].describe())\n", + " print(make_histogram(df, col))\n", + " \n", + " \n", + " print(\"----------- Meters Elapsed -----------\")\n", + " col = \"meters_elapsed\"\n", + " print(df[col].describe())\n", + " make_histogram(df, col)\n", + " \n", + " print(\"----------- Seconds Elapsed -----------\")\n", + " col = \"sec_elapsed\"\n", + " print(df[col].describe())\n", + " make_histogram(df, col)\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8d7b486-86e4-4927-bf29-b1d65df54798", + "metadata": {}, + "outputs": [], + "source": [ + "get_stats(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0da0d736-18b2-4bd3-afeb-6fa3aa8dad2e", + "metadata": {}, + "outputs": [], + "source": [ + "METERS_CUTOFF = 0\n", + "SEC_CUTOFF = 60 * 10\n", + "\n", + "new_df = df[\n", + " (df.meters_elapsed >= METERS_CUTOFF) & \n", + " (df.sec_elapsed >= SEC_CUTOFF)\n", + "]\n", + "\n", + "new_df.shape, df.shape, len(df) - len(new_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a8fa256-70a9-4fcd-a8f8-1129b89b230d", + "metadata": {}, + "outputs": [], + "source": [ + "get_stats(new_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05ef24ce-bd4c-41ad-a51a-53ecb8e40dfd", + "metadata": {}, + "outputs": [], + "source": [ + "METERS_CUTOFF = 1_609 # at least 1 mile\n", + "SEC_CUTOFF = 60 * 10\n", + "SEC_MAX = 60 * 180\n", + "\n", + "new_df = df[\n", + " (df.meters_elapsed >= METERS_CUTOFF) & \n", + " (df.sec_elapsed >= SEC_CUTOFF) & \n", + " (df.sec_elapsed <= SEC_MAX)\n", + "]\n", + "\n", + "new_df.shape, df.shape, len(df) - len(new_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f189d05-9a42-4310-ad0d-500f589c1bb2", + "metadata": {}, + "outputs": [], + "source": [ + "get_stats(new_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4976f99a-bf76-45d9-a965-2e0b7904a26e", + "metadata": {}, + "outputs": [], + "source": [ + "# Ok, now low speeds are much better...we have fewer of them\n", + "new_df[new_df.speed_mph <=5].speed_mph.hist(bins = range(0, 6, 1))" + ] + }, + { + "cell_type": "markdown", + "id": "f1821138-273a-4cb6-a962-5c300e61362a", + "metadata": {}, + "source": [ + "## Sanity check: number of routes should be fairly consistent across aggregation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1704b39b-be48-4836-adf5-8fd52d00c434", + "metadata": {}, + "outputs": [], + "source": [ + "for d in [\"stage4\", \"trip_speeds_single_summary\", \n", + " #\"shape_stop_single_segment\", \n", + " \"route_dir_single_segment\", \"route_dir_single_summary\"\n", + " ]:\n", + " FILE = dict_inputs[d]\n", + " df = pd.read_parquet(\n", + " f\"{SEGMENT_GCS}{FILE}_{analysis_date}.parquet\",\n", + " columns = [\"schedule_gtfs_dataset_key\", \"route_id\", \"direction_id\"]\n", + " ).drop_duplicates()\n", + " \n", + " print(FILE)\n", + " print(df.shape)\n", + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/rt_segment_speeds/logs/avg_speeds.log b/rt_segment_speeds/logs/avg_speeds.log index 31e4d476b..7b5f7d87d 100644 --- a/rt_segment_speeds/logs/avg_speeds.log +++ b/rt_segment_speeds/logs/avg_speeds.log @@ -14,3 +14,8 @@ 2024-01-30 10:22:12.414 | INFO | __main__:multi_day_averages:338 - route seg avg 0:02:29.962531 2024-01-30 10:22:54.131 | INFO | __main__:multi_day_averages:377 - route dir avg 0:00:41.717110 2024-01-30 10:22:54.176 | INFO | __main__::443 - average rollups for ['2023-10-09', '2023-10-10', '2023-10-11', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15']: 0:03:11.725898 +2024-02-15 14:52:09.597 | INFO | __main__:single_day_averages:194 - shape seg avg 0:00:47.942274 +2024-02-15 14:52:55.960 | INFO | __main__:single_day_averages:227 - route dir seg avg 0:00:46.362889 +2024-02-15 14:52:57.307 | INFO | __main__:single_day_averages:244 - trip avg 0:00:01.346473 +2024-02-15 14:53:05.722 | INFO | __main__:single_day_averages:276 - route dir avg: 0:00:08.415679 +2024-02-15 14:53:11.404 | INFO | __main__::433 - average rollups for 2024-01-17: 0:01:52.695658 diff --git a/rt_segment_speeds/logs/cut_stop_segments.log b/rt_segment_speeds/logs/cut_stop_segments.log index bf73b7f77..9948fde98 100644 --- a/rt_segment_speeds/logs/cut_stop_segments.log +++ b/rt_segment_speeds/logs/cut_stop_segments.log @@ -1,6 +1 @@ -2024-01-17 08:51:37.506 | INFO | __main__::71 - Analysis date: 2023-12-13 -2024-01-17 09:13:47.443 | INFO | __main__::118 - cut segments for all trips: 0:22:09.920160 -2024-01-25 17:55:11.789 | INFO | __main__::151 - cut segments 2024-01-17: 0:15:20.866136 -2024-01-25 18:10:52.489 | INFO | __main__::151 - cut segments 2023-12-13: 0:15:40.699105 -2024-01-25 18:26:27.834 | INFO | __main__::151 - cut segments 2023-11-15: 0:15:35.343763 -2024-01-25 18:41:57.495 | INFO | __main__::151 - cut segments 2023-10-11: 0:15:29.660398 \ No newline at end of file +0:15:29.6603982024-02-15 13:36:56.379 | INFO | __main__::156 - cut segments 2024-02-14: 0:13:55.835925 diff --git a/rt_segment_speeds/logs/interpolate_stop_arrival.log b/rt_segment_speeds/logs/interpolate_stop_arrival.log index db06f6283..5e358198e 100644 --- a/rt_segment_speeds/logs/interpolate_stop_arrival.log +++ b/rt_segment_speeds/logs/interpolate_stop_arrival.log @@ -1,8 +1 @@ -2023-12-14 11:37:11.735 | INFO | __main__::215 - Analysis date: 2023-12-13 -2023-12-14 11:39:47.181 | INFO | __main__:main:184 - stop_segments: set up df with nearest / subseq vp info: 0:02:35.392831 -2023-12-14 11:40:48.345 | INFO | __main__:main:190 - interpolate stop arrival: 0:01:01.164427 -2023-12-14 11:40:59.919 | INFO | __main__:main:196 - execution time for stop_segments: 0:03:48.131217 -2024-01-24 09:54:22.652 | INFO | __main__:interpolate_stop_arrivals:107 - get stop arrivals 2024-01-17: 0:10:11.131591 -2024-01-27 19:51:50.425 | INFO | __main__:interpolate_stop_arrivals:110 - get stop arrivals 2023-12-13: 0:09:47.554048 -2024-01-27 20:02:03.868 | INFO | __main__:interpolate_stop_arrivals:110 - get stop arrivals 2023-11-15: 0:10:13.251370 -2024-01-27 20:11:39.908 | INFO | __main__:interpolate_stop_arrivals:110 - get stop arrivals 2023-10-11: 0:09:35.901028 \ No newline at end of file +2024-02-15 14:18:47.082 | INFO | __main__:interpolate_stop_arrivals:110 - get stop arrivals 2024-02-14: 0:09:37.655118 diff --git a/rt_segment_speeds/logs/nearest_vp.log b/rt_segment_speeds/logs/nearest_vp.log index 1084cda97..03724a3f0 100644 --- a/rt_segment_speeds/logs/nearest_vp.log +++ b/rt_segment_speeds/logs/nearest_vp.log @@ -1,9 +1,2 @@ -2023-12-14 11:24:08.032 | INFO | __main__::342 - Analysis date: 2023-12-13 -2023-12-14 11:30:59.475 | INFO | __main__:find_nearest_vp_to_stop:280 - map partitions to transform vp: 0:06:51.416122 -2023-12-14 11:31:01.378 | INFO | __main__:find_nearest_vp_to_stop:312 - map partitions to find nearest vp to stop: 0:00:01.903498 -2024-01-27 13:45:18.221 | INFO | __main__:nearest_neighbor_shape_segments:203 - shape segments 2023-12-13: 0:11:38.045844 -2024-01-27 14:19:15.940 | INFO | __main__:nearest_neighbor_shape_segments:206 - shape segments 2023-12-13: 0:11:37.741682 -2024-01-27 17:07:34.843 | INFO | __main__:nearest_neighbor_shape_segments:204 - shape segments 2023-11-15: 0:12:02.309702 -2024-01-27 17:19:42.602 | INFO | __main__:nearest_neighbor_rt_stop_times:136 - RT stop times 2023-11-15: 0:12:04.187679 -2024-01-27 17:46:11.054 | INFO | __main__:nearest_neighbor_shape_segments:204 - shape segments 2023-10-11: 0:11:47.793159 -2024-01-27 17:58:02.005 | INFO | __main__:nearest_neighbor_rt_stop_times:136 - RT stop times 2023-10-11: 0:11:47.705595 \ No newline at end of file +2024-02-15 13:48:26.270 | INFO | __main__:nearest_neighbor_shape_segments:203 - shape segments 2024-02-14: 0:10:31.474349 +2024-02-15 14:08:52.783 | INFO | __main__:nearest_neighbor_rt_stop_times:135 - RT stop times 2024-02-14: 0:11:07.883083 diff --git a/rt_segment_speeds/logs/speeds_by_segment_trip.log b/rt_segment_speeds/logs/speeds_by_segment_trip.log index 291d0dbee..a350bda9e 100644 --- a/rt_segment_speeds/logs/speeds_by_segment_trip.log +++ b/rt_segment_speeds/logs/speeds_by_segment_trip.log @@ -1,6 +1,2 @@ -2024-01-24 17:15:10.165 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2024-01-17: 0:00:25.610204 -2024-01-27 20:12:24.879 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2023-12-13: 0:00:26.567386 -2024-01-27 20:12:50.577 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2023-11-15: 0:00:25.530726 -2024-01-27 20:13:15.096 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2023-10-11: 0:00:24.355903 -2024-01-28 15:12:19.958 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2023-09-13: 0:00:21.749183 -2024-01-28 15:12:40.323 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - \ No newline at end of file +2024-02-15 14:19:36.965 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2024-02-14: 0:00:31.989535 +2024-02-15 14:45:36.035 | INFO | __main__:calculate_speed_from_stop_arrivals:132 - speeds by segment: 2024-01-17: 0:00:32.109610 diff --git a/rt_segment_speeds/scripts/Makefile b/rt_segment_speeds/scripts/Makefile index e8e312986..14827b7df 100644 --- a/rt_segment_speeds/scripts/Makefile +++ b/rt_segment_speeds/scripts/Makefile @@ -20,7 +20,6 @@ speeds_pipeline: make export export: - python handle_common_errors.py python average_speeds.py download_roads: diff --git a/rt_segment_speeds/scripts/average_speeds.py b/rt_segment_speeds/scripts/average_speeds.py index cda502b92..9a616f291 100644 --- a/rt_segment_speeds/scripts/average_speeds.py +++ b/rt_segment_speeds/scripts/average_speeds.py @@ -12,7 +12,6 @@ from typing import Literal from calitp_data_analysis.geography_utils import WGS84 -from shared_utils import utils_to_add from calitp_data_analysis import utils from segment_speed_utils import (gtfs_schedule_wrangling, helpers, segment_calcs, time_helpers) @@ -21,9 +20,6 @@ OPERATOR_COLS = [ "schedule_gtfs_dataset_key", - #"name", # from schedule - #"organization_source_record_id", "organization_name", # from dim_organizations - #"base64_url", "caltrans_district", ] SHAPE_STOP_COLS = [ @@ -74,9 +70,7 @@ def import_segments( on shape_array_key and stop_pair. For rt_stop_times, import all trips with their segments, and merge on trip_instance_key and stop_pair. - """ - SEGMENT_FILE = "segment_options/stop_segments" - + """ keep_cols = [ "shape_array_key", "stop_pair", "schedule_gtfs_dataset_key", "route_id", "direction_id", @@ -84,30 +78,24 @@ def import_segments( ] if segment_type == "stop_segments": + SEGMENT_FILE = "segment_options/shape_stop_segments" - subset_trips = pd.concat([ - pd.read_parquet( - f"{SEGMENT_GCS}segment_options/" - f"shape_stop_segments_{analysis_date}.parquet", - columns = ["st_trip_instance_key"] - ) for analysis_date in analysis_date_list - ], axis=0, ignore_index=True).st_trip_instance_key.unique() - - gdf = pd.concat([ - gpd.read_parquet( - f"{SEGMENT_GCS}{SEGMENT_FILE}_{analysis_date}.parquet", - columns = keep_cols, - filters = [[("trip_instance_key", "in", subset_trips)]], - ).to_crs(WGS84) for analysis_date in analysis_date_list - ], axis=0, ignore_index=True).drop_duplicates(subset=keep_cols) elif segment_type == "rt_stop_times": - gdf = pd.concat([ - gpd.read_parquet( - f"{SEGMENT_GCS}{SEGMENT_FILE}_{analysis_date}.parquet", - columns = keep_cols, - ).to_crs(WGS84) for analysis_date in analysis_date_list - ], axis=0, ignore_index=True).drop_duplicates(subset=keep_cols) + SEGMENT_FILE = "segment_options/stop_segments" + + dfs = [ + delayed(gpd.read_parquet)( + f"{SEGMENT_GCS}{SEGMENT_FILE}_{analysis_date}.parquet", + columns = keep_cols, + ).to_crs(WGS84) for analysis_date in analysis_date_list + ] + + gdf = delayed(pd.concat)( + dfs, axis=0, ignore_index=True + ).drop_duplicates(subset=keep_cols).reset_index(drop=True) + + gdf = compute(gdf)[0] return gdf @@ -125,8 +113,8 @@ def concatenate_trip_segment_speeds( SPEED_FILE = dict_inputs["stage4"] MAX_SPEED = dict_inputs["max_speed"] - df = pd.concat([ - pd.read_parquet( + dfs = [ + delayed(pd.read_parquet)( f"{SEGMENT_GCS}{SPEED_FILE}_{analysis_date}.parquet", columns = (OPERATOR_COLS + SHAPE_STOP_COLS + STOP_PAIR_COLS + ROUTE_DIR_COLS + [ @@ -136,14 +124,19 @@ def concatenate_trip_segment_speeds( filters = [[("speed_mph", "<=", MAX_SPEED)]] ).assign( service_date = pd.to_datetime(analysis_date) - ) for analysis_date in analysis_date_list], - axis=0, ignore_index = True + ) for analysis_date in analysis_date_list + ] + + df = delayed(pd.concat)( + dfs, axis=0, ignore_index = True ).pipe( gtfs_schedule_wrangling.add_peak_offpeak_column ).pipe( gtfs_schedule_wrangling.add_weekday_weekend_column ) + df = compute(df)[0] + return df @@ -158,6 +151,10 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): TRIP_FILE = dict_inputs["trip_speeds_single_summary"] ROUTE_DIR_FILE = dict_inputs["route_dir_single_summary"] + METERS_CUTOFF = dict_inputs["min_meters_elapsed"] + MAX_TRIP_SECONDS = dict_inputs["max_trip_minutes"] * 60 + MIN_TRIP_SECONDS = dict_inputs["min_trip_minutes"] * 60 + start = datetime.datetime.now() df = concatenate_trip_segment_speeds([analysis_date], dict_inputs) @@ -183,7 +180,7 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): columns = col_order + ["geometry"] ) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( shape_stop_segments, SEGMENT_GCS, f"{SHAPE_SEG_FILE}_{analysis_date}" @@ -216,7 +213,7 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): columns = col_order + ["geometry"] ) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( route_dir_segments, SEGMENT_GCS, f"{ROUTE_SEG_FILE}_{analysis_date}" @@ -239,13 +236,18 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): trip_avg.to_parquet( f"{SEGMENT_GCS}{TRIP_FILE}_{analysis_date}.parquet" ) - del trip_avg t3 = datetime.datetime.now() logger.info(f"trip avg {t3 - t2}") + trip_avg_filtered = trip_avg[ + (trip_avg.meters_elapsed >= METERS_CUTOFF) & + (trip_avg.sec_elapsed >= MIN_TRIP_SECONDS) & + (trip_avg.sec_elapsed <= MAX_TRIP_SECONDS) + ].trip_instance_key.unique() + route_dir_avg = segment_calcs.weighted_average_speeds_across_segments( - df, + df[df.trip_instance_key.isin(trip_avg_filtered)], OPERATOR_COLS + ROUTE_DIR_COLS ).pipe( merge_operator_identifiers, [analysis_date] @@ -265,7 +267,7 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): columns = col_order + ["route_name", "geometry"] ) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( route_dir_avg, SEGMENT_GCS, f"{ROUTE_DIR_FILE}_{analysis_date}" @@ -305,30 +307,34 @@ def multi_day_averages(analysis_date_list: list, dict_inputs: dict): OPERATOR_COLS + ROUTE_DIR_COLS + STOP_PAIR_COLS + ["weekday_weekend"] ) - route_dir_segments = compute(route_dir_segments)[0] + #route_dir_segments = compute(route_dir_segments)[0] - route_dir_segments = time_helpers.add_time_span_columns( + route_dir_segments = delayed(time_helpers.add_time_span_columns)( route_dir_segments, time_span_num ).pipe( merge_operator_identifiers, analysis_date_list ) - segment_geom = (import_segments(analysis_date_list, "stop_segments") + segment_geom = delayed(import_segments(analysis_date_list, "stop_segments") .drop(columns = "shape_array_key") .drop_duplicates() ) - col_order = [c for c in route_dir_segments.columns] - route_dir_segments = pd.merge( + route_dir_segments = delayed(pd.merge)( segment_geom, route_dir_segments, on = OPERATOR_COLS + ROUTE_DIR_COLS + STOP_PAIR_COLS, - ).reset_index(drop=True).reindex( + ).reset_index(drop=True) + + route_dir_segments = compute(route_dir_segments)[0] + col_order = [c for c in route_dir_segments.columns] + + route_dir_segments = route_dir_segments.reindex( columns = col_order + ["geometry"] ) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( route_dir_segments, SEGMENT_GCS, f"{ROUTE_SEG_FILE}_{time_span_str}" @@ -367,7 +373,7 @@ def multi_day_averages(analysis_date_list: list, dict_inputs: dict): columns = col_order + ["route_name", "geometry"] ) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( route_dir_avg, SEGMENT_GCS, f"{ROUTE_DIR_FILE}_{time_span_str}" @@ -421,7 +427,7 @@ def stage_open_data_exports(analysis_date: str, dict_inputs: dict): level="INFO") STOP_SEG_DICT = helpers.get_parameters(CONFIG_PATH, "stop_segments") - + ''' for analysis_date in analysis_date_list: start = datetime.datetime.now() @@ -432,16 +438,13 @@ def stage_open_data_exports(analysis_date: str, dict_inputs: dict): end = datetime.datetime.now() logger.info(f"average rollups for {analysis_date}: {end - start}") + ''' - - for month in ["apr2023", "oct2023"]: + for one_week in [rt_dates.oct_week, rt_dates.apr_week]: start = datetime.datetime.now() - - one_week = [v for k, v in rt_dates.DATES.items() if month in k] - + multi_day_averages(one_week, STOP_SEG_DICT) end = datetime.datetime.now() logger.info(f"average rollups for {one_week}: {end - start}") - \ No newline at end of file diff --git a/rt_segment_speeds/scripts/config.yml b/rt_segment_speeds/scripts/config.yml index e0b2349d6..e16ce749f 100644 --- a/rt_segment_speeds/scripts/config.yml +++ b/rt_segment_speeds/scripts/config.yml @@ -3,19 +3,23 @@ stop_segments: stage2: "nearest/nearest_vp_shape_segments" stage3: "stop_arrivals" stage4: "speeds_stop_segments" + trip_speeds_single_summary: "rollup_singleday/speeds_trip" shape_stop_single_segment: "rollup_singleday/speeds_shape_stop_segments" route_dir_single_segment: "rollup_singleday/speeds_route_dir_segments" - trip_speeds_single_summary: "rollup_singleday/speeds_trip" route_dir_single_summary: "rollup_singleday/speeds_route_dir" route_dir_multi_segment: "rollup_multiday/speeds_route_dir_segments" route_dir_multi_summary: "rollup_multiday/speeds_route_dir" segments_file: "segment_options/shape_stop_segments" timestamp_col: "location_timestamp_local" - time_min_cutoff: 10 + min_trip_minutes: 10 + max_trip_minutes: 180 max_speed: 80 + min_meters_elapsed: 1609 rt_stop_times: stage1: "vp_usable" stage2: "nearest/nearest_vp_rt_stop_times" + stage3: "stop_arrivals_rt_stop_times" + stage4: "speeds_rt_stop_times" segments_file: "segment_options/stop_segments" road_segments: stage1: "vp_usable" @@ -26,4 +30,3 @@ road_segments: segments_file: "road_segments" segment_identifier_cols: ["linearid", "mtfcc", "segment_sequence"] timestamp_col: "location_timestamp_local" - time_min_cutoff: 10 diff --git a/rt_segment_speeds/scripts/cut_stop_segments.py b/rt_segment_speeds/scripts/cut_stop_segments.py index a5dfb464c..6b29a6392 100644 --- a/rt_segment_speeds/scripts/cut_stop_segments.py +++ b/rt_segment_speeds/scripts/cut_stop_segments.py @@ -14,8 +14,7 @@ from loguru import logger -#from calitp_data_analysis import utils -from shared_utils import utils_to_add +from calitp_data_analysis import utils from calitp_data_analysis.geography_utils import WGS84 from segment_speed_utils import gtfs_schedule_wrangling, helpers from segment_speed_utils.project_vars import (SEGMENT_GCS, @@ -145,7 +144,7 @@ def cut_stop_segments(analysis_date: str) -> gpd.GeoDataFrame: how = "inner" ) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( segments, SEGMENT_GCS, f"{SEGMENT_FILE}_{analysis_date}" diff --git a/rt_segment_speeds/scripts/handle_common_errors.py b/rt_segment_speeds/scripts/handle_common_errors.py deleted file mode 100644 index d5cbd376c..000000000 --- a/rt_segment_speeds/scripts/handle_common_errors.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Tag rows where we know errors are occurring when -we find the nearest vp. - -Error 1: nearest_vp_idx = subseq_vp_idx. -We cannot interpolate if the 2 endpoints are the same points. - -Error 2: change from the prior vp_idx value is negative. -We expect monotonically increasing vp_idx across stops, -which then translate to arrival times that are increasing. - -For loop/inlining shapes, esp near origin -(which is also destination), we can select a vp that's happening -at the end of the trip and attach to the origin stop. -This results in an arrival time for stop 1 that occurs after arrival time -for stop 2. -This happens because vp_primary_direction might be Unknown - -""" -import datetime -import pandas as pd - -from segment_speed_utils import array_utils, helpers -from segment_speed_utils.project_vars import SEGMENT_GCS, PROJECT_CRS, CONFIG_PATH -from shared_utils import rt_dates - - -if __name__ == "__main__": - - analysis_date = rt_dates.DATES["sep2023"] - STOP_SEG_DICT = helpers.get_parameters(CONFIG_PATH, "stop_segments") - - NEAREST_VP = f"{STOP_SEG_DICT['stage2']}_{analysis_date}" - - start = datetime.datetime.now() - - df = pd.read_parquet( - f"{SEGMENT_GCS}projection/{NEAREST_VP}.parquet" - ) - - WINDOW = 3 - df = array_utils.rolling_window_make_array( - df, - window = WINDOW, rolling_col = "nearest_vp_idx" - ) - df = array_utils.rolling_window_make_array( - df, - window = WINDOW, rolling_col = "stop_meters" - ) - - df.to_parquet( - f"{SEGMENT_GCS}projection/nearest_vp_error_{analysis_date}.parquet") - - end = datetime.datetime.now() - print(f"execution time: {end - start}") \ No newline at end of file diff --git a/rt_segment_speeds/scripts/interpolate_stop_arrival.py b/rt_segment_speeds/scripts/interpolate_stop_arrival.py index 48f0a23d2..f423cc5d8 100644 --- a/rt_segment_speeds/scripts/interpolate_stop_arrival.py +++ b/rt_segment_speeds/scripts/interpolate_stop_arrival.py @@ -10,7 +10,7 @@ from loguru import logger -from segment_speed_utils import helpers +from segment_speed_utils import array_utils, helpers, segment_calcs, wrangle_shapes from segment_speed_utils.project_vars import (SEGMENT_GCS, PROJECT_CRS, CONFIG_PATH ) @@ -18,7 +18,7 @@ def project_points_onto_shape( stop_geometry: shapely.Point, vp_coords_trio: shapely.LineString, - shape_geometry: shapely.Geometry, + shape_geometry: shapely.LineString, timestamp_arr: np.ndarray, ) -> tuple[float]: """ @@ -26,17 +26,108 @@ def project_points_onto_shape( and the stop position onto the shape geometry. Use np.interp to find interpolated arrival time """ - stop_position = shape_geometry.project(stop_geometry) - + stop_position = vp_coords_trio.project(stop_geometry) + stop_meters = shape_geometry.project(stop_geometry) + points = [shapely.Point(p) for p in vp_coords_trio.coords] - xp = np.asarray([shape_geometry.project(p) for p in points]) + projected_points = np.asarray([vp_coords_trio.project(p) for p in points]) - yp = timestamp_arr.astype("datetime64[s]").astype("float64") + interpolated_arrival = wrangle_shapes.interpolate_stop_arrival_time( + stop_position, projected_points, timestamp_arr) + + return stop_meters, interpolated_arrival - interpolated_arrival = np.interp(stop_position, xp, yp) + +def stop_and_arrival_time_arrays_by_trip( + df: pd.DataFrame, +) -> pd.DataFrame: + """ + For stops that violated the monotonically increasing condition, + set those arrival_times to NaT again. + Now, look across stops and interpolate again, using stop_meters. + """ + # Add columns with the trip's stop_meters and arrival_times + # for only correctly interpolated values + df_arrays = (df[df.arrival_time.notna()] + .groupby("trip_instance_key") + .agg({ + "stop_meters": lambda x: list(x), + "arrival_time": lambda x: list(x) + }).rename(columns = { + "stop_meters": "stop_meters_arr", + "arrival_time": "arrival_time_arr" + }).reset_index() + ) - return stop_position, interpolated_arrival + df2 = pd.merge( + df, + df_arrays, + on = "trip_instance_key", + how = "inner" + ) + + # Use correct values to fill in the missing arrival times + df2 = df2.assign( + arrival_time = df2.apply( + lambda x: wrangle_shapes.interpolate_stop_arrival_time( + x.stop_meters, x.stop_meters_arr, x.arrival_time_arr + ), axis=1 + ) + ).drop(columns = ["stop_meters_arr", "arrival_time_arr"]) + return df2 + + +def enforce_monotonicity_and_interpolate_across_stops( + df: pd.DataFrame +) -> pd.DataFrame: + """ + Do a check to make sure stop arrivals are all monotonically increasing. + If it fails the check in a window of 3, and the center + position is not increasing, we will interpolate again using + surrounding observations. + """ + df = segment_calcs.convert_timestamp_to_seconds( + df, ["arrival_time"]) + + df = array_utils.rolling_window_make_array( + df, + window = 3, rolling_col = "arrival_time_sec" + ) + + # Subset to trips that have at least 1 obs that violates monotonicity + trips_with_one_false = (df.groupby("trip_instance_key") + .agg({"arrival_time_sec_monotonic": "min"}) + .reset_index() + .query('arrival_time_sec_monotonic==0') + .trip_instance_key + ) + + # Set arrival times to NaT if it's not monotonically increasing + mask = df.arrival_time_sec_monotonic == False + df.loc[mask, 'arrival_time'] = np.nan + + no_fix = df[~df.trip_instance_key.isin(trips_with_one_false)] + fix1 = df[df.trip_instance_key.isin(trips_with_one_false)] + fix1 = stop_and_arrival_time_arrays_by_trip(fix1) + + drop_me = [ + "arrival_time_sec", + "rolling_arrival_time_sec", "arrival_time_sec_monotonic" + ] + + fixed_df = pd.concat( + [no_fix, fix1], axis=0 + ).drop( + columns = drop_me + ).sort_values( + ["trip_instance_key", "stop_sequence"] + ).reset_index(drop=True) + + del no_fix, fix1, df + + return fixed_df + def interpolate_stop_arrivals( analysis_date: str, @@ -58,6 +149,7 @@ def interpolate_stop_arrivals( ) df = df.assign( + stop_geometry = df.stop_geometry.to_crs(PROJECT_CRS), vp_coords_trio = df.vp_coords_trio.to_crs(PROJECT_CRS) ) @@ -94,20 +186,28 @@ def interpolate_stop_arrivals( results = gdf.assign( stop_meters = stop_meters_series, arrival_time = stop_arrival_series, - ).astype({"arrival_time": "datetime64[s]"})[ - ["trip_instance_key", "shape_array_key", - "stop_sequence", "stop_id", "stop_meters", - "arrival_time" - ]] - - del gdf - + )[["trip_instance_key", "shape_array_key", + "stop_sequence", "stop_id", + "stop_meters", "arrival_time"] + ].sort_values( + ["trip_instance_key", "stop_sequence"] + ).reset_index(drop=True) + + time1 = datetime.datetime.now() + logger.info(f"get stop arrivals {analysis_date}: {time1 - start}") + + results = enforce_monotonicity_and_interpolate_across_stops(results) + results.to_parquet( f"{SEGMENT_GCS}{STOP_ARRIVALS_FILE}.parquet" ) - + + del gdf, results + end = datetime.datetime.now() - logger.info(f"get stop arrivals {analysis_date}: {end - start}") + logger.info(f"interpolate arrivals execution time: {analysis_date}: {end - start}") + + return if __name__ == "__main__": @@ -121,8 +221,10 @@ def interpolate_stop_arrivals( level="INFO") STOP_SEG_DICT = helpers.get_parameters(CONFIG_PATH, "stop_segments") - + RT_STOP_TIMES_DICT = helpers.get_parameters(CONFIG_PATH, "rt_stop_times") + for analysis_date in analysis_date_list: interpolate_stop_arrivals(analysis_date, STOP_SEG_DICT) + #interpolate_stop_arrivals(analysis_date, RT_STOP_TIMES_DICT) \ No newline at end of file diff --git a/rt_segment_speeds/scripts/nearest_vp_to_stop.py b/rt_segment_speeds/scripts/nearest_vp_to_stop.py index 8e3973e06..e905c657d 100644 --- a/rt_segment_speeds/scripts/nearest_vp_to_stop.py +++ b/rt_segment_speeds/scripts/nearest_vp_to_stop.py @@ -2,6 +2,8 @@ Find nearest_vp_idx to the stop position using scipy KDTree. """ +import dask.dataframe as dd +import dask_geopandas as dg import datetime import geopandas as gpd import numpy as np @@ -12,11 +14,15 @@ from loguru import logger from calitp_data_analysis.geography_utils import WGS84 -#from calitp_data_analysis import utils -from shared_utils import utils_to_add +from calitp_data_analysis import utils from segment_speed_utils import helpers, neighbor from segment_speed_utils.project_vars import SEGMENT_GCS +stop_time_col_order = [ + 'trip_instance_key', 'shape_array_key', + 'stop_sequence', 'stop_id', 'stop_pair', + 'stop_primary_direction', 'geometry' +] def add_nearest_neighbor_result( gdf: gpd.GeoDataFrame, @@ -32,11 +38,11 @@ def add_nearest_neighbor_result( f"{SEGMENT_GCS}condensed/vp_condensed_{analysis_date}.parquet", columns = ["trip_instance_key", "vp_idx", "location_timestamp_local", - "geometry"] + "geometry"], ).rename(columns = { "vp_idx": "trip_vp_idx", "geometry": "trip_geometry" - }) + }).set_geometry("trip_geometry").to_crs(WGS84) gdf2 = pd.merge( gdf, @@ -53,48 +59,40 @@ def add_nearest_neighbor_result( coords_trio_series = [] # Iterate through and find the nearest_vp_idx, then surrounding trio + nearest_vp_idx = np.vectorize(neighbor.add_nearest_vp_idx)( + gdf2.vp_geometry, gdf2.stop_geometry, gdf2.vp_idx + ) + + gdf2 = gdf2.assign( + nearest_vp_idx = nearest_vp_idx, + ).drop( + columns = ["vp_idx", "vp_geometry"] + ) + for row in gdf2.itertuples(): - nearest_vp = neighbor.add_nearest_vp_idx( - getattr(row, "geometry"), - getattr(row, "stop_geometry"), - getattr(row, "vp_idx") - ) - - vp_idx_arr = np.asarray(getattr(row, "trip_vp_idx")) - timestamp_arr = np.asarray(getattr(row, "location_timestamp_local")) - coords_arr = np.asarray(getattr(row, "trip_geometry").coords) - vp_trio, time_trio, coords_trio = neighbor.add_trio( - nearest_vp, + getattr(row, "nearest_vp_idx"), np.asarray(getattr(row, "trip_vp_idx")), np.asarray(getattr(row, "location_timestamp_local")), - np.array(getattr(row, "trip_geometry").coords), + np.asarray(getattr(row, "trip_geometry").coords), ) - nearest_vp_idx_series.append(nearest_vp) - trio_line = shapely.LineString(coords_trio) vp_trio_series.append(vp_trio) time_trio_series.append(time_trio) - coords_trio_series.append(trio_line) - - - gdf2 = gdf2.assign( - nearest_vp_idx = nearest_vp_idx_series, - vp_idx_trio = vp_trio_series, - location_timestamp_local_trio = time_trio_series, - vp_coords_trio = gpd.GeoSeries(coords_trio_series, crs = WGS84) - ) - + coords_trio_series.append(shapely.LineString(coords_trio)) + drop_cols = [ - "vp_idx", "geometry", "location_timestamp_local", "trip_vp_idx", "trip_geometry" ] - gdf2 = gdf2.drop(columns = drop_cols) + gdf2 = gdf2.assign( + vp_idx_trio = vp_trio_series, + location_timestamp_local_trio = time_trio_series, + vp_coords_trio = gpd.GeoSeries(coords_trio_series, crs = WGS84) + ).drop(columns = drop_cols) - del nearest_vp_idx_series, vp_trio_series - del time_trio_series, coords_trio_series + del vp_trio_series, time_trio_series, coords_trio_series return gdf2 @@ -108,25 +106,25 @@ def nearest_neighbor_rt_stop_times( includes all trips. Use stop sequences for each trip. """ start = datetime.datetime.now() - EXPORT_FILE = Path(f'{dict_inputs["stage2"]}') + EXPORT_FILE = f'{dict_inputs["stage2"]}' stop_times = helpers.import_scheduled_stop_times( analysis_date, - columns = ["trip_instance_key", + columns = ["trip_instance_key", "shape_array_key", "stop_sequence", "stop_id", "stop_pair", "stop_primary_direction", "geometry"], with_direction = True, get_pandas = True, crs = WGS84 - ) + ).reindex(columns = stop_time_col_order) gdf = neighbor.merge_stop_vp_for_nearest_neighbor( stop_times, analysis_date) results = add_nearest_neighbor_result(gdf, analysis_date) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( results, SEGMENT_GCS, f"{EXPORT_FILE}_{analysis_date}", @@ -155,46 +153,49 @@ def nearest_neighbor_shape_segments( EXPORT_FILE = dict_inputs["stage2"] SEGMENT_FILE = dict_inputs["segments_file"] - subset_trips = pd.read_parquet( + rt_trips = helpers.import_unique_vp_trips(analysis_date) + + shape_stop_combinations = pd.read_parquet( f"{SEGMENT_GCS}{SEGMENT_FILE}_{analysis_date}.parquet", - columns = ["st_trip_instance_key"] - ).st_trip_instance_key.unique() + columns = ["trip_instance_key", + "stop_id1", "stop_pair", + "st_trip_instance_key"], + filters = [[("trip_instance_key", "in", rt_trips)]] + ).rename(columns = {"stop_id1": "stop_id"}) + + subset_trips = shape_stop_combinations.st_trip_instance_key.unique() stops_to_use = helpers.import_scheduled_stop_times( analysis_date, columns = ["trip_instance_key", "shape_array_key", - "stop_sequence", "stop_id", "stop_pair", - "stop_primary_direction", - "geometry"], + "stop_sequence", "stop_id", "stop_pair", + "stop_primary_direction", "geometry"], filters = [[("trip_instance_key", "in", subset_trips)]], get_pandas = True, with_direction = True ).rename(columns = {"trip_instance_key": "st_trip_instance_key"}) - all_trips = helpers.import_scheduled_stop_times( - analysis_date, - columns = ["trip_instance_key", "shape_array_key"], - get_pandas = True, - with_direction = True - ).drop_duplicates().reset_index(drop=True) - stop_times = pd.merge( stops_to_use, - all_trips, - on = "shape_array_key", + shape_stop_combinations, + on = ["st_trip_instance_key", "stop_id", "stop_pair"], how = "inner" + ).drop( + columns = "st_trip_instance_key" + ).drop_duplicates().reset_index(drop=True).reindex( + columns = stop_time_col_order ) + del stops_to_use, shape_stop_combinations + gdf = neighbor.merge_stop_vp_for_nearest_neighbor( stop_times, analysis_date) - - del stop_times, all_trips, stops_to_use - - results = add_nearest_neighbor_result(gdf, analysis_date) - del gdf + results = add_nearest_neighbor_result(gdf, analysis_date) - utils_to_add.geoparquet_gcs_export( + del stop_times, gdf + + utils.geoparquet_gcs_export( results, SEGMENT_GCS, f"{EXPORT_FILE}_{analysis_date}", @@ -207,7 +208,7 @@ def nearest_neighbor_shape_segments( del results return - + if __name__ == "__main__": @@ -224,5 +225,5 @@ def nearest_neighbor_shape_segments( for analysis_date in analysis_date_list: nearest_neighbor_shape_segments(analysis_date, STOP_SEG_DICT) - nearest_neighbor_rt_stop_times(analysis_date, RT_STOP_TIMES_DICT) + #nearest_neighbor_rt_stop_times(analysis_date, RT_STOP_TIMES_DICT) \ No newline at end of file diff --git a/rt_segment_speeds/scripts/publish_public_gcs.py b/rt_segment_speeds/scripts/publish_public_gcs.py index 906ef6521..94f919a29 100644 --- a/rt_segment_speeds/scripts/publish_public_gcs.py +++ b/rt_segment_speeds/scripts/publish_public_gcs.py @@ -2,56 +2,27 @@ Grab all files in the rollup """ import datetime -import gcsfs import pandas as pd -from dask import delayed, compute -from segment_speed_utils import helpers -from segment_speed_utils.project_vars import SEGMENT_GCS, PUBLIC_GCS, CONFIG_PATH +from segment_speed_utils import helpers, time_series_utils +from segment_speed_utils.project_vars import SEGMENT_GCS, PUBLIC_GCS -fs = gcsfs.GCSFileSystem() - -def concatenate_datasets_across_months(dataset_name: str) -> pd.DataFrame: - list_of_files = fs.glob(f"{SEGMENT_GCS}rollup/{dataset_name}_*") - print(list_of_files) - - dfs = [ - pd.read_parquet(f"gs://{d}").drop( - columns = "schedule_gtfs_dataset_key" - ) for d in list_of_files - ] - - if "shape" in dataset_name: - sort_cols = ["shape_id", "stop_sequence"] - elif "route" in dataset_name: - sort_cols = ["route_id", "direction_id", "stop_pair"] - - df = (pd.concat(dfs, - axis=0, ignore_index=True) - .sort_values(["organization_name", - "year", "month", "peak_offpeak", "weekday_weekend", - ] + sort_cols) - .reset_index(drop=True) - ) - - return df if __name__ == "__main__": + from segment_speed_utils.project_vars import CONFIG_PATH + STOP_SEG_DICT = helpers.get_parameters(CONFIG_PATH, "stop_segments") - - + DATASETS = [ - STOP_SEG_DICT["shape_rollup"], - STOP_SEG_DICT["route_direction_rollup"] + STOP_SEG_DICT["route_dir_single_segment"] ] for d in DATASETS: start = datetime.datetime.now() - df = delayed(concatenate_datasets_across_months)(d) - df = compute(df)[0] + df = time_series_utils.concatenate_datasets_across_months(d) df.to_parquet(f"{PUBLIC_GCS}speeds/{d}.parquet") end = datetime.datetime.now() diff --git a/rt_segment_speeds/scripts/select_stop_segments.py b/rt_segment_speeds/scripts/select_stop_segments.py index 4ad607197..15035544a 100644 --- a/rt_segment_speeds/scripts/select_stop_segments.py +++ b/rt_segment_speeds/scripts/select_stop_segments.py @@ -13,8 +13,7 @@ import geopandas as gpd import pandas as pd -#from calitp_data_analysis import utils -from shared_utils import utils_to_add +from calitp_data_analysis import utils from shared_utils import rt_dates from segment_speed_utils import helpers from segment_speed_utils.project_vars import SEGMENT_GCS @@ -73,7 +72,7 @@ def select_one_trip_per_shape(analysis_date: str): segments = select_one_trip_per_shape(analysis_date) - utils_to_add.geoparquet_gcs_export( + utils.geoparquet_gcs_export( segments, SEGMENT_GCS, f"{SEGMENT_FILE}_{analysis_date}" diff --git a/rt_segment_speeds/scripts/stop_arrivals_to_speed.py b/rt_segment_speeds/scripts/stop_arrivals_to_speed.py index 8a4ef1789..c3786cf5c 100644 --- a/rt_segment_speeds/scripts/stop_arrivals_to_speed.py +++ b/rt_segment_speeds/scripts/stop_arrivals_to_speed.py @@ -16,7 +16,7 @@ def attach_operator_natural_identifiers( ) -> pd.DataFrame: """ For each gtfs_dataset_key-shape_array_key combination, - re-attach the natural identifiers and organizational identifiers. + re-attach the natural identifiers. Return a df with all the identifiers we need during downstream aggregations, such as by route-direction. """ @@ -29,13 +29,18 @@ def attach_operator_natural_identifiers( get_pandas = True ) - # Get crosswalk from schedule_gtfs_dataset_key to organization - crosswalk = helpers.import_schedule_gtfs_key_organization_crosswalk( - analysis_date, - ).drop(columns = "itp_id") - # Add time-of-day, which is associated with trip_instance_key - time_of_day = gtfs_schedule_wrangling.get_trip_time_buckets(analysis_date) + sched_time_of_day = gtfs_schedule_wrangling.get_trip_time_buckets( + analysis_date + ).rename( + columns = {"time_of_day": "schedule_time_of_day"}) + + # If trip isn't in schedule, use vp to derive + vp_time_of_day = gtfs_schedule_wrangling.get_vp_trip_time_buckets( + analysis_date + ).rename( + columns = {"time_of_day": "vp_time_of_day"}) + trip_used_for_shape = pd.read_parquet( f"{SEGMENT_GCS}segment_options/" @@ -60,16 +65,21 @@ def attach_operator_natural_identifiers( stop_pair, on = ["shape_array_key", "stop_sequence"] ).merge( - time_of_day, + sched_time_of_day, on = "trip_instance_key", - how = "inner" - ).merge( - crosswalk, - on = "schedule_gtfs_dataset_key", how = "left" + ).merge( + vp_time_of_day, + on = "trip_instance_key", + how = "inner" ) - del crosswalk, shape_identifiers, time_of_day + df_with_natural_ids = df_with_natural_ids.assign( + time_of_day = df_with_natural_ids.schedule_time_of_day.fillna( + df_with_natural_ids.vp_time_of_day) + ).drop(columns = ["schedule_time_of_day", "vp_time_of_day"]) + + del df, stop_pair, sched_time_of_day, vp_time_of_day return df_with_natural_ids @@ -147,5 +157,4 @@ def calculate_speed_from_stop_arrivals( STOP_SEG_DICT = helpers.get_parameters(CONFIG_PATH, "stop_segments") for analysis_date in analysis_date_list: - calculate_speed_from_stop_arrivals(analysis_date, STOP_SEG_DICT) diff --git a/rt_segment_speeds/segment_speed_utils/__init__.py b/rt_segment_speeds/segment_speed_utils/__init__.py index dbbab68f7..6fbc798eb 100644 --- a/rt_segment_speeds/segment_speed_utils/__init__.py +++ b/rt_segment_speeds/segment_speed_utils/__init__.py @@ -6,6 +6,7 @@ project_vars, segment_calcs, time_helpers, + time_series_utils, vp_transform, wrangle_shapes, ) @@ -18,6 +19,7 @@ "project_vars", "segment_calcs", "time_helpers", + "time_series_utils", "vp_transform", "wrangle_shapes", ] \ No newline at end of file diff --git a/rt_segment_speeds/segment_speed_utils/array_utils.py b/rt_segment_speeds/segment_speed_utils/array_utils.py index 8568e177a..295aae47e 100644 --- a/rt_segment_speeds/segment_speed_utils/array_utils.py +++ b/rt_segment_speeds/segment_speed_utils/array_utils.py @@ -13,7 +13,7 @@ def rolling_window_make_array( ) -> pd.DataFrame: # https://stackoverflow.com/questions/47482009/pandas-rolling-window-to-return-an-array df[f"rolling_{rolling_col}"] = [ - np.asarray(window)for window in + np.asarray(window) for window in df.groupby("trip_instance_key")[rolling_col].rolling( window = window, center=True) ] @@ -31,7 +31,7 @@ def monotonic_check(arr: np.ndarray) -> bool: """ diff_arr = np.diff(arr) - if np.all(diff_arr >= 0): + if np.all(diff_arr > 0): return True else: return False \ No newline at end of file diff --git a/rt_segment_speeds/segment_speed_utils/gtfs_schedule_wrangling.py b/rt_segment_speeds/segment_speed_utils/gtfs_schedule_wrangling.py index f52cf49ee..a62150391 100644 --- a/rt_segment_speeds/segment_speed_utils/gtfs_schedule_wrangling.py +++ b/rt_segment_speeds/segment_speed_utils/gtfs_schedule_wrangling.py @@ -10,6 +10,7 @@ from segment_speed_utils import helpers, time_helpers from shared_utils import portfolio_utils, rt_utils from segment_speed_utils.project_vars import SEGMENT_GCS + def exclude_scheduled_operators( trips: pd.DataFrame, exclude_me: list = ["Amtrak Schedule", "*Flex"] @@ -168,6 +169,7 @@ def aggregate_time_of_day_to_peak_offpeak( return df3 + def get_vp_trip_time_buckets(analysis_date: str) -> pd.DataFrame: """ Assign trips to time-of-day. @@ -185,21 +187,17 @@ def get_vp_trip_time_buckets(analysis_date: str) -> pd.DataFrame: .agg({"location_timestamp_local": "min"}) .reset_index() .rename(columns={"location_timestamp_local": "min_time"}) - ) - - ddf2 = ddf2.compute() + ).compute() ddf2 = ddf2.assign( time_of_day=ddf2.apply( lambda x: rt_utils.categorize_time_of_day(x.min_time), axis=1 ) - ) + )[["time_of_day","trip_instance_key"]] - - ddf2 = ddf2[["time_of_day","trip_instance_key"]] - return ddf2 + def get_trip_time_buckets(analysis_date: str) -> pd.DataFrame: """ Assign trips to time-of-day. diff --git a/rt_segment_speeds/segment_speed_utils/neighbor.py b/rt_segment_speeds/segment_speed_utils/neighbor.py index 19d728660..69c950898 100644 --- a/rt_segment_speeds/segment_speed_utils/neighbor.py +++ b/rt_segment_speeds/segment_speed_utils/neighbor.py @@ -9,23 +9,29 @@ from segment_speed_utils import gtfs_schedule_wrangling, wrangle_shapes from segment_speed_utils.project_vars import SEGMENT_GCS +geo_const_meters = 6_371_000 * np.pi / 180 +geo_const_miles = 3_959_000 * np.pi / 180 + def nearest_snap(line: shapely.LineString, point: shapely.Point) -> int: """ Based off of this function, but we want to return the index value, rather than the point. https://github.com/UTEL-UIUC/gtfs_segments/blob/main/gtfs_segments/geom_utils.py """ - line = np.array(line.coords) - point = np.array(point.coords) + line = np.asarray(line.coords) + point = np.asarray(point.coords) tree = cKDTree(line) # np_dist is array of distances of result # np_inds is array of indices of result - np_dist, np_inds = tree.query(point, workers=-1, k=1) - + # to get approx distance in meters: geo_const * np_dist + _, np_inds = tree.query( + point, workers=-1, k=1, + #distance_upper_bound = geo_const_miles * 5 # upper bound of 5 miles + ) # We're looking for 1 nearest neighbor, so return 1st element in array return np_inds[0] - + def add_nearest_vp_idx( vp_linestring: shapely.LineString, @@ -87,9 +93,6 @@ def add_trio( coords_arr[start_pos: ] ) - elif array_length == 0: - return vp_idx_arr - # (start_idx > 0) and (array_length > 2): else: start_pos = start_idx - 1 @@ -108,17 +111,22 @@ def merge_stop_vp_for_nearest_neighbor( vp_condensed = gpd.read_parquet( f"{SEGMENT_GCS}condensed/" f"vp_nearest_neighbor_{analysis_date}.parquet", - ).drop(columns = "location_timestamp_local") - + ).drop(columns = "location_timestamp_local").to_crs(WGS84) + gdf = pd.merge( stop_times.rename( columns = { "geometry": "stop_geometry"} - ).set_geometry("stop_geometry"), + ).set_geometry("stop_geometry").to_crs(WGS84), vp_condensed.rename( - columns = {"vp_primary_direction": "stop_primary_direction"}), + columns = { + "vp_primary_direction": "stop_primary_direction", + "geometry": "vp_geometry" + }), on = ["trip_instance_key", "stop_primary_direction"], how = "inner" ) + del vp_condensed + return gdf \ No newline at end of file diff --git a/rt_segment_speeds/segment_speed_utils/project_vars.py b/rt_segment_speeds/segment_speed_utils/project_vars.py index 4cd0ea760..8f3c57406 100644 --- a/rt_segment_speeds/segment_speed_utils/project_vars.py +++ b/rt_segment_speeds/segment_speed_utils/project_vars.py @@ -9,19 +9,11 @@ SHARED_GCS = f"{GCS_FILE_PATH}shared_data/" PUBLIC_GCS = "gs://calitp-publish-data-analysis/" -analysis_date = rt_dates.DATES["jan2024"] +analysis_date = rt_dates.DATES["feb2024"] -days = ["a", "b", "", "c", "d", "e", "f"] -months = [ - "dec", - #"nov", "oct", "sep", - #"aug", "jul", "jun", - #"may", "apr", "mar" -] - -analysis_date_list = [ - rt_dates.DATES[f"{m}2023"] for m in months -] +oct_week = rt_dates.get_week("oct2023", exclude_wed=True) +apr_week = rt_dates.get_week("apr2023", exclude_wed=True) +analysis_date_list = [analysis_date] PROJECT_CRS = "EPSG:3310" CONFIG_PATH = "./config.yml" diff --git a/rt_segment_speeds/segment_speed_utils/time_series_utils.py b/rt_segment_speeds/segment_speed_utils/time_series_utils.py new file mode 100644 index 000000000..21c7e8a8b --- /dev/null +++ b/rt_segment_speeds/segment_speed_utils/time_series_utils.py @@ -0,0 +1,54 @@ +""" +Functions for creating time-series data +by concatenating aggregated data across multiple months. +""" +import datetime +import geopandas as gpd +import gcsfs +import pandas as pd + +from dask import delayed, compute +from pathlib import Path +from typing import Literal + +from segment_speed_utils.project_vars import SEGMENT_GCS + +fs = gcsfs.GCSFileSystem() + +OPERATOR_COLS = ["schedule_gtfs_dataset_key", "name", + "organization_source_record_id", "organization_name", + "base64_url", "caltrans_district"] +STOP_PAIR_COLS = ["stop_pair"] +ROUTE_DIR_COLS = ["route_id", "direction_id"] + + +def concatenate_datasets_across_months( + dataset_name: Literal["speeds_route_dir_segments", "speeds_route_dir"] +) -> pd.DataFrame: + """ + Concatenate parquets across all months of available data. + """ + list_of_files = fs.glob(f"{SEGMENT_GCS}{dataset_name}_*") + + # If the dataset name includes a folder, parse that away + dataset_stem = Path(dataset).stem + + dates = [Path(i).stem.split(f"{dataset_stem}_")[1] for i in list_of_files] + + dfs = [ + delayed(gpd.read_parquet)( + f"{SEGMENT_GCS}{dataset_name}_{d}.parquet" + ).assign( + service_date = pd.to_datetime(d) + ) for d in dates + ] + + df = delayed(pd.concat)( + dfs, axis=0, ignore_index=True + ).sort_values( + ["organization_name", "service_date"] + ROUTE_DIR_COLS + ).reset_index(drop=True) + + df = compute(df)[0] + + return df \ No newline at end of file diff --git a/rt_segment_speeds/segment_speed_utils/wrangle_shapes.py b/rt_segment_speeds/segment_speed_utils/wrangle_shapes.py index 374ceff1f..6becb9703 100644 --- a/rt_segment_speeds/segment_speed_utils/wrangle_shapes.py +++ b/rt_segment_speeds/segment_speed_utils/wrangle_shapes.py @@ -10,9 +10,6 @@ * https://gis.stackexchange.com/questions/416284/splitting-multiline-or-linestring-into-equal-segments-of-particular-length-using * https://stackoverflow.com/questions/62053253/how-to-split-a-linestring-to-segments """ -import dask.array as da -import dask.dataframe as dd -import dask_geopandas as dg import geopandas as gpd import numpy as np import pandas as pd @@ -182,32 +179,17 @@ def vp_as_gdf( return vp_gdf -def project_vp_onto_segment_geometry( - vp: pd.DataFrame, - segment_gdf: gpd.GeoDataFrame, - grouping_cols: list -) -> pd.DataFrame: +def interpolate_stop_arrival_time( + stop_position: float, + shape_meters_arr: np.ndarray, + timestamp_arr: np.ndarray +) -> float: """ - Project vp onto either shape_geometry or - road_geometry. + Interpolate the arrival time given the stop meters position. + Cast datetimes into floats and cast back as datetime. """ - segment_gdf = segment_gdf.rename(columns = {"geometry": "line_geometry"}) - - vp_gdf = vp_as_gdf(vp) - - gdf = pd.merge( - vp_gdf, - segment_gdf, - on = grouping_cols, - how = "inner" - ) - - gdf = gdf.assign( - shape_meters = gdf.line_geometry.project(gdf.geometry) - ) - - vp_projected_result = gdf[ - ["vp_idx"] + grouping_cols + ["shape_meters"] - ].drop_duplicates() - - return vp_projected_result \ No newline at end of file + timestamp_arr = np.asarray(timestamp_arr).astype("datetime64[s]").astype("float64") + + return np.interp( + stop_position, np.asarray(shape_meters_arr), timestamp_arr + ).astype("datetime64[s]") \ No newline at end of file diff --git a/rt_segment_speeds/setup.py b/rt_segment_speeds/setup.py index 91d733b7d..6021e31cc 100644 --- a/rt_segment_speeds/setup.py +++ b/rt_segment_speeds/setup.py @@ -3,7 +3,7 @@ setup( name="segment_speed_utils", packages=find_packages(), - version="1.3.2", + version="1.4.0", description="Utility functions for GTFS RT segment speeds", author="Cal-ITP", license="Apache",