Перевод поста Mariusz Jankowski "A Rat Race, or a Great Way to Start the Day".
Код, приведенный в статье, можно скачать здесь.
Выражаю огромную благодарность Кириллу Гузенко KirillGuzenko за помощь в переводе.
Не так давно, когда бушевала зима, расчищая подъезд к дому от завалов снега, я решил вспомнить о хорошей погоде, рассмотрев с использованием Wolfram Language свой велосипедный маршрут на работу.
В прошлом году я решил заняться такой весьма распространённой деятельностью, как запись данных своей активности. Я отметил, что за последние несколько лет мои поездки становились все быстрее и давались мне проще по мере того, как сезон приближался к концу, так что мне стало интересно удостовериться в наличии подобных улучшений своей физической формы. Используя лишь смартфон и соответствующее приложение, я записал 27 поездок между домом и работой, а затем использовал Wolfram Language для чтения, анализа и визуализации результатов.
Вот изображение с Google Earth, показывающее мой утренний велосипедный маршрут, имеющий расстояние чуть меньше 18 км, пролегающий с востока на запад.
Для передачи данных из смартфона я использовал GPX (GPS Exchange Format) — формат файла, поддерживаемый крупнейшими производителями GPS-устройств и доступный в большинстве приложений. Обычный файл GPX включает в себя данные о местоположении и высоте с отметками времени, и Wolfram Language возвращает эти данные в виде списка правил с говорящими названиями Geometry, PointElevation и PointTimestamp.
Вот фрагмент одного из файлов формата GPX:
Воспользовавшись новыми функциями в сфере работы с геоданными в Wolfram Language и доступными данными о времени и положении, я смог легко и быстро создать анимацию дневной поездки (больше деталей доступно в разделе Initialization в прилагаемом CDF).
Ещё немного усилий, и вот кое-что интересное: я совместил все утренние поездки за сезон в рамках одной анимированной гонки — вот такие вот получились «крысиные бега» на работу! Лидер сезона показан жёлтым, конечно же!
Вот результаты этого «забега»:
Рассмотрим теперь поездки в хронологическом порядке. Получается, что моё предположение об улучшении времени поездки ближе к концу сезона и по мере увеличения пройденного километража оказалось верным.
И пусть предыдущие расчеты и визуализации достаточно хороши, но мы можем сделать нечто большее. Файлы GPX содержат данные о высоте с привязкой ко времени, однако не только это позволит легко визуализировать общий профиль дороги, но и кое-что ещё: обнаружение участков подъёма и спуска посредством нового функционала из сферы обработки сигналов — обнаружение пиков.
Начнём со стандартного профиля дороги:
Чтобы определить подъёмы и спады, я сгладил данные по подъёмам чтобы фиксировать в сигнале только наиболее крупные локальные максимумы и минимумы. Для этого я сначала построил линейную интерполяцию всей функции чтобы избавиться от слишком нестабильных интервалов в записанных данных, а затем сгладил её посредством GaussianFilter.
Операция сглаживания убирает «паразитные» пики и спады в данных по высотам. Я определил оставшиеся крупные пики с помощью FindPeaks и разделил маршрут на восходящие и нисходящие участки.
Визуализируем участки подъёмов и спусков утренней поездки на графике высот:
А вот несколько более полезная визуализация — участки подъёмов и спусков маршрута на карте:
Примерные расстояния участков подъёма и спуска доступны из списков подъёмов и спусков, вычисленных ранее. Следующий результат подтверждает простую истину о том, что отправляться на работу всегда тяжелее (т. е. в гору), и, следовательно, менее приятно, чем возвращаться с неё.
Я уже с нетерпением жду следующего сезона и всяких интересных фактов в анализе своих данных с помощью Wolfram Language.
Комментарии (13)
OsipovRoman Автор
25.07.2015 17:08+1Это не сложно сделать:
stationfuk
25.07.2015 20:48Подозреваю, что имелся в виду график «вид сбоку».
KirillGuzenko
25.07.2015 22:03Вы это имеете ввиду?
Визуализируем участки подъёмов и спусков утренней поездки на графике высот:
Этот график следует называть именно графиком высот, потому что он изображает функцию, значение которой соответствует высоте.
Примеры: график синуса, график изменения угла подъёма и т.п. То есть обычно они именуются по тому, какой смысл вкладывается в значения соответствующей им функции. В данном случае это высота.PapaBubaDiop
25.07.2015 23:00Это гениально. Но хотелось бы на графике высот увидеть пелетон. На спусках он должен растягиваться, на подъемах сжиматься, очень любопытно. На проекции сверху это плохо видно из-за синуса проклятого.
OsipovRoman Автор
26.07.2015 00:45+5Прилагаю сделанную анимацию (качество картинки, к сожалению, упало из-за экспорта в gif и минимизации веса полученной gif-анимации):
midday
26.07.2015 21:26+1О спасибо большое! Отличная иллюстрация. Отлично видно как «лидер» в горочку прет мощно.
OsipovRoman Автор
26.07.2015 22:25К сожалению, после выгрузки на Хабр, гиф анимация почему то не доходит до конца.
Alexeyslav
27.07.2015 15:09Странно, но на графиках выше красным был обозначен подъем, а тут красный — спуск… так и надо, или ошибка?
OsipovRoman Автор
27.07.2015 15:16+1Когда я делал 3D вариант случайно перепутал цвета. Все остальное верно, безусловно.
dtestyk
26.07.2015 18:56Вы брали средний график высот по 27 поездкам? Интересно было бы увидеть разброс(больше он или меньше на пиках).
genixg
27.07.2015 09:45Тут не учтены такие факторы, как встречный/попутный ветер, загруженность дорог и светофоры, которые сильно влияют на итоговое время. Да и сердечный ритм неплохо бы тоже учитывать, т.к. усилие может быть приложено каждый день разное, в зависимости от настроения и даже общего состояния (выспался/не выспался, к примеру).
Есть еще над чем работать!OsipovRoman Автор
27.07.2015 09:50Из статьи вы видели, что это частное исследование конкретного человека. Про сердечный ритм еще ясно, но как будет учитывать все остальное человек, едущий на работу?
Сфетофоры можно просто удалять, равно как и остановки, когда видно, что находишься в одной точке продолжительное время (скажем, более 1 сек).
В остальном ваш комментарий конечно имеет здравое зерно, но с тем же успехом можно еще учитывать погодные явления, различное содержание кислорода на разной высоте, общую освещенность и пр. и пр.
Всего учесть нельзя, да и не нужно. Интегральные характеристики сами по себе учитывают эти факторы.
midday
Анимацию гонки конечно бы лучше нарисовать ему было на графике с высотами =)