Я использую Страву с 2014 года, отслеживая свои пробежки и неукоснительно следя за своими друзьями и профессиональными спортсменами. Я начал бегать в Мэриленде, затем переехал в Калифорнию, затем в Висконсин, а теперь живу в Нью-Йорке. И несмотря на штаты и все пробеги, есть разница между любой погодой и беговой погодой.

Поэтому для своего январского проекта я решил реализовать простую идею: могу ли я предсказать, будет ли сейчас отличная или плохая погода для бега?

Требования

Для этого проекта вам понадобится:

  1. Аккаунт Strava с «приличным» объемом данных (приличный — это немного субъективно. Вы можете начать с небольшого объема, но ваша модель будет улучшаться по мере увеличения количества прогонов!). Strava не начала добавлять данные о погоде в свои прогоны до июня 2020 года, поэтому уже есть некоторые ограничения.
  2. редактор кода. Я использовал код Visual Studio для этого проекта.
  3. Учетная запись OpenWeather. Подробнее об этом позже.

Источники данных

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

Скачать данные Strava

Первым шагом в сборе данных является загрузка архива наших прогонов Strava. ВНИМАНИЕ: в подсказках, которые вы должны нажать, прежде чем перейти к кнопке архивации, упоминается загрузка или удаление вашей учетной записи. Вы не удалите свою учетную запись, когда запросите эти данные. Хотя это не мой любимый выбор с точки зрения пользовательского опыта Strava, это самый простой способ получить нужные нам данные.

После входа в свою учетную запись перейдите к настройкам, затем нажмите «Моя учетная запись». Отсюда нажмите красную кнопку «Начать», чтобы перейти к области загрузки архива. В разделе «Запрос на загрузку» вы должны увидеть кнопку «Запросить ваш архив». Это отправит электронное письмо, содержащее данные, необходимые для нашего проекта.

Изучение наших данных Strava

Так что же в этом архиве? Strava отправит папку с файлом внутри под названием «activities.csv», который представляет собой электронную таблицу всех ваших действий. Каждая строка представляет собой действие с такими точками данных, как тип действия, описание, заголовок, идентификатор и погода!

Некоторые вещи, которые следует учитывать в отношении этих данных: погода добавляется только к мероприятиям на свежем воздухе. Кроме того, были мероприятия на свежем воздухе, для которых я не видел данных о погоде. Так что это оставило немного места для пробелов в данных — примечание об этом в моих выводах.

Хотя существует множество точек данных, связанных с погодой (перечисленных ниже), мы рассмотрим только их подмножество. Это связано с сопоставлением значений, которые будет отправлять наш API. Подробнее об этом позже.

#weather data points in Strava data
Weather Temperature, Apparent Temperature, Dewpoint, Humidity, Wind Speed, Wind Gust, Wind Bearing, Precipitation Intensity, Precipitation Probability, Precipitation Type, Cloud Cover, Weather Visibility, UV Index, Weather Ozone

Маркировка данных Strava

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

Вот пример того, как выглядит файл, который дает нам Strava.

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

Затем наступило самое интересное — пометить прогоны как «отличные» или «плохие». В науке о данных мы называем это контролируемым обучением. Модель может знать, как выглядела хорошая и плохая погода для бега в прошлом, и способна предсказывать новые погодные условия в будущем. Мы могли бы оставить данные немаркированными и надеяться, что они будут учиться, возможно, из-за других факторов, таких как мой темп или расстояние, но это не сработало для моих усилий.

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

Ууууу! Данные помечены. Теперь о построении прогностической модели.

Построение модели

Что это за модель? Это контролируемая модель машинного обучения.

Что означает "под наблюдением"? При использовании машинного обучения можно разработать два типа моделей — контролируемые и неконтролируемые. В моделях с учителем используются наборы данных, в которых метрика, которая должна быть предсказана, помечена, чтобы изучать и делать прогнозы на основе новых данных. Неконтролируемые модели машинного обучения используют немаркированные данные и пытаются найти тенденции и изучить закономерности.

Как работает эта модель? Наш помеченный набор данных Strava будет выступать в качестве обучающих данных. Наша модель рассмотрит эти данные и экстраполирует информацию о том, как входные данные о погоде повлияли на мою хорошую или плохую маркировку. Он будет использовать то, что он узнает, и сможет применять полученные данные к новым данным о погоде на лету. Мы будем получать данные о погоде для конкретного города в режиме реального времени из API OpenWeather и предупреждать пользователя, является ли это хорошей или плохой погодой.

Что такое API? Расшифровывается как «интерфейс прикладного программирования». Хорошая аналогия, если вы думаете об API как о меню. Вы просите что-то из меню. На самом деле вас не волнует, как они ее готовят или что происходит за кулисами, вы просто хотите свою еду. API позволяют программному обеспечению взаимодействовать. Мы можем вежливо попросить OpenWeather отправить нам данные о погоде через вызов API. Они пришлют нам несколько точек данных, которые мы можем ввести в нашу модель. Мы получили нашу еду, и мы счастливы.

