def test_generating_edge_vph_geodataframe_for_route(schedule): nodes, links = gngeojson.generate_geodataframes(schedule.route('2').graph()) df = schedule.route('2').generate_trips_dataframe() df = use_schedule.generate_edge_vph_geodataframe(df, links) correct_df = GeoDataFrame({'hour': {0: Timestamp('1970-01-01 17:00:00'), 1: Timestamp('1970-01-01 19:00:00'), 2: Timestamp('1970-01-01 17:00:00'), 3: Timestamp('1970-01-01 19:00:00'), 4: Timestamp('1970-01-01 17:00:00'), 5: Timestamp('1970-01-01 18:00:00')}, 'from_stop': {0: '2', 1: '2', 2: '3', 3: '3', 4: '4', 5: '4'}, 'to_stop': {0: '1', 1: '1', 2: '2', 3: '2', 4: '3', 5: '3'}, 'route_name': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, 'from_stop_name': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, 'to_stop_name': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, 'vph': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, 'geometry': {0: LineString([(-7.557148039524952, 49.766825803756994), (-7.557106577683727, 49.76682779861249)]), 1: LineString([(-7.557148039524952, 49.766825803756994), (-7.557106577683727, 49.76682779861249)]), 2: LineString([(-7.557121424907424, 49.76683608549253), (-7.557148039524952, 49.766825803756994)]), 3: LineString([(-7.557121424907424, 49.76683608549253), (-7.557148039524952, 49.766825803756994)]), 4: LineString([(-7.5570681956375, 49.766856648946295), (-7.557121424907424, 49.76683608549253)]), 5: LineString([(-7.5570681956375, 49.766856648946295), (-7.557121424907424, 49.76683608549253)])}}) assert_geodataframe_equal(df, correct_df, check_less_precise=True)
def test_generating_edge_vph_geodataframe(schedule): gdfs = gngeojson.generate_geodataframes(schedule.graph()) nodes, links = gdfs['nodes'], gdfs['links'] df = schedule.trips_with_stops_to_dataframe() df = use_schedule.generate_edge_vph_geodataframe(df, links) correct_df = GeoDataFrame({'hour': {0: Timestamp('1970-01-01 17:00:00'), 1: Timestamp('1970-01-01 18:00:00'), 2: Timestamp('1970-01-01 17:00:00'), 3: Timestamp('1970-01-01 19:00:00'), 4: Timestamp('1970-01-01 17:00:00'), 5: Timestamp('1970-01-01 19:00:00'), 6: Timestamp('1970-01-01 17:00:00'), 7: Timestamp('1970-01-01 19:00:00'), 8: Timestamp('1970-01-01 17:00:00'), 9: Timestamp('1970-01-01 19:00:00'), 10: Timestamp('1970-01-01 17:00:00'), 11: Timestamp('1970-01-01 18:00:00')}, 'from_stop': {0: '1', 1: '1', 2: '2', 3: '2', 4: '2', 5: '2', 6: '3', 7: '3', 8: '3', 9: '3', 10: '4', 11: '4'}, 'from_stop_name': {0: 'Stop_1', 1: 'Stop_1', 2: 'Stop_2', 3: 'Stop_2', 4: 'Stop_2', 5: 'Stop_2', 6: 'Stop_3', 7: 'Stop_3', 8: 'Stop_3', 9: 'Stop_3', 10: '', 11: ''}, 'to_stop': {0: '2', 1: '2', 2: '1', 3: '1', 4: '3', 5: '3', 6: '2', 7: '2', 8: '4', 9: '4', 10: '3', 11: '3'}, 'to_stop_name': {0: 'Stop_2', 1: 'Stop_2', 2: 'Stop_1', 3: 'Stop_1', 4: 'Stop_3', 5: 'Stop_3', 6: 'Stop_2', 7: 'Stop_2', 8: '', 9: '', 10: 'Stop_3', 11: 'Stop_3'}, 'vph': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1}, 'geometry': { 0: LineString([(4,2), (1,2)]), 1: LineString([(4,2), (1,2)]), 2: LineString([(1,2), (4,2)]), 3: LineString([(1,2), (4,2)]), 4: LineString([(1,2), (3,3)]), 5: LineString([(1,2), (3,3)]), 6: LineString([(3,3), (1,2)]), 7: LineString([(3,3), (1,2)]), 8: LineString([(3,3), (7,5)]), 9: LineString([(3,3), (7,5)]), 10: LineString([(7,5), (3,3)]), 11: LineString([(7,5), (3,3)])}}, crs='epsg:27700') assert_geodataframe_equal(df.sort_index(axis=1), correct_df.sort_index(axis=1), check_less_precise=True)
def generate_standard_outputs_for_schedule(schedule, output_dir, gtfs_day='19700101', include_shp_files=False): logging.info('Generating geojson standard outputs for schedule') schedule_links = schedule.to_geodataframe()['links'].to_crs("epsg:4326") df = schedule.route_trips_with_stops_to_dataframe(gtfs_day=gtfs_day) df_all_modes_vph = None vph_dir = os.path.join(output_dir, 'vehicles_per_hour') subgraph_dir = os.path.join(output_dir, 'subgraphs') graph_mode_map = schedule.mode_graph_map() for mode in schedule.modes(): logging.info(f'Generating vehicles per hour for {mode}') df_vph = use_schedule.generate_edge_vph_geodataframe(df[df['mode'] == mode], schedule_links) save_geodataframe( df_vph, filename=f'vehicles_per_hour_{mode}', output_dir=vph_dir, include_shp_files=include_shp_files ) if df_all_modes_vph is None: df_vph['mode'] = mode df_all_modes_vph = df_vph else: df_vph['mode'] = mode df_all_modes_vph = df_all_modes_vph.append(df_vph) logging.info(f'Generating schedule graph for {mode}') schedule_subgraph = generate_geodataframes( schedule.subgraph(graph_mode_map[mode])) save_geodataframe( schedule_subgraph['links'].to_crs("epsg:4326"), filename=f'schedule_subgraph_links_{mode}', output_dir=subgraph_dir, include_shp_files=include_shp_files ) save_geodataframe( schedule_subgraph['nodes'].to_crs("epsg:4326"), filename=f'schedule_subgraph_nodes_{mode}', output_dir=subgraph_dir, include_shp_files=include_shp_files ) logging.info('Saving vehicles per hour for all PT modes') save_geodataframe( df_all_modes_vph, filename='vehicles_per_hour_all_modes', output_dir=vph_dir, include_shp_files=include_shp_files ) logging.info('Saving vehicles per hour for all PT modes for selected hour slices') for h in [7, 8, 9, 13, 16, 17, 18]: save_geodataframe( df_all_modes_vph[df_all_modes_vph['hour'].dt.hour == h], filename=f'vph_all_modes_within_{h-1}:30-{h}:30', output_dir=vph_dir, include_shp_files=include_shp_files ) logging.info('Generating csv for vehicles per hour for each service') use_schedule.vehicles_per_hour( df, aggregate_by=['service', 'service_name', 'mode'], output_path=os.path.join(vph_dir, 'vph_per_service.csv')) logging.info('Generating csv for vehicles per hour per stop') use_schedule.vehicles_per_hour( df, aggregate_by=['from_stop', 'from_stop_name', 'mode'], output_path=os.path.join(vph_dir, 'vph_per_stop_departing_from.csv')) use_schedule.vehicles_per_hour( df, aggregate_by=['to_stop', 'to_stop_name', 'mode'], output_path=os.path.join(vph_dir, 'vph_per_stop_arriving_at.csv')) logging.info('Generating csvs for trips per day') use_schedule.trips_per_day_per_service(df, output_dir=output_dir) df_trips_per_route = use_schedule.trips_per_day_per_route(df, output_dir=output_dir) # stop-to-stop trips per day aggregation aggregated_per_stops = use_schedule.aggregate_trips_per_day_per_route_by_end_stop_pairs( schedule, df_trips_per_route) aggregated_per_stops.to_csv(os.path.join(output_dir, 'trips_per_day_per_route_aggregated_per_stop_id_pair.csv')) use_schedule.aggregate_by_stop_names(aggregated_per_stops).to_csv( os.path.join(output_dir, 'trips_per_day_per_route_aggregated_per_stop_name_pair.csv'))