Пошаговое введение менее чем за 5 минут

В этом блоге мы узнаем, как получать, преобразовывать и, наконец, привлекательно представлять данные. Мы собираемся работать с набором данных COVID-19 и Python, чтобы изучить основы.

Изучите данные, и вы сможете рассказывать истории, о которых многие люди даже не знают, но хотят их услышать. - Натан Яу

В общем, менее чем за 5 минут вы узнаете, как получать данные в фрейме данных Pandas, как преобразовывать фрейм данных и, наконец, визуализировать его с помощью линейного графика, гистограммы, круговой диаграммы и тепловой карты.

Данные об источниках

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

Для этого урока мы собираемся использовать данные из Центра системных наук и инженерии Джона Хопкина. В частности, мы собираемся использовать данные временных рядов для ежедневных смертей.

Первое, что мы можем сделать, это открыть ссылку в нашем браузере и изучить данные, чтобы быстро получить информацию. Мы видим, что данные представлены в формате CSV (с разделителем «,»). Мы также можем видеть, что каждый день содержит общее количество смертей (не ежедневных смертей). Наконец, мы видим, что данные доступны на уровне страны / региона.

Без лишних слов перейдем к коду. Для нашего удобства библиотека Pandas позволяет нам получать данные прямо из Интернета.

import pandas as pd
url = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'
df = pd.read_csv(url, delimiter=',',header = 'infer')

Преобразование данных

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

В этом случае первое, что мы должны сделать, это отфильтровать наши данные двумя способами:

  1. Сохраняйте данные только на уровне страны (т.е. удаляйте все данные, для которых определена провинция / штат)
  2. Сохраняйте данные на уровне страны только для Великобритании, США, Италии и Германии.
df_interest = df.loc[
                df['Country/Region'].isin(['United Kingdom','US', 'Italy', 'Germany'])
                & df['Province/State'].isna()]

Затем я хотел бы транспонировать данные так, чтобы каждый столбец относился к стране, а каждая строка - к дате.

df_interest.rename(index=lambda x: df_interest.at[x,'Country/Region'], inplace=True)
df1 = df_interest.transpose()

Наконец, мы можем избавиться от строк, которые нам не интересны:

  • Провинция / штат, страна / регион, широта и долгота
  • Любые столбцы, в которых по всем странам нет смертей

а затем преобразовать тип данных индекса в DateTime, чтобы он хорошо работал с операциями временных рядов.

df1 = df1.drop(['Province/State','Country/Region', 'Lat','Long'])
df1 = df1.loc[(df1 != 0).any(1)]
df1.index = pd.to_datetime(df1.index)

На этом мы готовы приступить к визуализации наших данных.

Визуализация данных

Линейный график

Нанесение данных на линию показывает, как данные меняются с течением времени, и вы можете сравнивать различные переменные. Создать линейный график в Python очень просто, если у вас есть данные в правильном формате.

from matplotlib import pyplot
df1.plot()
pyplot.xlabel('Dates')
pyplot.ylabel('No of Deaths')
pyplot.show()

Гистограмма

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

import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
objects = df1.max().index
y_pos = np.arange(len(objects))
performance = df1.tail(1).values.tolist()[0]
plt.bar(y_pos, performance, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('Deaths')
plt.xlabel('Countries')
plt.title('Deaths per Country')
plt.show()

Круговая диаграмма

Кому не нравится пирог… диаграммы! Круговые диаграммы - еще один отличный способ показать относительный размер между различными наборами данных; очень похоже на гистограмму.

from matplotlib import pyplot
import numpy as np
#Credit: https://stackoverflow.com/questions/41088236/how-to-have-actual-values-in-matplotlib-pie-chart-displayed-python
def absolute_value(val):
    a  = np.round(val/100.*df1.max().sum(), 0)
    return int(a)
plot = df1.max().plot.pie(y=df1.max().index, figsize=(5, 5),autopct=absolute_value, label='')
plot.set_title('Total Number of Deaths', fontsize=12)
pyplot.show()

Тепловая карта

Тепловые карты - это более продвинутая техника визуализации, которая позволяет нам представлять данные временных рядов по различным переменным, а затем сравнивать их по цветам.

#Credit https://matplotlib.org/3.1.1/gallery/images_contours_and_fields/image_annotated_heatmap.html
import numpy as np
from matplotlib import pyplot
df1 = df1.tail(15)
dates = df1.index.strftime('%Y-%b-%d')
countries = df1.max().index
df2 = pd.DataFrame(df1, columns=df1.columns).astype(int)
matrix = np.array(df2).transpose()
fig, ax = pyplot.subplots()
im = ax.imshow(matrix)
# We want to show all ticks...
ax.set_xticks(np.arange(len(dates)))
ax.set_yticks(np.arange(len(countries)))
# ... and label them with the respective list entries
ax.set_xticklabels(dates)
ax.set_yticklabels(countries)
# Rotate the tick labels and set their alignment.
pyplot.setp(ax.get_xticklabels(), rotation=45, ha="right",
         rotation_mode="anchor")
# Loop over data dimensions and create text annotations.
for i in range(len(dates)):
    for j in range(len(countries)):
        text = ax.text(i, j, matrix[j, i],
                       ha="center", va="center", color="w", size = '10')
ax.set_title("Deaths Per Day Heatmap")
fig.tight_layout()
pyplot.show()

Заключение

Вот и все, народ. Менее чем за пять минут вы научились создавать основы визуализации данных. Создание этих визуализаций может быть очень мощным инструментом, который поможет вам представить историю и донести сообщение.

Удачного обучения и сохраните всех!

Перед тем как уйти, если вам понравилась эта статья, вам также могут понравиться: