From 3e6472385f0b4ca1009a229577db20cf62e87282 Mon Sep 17 00:00:00 2001 From: tiffanychu90 Date: Thu, 14 Mar 2024 18:32:13 +0000 Subject: [PATCH 1/6] run hqta, traffic ops for march, partial speeds --- _shared_utils/shared_utils/rt_dates.py | 1 + gtfs_funnel/logs/download_data.log | 16 + gtfs_funnel/logs/download_vp_v2.log | 11 + gtfs_funnel/logs/vp_preprocessing.log | 7 + gtfs_funnel/route_typologies.py | 9 +- gtfs_funnel/update_vars.py | 2 +- .../B1_create_hqta_segments.py | 16 + high_quality_transit_areas/amtrak.ipynb | 278 ++++++++++++++++++ .../logs/hqta_processing.log | 9 + high_quality_transit_areas/update_vars.py | 2 +- open_data/update_vars.py | 2 +- 11 files changed, 345 insertions(+), 8 deletions(-) create mode 100644 high_quality_transit_areas/amtrak.ipynb diff --git a/_shared_utils/shared_utils/rt_dates.py b/_shared_utils/shared_utils/rt_dates.py index 396ce1d4d..6c1e71e27 100644 --- a/_shared_utils/shared_utils/rt_dates.py +++ b/_shared_utils/shared_utils/rt_dates.py @@ -51,6 +51,7 @@ "dec2023": "2023-12-13", "jan2024": "2024-01-17", "feb2024": "2024-02-14", + "mar2024": "2023-03-13", } y2023_dates = [ diff --git a/gtfs_funnel/logs/download_data.log b/gtfs_funnel/logs/download_data.log index 9a49e16df..d0315a783 100644 --- a/gtfs_funnel/logs/download_data.log +++ b/gtfs_funnel/logs/download_data.log @@ -286,3 +286,19 @@ 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 +2024-03-14 09:04:12.795 | INFO | __main__:download_one_day:46 - Analysis date: 2023-03-13 +2024-03-14 09:04:15.112 | INFO | __main__:download_one_day:53 - # operators to run: 197 +2024-03-14 09:04:15.112 | INFO | __main__:download_one_day:56 - *********** Download trips data *********** +2024-03-14 09:04:39.494 | INFO | __main__:download_one_day:86 - execution time: 0:00:26.673402 +2024-03-14 09:04:57.009 | INFO | __main__:download_one_day:23 - Analysis date: 2023-03-13 +2024-03-14 09:04:58.829 | INFO | __main__:download_one_day:30 - # operators to run: 197 +2024-03-14 09:04:58.830 | INFO | __main__:download_one_day:33 - *********** Download stops data *********** +2024-03-14 09:05:06.710 | INFO | __main__:download_one_day:64 - execution time: 0:00:09.700498 +2024-03-14 09:05:23.556 | INFO | __main__:download_one_day:22 - Analysis date: 2023-03-13 +2024-03-14 09:05:25.592 | INFO | __main__:download_one_day:29 - # operators to run: 197 +2024-03-14 09:05:25.592 | INFO | __main__:download_one_day:33 - *********** Download routelines data *********** +2024-03-14 09:07:56.533 | INFO | __main__:download_one_day:63 - execution time: 0:02:32.976430 +2024-03-14 09:08:13.702 | INFO | __main__:download_one_day:21 - Analysis date: 2023-03-13 +2024-03-14 09:08:15.097 | INFO | __main__:download_one_day:29 - # operators to run: 155 +2024-03-14 09:08:15.097 | INFO | __main__:download_one_day:33 - *********** Download st data *********** +2024-03-14 09:09:38.948 | INFO | __main__:download_one_day:56 - execution time: 0:01:25.245238 diff --git a/gtfs_funnel/logs/download_vp_v2.log b/gtfs_funnel/logs/download_vp_v2.log index cf8af9340..2ab3213d7 100644 --- a/gtfs_funnel/logs/download_vp_v2.log +++ b/gtfs_funnel/logs/download_vp_v2.log @@ -185,3 +185,14 @@ 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 +2024-03-14 09:09:58.720 | INFO | __main__::148 - Analysis date: 2023-03-13 +2024-03-14 09:11:36.786 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 0 to GCS: 0:01:38.029332 +2024-03-14 09:12:26.968 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 1 to GCS: 0:00:50.181553 +2024-03-14 09:15:04.540 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 2 to GCS: 0:02:37.570466 +2024-03-14 09:16:39.753 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 3 to GCS: 0:01:35.211943 +2024-03-14 09:16:39.755 | INFO | __main__::155 - execution time: 0:06:40.997879 +2024-03-14 09:16:57.331 | INFO | __main__::95 - Analysis date: 2023-03-13 +2024-03-14 09:17:03.307 | INFO | __main__::103 - concat and filter batched data: 0:00:05.975527 +2024-03-14 09:19:12.804 | INFO | __main__::110 - export concatenated vp: 0:02:09.497151 +2024-03-14 09:21:46.029 | INFO | __main__::132 - remove batched parquets +2024-03-14 09:21:46.029 | INFO | __main__::135 - execution time: 0:04:48.697741 diff --git a/gtfs_funnel/logs/vp_preprocessing.log b/gtfs_funnel/logs/vp_preprocessing.log index 40872d22d..ad25a2dda 100644 --- a/gtfs_funnel/logs/vp_preprocessing.log +++ b/gtfs_funnel/logs/vp_preprocessing.log @@ -12,3 +12,10 @@ 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 +2024-03-14 09:26:43.404 | INFO | __main__::169 - 2023-03-13: pare down vp: 0:01:37.278692 +2024-03-14 09:30:03.387 | INFO | __main__:attach_prior_vp_add_direction:89 - persist vp gddf: 0:03:01.387551 +2024-03-14 09:32:40.068 | INFO | __main__:attach_prior_vp_add_direction:121 - np vectorize arrays for direction: 0:02:36.680878 +2024-03-14 09:32:45.659 | INFO | __main__::193 - 2023-03-13: export vp direction: 0:05:43.659881 +2024-03-14 09:33:52.186 | INFO | __main__::199 - 2023-03-13: export usable vp with direction: 0:01:06.526779 +2024-03-14 09:33:52.187 | INFO | __main__::202 - 2023-03-13: vp_direction script execution time: 0:06:50.186660 +2024-03-14 09:47:28.091 | INFO | __main__::142 - 2023-03-13: condense vp for trip 0:13:14.682784 diff --git a/gtfs_funnel/route_typologies.py b/gtfs_funnel/route_typologies.py index e925e9302..e297799f1 100644 --- a/gtfs_funnel/route_typologies.py +++ b/gtfs_funnel/route_typologies.py @@ -37,8 +37,7 @@ def assemble_scheduled_trip_metrics( time_of_day = (gtfs_schedule_wrangling.get_trip_time_buckets(analysis_date) [["trip_instance_key", "time_of_day", - "service_minutes"]] - .rename(columns = {"service_minutes": "sched_service_min"}) + "scheduled_service_minutes"]] ) trip_cols = ["schedule_gtfs_dataset_key", "trip_instance_key"] @@ -81,15 +80,15 @@ def schedule_metrics_by_route_direction( # take mean of the median stop spacing for trip # does this make sense? # median is the single boiled down metric at the trip-level - "sched_service_min": "mean", + "scheduled_service_minutes": "mean", }).reset_index() .rename(columns = { "median_stop_meters": "avg_stop_meters", - "sched_service_min": "avg_sched_service_min" + "scheduled_service_minutes": "avg_scheduled_service_minutes" }) ) - round_me = ["avg_stop_meters", "avg_sched_service_min"] + round_me = ["avg_stop_meters", "avg_scheduled_service_minutes"] metrics_df[round_me] = metrics_df[round_me].round(2) common_shape = gtfs_schedule_wrangling.most_common_shape_by_route_direction( diff --git a/gtfs_funnel/update_vars.py b/gtfs_funnel/update_vars.py index 07a14fb20..18f8624a9 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["feb2024"] + rt_dates.DATES["mar2024"] ] CONFIG_PATH = Path("config.yml") diff --git a/high_quality_transit_areas/B1_create_hqta_segments.py b/high_quality_transit_areas/B1_create_hqta_segments.py index f831cfb81..148106cad 100644 --- a/high_quality_transit_areas/B1_create_hqta_segments.py +++ b/high_quality_transit_areas/B1_create_hqta_segments.py @@ -105,8 +105,24 @@ def select_shapes_and_segment( Concatenate these 2 portions and then cut HQTA segments. Returns the hqta_segments for all the routes across all operators. """ + # Only include certain Amtrak routes + ca_amtrak = ["Pacific Surfliner", "San Joaquins", + "Coast Starlight", "Capitol Corridor", + #"Sunset Limited", "California Zephyr", + ] + + outside_ca_amtrak_shapes = helpers.import_scheduled_trips( + analysis_date, + filters = [[("name", "==", "Amtrak Schedule"), + ("route_long_name", "not in", ca_amtrak)]], + columns = ["shape_array_key"] + ).shape_array_key.unique() + + gdf = gtfs_schedule_wrangling.longest_shape_by_route_direction( analysis_date + ).query( + 'shape_array_key not in @outside_ca_amtrak_shapes' ).drop( columns = ["schedule_gtfs_dataset_key", "shape_array_key", "route_length"] diff --git a/high_quality_transit_areas/amtrak.ipynb b/high_quality_transit_areas/amtrak.ipynb new file mode 100644 index 000000000..54ba0ad21 --- /dev/null +++ b/high_quality_transit_areas/amtrak.ipynb @@ -0,0 +1,278 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9591797b-9f6e-4c50-aa6d-d7aefae788e3", + "metadata": {}, + "source": [ + "# Amtrak Routes for HQTA\n", + "\n", + "Looks like Amtrak is back in our scheduled data, because `regional_feed_type = None` again.\n", + "\n", + "Keep:\n", + "* Pacific Surfliner\n", + "* San Joaquins\n", + "* Coast Starlight\n", + "* Capitol Corridor\n", + "\n", + "Do not keep (too much outside CA):\n", + "* California Zephyr\n", + "* Sunset Limited" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "1aa26833-e218-4949-827e-d7f06f7da634", + "metadata": {}, + "outputs": [], + "source": [ + "import geopandas as gpd\n", + "import pandas as pd\n", + "\n", + "from segment_speed_utils import helpers\n", + "from shared_utils import rt_dates" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ea935076-8b20-4b68-9443-b53bf859ad35", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(6411, 2)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "analysis_date = rt_dates.DATES[\"mar2024\"]\n", + "\n", + "shapes = helpers.import_scheduled_shapes(\n", + " analysis_date,\n", + " columns = [\"shape_array_key\", \"geometry\"],\n", + " crs = \"EPSG:4326\",\n", + " get_pandas = True\n", + ") \n", + "\n", + "shapes.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "dcff0ce4-996d-4d95-af31-4185b89cdf1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "shapes.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "09ed1f70-266d-4c09-8346-b5ddc35b6af8", + "metadata": {}, + "outputs": [], + "source": [ + "trips = helpers.import_scheduled_trips(\n", + " analysis_date,\n", + " columns = [\"name\", \"shape_array_key\", \"route_id\", \n", + " \"route_short_name\", \"route_long_name\", \n", + " \"regional_feed_type\"],\n", + " get_pandas = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "840d6cb6-b59b-4b7f-b134-c4076e1fdf80", + "metadata": {}, + "outputs": [], + "source": [ + "amtrak_trips = trips[trips.name==\"Amtrak Schedule\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9a63ff6d-751f-40b8-93f9-4d3c565f245e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Series([], Name: regional_feed_type, dtype: int64)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amtrak_trips.regional_feed_type.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "66fa6c2c-de84-4cd6-b823-9f1671c87024", + "metadata": {}, + "outputs": [], + "source": [ + "amtrak_trips2 = pd.merge(\n", + " shapes,\n", + " amtrak_trips,\n", + " on = \"shape_array_key\",\n", + " how = \"inner\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6142ef00-0b71-4bf0-9272-07e4a33ca69b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([None], dtype=object)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amtrak_trips2.route_short_name.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b168339b-191e-4ca9-91a3-0074d5c23cb6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "amtrak_trips2.plot(\"route_long_name\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9c9a5107-f071-42c9-8cf4-9480bad42edf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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VJsPEOvWrauxvOpwmRa4LmRnZ9OkSZMqz1ssFnJzc6vNU8ZNN91E06ZN6du3Lxs2bHCkTOBKrTt27OCGG26okGfYsGHs2LGjyjJ27NhB//790el0Fa45fPgwFy9edLjmqli6dClXXXUV/fr1qzHvww8/TGhoKL169eKjjz6y+2GY2840//333/niiy/49ttvq8zz6quvkpeXx7hx46rM4+fnx2uvvcb111+PWq3myy+/ZOzYsaxfv56bbrrJaVpTU1MJDw+vkC88PJycnBwKCwvx8fG5opzU1FTatGlzxTVl54KDgx2itzqKiopYsWIF06dPrzHv888/z+DBgzEYDPzwww/8+9//Ji8vj6lTp9a+wnq13/Xk6aefrnEu6cGDBytcU5ufusTERBEaGirmzZtXZZ4VK1YIg8EgNm/e3Ci1tm/fXrz00ksV3vv2228FIAoKCiota8iQIWLSpElO01qbLsTKlSuFVqsVqamp1earjFmzZonIyEi7rlG0BX7iiSe4++67q83Ttm1bu8r8+++/iYuLY9KkScycObPSPKtWreL+++9nzZo1V/xM10brihUreO+999i+fbvTtEZERJCWllbhvbS0NAICAiptfctf88ILL9i07ty5k7vvvps//vijwtRGe7XWlqVLlzJq1Kgrfj1qw7XXXsu8efMwGo21nmuhqIHDwsIICwtzWHkHDhxg8ODB3HXXXbz44ouV5vn888+59957WbVqFSNHjqx12eW1pqamEhUVRYcOHZymtXfv3mzcuLHCe5s3b65y/WHZNc8++yxBQUE2rZ988gkxMTFce+21ddZaW06ePMmWLVvqfI+wb98+goOD7ZsoZHc7rxCnT58WCQkJYu7cucLPz08kJCSIhIQEkZubK4Sw/hSHhYWJO++8U6SkpNhe6enptjJWrFghtFqteOeddyrkycrKsuV56623xODBg23Hy5YtEytXrhQHDx4UBw8eFC+++KJQq9Xio48+cqrWEydOCIPBIJ588klx8OBB8c477wiNRiO+//77KrVmZWWJ8PBwMWHCBLF//36xatUqYTAYxJIlS+qsVQghjh49KhISEsTkyZPFVVddZctTfrRDCCFmzpwpmjdvLkwm0xX1fPXVVxVGQzZs2CA++OADkZiYKI4ePSreffddYTAYxHPPPVel1spwGQPfddddlfbltmzZIoSoem1dq1atbGUMGDCg0jx33XWXLc/s2bMrXLNs2TLRsWNHYTAYREBAgOjVq5dYs2aN07UKIcSWLVtE9+7dhU6nE23bthUff/xxhfOXaxVCiD///FP07dtX6PV60aJFC7FgwYJ6aa3u73by5ElbHrPZLCIjI8UzzzxTaT0ff/yxKN9efvfdd6J79+7Cz89P+Pr6im7duon33ntPmM3mavVejpxOKXFp3HocWOL+SANLXBppYIlLIw0scWmkgSUujTSwxKWRBpa4NNLAEpdGGlji0kgDS1waaWCJSyMNLHFp/h/Fr3NWMnRlpAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ca_amtrak = [\"Pacific Surfliner\", \"San Joaquins\", \n", + " \"Coast Starlight\", \"Capitol Corridor\"\n", + " ]\n", + "amtrak_trips2[\n", + " amtrak_trips2.route_long_name.isin(ca_amtrak)\n", + "].plot(\"route_long_name\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f301fd6-ab91-45f0-b371-b11ee0332d96", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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/high_quality_transit_areas/logs/hqta_processing.log b/high_quality_transit_areas/logs/hqta_processing.log index 0feba20a6..5a7aad3c7 100644 --- a/high_quality_transit_areas/logs/hqta_processing.log +++ b/high_quality_transit_areas/logs/hqta_processing.log @@ -62,3 +62,12 @@ 2024-02-23 13:48:09.216 | INFO | __main__::160 - C3_create_bus_hqta_types 2024-02-14 execution time: 0:00:21.771559 2024-02-23 15:04:25.099 | INFO | __main__::295 - D1_assemble_hqta_points 2024-02-14 execution time: 0:00:24.251981 2024-02-23 15:06:13.474 | INFO | __main__::167 - D2_assemble_hqta_polygons 2024-02-14 execution time: 0:00:20.572008 +2024-03-14 10:35:35.916 | INFO | __main__::340 - A1_rail_ferry_brt_stops 2023-03-13 execution time: 0:00:56.468970 +2024-03-14 10:49:33.915 | INFO | __main__::243 - B1_create_hqta_segments execution time: 0:13:35.798908 +2024-03-14 10:50:41.957 | INFO | __main__::256 - B2_sjoin_stops_to_segments 2023-03-13 execution time: 0:00:46.505567 +2024-03-14 10:51:12.944 | INFO | __main__::142 - C1_prep_pairwise_intersections 2023-03-13 execution time: 0:00:07.495188 +2024-03-14 10:52:10.238 | INFO | __main__::125 - C2_find_intersections 2023-03-13 execution time: 0:00:34.444930 +2024-03-14 10:53:01.682 | INFO | __main__::163 - C3_create_bus_hqta_types 2023-03-13 execution time: 0:00:29.090421 +2024-03-14 11:27:07.016 | INFO | __main__::259 - B1_create_hqta_segments execution time: 0:01:24.890920 +2024-03-14 11:29:20.496 | INFO | __main__::295 - D1_assemble_hqta_points 2023-03-13 execution time: 0:00:22.179824 +2024-03-14 11:30:06.328 | INFO | __main__::167 - D2_assemble_hqta_polygons 2023-03-13 execution time: 0:00:22.226070 diff --git a/high_quality_transit_areas/update_vars.py b/high_quality_transit_areas/update_vars.py index 29627c0ac..4dd1ee5f2 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_dates -analysis_date = rt_dates.DATES["feb2024"] +analysis_date = rt_dates.DATES["mar2024"] GCS_FILE_PATH = ("gs://calitp-analytics-data/data-analyses/" "high_quality_transit_areas/") diff --git a/open_data/update_vars.py b/open_data/update_vars.py index 3add72c13..1bb037036 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["feb2024"] +analysis_date = rt_dates.DATES["mar2024"] GCS_FILE_PATH = "gs://calitp-analytics-data/data-analyses/" COMPILED_CACHED_VIEWS = f"{GCS_FILE_PATH}rt_delay/compiled_cached_views/" From 5fdfa8226ad9ec19909e35664f7edb81e2a90515 Mon Sep 17 00:00:00 2001 From: tiffanychu90 Date: Thu, 14 Mar 2024 19:20:19 +0000 Subject: [PATCH 2/6] rerun for mar 2024 --- _shared_utils/shared_utils/rt_dates.py | 2 +- gtfs_funnel/logs/download_data.log | 16 ++ gtfs_funnel/logs/download_vp_v2.log | 11 ++ gtfs_funnel/logs/vp_preprocessing.log | 6 + .../check2_hq_corridors.ipynb | 10 +- .../check3_hqta_points.ipynb | 2 +- .../logs/hqta_processing.log | 8 + .../segment_speed_utils/metrics.py | 179 ++++++++++++++++++ 8 files changed, 227 insertions(+), 7 deletions(-) create mode 100644 rt_segment_speeds/segment_speed_utils/metrics.py diff --git a/_shared_utils/shared_utils/rt_dates.py b/_shared_utils/shared_utils/rt_dates.py index 6c1e71e27..379b251a8 100644 --- a/_shared_utils/shared_utils/rt_dates.py +++ b/_shared_utils/shared_utils/rt_dates.py @@ -51,7 +51,7 @@ "dec2023": "2023-12-13", "jan2024": "2024-01-17", "feb2024": "2024-02-14", - "mar2024": "2023-03-13", + "mar2024": "2024-03-13", } y2023_dates = [ diff --git a/gtfs_funnel/logs/download_data.log b/gtfs_funnel/logs/download_data.log index d0315a783..9c4705a65 100644 --- a/gtfs_funnel/logs/download_data.log +++ b/gtfs_funnel/logs/download_data.log @@ -302,3 +302,19 @@ 2024-03-14 09:08:15.097 | INFO | __main__:download_one_day:29 - # operators to run: 155 2024-03-14 09:08:15.097 | INFO | __main__:download_one_day:33 - *********** Download st data *********** 2024-03-14 09:09:38.948 | INFO | __main__:download_one_day:56 - execution time: 0:01:25.245238 +2024-03-14 11:40:02.601 | INFO | __main__:download_one_day:46 - Analysis date: 2024-03-13 +2024-03-14 11:40:04.888 | INFO | __main__:download_one_day:53 - # operators to run: 198 +2024-03-14 11:40:04.888 | INFO | __main__:download_one_day:56 - *********** Download trips data *********** +2024-03-14 11:40:27.756 | INFO | __main__:download_one_day:86 - execution time: 0:00:25.154163 +2024-03-14 11:40:45.783 | INFO | __main__:download_one_day:23 - Analysis date: 2024-03-13 +2024-03-14 11:40:47.912 | INFO | __main__:download_one_day:30 - # operators to run: 198 +2024-03-14 11:40:47.913 | INFO | __main__:download_one_day:33 - *********** Download stops data *********** +2024-03-14 11:40:55.873 | INFO | __main__:download_one_day:64 - execution time: 0:00:10.088939 +2024-03-14 11:41:13.626 | INFO | __main__:download_one_day:22 - Analysis date: 2024-03-13 +2024-03-14 11:41:15.717 | INFO | __main__:download_one_day:29 - # operators to run: 198 +2024-03-14 11:41:15.718 | INFO | __main__:download_one_day:33 - *********** Download routelines data *********** +2024-03-14 11:42:47.690 | INFO | __main__:download_one_day:63 - execution time: 0:01:34.063605 +2024-03-14 11:43:04.973 | INFO | __main__:download_one_day:21 - Analysis date: 2024-03-13 +2024-03-14 11:43:06.291 | INFO | __main__:download_one_day:29 - # operators to run: 172 +2024-03-14 11:43:06.291 | INFO | __main__:download_one_day:33 - *********** Download st data *********** +2024-03-14 11:44:27.599 | INFO | __main__:download_one_day:56 - execution time: 0:01:22.625555 diff --git a/gtfs_funnel/logs/download_vp_v2.log b/gtfs_funnel/logs/download_vp_v2.log index 2ab3213d7..c555431b9 100644 --- a/gtfs_funnel/logs/download_vp_v2.log +++ b/gtfs_funnel/logs/download_vp_v2.log @@ -196,3 +196,14 @@ 2024-03-14 09:19:12.804 | INFO | __main__::110 - export concatenated vp: 0:02:09.497151 2024-03-14 09:21:46.029 | INFO | __main__::132 - remove batched parquets 2024-03-14 09:21:46.029 | INFO | __main__::135 - execution time: 0:04:48.697741 +2024-03-14 11:44:47.535 | INFO | __main__::148 - Analysis date: 2024-03-13 +2024-03-14 11:47:05.554 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 0 to GCS: 0:02:18.016698 +2024-03-14 11:48:07.120 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 1 to GCS: 0:01:01.565485 +2024-03-14 11:52:52.284 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 2 to GCS: 0:04:45.163361 +2024-03-14 11:55:08.855 | INFO | __main__:loop_through_batches_and_download_vp:111 - exported batch 3 to GCS: 0:02:16.569896 +2024-03-14 11:55:08.856 | INFO | __main__::155 - execution time: 0:10:21.318927 +2024-03-14 11:55:28.243 | INFO | __main__::95 - Analysis date: 2024-03-13 +2024-03-14 11:55:35.238 | INFO | __main__::103 - concat and filter batched data: 0:00:06.994611 +2024-03-14 11:58:41.151 | INFO | __main__::110 - export concatenated vp: 0:03:05.913001 +2024-03-14 12:01:43.033 | INFO | __main__::132 - remove batched parquets +2024-03-14 12:01:43.035 | INFO | __main__::135 - execution time: 0:06:14.791580 diff --git a/gtfs_funnel/logs/vp_preprocessing.log b/gtfs_funnel/logs/vp_preprocessing.log index ad25a2dda..104e1b4d2 100644 --- a/gtfs_funnel/logs/vp_preprocessing.log +++ b/gtfs_funnel/logs/vp_preprocessing.log @@ -19,3 +19,9 @@ 2024-03-14 09:33:52.186 | INFO | __main__::199 - 2023-03-13: export usable vp with direction: 0:01:06.526779 2024-03-14 09:33:52.187 | INFO | __main__::202 - 2023-03-13: vp_direction script execution time: 0:06:50.186660 2024-03-14 09:47:28.091 | INFO | __main__::142 - 2023-03-13: condense vp for trip 0:13:14.682784 +2024-03-14 12:08:15.749 | INFO | __main__::169 - 2024-03-13: pare down vp: 0:01:39.120888 +2024-03-14 12:11:52.801 | INFO | __main__:attach_prior_vp_add_direction:89 - persist vp gddf: 0:03:19.615961 +2024-03-14 12:14:59.645 | INFO | __main__:attach_prior_vp_add_direction:121 - np vectorize arrays for direction: 0:03:06.843928 +2024-03-14 12:15:05.566 | INFO | __main__::193 - 2024-03-13: export vp direction: 0:06:32.381100 +2024-03-14 12:16:08.741 | INFO | __main__::199 - 2024-03-13: export usable vp with direction: 0:01:03.175027 +2024-03-14 12:16:08.742 | INFO | __main__::202 - 2024-03-13: vp_direction script execution time: 0:07:35.556127 diff --git a/high_quality_transit_areas/check2_hq_corridors.ipynb b/high_quality_transit_areas/check2_hq_corridors.ipynb index ea38d6b36..c4440b9b0 100644 --- a/high_quality_transit_areas/check2_hq_corridors.ipynb +++ b/high_quality_transit_areas/check2_hq_corridors.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "ecdd335a-be94-4a11-aaca-24a43a3b9756", "metadata": {}, "outputs": [], @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "4fa137db-08d5-4822-9bdd-46919ee0da7f", "metadata": {}, "outputs": [], @@ -45,14 +45,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "1e383a39-3810-41f6-a366-985126b335db", "metadata": {}, "outputs": [], "source": [ - "bus_hq_corr = prep_clip.prep_bus_corridors()\n", + "bus_hq_corr = prep_clip.prep_bus_corridors(is_hq_corr=True)\n", "\n", - "corridors = D2.get_dissolved_hq_corridor_bus(bus_hq_corr.compute(), \n", + "corridors = D2.get_dissolved_hq_corridor_bus(bus_hq_corr, \n", " analysis_date)" ] }, diff --git a/high_quality_transit_areas/check3_hqta_points.ipynb b/high_quality_transit_areas/check3_hqta_points.ipynb index 7539f6e07..42e7d19f6 100644 --- a/high_quality_transit_areas/check3_hqta_points.ipynb +++ b/high_quality_transit_areas/check3_hqta_points.ipynb @@ -26,7 +26,7 @@ "\n", "from IPython.display import Markdown\n", "\n", - "from utilities import GCS_FILE_PATH" + "from update_vars import GCS_FILE_PATH" ] }, { diff --git a/high_quality_transit_areas/logs/hqta_processing.log b/high_quality_transit_areas/logs/hqta_processing.log index 5a7aad3c7..daa56734f 100644 --- a/high_quality_transit_areas/logs/hqta_processing.log +++ b/high_quality_transit_areas/logs/hqta_processing.log @@ -71,3 +71,11 @@ 2024-03-14 11:27:07.016 | INFO | __main__::259 - B1_create_hqta_segments execution time: 0:01:24.890920 2024-03-14 11:29:20.496 | INFO | __main__::295 - D1_assemble_hqta_points 2023-03-13 execution time: 0:00:22.179824 2024-03-14 11:30:06.328 | INFO | __main__::167 - D2_assemble_hqta_polygons 2023-03-13 execution time: 0:00:22.226070 +2024-03-14 11:48:11.160 | INFO | __main__::340 - A1_rail_ferry_brt_stops 2024-03-13 execution time: 0:00:57.213630 +2024-03-14 11:53:27.946 | INFO | __main__::259 - B1_create_hqta_segments execution time: 0:04:58.538786 +2024-03-14 11:54:43.754 | INFO | __main__::256 - B2_sjoin_stops_to_segments 2024-03-13 execution time: 0:00:50.087412 +2024-03-14 11:55:10.649 | INFO | __main__::142 - C1_prep_pairwise_intersections 2024-03-13 execution time: 0:00:07.089710 +2024-03-14 11:56:06.191 | INFO | __main__::125 - C2_find_intersections 2024-03-13 execution time: 0:00:35.945019 +2024-03-14 11:56:55.334 | INFO | __main__::163 - C3_create_bus_hqta_types 2024-03-13 execution time: 0:00:27.390021 +2024-03-14 12:12:21.763 | INFO | __main__::295 - D1_assemble_hqta_points 2024-03-13 execution time: 0:00:26.480160 +2024-03-14 12:13:12.687 | INFO | __main__::167 - D2_assemble_hqta_polygons 2024-03-13 execution time: 0:00:29.033860 diff --git a/rt_segment_speeds/segment_speed_utils/metrics.py b/rt_segment_speeds/segment_speed_utils/metrics.py new file mode 100644 index 000000000..9580e060f --- /dev/null +++ b/rt_segment_speeds/segment_speed_utils/metrics.py @@ -0,0 +1,179 @@ +""" +Define the metrics we can derive for +segment speeds, RT vs schedule, etc. +""" +import pandas as pd + +from typing import Literal + +from segment_speed_utils import segment_calcs + +def weighted_average_speeds_across_segments( + df: pd.DataFrame, + group_cols: list +) -> pd.DataFrame: + """ + We can use our segments and the deltas within a trip + to calculate the trip-level average speed, or + the route-direction-level average speed. + But, we want a weighted average, using the raw deltas + instead of mean(speed_mph), since segments can be varying lengths. + """ + avg_speeds_peak = (df.groupby(group_cols + ["peak_offpeak"], + observed=True, group_keys=False) + .agg({ + "meters_elapsed": "sum", + "sec_elapsed": "sum", + }).reset_index() + ) + + avg_speeds_peak = segment_calcs.speed_from_meters_elapsed_sec_elapsed( + avg_speeds_peak) + + # For all aggregations above the trip level, continue on + if "trip_instance_key" not in group_cols: + avg_speeds_allday = (df.groupby(group_cols, + observed=True, group_keys=False) + .agg({ + "meters_elapsed": "sum", + "sec_elapsed": "sum", + }).reset_index() + ) + + avg_speeds_allday = segment_calcs.speed_from_meters_elapsed_sec_elapsed( + avg_speeds_allday + ).assign( + peak_offpeak = "all_day" + ) + + avg_speeds = pd.concat( + [avg_speeds_peak, avg_speeds_allday], + axis=0, ignore_index = True + ).rename( + columns = {"peak_offpeak": "time_period"} + ) + + return avg_speeds + + # A trip level dataset cannot be aggregated to peak/offpeak/all_day + else: + return avg_speeds_peak + + +def derive_rt_vs_schedule_metrics(df: pd.DataFrame) -> pd.DataFrame: + """ + Add metrics and numeric rounding. + """ + integrify = ["vp_in_shape", "total_vp"] + df[integrify] = df[integrify].fillna(0).astype("int") + + df = df.assign( + vp_per_minute = df.total_vp / df.rt_service_minutes, + pct_in_shape = df.vp_in_shape / df.total_vp, + pct_rt_journey_vp = df.minutes_atleast1_vp / df.rt_service_minutes, + pct_rt_journey_atleast2_vp = df.minutes_atleast2_vp / df.rt_service_minutes, + pct_sched_journey_atleast1_vp = (df.minutes_atleast1_vp / + df.scheduled_service_minutes), + pct_sched_journey_atleast2_vp = (df.minutes_atleast2_vp / + df.scheduled_service_minutes), + ) + + two_decimal_cols = [ + "vp_per_minute", "rt_service_minutes", + ] + + df[two_decimal_cols] = df[two_decimal_cols].round(2) + + three_decimal_cols = [ + c for c in df.columns if "pct_" in c + ] + + df[three_decimal_cols] = df[three_decimal_cols].round(3) + + # Mask percents for any values above 100% + # Scheduled service minutes can be assumed to be shorter than + # RT service minutes, so there can be more minutes with vp data available + mask_me = [c for c in df.columns if + ("pct_sched_journey" in c) or + # check when this would happen in route direction aggregation + ("pct_rt_journey" in c)] + for c in mask_me: + df[c] = df[c].mask(df[c] > 1, 1) + + return df + + +def calculate_weighted_average_vp_schedule_metrics( + df: pd.DataFrame, + group_cols: list, +) -> pd.DataFrame: + + sum_cols = [ + "minutes_atleast1_vp", + "minutes_atleast2_vp", + "rt_service_minutes", + "scheduled_service_minutes", + "total_vp", + "vp_in_shape", + ] + + count_cols = ["trip_instance_key"] + + df2 = ( + df.groupby(group_cols, + observed=True, group_keys=False) + .agg({ + **{e: "sum" for e in sum_cols}, + **{e: "count" for e in count_cols}} + ).reset_index() + .rename(columns = {"trip_instance_key": "n_trips"}) + ) + + return df2 + + +def concatenate_peak_offpeak_allday_averages( + df: pd.DataFrame, + group_cols: list, + metric_type: Literal["segment_speeds", "rt_vs_schedule"] +) -> pd.DataFrame: + """ + Calculate average speeds for all day and + peak_offpeak. + Concatenate these, so that speeds are always calculated + for the same 3 time periods. + """ + if metric_type == "segment_speeds": + avg_peak = segment_calcs.calculate_avg_speeds( + df, + group_cols + ["peak_offpeak"] + ) + + avg_allday = segment_calcs.calculate_avg_speeds( + df, + group_cols + ).assign(peak_offpeak = "all_day") + + elif metric_type == "rt_vs_schedule": + avg_peak = calculate_weighted_average_vp_schedule_metrics( + df, + group_cols + ["peak_offpeak"] + ) + + avg_allday = calculate_weighted_average_vp_schedule_metrics( + df, + group_cols + ).assign(peak_offpeak = "all_day") + + else: + print(f"Valid metric types: ['segment_speeds', 'rt_vs_schedule']") + + # Concatenate so that every segment has 3 time periods: peak, offpeak, and all_day + avg_metrics = pd.concat( + [avg_peak, avg_allday], + axis=0, ignore_index = True + ).rename( + columns = {"peak_offpeak": "time_period"} + ) + + return avg_metrics \ No newline at end of file From e5cf75cf81e6844a21dfd822b3b544e71de61a97 Mon Sep 17 00:00:00 2001 From: tiffanychu90 Date: Thu, 14 Mar 2024 22:40:56 +0000 Subject: [PATCH 3/6] swap order, use dask delayed to condense --- gtfs_funnel/Makefile | 9 +++--- gtfs_funnel/logs/vp_preprocessing.log | 9 ++---- gtfs_funnel/vp_condenser.py | 42 ++++++++------------------- gtfs_funnel/vp_direction.py | 4 +-- 4 files changed, 21 insertions(+), 43 deletions(-) diff --git a/gtfs_funnel/Makefile b/gtfs_funnel/Makefile index a3b389209..217074c94 100644 --- a/gtfs_funnel/Makefile +++ b/gtfs_funnel/Makefile @@ -6,15 +6,16 @@ download_gtfs_data: python download_stop_times.py python download_vehicle_positions.py python concatenate_vehicle_positions.py - + + preprocess: python stop_times_with_direction.py + python route_typologies.py + python crosswalk_gtfs_dataset_key_to_organization.py python vp_keep_usable.py python vp_direction.py - python vp_condenser.py python cleanup.py - python route_typologies.py - python crosswalk_gtfs_dataset_key_to_organization.py + python vp_condenser.py # Start compiling scripts needed when we start concatenating several days # Clean route names for displaying across time diff --git a/gtfs_funnel/logs/vp_preprocessing.log b/gtfs_funnel/logs/vp_preprocessing.log index 104e1b4d2..f678e8d84 100644 --- a/gtfs_funnel/logs/vp_preprocessing.log +++ b/gtfs_funnel/logs/vp_preprocessing.log @@ -12,16 +12,11 @@ 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 -2024-03-14 09:26:43.404 | INFO | __main__::169 - 2023-03-13: pare down vp: 0:01:37.278692 -2024-03-14 09:30:03.387 | INFO | __main__:attach_prior_vp_add_direction:89 - persist vp gddf: 0:03:01.387551 -2024-03-14 09:32:40.068 | INFO | __main__:attach_prior_vp_add_direction:121 - np vectorize arrays for direction: 0:02:36.680878 -2024-03-14 09:32:45.659 | INFO | __main__::193 - 2023-03-13: export vp direction: 0:05:43.659881 -2024-03-14 09:33:52.186 | INFO | __main__::199 - 2023-03-13: export usable vp with direction: 0:01:06.526779 -2024-03-14 09:33:52.187 | INFO | __main__::202 - 2023-03-13: vp_direction script execution time: 0:06:50.186660 -2024-03-14 09:47:28.091 | INFO | __main__::142 - 2023-03-13: condense vp for trip 0:13:14.682784 2024-03-14 12:08:15.749 | INFO | __main__::169 - 2024-03-13: pare down vp: 0:01:39.120888 2024-03-14 12:11:52.801 | INFO | __main__:attach_prior_vp_add_direction:89 - persist vp gddf: 0:03:19.615961 2024-03-14 12:14:59.645 | INFO | __main__:attach_prior_vp_add_direction:121 - np vectorize arrays for direction: 0:03:06.843928 2024-03-14 12:15:05.566 | INFO | __main__::193 - 2024-03-13: export vp direction: 0:06:32.381100 2024-03-14 12:16:08.741 | INFO | __main__::199 - 2024-03-13: export usable vp with direction: 0:01:03.175027 2024-03-14 12:16:08.742 | INFO | __main__::202 - 2024-03-13: vp_direction script execution time: 0:07:35.556127 +2024-03-14 12:43:58.062 | INFO | __main__::153 - 2024-03-13: condense vp for trip 0:04:45.267623 +2024-03-14 12:56:43.421 | INFO | __main__::161 - 2024-03-13: prepare vp to use in nearest neighbor: 0:12:45.358549 diff --git a/gtfs_funnel/vp_condenser.py b/gtfs_funnel/vp_condenser.py index d54b7d777..13b13e36b 100644 --- a/gtfs_funnel/vp_condenser.py +++ b/gtfs_funnel/vp_condenser.py @@ -1,7 +1,6 @@ """ Condense vp into arrays by trip-direction. """ -import dask.dataframe as dd import datetime import geopandas as gpd import pandas as pd @@ -28,7 +27,7 @@ def condense_vp_to_linestring( USABLE_VP = dict_inputs["usable_vp_file"] EXPORT_FILE = dict_inputs["vp_condensed_line_file"] - vp = dd.read_parquet( + vp = delayed(pd.read_parquet)( f"{SEGMENT_GCS}{USABLE_VP}_{analysis_date}", columns = ["trip_instance_key", "x", "y", "vp_idx", "vp_primary_direction", @@ -36,42 +35,24 @@ def condense_vp_to_linestring( ], ) - vp_dtypes = vp.drop(columns = ["x", "y"]).dtypes.to_dict() - - vp_gdf = vp.map_partitions( - wrangle_shapes.vp_as_gdf, - crs = WGS84, - meta = { - **vp_dtypes, - "geometry": "geometry" - }, - align_dataframes = True - ) - - vp_condensed = vp_gdf.map_partitions( - vp_transform.condense_point_geom_to_line, + vp_gdf = delayed(wrangle_shapes.vp_as_gdf)(vp, crs = WGS84) + + vp_condensed = delayed(vp_transform.condense_point_geom_to_line)( + vp_gdf, group_cols = ["trip_instance_key"], geom_col = "geometry", other_cols = ["vp_idx", "location_timestamp_local", "vp_primary_direction"], - meta = { - "trip_instance_key": "object", - "geometry": "geometry", - "vp_idx": "object", - "location_timestamp_local": "object", - "vp_primary_direction": "object", - }, - align_dataframes = False - ).compute().set_geometry("geometry").set_crs(WGS84) + ).set_geometry("geometry").set_crs(WGS84) + + vp_condensed = compute(vp_condensed)[0] utils.geoparquet_gcs_export( vp_condensed, SEGMENT_GCS, f"{EXPORT_FILE}_{analysis_date}" ) - - del vp_condensed - + return @@ -100,7 +81,7 @@ def prepare_vp_for_all_directions( vp, direction) for direction in wrangle_shapes.ALL_DIRECTIONS ] - + results = [compute(i)[0] for i in dfs] gdf = pd.concat( @@ -135,10 +116,11 @@ def prepare_vp_for_all_directions( for analysis_date in analysis_date_list: start = datetime.datetime.now() - + condense_vp_to_linestring(analysis_date, CONFIG_DICT) time1 = datetime.datetime.now() + logger.info( f"{analysis_date}: condense vp for trip " f"{time1 - start}" diff --git a/gtfs_funnel/vp_direction.py b/gtfs_funnel/vp_direction.py index 6f9104e6a..2c6dddabd 100644 --- a/gtfs_funnel/vp_direction.py +++ b/gtfs_funnel/vp_direction.py @@ -160,8 +160,8 @@ def add_direction_to_usable_vp( ).drop_duplicates(subset=["vp_idx", "vp_primary_direction"]) export_path = f"{SEGMENT_GCS}{INPUT_FILE}_{analysis_date}" - if fs.exists(export_path): - fs.rm(export_path, recursive=True) + + helpers.if_exists_then_delete(export_path) vp_with_dir.to_parquet( export_path, From 7e7a0512099eab5494bc8798e2abf88f1c166f3f Mon Sep 17 00:00:00 2001 From: tiffanychu90 Date: Thu, 14 Mar 2024 22:42:47 +0000 Subject: [PATCH 4/6] run speeds for mar --- rt_segment_speeds/logs/avg_speeds.log | 6 +++ rt_segment_speeds/logs/cut_stop_segments.log | 1 + rt_segment_speeds/scripts/average_speeds.py | 38 +++++++-------- rt_segment_speeds/scripts/config.yml | 4 +- .../scripts/interpolate_stop_arrival.py | 9 +++- .../scripts/nearest_vp_to_stop.py | 11 ++++- .../scripts/publish_public_gcs.py | 5 +- .../scripts/stop_arrivals_to_speed.py | 11 ++++- .../gtfs_schedule_wrangling.py | 48 +++++++++++++++++-- .../segment_speed_utils/metrics.py | 4 +- .../segment_speed_utils/project_vars.py | 5 +- .../segment_speed_utils/time_series_utils.py | 6 ++- 12 files changed, 112 insertions(+), 36 deletions(-) diff --git a/rt_segment_speeds/logs/avg_speeds.log b/rt_segment_speeds/logs/avg_speeds.log index 4d47620db..a09b32212 100644 --- a/rt_segment_speeds/logs/avg_speeds.log +++ b/rt_segment_speeds/logs/avg_speeds.log @@ -26,3 +26,9 @@ 2024-02-28 15:02:52.016 | INFO | __main__:multi_day_averages:351 - route seg avg 0:04:51.436845 2024-02-28 15:03:48.470 | INFO | __main__:multi_day_averages:391 - route dir avg 0:00:56.454294 2024-02-28 15:03:48.541 | INFO | __main__::456 - average rollups for ['2023-04-10', '2023-04-11', '2023-04-12', '2023-04-13', '2023-04-14', '2023-04-15', '2023-04-16']: 0:05:47.967308 +2024-03-14 14:16:48.427 | INFO | __main__:single_day_averages:170 - shape seg avg 0:03:23.830232 +2024-03-14 14:58:31.402 | INFO | __main__:single_day_averages:164 - shape seg avg 0:03:17.806332 +2024-03-14 15:00:54.509 | INFO | __main__:single_day_averages:199 - route dir seg avg 0:02:23.106681 +2024-03-14 15:00:56.734 | INFO | __main__:single_day_averages:216 - trip avg 0:00:02.224932 +2024-03-14 15:01:08.404 | INFO | __main__:single_day_averages:255 - route dir avg: 0:00:11.670228 +2024-03-14 15:01:15.161 | INFO | __main__::416 - average rollups for 2024-03-13: 0:06:10.168066 diff --git a/rt_segment_speeds/logs/cut_stop_segments.log b/rt_segment_speeds/logs/cut_stop_segments.log index 9948fde98..689d5919a 100644 --- a/rt_segment_speeds/logs/cut_stop_segments.log +++ b/rt_segment_speeds/logs/cut_stop_segments.log @@ -1 +1,2 @@ 0:15:29.6603982024-02-15 13:36:56.379 | INFO | __main__::156 - cut segments 2024-02-14: 0:13:55.835925 +2024-03-14 13:33:18.528 | INFO | __main__::156 - cut segments 2024-03-13: 0:26:02.810762 diff --git a/rt_segment_speeds/scripts/average_speeds.py b/rt_segment_speeds/scripts/average_speeds.py index 5d00e9bed..1bd108887 100644 --- a/rt_segment_speeds/scripts/average_speeds.py +++ b/rt_segment_speeds/scripts/average_speeds.py @@ -17,6 +17,7 @@ helpers, metrics, time_helpers, + time_series_utils ) from segment_speed_utils.project_vars import SEGMENT_GCS, CONFIG_PATH from segment_speed_utils.time_series_utils import STOP_PAIR_COLS, ROUTE_DIR_COLS @@ -86,31 +87,24 @@ def concatenate_trip_segment_speeds( SPEED_FILE = dict_inputs["stage4"] MAX_SPEED = dict_inputs["max_speed"] - dfs = [ - delayed(pd.read_parquet)( - f"{SEGMENT_GCS}{SPEED_FILE}_{analysis_date}.parquet", - columns = (OPERATOR_COLS + SHAPE_STOP_COLS + + df = time_series_utils.concatenate_datasets_across_dates( + SEGMENT_GCS, + SPEED_FILE, + analysis_date_list, + data_type = "df", + get_pandas = get_pandas, + columns = (OPERATOR_COLS + SHAPE_STOP_COLS + STOP_PAIR_COLS + ROUTE_DIR_COLS + [ "trip_instance_key", "speed_mph", "meters_elapsed", "sec_elapsed", "time_of_day"]), - filters = [[("speed_mph", "<=", MAX_SPEED)]] - ).assign( - service_date = pd.to_datetime(analysis_date) - ) for analysis_date in analysis_date_list - ] - - df = delayed(pd.concat)( - dfs, axis=0, ignore_index = True + filters = [[("speed_mph", "<=", MAX_SPEED)]] ).pipe( gtfs_schedule_wrangling.add_peak_offpeak_column ).pipe( gtfs_schedule_wrangling.add_weekday_weekend_column ) - if get_pandas: - df = compute(df)[0] - return df @@ -139,9 +133,10 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): t0 = datetime.datetime.now() shape_stop_segments = metrics.concatenate_peak_offpeak_allday_averages( df, - OPERATOR_COLS + SHAPE_STOP_COLS + STOP_PAIR_COLS + OPERATOR_COLS + SHAPE_STOP_COLS + STOP_PAIR_COLS, + metric_type = "segment_speeds" ).pipe( - time_series_utils.merge_operator_identifiers, [analysis_date] + gtfs_schedule_wrangling.merge_operator_identifiers, [analysis_date] ) col_order = [c for c in shape_stop_segments.columns] @@ -170,7 +165,8 @@ def single_day_averages(analysis_date: str, dict_inputs: dict): route_dir_segments = metrics.concatenate_peak_offpeak_allday_averages( df, - OPERATOR_COLS + ROUTE_DIR_COLS + STOP_PAIR_COLS + OPERATOR_COLS + ROUTE_DIR_COLS + STOP_PAIR_COLS, + metric_type = "segment_speeds" ).pipe( gtfs_schedule_wrangling.merge_operator_identifiers, [analysis_date] ) @@ -286,7 +282,8 @@ def multi_day_averages(analysis_date_list: list, dict_inputs: dict): route_dir_segments = delayed( metrics.concatenate_peak_offpeak_allday_averages)( df, - OPERATOR_COLS + ROUTE_DIR_COLS + STOP_PAIR_COLS + ["weekday_weekend"] + OPERATOR_COLS + ROUTE_DIR_COLS + STOP_PAIR_COLS + ["weekday_weekend"], + metric_type = "segment_speeds" ) route_dir_segments = compute(route_dir_segments)[0] @@ -294,7 +291,8 @@ def multi_day_averages(analysis_date_list: list, dict_inputs: dict): route_dir_segments = time_helpers.add_time_span_columns( route_dir_segments, time_span_num ).pipe( - merge_operator_identifiers, analysis_date_list + gtfs_schedule_wrangling.merge_operator_identifiers, + analysis_date_list ) segment_geom = import_segments( diff --git a/rt_segment_speeds/scripts/config.yml b/rt_segment_speeds/scripts/config.yml index 17acbaa0b..78d8b1f5a 100644 --- a/rt_segment_speeds/scripts/config.yml +++ b/rt_segment_speeds/scripts/config.yml @@ -23,8 +23,8 @@ rt_stop_times: segments_file: "segment_options/stop_segments" road_segments: stage1: "vp_usable" - stage2: "nearest_vp_roads" - stage3: "stop_arrivals_roads" + stage2: "nearest/nearest_vp_roads" + stage3: "road_segments/stop_arrivals" stage4: "speeds_road_segments" stage5: "avg_speeds_road_segments" segments_file: "road_segments" diff --git a/rt_segment_speeds/scripts/interpolate_stop_arrival.py b/rt_segment_speeds/scripts/interpolate_stop_arrival.py index 386b094cc..805b373db 100644 --- a/rt_segment_speeds/scripts/interpolate_stop_arrival.py +++ b/rt_segment_speeds/scripts/interpolate_stop_arrival.py @@ -226,4 +226,11 @@ def interpolate_stop_arrivals( logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - \ No newline at end of file + from segment_speed_utils.project_vars import analysis_date_list, CONFIG_PATH + + for analysis_date in analysis_date_list: + interpolate_stop_arrivals( + analysis_date = analysis_date, + segment_type = segment_type, + config_path = CONFIG_PATH + ) \ 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 fb858fb1d..81c01ef1e 100644 --- a/rt_segment_speeds/scripts/nearest_vp_to_stop.py +++ b/rt_segment_speeds/scripts/nearest_vp_to_stop.py @@ -143,4 +143,13 @@ def nearest_neighbor_for_stop( logger.add(LOG_FILE, retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", - level="INFO") \ No newline at end of file + level="INFO") + + from segment_speed_utils.project_vars import analysis_date_list, CONFIG_PATH + + for analysis_date in analysis_date_list: + nearest_neighbor_for_stop( + analysis_date = analysis_date, + segment_type = segment_type, + config_path = CONFIG_PATH + ) \ 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 a894d1a35..527d5b9fd 100644 --- a/rt_segment_speeds/scripts/publish_public_gcs.py +++ b/rt_segment_speeds/scripts/publish_public_gcs.py @@ -29,11 +29,12 @@ start = datetime.datetime.now() - df = time_series_utils.concatenate_datasets_across_months( + df = time_series_utils.concatenate_datasets_across_dates( SEGMENT_GCS, d, analysis_date_list, - data_type = "gdf" + data_type = "gdf", + get_pandas = True ) dataset_stem = Path(d).stem diff --git a/rt_segment_speeds/scripts/stop_arrivals_to_speed.py b/rt_segment_speeds/scripts/stop_arrivals_to_speed.py index 7b382fdbf..f21d77912 100644 --- a/rt_segment_speeds/scripts/stop_arrivals_to_speed.py +++ b/rt_segment_speeds/scripts/stop_arrivals_to_speed.py @@ -156,4 +156,13 @@ def calculate_speed_from_stop_arrivals( logger.add(LOG_FILE, retention="3 months") logger.add(sys.stderr, format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", - level="INFO") \ No newline at end of file + level="INFO") + + from segment_speed_utils.project_vars import analysis_date_list, CONFIG_PATH + + for analysis_date in analysis_date_list: + calculate_speed_from_stop_arrivals( + analysis_date = analysis_date, + segment_type = segment_type, + config_path = CONFIG_PATH + ) \ 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 dc533be3e..134ee6733 100644 --- a/rt_segment_speeds/segment_speed_utils/gtfs_schedule_wrangling.py +++ b/rt_segment_speeds/segment_speed_utils/gtfs_schedule_wrangling.py @@ -17,9 +17,39 @@ "right_only": "vp_only" } +CA_AMTRAK = ["Pacific Surfliner", "San Joaquins", + "Coast Starlight", "Capitol Corridor"] + + +def amtrak_trips( + analysis_date: str, + inside_ca: bool = True +) -> pd.DataFrame: + """ + Return Amtrak table, either for routes primarily inside CA or outside CA. + """ + + if inside_ca: + filters = [[("name", "==", "Amtrak Schedule"), + ("route_long_name", "in", CA_AMTRAK)]] + else: + filters = [[("name", "==", "Amtrak Schedule"), + ("route_long_name", "not in", CA_AMTRAK)]] + + trips = helpers.import_scheduled_trips( + analysis_date, + get_pandas = True, + filters = filters, + columns = None + ) + + return trips + + def exclude_scheduled_operators( trips: pd.DataFrame, - exclude_me: list = ["Amtrak Schedule", "*Flex"] + exclude_me: list = ["*Flex"], + include_amtrak_routes: list = CA_AMTRAK ): """ Exclude certain operators by name. @@ -33,7 +63,20 @@ def exclude_scheduled_operators( for i in substrings: trips = trips[~trips.name.str.contains(i)].reset_index(drop=True) - return trips[~trips.name.isin(exclude_me)].reset_index(drop=True) + trips = trips[~trips.name.isin(exclude_me)].reset_index(drop=True) + + outside_ca_amtrak = helpers.import_scheduled_trips( + analysis_date, + columns = ["trip_instance_key"], + filters = [[("name", "==", "Amtrak Schedule"), + ("route_long_name", "not in", include_amtrak_routes)]], + ).trip_instance_key.unique() + + trips = trips[ + ~trips.trip_instance_key.isin(outside_ca_amtrak) + ].reset_index(drop=True) + + return trips def get_trips_with_geom( @@ -274,7 +317,6 @@ def attach_scheduled_route_info( time_df = time_df.assign( route_id = time_df.route_id.fillna("Unknown"), - direction_id = time_df.direction_id.astype("Int64"), time_of_day = time_df.sched_time_of_day.fillna( time_df.rt_time_of_day), sched_rt_category = time_df.sched_rt_category.map( diff --git a/rt_segment_speeds/segment_speed_utils/metrics.py b/rt_segment_speeds/segment_speed_utils/metrics.py index 9580e060f..813b6ec7a 100644 --- a/rt_segment_speeds/segment_speed_utils/metrics.py +++ b/rt_segment_speeds/segment_speed_utils/metrics.py @@ -70,7 +70,7 @@ def derive_rt_vs_schedule_metrics(df: pd.DataFrame) -> pd.DataFrame: df = df.assign( vp_per_minute = df.total_vp / df.rt_service_minutes, pct_in_shape = df.vp_in_shape / df.total_vp, - pct_rt_journey_vp = df.minutes_atleast1_vp / df.rt_service_minutes, + pct_rt_journey_atleast1_vp = df.minutes_atleast1_vp / df.rt_service_minutes, pct_rt_journey_atleast2_vp = df.minutes_atleast2_vp / df.rt_service_minutes, pct_sched_journey_atleast1_vp = (df.minutes_atleast1_vp / df.scheduled_service_minutes), @@ -126,7 +126,7 @@ def calculate_weighted_average_vp_schedule_metrics( **{e: "sum" for e in sum_cols}, **{e: "count" for e in count_cols}} ).reset_index() - .rename(columns = {"trip_instance_key": "n_trips"}) + .rename(columns = {"trip_instance_key": "n_vp_trips"}) ) return df2 diff --git a/rt_segment_speeds/segment_speed_utils/project_vars.py b/rt_segment_speeds/segment_speed_utils/project_vars.py index 8f3c57406..79a2fec8c 100644 --- a/rt_segment_speeds/segment_speed_utils/project_vars.py +++ b/rt_segment_speeds/segment_speed_utils/project_vars.py @@ -9,7 +9,7 @@ SHARED_GCS = f"{GCS_FILE_PATH}shared_data/" PUBLIC_GCS = "gs://calitp-publish-data-analysis/" -analysis_date = rt_dates.DATES["feb2024"] +analysis_date = rt_dates.DATES["mar2024"] oct_week = rt_dates.get_week("oct2023", exclude_wed=True) apr_week = rt_dates.get_week("apr2023", exclude_wed=True) @@ -17,4 +17,5 @@ PROJECT_CRS = "EPSG:3310" CONFIG_PATH = "./config.yml" -ROAD_SEGMENT_METERS = 1_000 \ No newline at end of file +ROAD_SEGMENT_METERS = 1_000 +SEGMENT_TYPES = ["stop_segments", "rt_stop_times"] \ No newline at end of file diff --git a/rt_segment_speeds/segment_speed_utils/time_series_utils.py b/rt_segment_speeds/segment_speed_utils/time_series_utils.py index 114702ec3..c01c367ef 100644 --- a/rt_segment_speeds/segment_speed_utils/time_series_utils.py +++ b/rt_segment_speeds/segment_speed_utils/time_series_utils.py @@ -23,11 +23,12 @@ ROUTE_DIR_COLS = ["route_id", "direction_id"] -def concatenate_datasets_across_months( +def concatenate_datasets_across_dates( gcs_bucket: str, dataset_name: Literal["speeds_route_dir_segments", "speeds_route_dir"], date_list: list, data_type: Literal["df", "gdf"] = "gdf", + get_pandas: bool = True, **kwargs ) -> pd.DataFrame: """ @@ -56,6 +57,7 @@ def concatenate_datasets_across_months( dfs, axis=0, ignore_index=True ) - df = compute(df)[0] + if get_pandas: + df = compute(df)[0] return df \ No newline at end of file From 1cf1d140bf196f0996c3676e0702df224968c04f Mon Sep 17 00:00:00 2001 From: tiffanychu90 Date: Thu, 14 Mar 2024 22:44:07 +0000 Subject: [PATCH 5/6] run rt vs sched, update how functions are used across multiple pipelines --- gtfs_digest/merge_data.py | 28 +++++++++---------- .../B1_create_hqta_segments.py | 14 ++-------- .../logs/rt_v_scheduled_route_metrics.log | 2 ++ .../logs/rt_v_scheduled_trip_metrics.log | 6 ++++ .../scripts/rt_v_scheduled_routes.py | 7 ++--- .../scripts/rt_v_scheduled_trip.py | 8 +++++- rt_scheduled_v_ran/scripts/update_vars.py | 10 +------ 7 files changed, 35 insertions(+), 40 deletions(-) diff --git a/gtfs_digest/merge_data.py b/gtfs_digest/merge_data.py index e27da1d6c..204d05792 100644 --- a/gtfs_digest/merge_data.py +++ b/gtfs_digest/merge_data.py @@ -17,18 +17,17 @@ def concatenate_schedule_by_route_direction( Concatenate schedule data that's been aggregated to route-direction-time_period. """ - df = time_series_utils.concatenate_datasets_across_months( + df = time_series_utils.concatenate_datasets_across_dates( RT_SCHED_GCS, "schedule_route_dir/schedule_route_direction_metrics", date_list, data_type = "df", columns = route_time_cols + [ - "avg_sched_service_min", + "avg_sched_service_minutes", "avg_stop_meters", - "n_trips", "frequency",] - ).sort_values(sort_cols).reset_index(drop=True).rename( - columns = {"n_trips": "n_scheduled_trips"} - ) + "n_scheduled_trips", "frequency"], + get_pandas = True + ).sort_values(sort_cols).reset_index(drop=True) return df @@ -40,14 +39,15 @@ def concatenate_segment_speeds_by_route_direction( Concatenate segment speeds data that's been aggregated to route-direction-time_period. """ - df = time_series_utils.concatenate_datasets_across_months( + df = time_series_utils.concatenate_datasets_across_dates( SEGMENT_GCS, "rollup_singleday/speeds_route_dir_segments", date_list, data_type = "gdf", columns = route_time_cols + [ "stop_pair", "p20_mph", "p50_mph", - "p80_mph", "geometry"] + "p80_mph", "geometry"], + get_pandas = True ).sort_values(sort_cols).reset_index(drop=True) return df @@ -60,12 +60,13 @@ def concatenate_speeds_by_route_direction( Concatenate rt vs schedule data that's been aggregated to route-direction-time_period. """ - df = time_series_utils.concatenate_datasets_across_months( + df = time_series_utils.concatenate_datasets_across_dates( SEGMENT_GCS, "rollup_singleday/speeds_route_dir", date_list, data_type = "df", - columns = route_time_cols + ["speed_mph"] + columns = route_time_cols + ["speed_mph"], + get_pandas = True ).sort_values(sort_cols).reset_index(drop=True) return df @@ -75,14 +76,13 @@ def concatenate_rt_vs_schedule_by_route_direction( date_list: list ) -> pd.DataFrame: - df = time_series_utils.concatenate_datasets_across_months( + df = time_series_utils.concatenate_datasets_across_dates( RT_SCHED_GCS, "vp_route_dir/route_direction_metrics", date_list, data_type = "df", - ).sort_values(sort_cols).reset_index(drop=True).rename( - columns = {"n_trips": "vp_trips"} - ) + get_pandas = True + ).sort_values(sort_cols).reset_index(drop=True) # We'll add this back in after merging # because these would be NaN if it's not in schedule diff --git a/high_quality_transit_areas/B1_create_hqta_segments.py b/high_quality_transit_areas/B1_create_hqta_segments.py index 148106cad..23c5df0cd 100644 --- a/high_quality_transit_areas/B1_create_hqta_segments.py +++ b/high_quality_transit_areas/B1_create_hqta_segments.py @@ -106,18 +106,8 @@ def select_shapes_and_segment( Returns the hqta_segments for all the routes across all operators. """ # Only include certain Amtrak routes - ca_amtrak = ["Pacific Surfliner", "San Joaquins", - "Coast Starlight", "Capitol Corridor", - #"Sunset Limited", "California Zephyr", - ] - - outside_ca_amtrak_shapes = helpers.import_scheduled_trips( - analysis_date, - filters = [[("name", "==", "Amtrak Schedule"), - ("route_long_name", "not in", ca_amtrak)]], - columns = ["shape_array_key"] - ).shape_array_key.unique() - + outside_amtrak_shapes = gtfs_schedule_wrangling.amtrak_trips( + analysis_date, inside_ca = False).shape_array_key.unique() gdf = gtfs_schedule_wrangling.longest_shape_by_route_direction( analysis_date diff --git a/rt_scheduled_v_ran/logs/rt_v_scheduled_route_metrics.log b/rt_scheduled_v_ran/logs/rt_v_scheduled_route_metrics.log index a075bfec6..8af640be4 100644 --- a/rt_scheduled_v_ran/logs/rt_v_scheduled_route_metrics.log +++ b/rt_scheduled_v_ran/logs/rt_v_scheduled_route_metrics.log @@ -22,3 +22,5 @@ 2024-03-12 15:13:40.663 | INFO | __main__:route_metrics:47 - route aggregation 2023-04-14: 0:00:01.329009 2024-03-12 15:13:42.091 | INFO | __main__:route_metrics:47 - route aggregation 2023-04-15: 0:00:01.425752 2024-03-12 15:13:43.361 | INFO | __main__:route_metrics:47 - route aggregation 2023-04-16: 0:00:01.268246 +2024-03-14 13:38:59.152 | INFO | __main__:route_metrics:47 - route aggregation 2024-03-13: 0:00:03.018222 +2024-03-14 15:03:28.709 | INFO | __main__:route_metrics:46 - route aggregation 2024-03-13: 0:00:02.241537 diff --git a/rt_scheduled_v_ran/logs/rt_v_scheduled_trip_metrics.log b/rt_scheduled_v_ran/logs/rt_v_scheduled_trip_metrics.log index ecbf5ada8..c44677716 100644 --- a/rt_scheduled_v_ran/logs/rt_v_scheduled_trip_metrics.log +++ b/rt_scheduled_v_ran/logs/rt_v_scheduled_trip_metrics.log @@ -373,3 +373,9 @@ 2024-03-12 13:50:07.918 | INFO | __main__:rt_schedule_trip_metrics:335 - Total run time for metrics on 2023-04-14: 0:01:05.779022 2024-03-12 13:50:51.699 | INFO | __main__:rt_schedule_trip_metrics:335 - Total run time for metrics on 2023-04-15: 0:00:43.774220 2024-03-12 13:51:33.881 | INFO | __main__:rt_schedule_trip_metrics:335 - Total run time for metrics on 2023-04-16: 0:00:42.177338 +2024-03-14 13:10:48.105 | INFO | __main__:rt_schedule_trip_metrics:280 - tabular trip metrics 2024-03-13: 0:02:52.759213 +2024-03-14 13:37:23.944 | INFO | __main__:rt_schedule_trip_metrics:285 - spatial trip metrics 2024-03-13: 0:26:35.839292 +2024-03-14 13:38:34.587 | INFO | __main__:rt_schedule_trip_metrics:332 - Total run time for metrics on 2024-03-13: 0:30:39.241002 +2024-03-14 14:05:15.224 | INFO | __main__:rt_schedule_trip_metrics:289 - spatial trip metrics 2024-03-13: 0:01:17.077763 +2024-03-14 14:45:05.490 | INFO | __main__:rt_schedule_trip_metrics:291 - spatial trip metrics 2024-03-13: 0:20:03.321136 +2024-03-14 14:55:09.933 | INFO | __main__:rt_schedule_trip_metrics:338 - Total run time for metrics on 2024-03-13: 0:01:04.158141 diff --git a/rt_scheduled_v_ran/scripts/rt_v_scheduled_routes.py b/rt_scheduled_v_ran/scripts/rt_v_scheduled_routes.py index e6d097321..f979d8ace 100644 --- a/rt_scheduled_v_ran/scripts/rt_v_scheduled_routes.py +++ b/rt_scheduled_v_ran/scripts/rt_v_scheduled_routes.py @@ -7,8 +7,7 @@ from loguru import logger from segment_speed_utils import (gtfs_schedule_wrangling, - metrics, - time_series_utils + metrics ) from segment_speed_utils.project_vars import RT_SCHED_GCS from segment_speed_utils.time_series_utils import ROUTE_DIR_COLS @@ -56,7 +55,7 @@ def route_metrics( format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}", level="INFO") - from update_vars import route_analysis_date_list, CONFIG_DICT + from update_vars import analysis_date_list, CONFIG_DICT - for analysis_date in route_analysis_date_list: + for analysis_date in analysis_date_list: route_metrics(analysis_date, CONFIG_DICT) diff --git a/rt_scheduled_v_ran/scripts/rt_v_scheduled_trip.py b/rt_scheduled_v_ran/scripts/rt_v_scheduled_trip.py index 650e7d952..37216974f 100644 --- a/rt_scheduled_v_ran/scripts/rt_v_scheduled_trip.py +++ b/rt_scheduled_v_ran/scripts/rt_v_scheduled_trip.py @@ -152,6 +152,10 @@ def buffer_shapes( """ Buffer shapes for shapes that are present in vp. """ + # Remove certain Amtrak routes + amtrak_outside_ca = gtfs_schedule_wrangling.amtrak_trips( + analysis_date, inside_ca = False).shape_array_key.unique().tolist() + shapes = helpers.import_scheduled_shapes( analysis_date, columns=["shape_array_key", "geometry"], @@ -160,7 +164,7 @@ def buffer_shapes( **kwargs ).dropna( subset="geometry" - ) + ).query("shape_array_key not in @amtrak_outside_ca") shapes = shapes.assign( geometry = shapes.geometry.buffer(buffer_meters) @@ -229,6 +233,8 @@ def spatial_accuracy_count(analysis_date: str): shapes_in_vp = vp_usable.shape_array_key.unique().compute().tolist() + + shapes = buffer_shapes( analysis_date, buffer_meters = 35, diff --git a/rt_scheduled_v_ran/scripts/update_vars.py b/rt_scheduled_v_ran/scripts/update_vars.py index 10da85985..f7d9a2f2f 100644 --- a/rt_scheduled_v_ran/scripts/update_vars.py +++ b/rt_scheduled_v_ran/scripts/update_vars.py @@ -2,18 +2,10 @@ import yaml from pathlib import Path -trip_months = ["sep", "oct"] - -trip_analysis_date_list = [ - rt_dates.DATES[f"{m}2023"] for m in trip_months -] - oct_week = rt_dates.get_week("oct2023", exclude_wed=True) apr_week = rt_dates.get_week("apr2023", exclude_wed=True) -route_analysis_date_list = (rt_dates.y2024_dates + - rt_dates.y2023_dates + - oct_week + apr_week) +analysis_date_list = [rt_dates.DATES["mar2024"]] CONFIG_PATH = Path("config.yml") From b71cc0c6b932b4ce92dd3e2cbd7a416e4dd34fc8 Mon Sep 17 00:00:00 2001 From: tiffanychu90 Date: Thu, 14 Mar 2024 22:49:22 +0000 Subject: [PATCH 6/6] run rt_stop_times for mar --- gtfs_digest/merge_data.py | 4 ---- rt_scheduled_v_ran/scripts/Makefile | 6 +++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gtfs_digest/merge_data.py b/gtfs_digest/merge_data.py index 204d05792..9350d18e9 100644 --- a/gtfs_digest/merge_data.py +++ b/gtfs_digest/merge_data.py @@ -26,7 +26,6 @@ def concatenate_schedule_by_route_direction( "avg_sched_service_minutes", "avg_stop_meters", "n_scheduled_trips", "frequency"], - get_pandas = True ).sort_values(sort_cols).reset_index(drop=True) return df @@ -47,7 +46,6 @@ def concatenate_segment_speeds_by_route_direction( columns = route_time_cols + [ "stop_pair", "p20_mph", "p50_mph", "p80_mph", "geometry"], - get_pandas = True ).sort_values(sort_cols).reset_index(drop=True) return df @@ -66,7 +64,6 @@ def concatenate_speeds_by_route_direction( date_list, data_type = "df", columns = route_time_cols + ["speed_mph"], - get_pandas = True ).sort_values(sort_cols).reset_index(drop=True) return df @@ -81,7 +78,6 @@ def concatenate_rt_vs_schedule_by_route_direction( "vp_route_dir/route_direction_metrics", date_list, data_type = "df", - get_pandas = True ).sort_values(sort_cols).reset_index(drop=True) # We'll add this back in after merging diff --git a/rt_scheduled_v_ran/scripts/Makefile b/rt_scheduled_v_ran/scripts/Makefile index 9d28b4349..7a41cb268 100644 --- a/rt_scheduled_v_ran/scripts/Makefile +++ b/rt_scheduled_v_ran/scripts/Makefile @@ -1,4 +1,8 @@ rt_sched_pipeline: # cd rt_segment_speeds && pip install -r requirements.txt && cd ../_shared_utils && make setup_env && cd ../ python rt_v_scheduled_trip.py - python rt_v_scheduled_routes.py \ No newline at end of file + python rt_v_scheduled_routes.py + + +schedule_rt_stop_times_table: + python rt_stop_times.py