Пошаговое введение менее чем за 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')
Преобразование данных
Теперь, когда мы получили данные, нам нужно подготовить их к обработке. Необходимые нам операции зависят от того, чего мы пытаемся достичь.
В этом случае первое, что мы должны сделать, это отфильтровать наши данные двумя способами:
- Сохраняйте данные только на уровне страны (т.е. удаляйте все данные, для которых определена провинция / штат)
- Сохраняйте данные на уровне страны только для Великобритании, США, Италии и Германии.
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()
Заключение
Вот и все, народ. Менее чем за пять минут вы научились создавать основы визуализации данных. Создание этих визуализаций может быть очень мощным инструментом, который поможет вам представить историю и донести сообщение.
Удачного обучения и сохраните всех!
Перед тем как уйти, если вам понравилась эта статья, вам также могут понравиться: