Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Не знаю, было ли это очевидно, или нет, но я в три часа ночи наконец понял, как читать данные по рейсам маршрутов с data.mos.ru, и что там на самом деле по каждому маршруту можно посмотреть количество выходов и их график)

  • Like 1
Опубликовано
12 часов назад, Infeer10 сказал:

data.mos.ru,

Точно здесь? Можно конкретнее ссылку? Очень интересно. Спасибо.

Опубликовано

Вот такую табличку, чем-то похожую на путевой лист, теперь можно сделать по каждому маршруту:

Снимок экрана 2024-03-11 152137.png

  • Like 2
  • Thanks 1
Опубликовано

Нашел, спасибо! Прикольно.

Опубликовано
25 минут назад, Infeer10 сказал:

Вот такую табличку, чем-то похожую на путевой лист, теперь можно сделать по каждому маршруту:

Снимок экрана 2024-03-11 152137.png

покопался по сайту, но не смог найти (или у меня как раз не открывается тот раздел, где расписания маршрутов)

илья, поделись, как и откуда собираешь информацию?

Опубликовано (изменено)

Нужны вот эти пять таблиц (укажу их номер в базе данных для удобства):

Расписание рейсов (60661) — собственно, сами расписания, где указан код рейса в формате: код маршрута_код рейса_выход, и указано время, код остановки и порядковый номер остановки

Остановки (60662)— здесь есть карта остановок, опять же важен код

Маршруты (60664) — здесь просто указаны маршруты, но важен их код (который, кстати, указан в адресе ссылки расписания маршрута на t.mos.ru)

Рейсы маршрутов (60665) — здесь просто можно посмотреть рейсы маршрутов

Календарь маршрутов (60666) — здесь указана принадлежность рейсов дням недели и дата начала и формальная дата окончания действия расписания

К сожалению, всё неотсортированно и записано в кодах. И лучше скачать таблицы по кнопке "экспорт", потому что сайт их не выдерживает

 

И, как пример, если вручную хочется посмотреть всё про маршрут, например, 175:

Смотрим код маршрута в таблице (60664) или на сайте — это 106

Переходим в расписания (60661), сортируем от А до Я, чтобы было удобнее, и видим формат: 106_3125711_1_701. 106 — код маршрута, 3125711 — код расписания, 1_701 — выход (1-й 701-го рейса)

Чтобы понять к чему относится код расписания, смотрим таблицу (60666), сортируем от А до Я и по поиску находим, что 3125711 — код для рейсов по субботам и воскресеньям. Справа можно посмотреть дату начала действия и окончания (формального).

Ну и возвращаемся в таблицу (60661), смотрим порядковый номер остановки и время. Если непонятно, что за остановка по коду, то смотрим таблицу (60662).

Если просто нужно посмотреть количество выходов, то смотрим таблицу (60665).

Изменено пользователем Infeer10
  • Like 2
  • Thanks 3
Опубликовано

А, нашёл один недостаток: у таблицы с расписанием больше миллиона столбцов, и Excel не читает дальше. Может, кто-то знает, как можно решить?

Опубликовано
11 минут назад, Infeer10 сказал:

А, нашёл один недостаток: у таблицы с расписанием больше миллиона столбцов, и Excel не читает дальше. Может, кто-то знает, как можно решить?

она настолько тяжелая, что на мой ноутбук не скачивается совсем, а на сайте даже не загружается, выдает ошибку

Опубликовано
Только что, Gleb72442 сказал:

она настолько тяжелая, что на мой ноутбук не скачивается совсем, а на сайте даже не загружается, выдает ошибку

Да, я минут 5 перезагружал сайт, пока, наконец, не началась загрузка)

Опубликовано
Только что, Любезный сказал:

Не использовать ёксель.

А что сможет прочитать настолько огромную таблицу?

Опубликовано

А вот вопрос, каждый выход должен соответствовать одной машине? Я думал, так и есть, и можно быстро посчитать выходы, но, например, на 27 (автобусном) в будни есть 201 и 702 рейсы, то есть, по идее, две машины, хотя и по реестру, и я всегда наблюдал только одну машину. Или на 1 (автобусном) 301, 302, 703, 704, 705, 706 рейсы, но и по реестру и по наблюдениям машин всегда было 5. У обоих этих маршрутов расписание уехало за пределы таблицы, поэтому понять сложно.

