![](https://habrastorage.org/files/8a0/b93/82d/8a0b9382dbaf47d49bed269625be6ec5.png)
Перевод поста Bernat Espigulé-Pons "A Year of Runkeeper: Analysis and Visualization".
Код, приведенный в статье, можно скачать здесь, а дополнительные файлы здесь.
Выражаю огромную благодарность Кириллу Гузенко KirillGuzenko за помощь в переводе и подготовке публикации
Почти год назад я решил записывать все свои передвижения с помощью Runkeeper, и теперь хочу представить несколько вариантов визуализации моей годовой активности. Проект получается несложным: данные по своим передвижениям я буду подгружать из Runkeeper, а анализировать/визуализировать — в Wolfram Language. В этой анимации (см.ниже) показаны мои передвижения по Барселоне, и я покажу вам, как сделать такую же.
![](https://habrastorage.org/getpro/habr/post_images/af1/3da/16a/af13da16afd29ec8a41929ce867d22ab.gif)
Следуя указаниям на этой странице, я экспортирую свои данные из Runkeeper. Есть и другой способ — подключить мой аккаунт в Runkeeper к Wolfram Language с помощью функции ServiceConnect. Правда, с помощью этой функции можно проанализировать всего 25 передвижений, так что на этот раз я буду экспортировать данные вручную.
Итак, в результате у меня получился ZIP-файл с парой CSV файлов, и еще — все мои ранее записанные GPX файлы. Прежде всего я сохраню ноутбук (файл Mathematica) в директории, в которой распаковал архив, а затем назначу эту директорию основной:
![](https://habrastorage.org/getpro/habr/post_images/49f/204/324/49f204324881c67133533eae936dcb20.png)
Посмотрим теперь на первую строку файла «cardioActivities.csv»:
![](https://habrastorage.org/getpro/habr/post_images/ea1/ad4/c23/ea1ad4c23d497a310b1838de74a6f342.png)
В Runkeeper'е можно проводить сразу несколько измерений с разными элементами. Чтобы правильно интерпретировать эти величины, я использую функцию SemanticImport со следующими типами столбцов:
![](https://habrastorage.org/getpro/habr/post_images/96f/d09/2a1/96fd092a1ea395723f28ba5123ce7e06.png)
![](https://habrastorage.org/getpro/habr/post_images/503/671/0ab/5036710ab7136b10353f86944beb77f7.jpg)
В результате я получаю Dataset объект, который легко проанализировать. Давайте поработаем с данными:
1. Посчитаем, сколько раз и каким способом я передвигался:
![](https://habrastorage.org/getpro/habr/post_images/f3c/9e0/afb/f3c9e0afb93c15b7df24b7e398cdd1cd.png)
2. Вычислим среднее расстояние:
![](https://habrastorage.org/getpro/habr/post_images/514/612/322/51461232231c628a6af7da8d0ca7a963.png)
3. Построим гистограмму всех расстояний:
![](https://habrastorage.org/getpro/habr/post_images/66d/880/983/66d8809833e4c916b815cf2cc3968514.png)
4. Используем функцию DateListStepPlot для визуализации средней скорости передвижения:
![](https://habrastorage.org/getpro/habr/post_images/6b4/760/6d5/6b47606d5b47c7c25fbbfe7496a586d5.png)
5. Выберем путешествия длиной более 10 миль:
![](https://habrastorage.org/getpro/habr/post_images/3bf/64f/a6b/3bf64fa6bdc3cae9c99f7010ce92e566.png)
![](https://habrastorage.org/getpro/habr/post_images/4aa/8dd/5a3/4aa8dd5a3b695a8bdddfe43222683808.jpg)
6. Узнаем, сколько раз я залез бы на Эверест:
![](https://habrastorage.org/getpro/habr/post_images/0bf/256/d09/0bf256d096a3a2b00c53c95e8c9937f5.png)
7. Сгруппируем виды деятельности по их описанию:
![](https://habrastorage.org/getpro/habr/post_images/1d4/c3f/458/1d4c3f458f1cae0ebd898fbd11ebf6a1.png)
8. Выберем мероприятия с пометкой «Бостон» и импортируем их GPX файлы:
![](https://habrastorage.org/getpro/habr/post_images/b5d/94b/ff9/b5d94bff9e589b5a174e9c73e09a723e.png)
9. Обозначим на карте точки старта для всех способов передвижения:
![](https://habrastorage.org/getpro/habr/post_images/887/706/da9/887706da90e201afd608be4d75bd2e9c.png)
10. И последнее, но не менее важное: используем функцию TimelinePlot для всех видов передвижения:
![](https://habrastorage.org/getpro/habr/post_images/1dd/15b/4fd/1dd15b4fde6e0a22de7ebadd16613aa4.png)
Пока все идет хорошо. Дальше нам нужно вытащить данные из GPX файлов. Используя функции Import и GeoGraphics, построим GPS-трек, обозначив его черной линией.
![](https://habrastorage.org/getpro/habr/post_images/c20/fa0/126/c20fa012619aa657ac247ac0c38657cf.png)
Но я хочу получить еще и данные о высоте, на которой я находился, и скорости, с которой передвигался. У функции Import есть опция «Data», которая позволяет получить доступ к GPX файлу общей для Wolfram Language формы (списки, строки и т. д.):
![](https://habrastorage.org/getpro/habr/post_images/68b/1e1/944/68b1e1944b9fe5bbb7af270597734e7e.png)
В этом документе содержится список зафиксированных с помощью функции GeoPosition точек высоты и отметок времени. Так как меня интересуют только точки, я определил функцию, которая находит мое местоположение, и использовал функцию TimeSeries для определения высоты, на которой я находился:
![](https://habrastorage.org/getpro/habr/post_images/9c4/cb7/38c/9c4cb738c19a61caed480c901562eaab.png)
Данные GPX данные представляются в виде ассоциации (Association) с парой ключей:
![](https://habrastorage.org/getpro/habr/post_images/631/9d6/5ff/6319d65ff59c639bf68b19e3811d2d61.png)
Теперь можно создать график DateListPlot, окрашенный в зависимости от значения функции (высоты).
![](https://habrastorage.org/getpro/habr/post_images/5f2/62d/9e0/5f262d9e0b042aa7cee740c20f4e01c9.png)
Или воспользуемся параметром «Geometry»: используем функцию Rescale для точек подъема, а затем раскрасим GPS-трек в зависимости от высоты:
![](https://habrastorage.org/getpro/habr/post_images/d15/cec/925/d15cec925d7217dfcf38bdade36fabfa.png)
Теперь, используя эти данные, можно вычислить мгновенную скорость. Сандер Хейсман (Sander Huisman), участник сообщества Wolfram Community, показал недавно, как вычислить мгновенную скорость и раскрасить GPS-трек. Ниже представлена функция, которую я определил для вычисления временных рядов мгновенной скорости из точек GeoPosition и временных рядов подъемов:
![](https://habrastorage.org/getpro/habr/post_images/797/579/ef1/797579ef1bd20093053bed9e7d58130e.png)
А теперь вспомним предыдущий пример: DateListPlot может сказать мне, когда я делал остановку во время похода:
![](https://habrastorage.org/getpro/habr/post_images/955/87f/e2d/95587fe2d5e722c16656ba2a0112c920.png)
Во время этих коротких перерывов я останавливался, чтобы сфотографировать скальные образования, вдохновлявшие самого Сальвадора Дали. Давайте составим карту этих остановок с помощью раскрашивания GPS-трека в зависимости от скорости:
![](https://habrastorage.org/getpro/habr/post_images/94e/5d0/c01/94e5d0c01296113278ce3950cc0e6070.png)
Теперь, когда я могу обозначать точки своего местонахождения, высоту подъема и определять мгновенную скорость движения, можно объединить все это в новый набор данных:
![](https://habrastorage.org/getpro/habr/post_images/3ac/2ce/131/3ac2ce131adc7154c12835bb60caa85c.png)
Год назад я переехал из сельской местности в Барселону:
![](https://habrastorage.org/getpro/habr/post_images/ee1/c85/f1f/ee1c85f1fd9918a0237780b4c8ed9a62.png)
Чтобы обозначить мои передвижения в Барселоне, я мог бы использовать функции GeoWithinQ или GeoDistance, но сейчас эти функции не понадобятся: я сделал пометки к моим передвижениям по городу:
![](https://habrastorage.org/getpro/habr/post_images/144/95a/8bc/14495a8bce28743c39015ff53948cb96.png)
Сначала я хочу убедиться, что все мои передвижения будут обозначены на черно-белой единообразной карте без пометок, и затем нанесу на карту свои передвижения с помощью функции GeoGraphics. Для этого я добавил дополнительные опции GeoStyling для GeoBackground, чтобы сделать фон серых оттенков. Я также добавил GeoScaleBar и ограничил отрезок на карте с помощью функции GeoRange:
![](https://habrastorage.org/getpro/habr/post_images/67d/6d7/f2f/67d6d7f2fd51b58a226234019ed44c7a.png)
По-моему, выглядит неплохо. Нанесем на карту все зафиксированные передвижения:
![](https://habrastorage.org/getpro/habr/post_images/403/227/65f/40322765f832c7ac667f92860fc1d95b.png)
Я покрыл почти весь город! Если бы я наносил на карту только начальные (желтые) и красные (конечные) точки, стало бы понятно, где я живу. В большинстве случаев я добирался из одной точки в другую, используя city’s bicycle-sharing system:
![](https://habrastorage.org/getpro/habr/post_images/328/a60/fbf/328a60fbff3781195e8e5c2d12f26a0a.png)
Давайте теперь построим маршрут, который позволит за кратчайшее время снова посетить все эти места:
![](https://habrastorage.org/getpro/habr/post_images/e10/42d/af9/e1042daf9b787301801b18f1a465c273.png)
Чтобы посетить их все, понадобится проехать (пройти) около 170 км:
![](https://habrastorage.org/getpro/habr/post_images/6be/ccc/9e3/6beccc9e3d0338c89192a54800cb2d1b.png)
Неплохо, если сравнить с тем, сколько у меня набегает за год:
![](https://habrastorage.org/getpro/habr/post_images/13e/7df/95f/13e7df95f0cffc4513afd9a674fd75ce.png)
Что еще я заметил, пользуясь Runkeeper'ом на протяжении года: мой путь из точки А (дом) в точку Б (центр капойэра) постоянно меняется. Дело в том, что я еще не уверен, что добираться туда на велосипеде лучше всего. Функция TravelDirections поможет посмотреть на данные по-новому:
![](https://habrastorage.org/getpro/habr/post_images/34d/233/e90/34d233e9062cfc1f5d41c3e9f092c11d.png)
Нарисуем «TravelPath» для трех различных значений метода передвиженияTravelMethod — «Biking» (на велосипеде) (зеленый), «Walking» (пешком) (синий), и «Driving» (за рулем) (красный); однако здесь изображен не только простой способ добраться из точки А в точку В:
![](https://habrastorage.org/getpro/habr/post_images/b82/261/580/b822615807a4436e9743ccebcafd2cc3.png)
Функция TravelDistance сообщает нам, что путь «Пешком» — самый короткий:
![](https://habrastorage.org/getpro/habr/post_images/f0a/84e/218/f0a84e218b0eb6a5eb7437744e6f6f25.png)
Однако этот путь проходит через центр Барселоны — Ciutat Vella (старый город), который представляет собой лабиринт средневековых улиц с ограничениями для пешеходов, так что мне понадобится целый час, чтобы добраться из точки А в точку Б. Функция TravelTime показывает, что путь «На велосипеде» быстрее:
![](https://habrastorage.org/getpro/habr/post_images/489/fe2/44a/489fe244a8f68e95f257223d9fc17c32.png)
Надо сказать, что за этот год я испробовал различные способы добраться до точки B на велосипеде. Мой фаворит сейчас — путь «за рулем», обозначенный красным цветом:
![](https://habrastorage.org/getpro/habr/post_images/cb9/22d/f42/cb922df42ab1ca8568112c2c412e66ed.png)
Давайте теперь построим графики всех 55 поездок, окрашенные в соответствии с временем в пути.
![](https://habrastorage.org/getpro/habr/post_images/0c2/882/58f/0c288258f1c7d2d381ac2d12d666159f.png)
![](https://habrastorage.org/getpro/habr/post_images/903/586/187/9035861877a33ef7fc585e713f3df4d7.png)
Синие/зеленые дорожки ближе всего к варианту «Пешком», и похоже, что это самые короткие пути в точку B. Мой рекорд — около 13 минут:
![](https://habrastorage.org/getpro/habr/post_images/1a5/ac7/a44/1a5ac7a44558d5b98aca94d95ece545c.png)
Среднее время в пути близко к предсказанному функцией TravelDirectionsData:
![](https://habrastorage.org/getpro/habr/post_images/482/1ab/832/4821ab832bef9164efc3e79f20e4af32.png)
С помощью этих данных я могу путешествовать во времени по всему прошедшему году. В следующих своих статьях, посвященных GeoGraphics, я собираюсь раскрасить GPS-треки в соответствии со скоростью передвижения и добавлю даты для каждого вида передвижения с помощью функции Tooltip:
![](https://habrastorage.org/getpro/habr/post_images/5ec/993/31d/5ec99331d1086e9f63a852da5d7e76ed.png)
А теперь можно взять каждый каждый из вариантов передвижения по отдельности и анимировать все мои поездки и походы по Барселоне за год.
Код для создания анимации доступен в конце этой статьи в формате CDF. Предлагаю использовать его для анализа ваших данных из Runkeeper. Нужно больше идей? Обратите внимание на статью (ссылка на перевод, опубликованный на Хабре) "В погоне за самим собой, или отличный способ начать свой день".
По вопросам о технологиях Wolfram пишите на info-russia@wolfram.com