[Перевод] Год с Runkeeper: Анализ и визуализация геоданных о ваших путешествиях

8a0b9382dbaf47d49bed269625be6ec5.png


Перевод поста Bernat Espigulé-Pons «A Year of Runkeeper: Analysis and Visualization».
Код, приведенный в статье, можно скачать здесь, а дополнительные файлы здесь.
Выражаю огромную благодарность Кириллу Гузенко KirillGuzenko за помощь в переводе и подготовке публикации
Почти год назад я решил записывать все свои передвижения с помощью Runkeeper, и теперь хочу представить несколько вариантов визуализации моей годовой активности. Проект получается несложным: данные по своим передвижениям я буду подгружать из Runkeeper, а анализировать/визуализировать — в Wolfram Language. В этой анимации (см.ниже) показаны мои передвижения по Барселоне, и я покажу вам, как сделать такую же.

af13da16afd29ec8a41929ce867d22ab.gif
Следуя указаниям на этой странице, я экспортирую свои данные из Runkeeper. Есть и другой способ — подключить мой аккаунт в Runkeeper к Wolfram Language с помощью функции ServiceConnect. Правда, с помощью этой функции можно проанализировать всего 25 передвижений, так что на этот раз я буду экспортировать данные вручную.

Итак, в результате у меня получился ZIP-файл с парой CSV файлов, и еще — все мои ранее записанные GPX файлы. Прежде всего я сохраню ноутбук (файл Mathematica) в директории, в которой распаковал архив, а затем назначу эту директорию основной:

49f204324881c67133533eae936dcb20.png

Посмотрим теперь на первую строку файла «cardioActivities.csv»:

ea1ad4c23d497a310b1838de74a6f342.png

В Runkeeper’е можно проводить сразу несколько измерений с разными элементами. Чтобы правильно интерпретировать эти величины, я использую функцию SemanticImport со следующими типами столбцов:

96fd092a1ea395723f28ba5123ce7e06.png

5036710ab7136b10353f86944beb77f7.jpg

В результате я получаю Dataset объект, который легко проанализировать. Давайте поработаем с данными:

1. Посчитаем, сколько раз и каким способом я передвигался:

f3c9e0afb93c15b7df24b7e398cdd1cd.png

2. Вычислим среднее расстояние:

51461232231c628a6af7da8d0ca7a963.png

3. Построим гистограмму всех расстояний:

66d8809833e4c916b815cf2cc3968514.png

4. Используем функцию DateListStepPlot для визуализации средней скорости передвижения:

6b47606d5b47c7c25fbbfe7496a586d5.png

5. Выберем путешествия длиной более 10 миль:

3bf64fa6bdc3cae9c99f7010ce92e566.png

4aa8dd5a3b695a8bdddfe43222683808.jpg

6. Узнаем, сколько раз я залез бы на Эверест:

0bf256d096a3a2b00c53c95e8c9937f5.png

7. Сгруппируем виды деятельности по их описанию:

1d4c3f458f1cae0ebd898fbd11ebf6a1.png

8. Выберем мероприятия с пометкой «Бостон» и импортируем их GPX файлы:

b5d94bff9e589b5a174e9c73e09a723e.png

9. Обозначим на карте точки старта для всех способов передвижения:

887706da90e201afd608be4d75bd2e9c.png

10. И последнее, но не менее важное: используем функцию TimelinePlot для всех видов передвижения:

1dd15b4fde6e0a22de7ebadd16613aa4.png

Пока все идет хорошо. Дальше нам нужно вытащить данные из GPX файлов. Используя функции Import и GeoGraphics, построим GPS-трек, обозначив его черной линией.

c20fa012619aa657ac247ac0c38657cf.png

Но я хочу получить еще и данные о высоте, на которой я находился, и скорости, с которой передвигался. У функции Import есть опция «Data», которая позволяет получить доступ к GPX файлу общей для Wolfram Language формы (списки, строки и т. д.):

68b1e1944b9fe5bbb7af270597734e7e.png

В этом документе содержится список зафиксированных с помощью функции GeoPosition точек высоты и отметок времени. Так как меня интересуют только точки, я определил функцию, которая находит мое местоположение, и использовал функцию TimeSeries для определения высоты, на которой я находился:

9c4cb738c19a61caed480c901562eaab.png

Данные GPX данные представляются в виде ассоциации (Association) с парой ключей:

6319d65ff59c639bf68b19e3811d2d61.png

Теперь можно создать график DateListPlot, окрашенный в зависимости от значения функции (высоты).

5f262d9e0b042aa7cee740c20f4e01c9.png

Или воспользуемся параметром «Geometry»: используем функцию Rescale для точек подъема, а затем раскрасим GPS-трек в зависимости от высоты:

d15cec925d7217dfcf38bdade36fabfa.png

Теперь, используя эти данные, можно вычислить мгновенную скорость. Сандер Хейсман (Sander Huisman), участник сообщества Wolfram Community, показал недавно, как вычислить мгновенную скорость и раскрасить GPS-трек. Ниже представлена функция, которую я определил для вычисления временных рядов мгновенной скорости из точек GeoPosition и временных рядов подъемов:

797579ef1bd20093053bed9e7d58130e.png

