Создание динамики в визуализации данных позволяет рассказать историю более выигрышно. Это несложно, если вы используете Python. Для построения в этой статье мы воспользуемся данными по распространению COVID-19 в США – в настоящий момент именно в США наибольшее количество заболевших (сейчас уже почти 1 млн человек). Отфильтруем топ-5 пострадавших штатов по состоянию на 16 апреля 2020 года, добавим Вашингтон и Калифорнию и построим график числа заболевших в пересчёте на 100 тысяч человек. Итоговый результат, к которому мы стремимся, выглядит так:
Весь код, данные и готовый график можно найти в этом репозитории.
1. Загрузка данных
Начнём анализ с импорта библиотек и создания датафреймов:
Разберемся подробнее, что здесь происходит.
В первой секции мы импортируем несколько библиотек:
- pandas – для создания фреймов данных и создания базовых графиков.
- matplotlib – для создания реальных графиков.
- glob – для отбора файлов и создания GIF-изображения.
- moviepy – для создания GIF.
Если у библиотеки еще не установлены, можно это исправить с помощью pip:
Во второй секции мы генерируем два датафрейма.
Исходные данные:
- us-states.csv – статистика по случаям заражения. Источник: репозиторий NY Times GitHub.
- nst-est2019-alldata.csv – данные переписи населения США в 2019. Источник: сайт переписи населения census.gov.
Наконец, в третьей секции объединяем два фрейма в один – df
(руководство по методу merge).
Дополнительно мы вычисляем коэффициент встречаемости COVID-19 на 100 тысяч человек населения, разделив количество случаев на население штата и умножив на 100 000. Результат вычислений записываем в столбец rate
.
2. Подготовка данных
Теперь у нас есть данные по всем штатам – но этого слишком много. Визуализация данных получилась бы беспорядочной и непонятной. Поэтому ограничим наш анализ и отберем штаты с самым высоким коэффициентом заболевших по состоянию на 16 апреля 2020 года. Добавим к ним также Вашингтон и Калифорнию, поскольку у них рано было зарегистрировано большое число случаев заболевания.
В четвертой секции мы отбираем штаты, которые войдут в конечную визуализацию. Для этого создаем новый фрейм df_1604
, в который входят только данные за 16 апреля. Сортируем его по убыванию, отбираем первые пять позиций и формируем таким образом список штатов с самым высоким показателем rate
. Добавляем дополнительно Вашингтон и Калифорнию.
В секции 5 фильтруем исходный датафрейм – оставляем только отобранные штаты. Ограничиваем начало диапазона 1 марта 2020, так как до этой даты случаев заболевания было мало или информация о них неполная. Наконец, создаем сводную таблицу, подготовленную к отображению.
В шестой секции сбрасываем индекс многоиндексного датафрейма, чтобы обеспечить возможность построения графиков. Удаляем столбец даты. Это довольно спорное решение, но учитывая то, что мы хотим анимировать график, будет проще отображать динамику относительно количества дней, прошедших с 1 марта 2020 года.
3. Построение графиков
Данные подготовлены, можно переходить к построению графиков на Python.
Приведенный ниже код повторяется несколько раз – он создает множество png-изображений для разных временных точек. Затем мы просто сошьем их вместе, чтобы получить gif-изображение.
Здесь мы делаем несколько вещей:
- Устанавливаем тему отображения Five Thirty-Eight.
- Измеряем длину фрейма данных и записываем ее в переменную
length
. Добавляем к этому значению10
. Это облегчает сортировку имен результирующих файлов (по сравнению с нумерацией с единицы). - В цикле for создаем визуализацию для каждой даты.
- Сохраняем полученные файлы в папку.
4. Создание анимации
Мы добрались до самого интересного! Пора превратить папку с png-картинками в единый анимированный gif.
В этом фрагменте мы делаем две вещи:
- Используем пакет
glob
для создания списка всех png-файлов (не забудьте указать правильный путь к папке). По сути мы просто берем все файлы из указанной директории, поэтому важно, чтобы кроме них там ничего не было. - Создаем gif-файл с помощью
moviepy
и сохраняем его в каталог текущего пользователя. Он будет отображаться со скоростью 6 кадров в секунду.
Так выглядит анимированный график, который мы создали за несколько простых шагов. Увы, он демонстрирует быстрое распространение COVID-19.
Комментарии