Три недели назад мы с командой в Routitude переключились с наших привычных задач на создание сервиса для мониторинга распространения вируса COVID-19. За это время мы реализовали:
- дашборд с регулярно обновляющимися данными для всех стран (а также административных субъектов России и штатов США);
- интерактивную карту распространения инфекции;
- карту миграционных ограничений, введенных в связи с эпидемией;
- исторические графики развития эпидемии по каждой стране.
Все это было добавлено к уже существующей информации по визовым ограничением, климатическим показателям и данным по авиаперелетам.
Результат нашей работы можно посмотреть здесь: routitude.com/map/covid, а детали о том как все устроено — под катом.
Минутка заботы от НЛО
В мире официально объявлена пандемия COVID-19 — потенциально тяжёлой острой респираторной инфекции, вызываемой коронавирусом SARS-CoV-2 (2019-nCoV). На Хабре много информации по этой теме — всегда помните о том, что она может быть как достоверной/полезной, так и наоборот.
Мы призываем вас критично относиться к любой публикуемой информации
Официальные источники
- Cайт Министерства здравоохранения РФ
- Cайт Роспотребнадзора
- Сайт ВОЗ (англ)
- Сайт ВОЗ
- Сайты и официальные группы оперативных штабов в регионах
Если вы проживаете не в России, обратитесь к аналогичным сайтам вашей страны.
Мойте руки, берегите близких, по возможности оставайтесь дома и работайте удалённо.
Читать публикации про: коронавирус | удалённую работу
Краткая предыстория
Сервис Routitude изначально был создан с целью объединения всей необходимой информации для поиска оптимальных направлений для путешествия в зависимости от различных условий. Параметры поиска включают в себя погодные условия в интересующий период времени, доступные прямые рейсы из выбранного города отправления, визовые ограничения и условия пребывания в стране (безопасность, цены и т.п.). Два года назад мы приступили к реализации этого проекта. В течение этого времени мы запускали несколько бета-версий и к апрелю этого года готовили полноценный релиз Routitute 1.0.
В марте планы по релизу проекта резко изменились в связи с активным распространение инфекции COVID-19. Большинство людей по всему миру были вынуждены поставить поездки на паузу и оставаться дома. Имея позади 2 года разработки инфраструктуры для отображения глобальной информации для многих стран и городов мира, мы приняли решение использовать наш опыт для создания сервиса, который будет полезен людям прямо сейчас. За две недели мы собрали все необходимые источники данных, реализовали отображение информации по коронавирусу на нашей инфраструктуре и выкатили приложение.
Основной функционал сервиса
В текущей версии есть 2 ключевых слоя для отображения информации:
- Слой с данными по коронавирусу в виде полигонов для каждой страны, раскрашенных в цветовую палитру по количеству подтвержденных случаев заражения инфекцией. В центре полигона указано общее число случаев заражения в стране. Для России и США есть разбивка по регионам. Подробная статистика, а также исторические данные доступны по клику на полигон страны.
- Слой, отображающий ограничения по въезду в страну или территорию по 2 типам: 1) закрытые для въезда территории 2) территории, которые ввели ограничение на въезд в связи с карантинными мерами. Комментарий для каждого конкретного ограничения содержится в карточке страны, доступной по клику на полигон.
На главной странице в левой панели отображаются базовые показатели по глобальному распространению инфекции COVID-19. Данные включают в себя количество подтвержденных случаев заражения (Confirmed), количество смертей (Deaths), количество выздоровевших (Recovered). Дополнительно рассчитаны показатель активных случаев (Active), как разница общего количества заражений и количества выздоровевших пациентов, и показатель доли заражения населения страны (Active case rate), как процентное отношение общего количества активных случаев к численности населения страны. Помимо этого, отображаются топ 5 стран, отсортированные по дневному приросту одного из вышеописанных показателей.
Для каждой страны предусмотрена страница с показателями по распространению коронавируса, включая исторические данные в виде графиков для различных показателей. Кроме того, на странице страны отражена информация по миграционным ограничениям, вызванным распространением коронавирусной инфекции, с подробным комментарием, а также общая информация о стране.
Источники данных и инструменты
Для сбора и обработки данных мы используем набор Python Flask микросервисов. Веб интерфейс написан на Vue.js фреймворке, а карта реализована на базе mapbox. Интерфейс сайта дружелюбен к мобильным устройствам.
Исторические данные для отображение трендов распространения вируса в виде графиков основаны на публично доступных датасетах университета Джонса Хопкинса (Johns Hopkins University CSSE), которые обновляются раз в сутки и находятся в github репозитории. Данные организованы в виде текстовых файлов с базовой статистикой, такой как количество подтвержденных случаев заражения, количество смертей и количество выздоровевших, за каждый день. Для извлечения и обработки этих данных мы используем Python и популярный пакет для анализа данных Pandas. Код для получения данных за определенный день представлен ниже.
import pandas as pd
def get_covid_daily_report(report_date):
"""
Get coronavirus report on date
:param report_date: requesting date of report (MM-DD-YYYY)
:return: Pandas DataFrame with data
"""
report_url = (
f'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/'
f'csse_covid_19_data/csse_covid_19_daily_reports/{report_date}.csv'
)
return pd.read_csv(report_url)
df = get_daily_report('03-15-2020')
Так как обновление этих данных осуществляется только раз в сутки, для отображения текущей информации они подходят плохо. Поэтому, для выдачи актуальной информации в реальном времени мы используем данные из Википедии со страницы, посвященной пандемии коронавируса по странам и территориям. Для иллюстрации подхода приведу простой пример кода для получения актуальной статистики по коронавирусу из Википедии (страница, как и положение на ней таблицы с данными, могут меняться в будущем, что, соотвественно, может вызвать необходимость редактирования кода).
import pandas as pd
import requests
def get_current_covid_report():
"""
Get current COVID-19 report
:return: pandas DataFrame
"""
page_url = (
'https://en.wikipedia.org/wiki/'
'2019%E2%80%9320_coronavirus_pandemic_by_country_and_territory'
)
response = requests.get(page_url)
df = pd.read_html(response.content)[1]
df = pd.DataFrame(
df.values[:, 1:5],
columns=['country', 'confirmed', 'deaths', 'recovered']
)
return df
df = get_current_covid_report()
Для визуализации на карте ограничений по въезду в страны или территории, также, используются данные из Википедии. Эта информация извлекается со страницы, посвященной миграционны ограничениям. Для парсинга страницы мы используем пакет beautifulsoup4.
Что дальше?
Как уже отмечалось выше Routitude — это сервис для путешественников, которым важно выбрать лучшее место для своего следующего приключения. Поэтому, как только конец текущего кризиса будет в обозримом будущем, мы продолжим обогащать наше приложение различными данными об условиях и возможностях в различных уголках планеты. А пока, наша краткосрочная цель — отразить текущую обстановку в мире.
Мы будем рады обратной связи и готовы ответить на ваши вопросы.
Будьте здоровы!