Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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'))