А теперь вспомним предыдущий пример: DateListPlot может сказать мне, когда я делал остановку во время похода:

95587fe2d5e722c16656ba2a0112c920.png

Во время этих коротких перерывов я останавливался, чтобы сфотографировать скальные образования, вдохновлявшие самого Сальвадора Дали. Давайте составим карту этих остановок с помощью раскрашивания GPS-трека в зависимости от скорости:

94e5d0c01296113278ce3950cc0e6070.png

Теперь, когда я могу обозначать точки своего местонахождения, высоту подъема и определять мгновенную скорость движения, можно объединить все это в новый набор данных:

3ac2ce131adc7154c12835bb60caa85c.png

Год назад я переехал из сельской местности в Барселону:

ee1c85f1fd9918a0237780b4c8ed9a62.png

Чтобы обозначить мои передвижения в Барселоне, я мог бы использовать функции GeoWithinQ или GeoDistance, но сейчас эти функции не понадобятся: я сделал пометки к моим передвижениям по городу:

14495a8bce28743c39015ff53948cb96.png

Сначала я хочу убедиться, что все мои передвижения будут обозначены на черно-белой единообразной карте без пометок, и затем нанесу на карту свои передвижения с помощью функции GeoGraphics. Для этого я добавил дополнительные опции GeoStyling для GeoBackground, чтобы сделать фон серых оттенков. Я также добавил GeoScaleBar и ограничил отрезок на карте с помощью функции GeoRange:

67d6d7f2fd51b58a226234019ed44c7a.png

По-моему, выглядит неплохо. Нанесем на карту все зафиксированные передвижения:

40322765f832c7ac667f92860fc1d95b.png

Я покрыл почти весь город! Если бы я наносил на карту только начальные (желтые) и красные (конечные) точки, стало бы понятно, где я живу. В большинстве случаев я добирался из одной точки в другую, используя city«s bicycle-sharing system:

328a60fbff3781195e8e5c2d12f26a0a.png

Давайте теперь построим маршрут, который позволит за кратчайшее время снова посетить все эти места:

e1042daf9b787301801b18f1a465c273.png

Чтобы посетить их все, понадобится проехать (пройти) около 170 км:

6beccc9e3d0338c89192a54800cb2d1b.png

Неплохо, если сравнить с тем, сколько у меня набегает за год:

13e7df95f0cffc4513afd9a674fd75ce.png

Что еще я заметил, пользуясь Runkeeper’ом на протяжении года: мой путь из точки А (дом) в точку Б (центр капойэра) постоянно меняется. Дело в том, что я еще не уверен, что добираться туда на велосипеде лучше всего. Функция TravelDirections поможет посмотреть на данные по-новому:

34d233e9062cfc1f5d41c3e9f092c11d.png

Нарисуем «TravelPath» для трех различных значений метода передвиженияTravelMethod — «Biking» (на велосипеде) (зеленый), «Walking» (пешком) (синий), и «Driving» (за рулем) (красный); однако здесь изображен не только простой способ добраться из точки А в точку В:

b822615807a4436e9743ccebcafd2cc3.png

Функция TravelDistance сообщает нам, что путь «Пешком» — самый короткий:

f0a84e218b0eb6a5eb7437744e6f6f25.png

Однако этот путь проходит через центр Барселоны — Ciutat Vella (старый город), который представляет собой лабиринт средневековых улиц с ограничениями для пешеходов, так что мне понадобится целый час, чтобы добраться из точки А в точку Б. Функция TravelTime показывает, что путь «На велосипеде» быстрее:

489fe244a8f68e95f257223d9fc17c32.png

Надо сказать, что за этот год я испробовал различные способы добраться до точки B на велосипеде. Мой фаворит сейчас — путь «за рулем», обозначенный красным цветом:

cb922df42ab1ca8568112c2c412e66ed.png

Давайте теперь построим графики всех 55 поездок, окрашенные в соответствии с временем в пути.

0c288258f1c7d2d381ac2d12d666159f.png

9035861877a33ef7fc585e713f3df4d7.png

Синие/зеленые дорожки ближе всего к варианту «Пешком», и похоже, что это самые короткие пути в точку B. Мой рекорд — около 13 минут:

1a5ac7a44558d5b98aca94d95ece545c.png

Среднее время в пути близко к предсказанному функцией TravelDirectionsData:

4821ab832bef9164efc3e79f20e4af32.png

С помощью этих данных я могу путешествовать во времени по всему прошедшему году. В следующих своих статьях, посвященных GeoGraphics, я собираюсь раскрасить GPS-треки в соответствии со скоростью передвижения и добавлю даты для каждого вида передвижения с помощью функции Tooltip:

5ec99331d1086e9f63a852da5d7e76ed.png

А теперь можно взять каждый каждый из вариантов передвижения по отдельности и анимировать все мои поездки и походы по Барселоне за год.

Код для создания анимации доступен в конце этой статьи в формате CDF. Предлагаю использовать его для анализа ваших данных из Runkeeper. Нужно больше идей? Обратите внимание на статью (ссылка на перевод, опубликованный на Хабре) «В погоне за самим собой, или отличный способ начать свой день».

По вопросам о технологиях Wolfram пишите на info-russia@wolfram.com

© Habrahabr.ru