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

Изменения в режимах маршрутов и их расписаниях


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

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

Снимок экрана 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 ошибка

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

Ссылка на комментарий
Поделиться на другие сайты

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

Изменено пользователем М.Михаил
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, IGreshnikov сказал:

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

Учитывая, как некоторые участники форума раскусили эту базу уже, разложив её на атомы, то написание бота для них - это дело одного дня, если мы все попросим ))))

Изменено пользователем Касым
  • Haha 1
Ссылка на комментарий
Поделиться на другие сайты

100: 100/74 —> 142/103, из районных в магистральные

460: 28/0, 681: 32/0 —> 0

660: 82/52 —> 50/43, из районных в социальные

Изменено пользователем Infeer10
  • Thanks 1
Ссылка на комментарий
Поделиться на другие сайты

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

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

Создать учетную запись

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

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

Войти

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

Войти
×
×
  • Создать...

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

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