Для тех, кто хочет узнать больше, я бы порекомендовал эту статью о том, как использовать Python с API.

Получение результатов API

Практика интеграции результатов API в модель — отличный способ улучшить свои навыки работы с данными. Результаты API расширяют возможности сбора данных в режиме реального времени вместо использования так называемых статических данных, таких как таблица Excel, которая не обновляется сама по себе.

Как я уже упоминал ранее, API позволит нам «получить свою еду», а точнее данные, соответствующие определенному набору параметров. Параметры появляются повсюду в науке о данных как метод определения и настройки моделей, информации и многого другого. Для нашего приложения в «вызове» API есть три ключевых показателя — ключ API, единица измерения и название города. Когда мы запрашиваем данные у OpenWeather, мы указываем единицы измерения, в которых мы хотели бы, чтобы данные возвращались (метрика), и город, из которого мы хотели бы получать данные о погоде (предоставляется в качестве входных данных от нашего пользователя).

Чтобы использовать API OpenWeather, вы должны настроить учетную запись и получить ключ API. Ключ API — это уникальный идентификатор, который аутентифицирует ваш проект для передачи данных. Один пользователь может сгенерировать несколько ключей API в программе (например, OpenWeather), каждый из которых предназначен для отдельного проекта (это работающее приложение погоды, приложение, которое сообщает мне, сколько минут дождя было сегодня, и любое другое приложение, которое мне понадобится для прогноза погоды). данные из OpenWeather для сборки).

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

import streamlit as st
import requests
city_name = st.text_input(“City Name”)
url = f”https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={your_api_key_goes_here}&units=metric"
response = requests.get(url)

Разработка приложения

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

Ответ, к которому я обращусь, — это одна из моих любимых библиотек всех времен: Streamlit. По моему скромному мнению, это самый быстрый способ создания и развертывания приложений на основе данных. Он безупречно интегрируется с Python и может быть быстро развернут с помощью GitHub.

Мы можем открыть файл с именем app.py, и в нем будет размещен наш интерфейс.

Интерфейс будет состоять из подсказки для названия города, однострочного вывода прогноза и, для удовольствия, рандомизированной текущей цитаты, которая заставит вас двигаться!

Мы загрузили наши библиотеки (включая нашу модель, которая находится в model_build.py), перечислили наши функции, представили нашу модель нашему пользователю, а затем определили, для какого города наша модель будет делать прогноз!

Что касается прогноза, мы создадим класс для нашего города, установив переменные погоды в соответствии с информацией, которую мы получаем от API. Тогда, вау! Мы можем предсказать тип погоды для города на лету.

Streamlit упаковывает весь наш код, а затем, подключившись к GitLab, мы можем создать вот такой пользовательский интерфейс:

Ограничения и дальнейшие улучшения

  1. Strava не предоставляет данные о погоде для пробежек до июня 2020 года.
  2. API, из которого Strava собирает данные о погоде, больше не предназначен для личного использования, поэтому данные, которые предоставляет нам наш API, отличаются от тех, которые учитываются Strava. Необходимо внести улучшения в сопоставление большего количества погодных характеристик (снегопад, облачный покров и т. д.), чтобы повысить производительность модели.
  3. Моя память настолько хороша, что я не мог точно отметить все старые прогоны как отличные или плохие. Я хотел бы исправить это, отслеживая погоду в своих описаниях Strava с этого момента и обновляя данные о тренировках в ближайшие несколько месяцев.
  4. Эта модель ДЕЙСТВИТЕЛЬНО проста и позволяет снизить барьеры для изучения науки о данных. В реальном моделировании требуется гораздо больше проверки, настройки и больших наборов данных. Это нормально начинать с малого! Я добавил несколько коротких строк кода, относящихся к перекрестной проверке поиска по сетке, и если вы хотите узнать об этом больше, нажмите здесь.
  5. Чтобы увеличить наши тестовые данные, разумным следующим шагом было бы реализовать способ определения «хороших» или «плохих» погодных условий на лету. Представьте, что вы выходите на улицу, чтобы выполнить какие-то поручения, и говорите: «Эй, сейчас ОТЛИЧНАЯ погода для бега!» Вы можете открыть приложение, нажать «ОТЛИЧНО», и погодные условия и результат будут сохранены как данные тренировки.
  6. Это приложение было создано для моих личных предпочтений в беговой погоде. Если бы № 5 был реализован, человек мог бы использовать свои собственные предпочтения для прогнозирования.

Заключение

Этот проект был очень веселым. Мне очень понравилось копаться в данных Strava и находить способ с пользой применить их в своей жизни. Я очень хочу продолжить разработку небольших, простых проектов по науке о данных, чтобы помочь другим научить тому, как это просто и где мы можем немного оптимизировать свою жизнь с помощью науки о данных.

Открыт для обратной связи, комментариев и идей о том, что будет дальше. На мой февральский проект!

Полный код можно найти здесь: https://github.com/gabylorenzi/is-it-running-weather

Приложение Streamlit развернуто здесь: https://share.streamlit.io/gabylorenzi/is-it-running-weather/main/app.py