Опубликовано
1 час назад, Infeer10 сказал:

А вот вопрос, каждый выход должен соответствовать одной машине? Я думал, так и есть, и можно быстро посчитать выходы, но, например, на 27 (автобусном) в будни есть 201 и 702 рейсы, то есть, по идее, две машины, хотя и по реестру, и я всегда наблюдал только одну машину. Или на 1 (автобусном) 301, 302, 703, 704, 705, 706 рейсы, но и по реестру и по наблюдениям машин всегда было 5. У обоих этих маршрутов расписание уехало за пределы таблицы, поэтому понять сложно.

Илья, на 27 автобусном есть днём интервал 40 минут. Конечно, там два выхода.

Или на утренний рейс 7:14 даётся полтора часа, в это время второй выход начинает работу в 8:13...

Опубликовано
4 минуты назад, Trotil сказал:

на 27 автобусном есть днём интервал 40 минут.

Этот призрак еще существует?

Опубликовано

Существует. Наряду с другими, и посконными, и новосделанными. Это старый призрак, наш, родной. 

Опубликовано

А вот, к примеру, маршрут "магистральных" интервалов:

Снимок экрана 2024-03-12 020737.png

Снимок экрана 2024-03-12 020807.png

 

В общем, надеюсь, что такое можно будет делать автоматически)

Опубликовано (изменено)

Здесь я распишу тезисно, как можно работать с этими данными через СУБД sqlite3.

Инструкция будет в виде практического примера поиска расписания по реальному номеру маршрута, инструкцию вы при желании сможете адаптировать под другие задачи поиска.

Про автоматизацию будет сказано ниже.

 

Вам понадобятся:

DB Browser отсюда: https://sqlitebrowser.org/dl/

Расширение text.dll отсюда: https://github.com/nalgeon/sqlean/releases/tag/0.21.10   (документация: https://antonz.ru/sqlean-text/ )

 

Этап 1: подготовительный

- загружаем данные csv на ПК по ссылкам Ильи

- если нет нужных данных csv, их можно сконвертировать из xlsx в csv с помощью сервиса: https://convertio.co/ru/xlsx-csv/

 

В DB Browser:

- создать новую БД

 

- загрузить csv в БД  (файл - импорт), "имена столбцов в первой строке" - ДА, и изменить разделитель на ";" (для csv с сайта data.mos.ru)

для нашего примера понадобится загрузить data-60661-2024-02-08.csv и data-60664-2024-03-01.csv

 

- загружаем расширение text.dll в DB Browser (инструменты - загрузить расширение - text.dll)

 

В базе данных сцеплены id маршрута, id расписания, номер рейса и номер выхода в одну строку. Для удобства поиска их надо расцепить, для этого мы создадим новые столбцы:

 

alter table "data-60661-2024-02-08"
add column route_id text as (
  case when trip_id like '%_%' then
    text_split(trip_id, "_", 1)
  else trip_id
  end
);

 

Этот sql-запрос нужно выполнять во вкладке SQL. После этого во вкладке "данные" для таблицы data-60661-2024-02-08 появится дополнительный столбец route_id. Это виртуальный столбец, который генерируется "на лету", используя данные столбца trip_id. Размер БД от этой операции не увеличивается. Функция text_split(str, sep, n) бьет строку по разделителю и возвращает n-ю часть.

Ещё замечание - имена таблиц содержат символ "-", поэтому в запросах имена приходится обрамлять кавычками. Если переименовать имена без "-", двойные кавычки можно не писать.

Аналогично можно вычленить и добавить столбцы service_id, num_trip, vyhod.

 

Для ускорения по полю route_id можно создать индекс, но можно и не создавать, если вы не знаете, что это такое и как это делать.

Базу данных можно сохранить на диск, чтобы не проделывать эти шаги каждый раз.

 

Этап 2: улучшаем человекочитаемость данных

 

В таблице data-60661-2024-02-08 маршруты заданы через id, исправим это. Объединим таблицы data-60661-2024-02-08 и data-60664-2024-03-01 следующим запросом:

select *
from "data-60661-2024-02-08"
  join "data-60664-2024-03-01" on "data-60661-2024-02-08".route_id = "data-60664-2024-03-01".route_id

 

или скопируем результат этого запроса в отдельную таблицу, синтаксис: CREATE TABLE name_newtable AS SELECT ...

 

