Я обычно не работаю с данными общественного транспорта: таких задач нет на работе, и у меня на курсе нет такого раздела. Люди, кто занимается расписаниями и оптимизацией маршрутов, - боги из другого мира.
Но так случилось, что PhD потребовало от меня разобраться, и достаточно быстро, в этой области и посчитать среднее время на общественном транспорте между районами.
Поэтому этот пост для тех, кто как и я, не занимается транспортом на ежедневной основе, но кому вдруг нужно быстро посчитать показатель с ним связанный.
Форматы данных
Начнем с того, что обычно данные по общественному транспорту - это открытые данные. Их публикуют как ответственные за транспорт гос органы, транспортные компании, так и различные платформы агрегаторы. Последние не создают информацию, а только хранят и передают ее в удобном виде. У последних обычно есть API.
Я бы разделила данные на 2 типа:
1. Как должно быть: расписание, маршруты, остановки
2. Как фактически есть: GPS сигналы автобусов
Хорошая новость: вся информация о том, как транспорт должен ходить, во всем мире хранится и передается в одном формате, а именно GTFS (General Transit Feed Specification). Физически, это архив с txt файлами, обновляемый с регулярной частотой от 1 минуты до 1 года, в зависимости от того насколько динамична транспортная система. Плюс такой универсальности: не придется писать код с 0 - его уже много раз написали за вас.
Формат "Как должно быть" - GTFS Schedule
agency.txt — файл, содержащий информацию об организациях, управляющих транспортными средствами. Включает в себя название агентства, его веб-сайт, код агентства и другие контактные данные.
stops.txt — файл, включающий список всех остановок и станций, на которых останавливаются транспортные средства. Содержит название остановки, ее координаты (широта и долгота), а также код остановки.
routes.txt — файл, описывающий маршруты, по которым следуют транспортные средства. В нем содержится информация о номерах маршрутов, названиях и типах транспорта (автобус, трамвай и т.д.)
shapes.txt — файл, который описывает форму (траекторию) маршрутов. Эта информация используется для визуализации маршрутов на картах.
trips.txt — файл, содержащий детализированную информацию о рейсах по каждому маршруту. Он связывает маршрут с конкретными остановками и временем прибытия на них.
stop_times.txt — файл, в котором указано время прибытия и отправления транспортного средства на каждой остановке для каждого рейса.
calendar.txt — файл, определяющий дни недели и периоды, когда действует расписание. Содержит информацию о том, какие дни считаются рабочими, выходными и праздничными.
calendar_dates.txt — файл, содержащий исключения и дополнения к расписанию, указанные в calendar.txt, такие как дополнительные рейсы в праздничные дни или отмененные рейсы.
fare_rules.txt и fare_attributes.txt — файлы, которые описывают тарифы и правила их применения на различных маршрутах и остановках.
Для задачи расчета среднего commuting time потребуются не все файлы - какие, попробуйте пока догадаться сами.
Формат "Как фактически есть" GTFS- RT ( Real time)
С этим форматом я признаюсь, не работала, так как он предназначен в первую очередь для передачи данных между транспортным средством и приложением ( например, Яндекс Транспорт) в режиме реального времени, а не для анализа. Но все равно опишу, насколько знаю.
В отличие от GTFS Schedule, GTFS- RT это не архив, а файл, например JSON, который обновляется с высокой частотой (обычно каждые 10-30 секунд). Каждый файл представляет собой снимок текущего состояния транспорта — положение транспортных средств, актуальное расписание и уведомления в конкретный момент времени.
Пример исторического среза от 26 февраля 2022 года: https://openmobilitydata.org/p/saint-petersburg/861/source
Структура файла:
Vehicle Positions (Позиции транспортных средств):
Содержит данные о текущем местоположении транспортных средств, включая:
- Координаты: широта и долгота.
- Направление движения: угол в градусах.
- Скорость: текущая скорость транспортного средства.
- Идентификатор транспортного средства: уникальный номер или код.
Trip Updates (Обновления рейсов):
Предоставляет информацию об изменениях в расписании, таких как:
- Задержки: время задержки относительно расписания.
- Отмены рейсов: информация об отмененных рейсах.
- Изменения маршрута: данные о временных изменениях маршрутов.
Service Alerts (Уведомления о сервисе):
Содержит уведомления о сбоях или изменениях в обслуживании, включая:
- Причина: причина изменения или сбоя (например, ремонтные работы, погодные условия).
- Описание: подробности о характере и продолжительности изменения.
Конечно, могут возникать задачи, когда нужно проанализировать фактическое движение. В этом случае есть 2 варианта: подключиться к API одного из сервисов и сохранять ответы. Или пойти в открытые данные города/страны и найти там архив с такими файлами.
Платформы - агрегаторы транспортных данных
Только для доступа к историческим данным ( до февраля 2022)
Доступ: API, можно скачать файлы с сайта
Карта покрытия (в России только СПБ) :
Актуальные данные ( обновляются real-time)
Доступ: API, можно скачать последний файл с сайта
Покрытие: более 2000 операторов из 70 стран. В России только СПБ
3. TRANSITLAND
Актуальные данные (обновляются real-time)
Доступ: API, можно посмотреть на глобальной карте, но возможности скачать с сайта не увидела
Покрытие: более 2 500 операторов из 55 стран. В России только СПБ
Решение задачи расчета среднего времени на ОТ из разных районов города до центра Тель-Авива
Дисклеймер:
Как я писала - ноутбуков по обработке GTFS на GitHub полно, поэтому я тоже взяла готовый код отсюда и обработала его под свою задачу.
Важно: я считала время в будний день, не привязываясь к календарю.
Если вы сразу хотите посмотреть код: https://github.com/Ines2607/phd_scripts
Источники:
1. GTFS файлы министерства транспорта
2. Границы статистических зон Израиля (на github по ссылке выше)
ОСНОВНЫЕ ШАГИ:
1. Загружаем данные. Я загружаю все файлы, чтобы посмотреть на них, но в анализе понадобятся только 2: stops.txt, stop_times.txt
2. Оставляем только остановки внутри нужной зоны. И находим соответствие остановка - зона. У меня получилось 3516 остановок.
3. На основе файла stop_times.txt создаем список из всех пар остановок со временем и дистанцией между ними, оставляя только те, между которыми существует прямой маршрут.
4. Построение кратчайшего маршрута с использованием алгоритма Дейкстры
Цель: построить маршруты между всеми парами остановок с пересадками
Главный минус: время ожидания между автобусами не учитывается
Шаги:
1. Создание графа из датасета с шага 3, где вершины - это остановки, а ребра - маршрут между ними ( trip_id).
2. Построение кратчайшего пути между всеми парами вершин, учитывая время между ними (вес в данном случае travel_time, несмотря на то, что автор называет его distance).
Для пары остановок 13605 - 13557 получился следующий маршрут длительность 15 мин и расстоянием 5.7 миль:
5. Так как наша финальная задача найти расстояние между районами, а не остановками, то тестируем следующий подход: для каждой статзоны находим остановку наиболее близкую к центру.Какие минусы приходят в голову?)
6. Пытаемся улучшить прошлый вариант. Теперь вместо самой центральной остановки перебираем все, попадающие в радиус 1 км от центра зоны остановки, и находим ту, с которой время поездки минимально. Зачем?
- Потому что верим, что ради возможности ехать без пересадки средний человек готов пройти до 15 мин пешком.
- А еще то единственный способ учесть разные направления движения
Результат тестирования на одной из зон: время варьируется от 23 до 31 мин
7. Прогоняем такой подход на всем датасете: в качестве старта используем все остановки в рамках географии( 3516), в качестве окончания 1 остановку - ближайшую к центру Тель-Авива.
Для каждого района сохраняем минимальное время в пути.
В результате получаем такую карту (звездой отмечен центр города):
Зачем нужна такая карта:
1. Оценка транспортной доступности - сравнив дистанцию по воздуху и время на транспорте легко увидеть самые труднодоступные районы города
2. Изучение изменения ключевых городских показателей с удалением от центра города на транспорте( например плотности населения, заработной платы или цен на жилье)
Ограничения подхода:
1. Расчет работает быстро, если не пытаться добавлять фактическое время пересадок или возможность сесть на 2ой автобус/ метро на другой остановке ( то есть в буфере) . В этом случае число операций увеличивается в N^4 ( 4 -среднее число остановок в окрестности)
P.S. Пишите ваши вопросы/комментарии, особенно если есть идеи или готовые предложения по улучшению подхода.
А я вам предлагаю скоротать время с помощью моего курса по основам пространственного анализа с использованием Python. Наша цель — показать, как геоаналитические методы могут быть применены в бизнесе.
Курс предназначен для:
- GIS-специалистов с базовыми знаниями Python, которые хотят развить свои аналитические навыки;
- Аналитиков, которым необходимы геоинструменты для решения задач.
Курс полностью самостоятелен и включает возможность обсуждения в нашем чате в Telegram.
Посетите наш сайт, пройдите тест и присоединяйтесь к курсу. А для тех, кто еще сомневается, подходит эта профессия или нет, мы подготовили демо-версию курса за символическую цену, все подробности по ссылке геокурса!