create table copied AS
select *
from "data-60661-2024-02-08"
  join "data-60664-2024-03-01" on "data-60661-2024-02-08".route_id = "data-60664-2024-03-01".route_id
  where "data-60664-2024-03-01".route_short_name = "с962"

 

(в примере строкой where мы дополнительно ограничили выборку маршрутом "c962")

Для дальнейшего поиска в DB Browser`e результат лучше скопировать в отдельную таблицу.

Этот метод добавляеь столбец route_short_name, по которому можно дополнительно фильтровать данные, см. далее.

 

Этап 3. поиск информации и просмотр информации в DB Browser`e

 

DB Browser имеет такую удобную фичу, как фильтры. Фильтры поддерживают регулярные выражения.

С помощью фильтров можно быстро достать только нужные данные и отфильтровать ненужные и результат тут же отобразится в браузере DB.

Для примера, я в таблице data-60661-2024-02-08 поставил два фильтра:

на stop_sequence установил  "=1" (два символа без кавычек) - начальная остановка

на trip_id: /^107_.*702$/

символы ^,$ - начало и конец строки

комбинация .* - любая последовательность посередине, которая игнорируется

после id я поставил _, чтобы не захватить 1071, 1072 и т.д.

107 - это id маршрута 27, результат - DB Browser отобразил 7 рейсов выхода 702 маршрута 27:

Результат на скриншоте:

 

27_702.PNG.1fd1aac452a642c2c4dbf2646e3e6769.PNG

 

Это очень гибкая и наглядная система. Для повышения читаемости колонки в DB Browser можно сортировать.

После того, как вы объедините таблицы на этапе 2, фильтровать данные станет ещё проще. Необязательно использовать такие сложные регулярки.

Но я бы не рекомендовал объединять всё, так как такая таблица будет занимать несколько десятков гигабайт и работать очень медленно.

Строго говоря, это неправильный метод работы, а правильный и профессиональный - через написание запросов select с условиями where и сортировкой order by. Но он требует навыков.

 

Этап 4, автоматизация.

К сожалению, этот этап объёмный и его описание нельзя вместить в один пост, и у меня сейчас нет времени сделать такую автоматизацию самостоятельно. Но если коротко, это проще всего сделать на python или на perl.

Нужно подготовить базу данных (этапы 1,2) и дополнительные колонки с помощью DB Browser, (дополнительные таблицы не создавать), сохранить, затем написать скрипт на питоне, который:

- подключится к этой подготовленной БД

- сделает нужные выборки select

- выведет в файл / на экран информацию в виде простой html страницы

- закроет соединение

(в сети есть достаточно подробные учебные руководства по подобной тематике на русском языке).

 

sqlite поддерживает агрегирующие функции, поэтому просто будет посчитать кол-во рейсов, среднее время работы, продолжительность обедов, максимальное число остановок и прочую любознательную статистику.

Изменено пользователем Trotil
  • Thanks 2
Опубликовано
15 часов назад, Infeer10 сказал:

А что сможет прочитать настолько огромную таблицу?

Из мелкомягкого - аксес.

Опубликовано (изменено)

Гм, мне кажется, или есть какая-то несправедливость?

Вот в примере ниже рейс 707: за рулём примерно 9,5 часов (с учётом дороги в/из парк(а)), почти 5 часов отдых

А рейс 301: у одного водителя за рулём 8,5 часов (с дорогой из парка), при этом отдых всего около 2 часов

image.thumb.png.0b259eee4b7b6147db8489887aaf4b6a.png

Изменено пользователем Infeer10
Опубликовано
1 минуту назад, Infeer10 сказал:

Гм, мне кажется, или есть какая-то несправедливость?

Вот в примере ниже рейс 707: за рулём примерно 9,5 часов (с учётом дороги в/из парк(а)), почти 5 часов отдых

А рейс 301: за рулём 8,5 часов (с дорогой из парка), при этом отдых всего около 2 часов

image.thumb.png.0b259eee4b7b6147db8489887aaf4b6a.png

Ну дык, как правило, водители ротируются с выхода на выход. И так и должно быть. Несколько выходов, с утра до ночи, и несколько дополнительных с упором на пиковый вывоз.

 

В Подмосковье на жирных маршрутах очень много где так.

По Подмосковью я с такими простынями работаю уже под десять лет, и в целом система-то везде в стране одинаковая.

Опубликовано

Не соглашусь. Время обеда больше времени круга с запасом (правда не знаю насколько выполняется расписание), так что вполне мог кружок один сделать. 

Опубликовано
15 часов назад, Infeer10 сказал:

Гм, мне кажется, или есть какая-то несправедливость?

Вот в примере ниже рейс 707: за рулём примерно 9,5 часов (с учётом дороги в/из парк(а)), почти 5 часов отдых

А рейс 301: у одного водителя за рулём 8,5 часов (с дорогой из парка), при этом отдых всего около 2 часов

Раньше на трёхсменке на 8,5-9,5 часов работы вообще мог один обед в 30 минут быть, а сейчас два обеда суммарно около двух часов или более двух часов. Если 301-му сделать дольше продолжительность отдыха, он просто не успеет сделать все рейсы. Что касается 707 выхода, если ему сократить продолжительность отдыха, он последний рейс сделает в межпиковое время, а в вечерний час-пик работать будет некому. Для водителя это может быть неудобно, но для пассажиров лучше так. На транспорте применяется понятие разделения смены на части. Это один из примеров такого разделения.

 

9 часов назад, Паштет сказал:

Не соглашусь. Время обеда больше времени круга с запасом (правда не знаю насколько выполняется расписание), так что вполне мог кружок один сделать. 

Сделать то он может. Только придётся или какой-то из последующих кругов отменять, или продолжительность рабочего дня выйдет за максимально допустимую.

  • Thanks 2
Опубликовано (изменено)

У всех таблиц, кроме расписания рейсов и самих рейсов, вышло обновление.

Изменено пользователем Infeer10
Опубликовано
В 11.03.2024 в 15:48, Infeer10 сказал:

Нужны вот эти пять таблиц (укажу их номер в базе данных для удобства):

Расписание рейсов (60661) — собственно, сами расписания, где указан код рейса в формате: код маршрута_код рейса_выход, и указано время, код остановки и порядковый номер остановки

Остановки (60662)— здесь есть карта остановок, опять же важен код

Маршруты (60664) — здесь просто указаны маршруты, но важен их код (который, кстати, указан в адресе ссылки расписания маршрута на t.mos.ru)

Рейсы маршрутов (60665) — здесь просто можно посмотреть рейсы маршрутов

Календарь маршрутов (60666) — здесь указана принадлежность рейсов дням недели и дата начала и формальная дата окончания действия расписания

К сожалению, всё неотсортированно и записано в кодах. И лучше скачать таблицы по кнопке "экспорт", потому что сайт их не выдерживает

 

И, как пример, если вручную хочется посмотреть всё про маршрут, например, 175:

Смотрим код маршрута в таблице (60664) или на сайте — это 106

Переходим в расписания (60661), сортируем от А до Я, чтобы было удобнее, и видим формат: 106_3125711_1_701. 106 — код маршрута, 3125711 — код расписания, 1_701 — выход (1-й 701-го рейса)

Чтобы понять к чему относится код расписания, смотрим таблицу (60666), сортируем от А до Я и по поиску находим, что 3125711 — код для рейсов по субботам и воскресеньям. Справа можно посмотреть дату начала действия и окончания (формального).

Ну и возвращаемся в таблицу (60661), смотрим порядковый номер остановки и время. Если непонятно, что за остановка по коду, то смотрим таблицу (60662).

Если просто нужно посмотреть количество выходов, то смотрим таблицу (60665).

А оно вообще работает? Полчаса попыток через мобилу и iPad - либо пустая страница, либо 404 ошибка

Опубликовано
Только что, М.Михаил сказал:

А оно вообще работает? Полчаса попыток через мобилу и iPad - либо пустая страница, либо 404 ошибка

Мобильные устройства точно не потянет, только скачать на компьютер.

Опубликовано (изменено)

Понял, жаль. Тогда попробую утром, если он оживет спустя полгода😅

Изменено пользователем М.Михаил
Опубликовано

у меня даже комп отказывается это открывать примерно за это же время😅. ну и фиг с ними, хотя и интересно было бы глянуть пару маршрутов.

Опубликовано

есть ли какие-то боты/программы, оповещающие об изменении выпуска и интервалов на маршрутах? ещё давно видел скриншот из телеги, где был именно такой бот, но найти его так и не смог

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.