www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Визуализация данных с помощью Bokeh в Python, Часть I: Начало работы

Дата публикации Mar 17, 2018

Подними свою визуализацию

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

Раздраженная, она спросила меня, могу ли я сделать визуальное отображение трансформации. Через пару минут, используя пакет R под названиемgganimateЯ сделал простую анимацию, показывающую, как метод преобразует временные ряды. Теперь, вместо того, чтобы пытаться объяснить вейвлеты, член моей команды может показать клип, чтобы дать интуитивное представление о том, как работает техника. Я пришел к выводу, что мы можем провести самый тщательный анализ, но в конце концов все, что люди хотят увидеть, это гифки! Несмотря на то, что это утверждение должно быть юмористическим, оно имеет элемент правды: результаты не окажут существенного влияния, если их нельзя будет четко донести, и зачастую лучший способ представления результатов анализа - визуализация.

Ресурсы, доступные для науки о данных, быстро развиваются, что особенно заметно всфера визуализациигде, кажется, есть еще один вариант, чтобы попробовать каждую неделю. Со всеми этими достижениями есть одна общая тенденция: увеличенная интерактивность. Людям нравится видеть данные в статических графиках, но больше всего им нравится играть с данными, чтобы увидеть, как изменение параметров влияет на результаты. Что касается моих исследований, отчет, в котором говорится владельцу здания о том, сколько электроэнергии они могут сэкономить, изменив свой график работы от сети переменного тока, является хорошим, но более эффективно дать им интерактивный график, на котором они могут выбирать различные графики и видеть, как их выбор влияет на потребление электроэнергии. , В последнее время, вдохновленный тенденцией к интерактивным сюжетам и желанием продолжать изучать новые инструменты, я работал сBokehбиблиотека Python. Пример интерактивных возможностей Bokeh показан на этой панели, которую я построил для своего исследовательского проекта:

Хотя я не могу поделиться кодом этого проекта, я могу рассмотреть пример создания полностью интерактивного приложения Bokeh с использованием общедоступных данных. Эта серия статей будет охватывать весь процесс создания приложения с использованием Bokeh. В этом первом посте мы рассмотрим основные элементы Bokeh, которые мы будем использовать в последующих постах. На протяжении всей этой серии мы будем работать сНабор данных nycflights13, который имеет записи более 300 000 рейсов с 2013 года. Сначала мы сконцентрируемся на визуализации одной переменной, в данном случае задержки прибытия рейсов в минутах, и начнем с построения базовой гистограммы, классического метода отображения спреда и расположение одной непрерывной переменной.полный код доступен на GitHubи первый ноутбук Jupyter можно найтиВот, Этот пост посвящен визуальным элементам, поэтому я призываю всех желающих ознакомиться с кодом, если они хотят увидеть неопрятные, но необходимые этапы очистки и форматирования данных!

Основы Боке

Основная концепция Bokeh заключается в том, что графики строятся по одному слою за раз. Мы начинаем с создания фигуры, а затем добавляем элементы, называемыеглифы, к рисунку. (Для тех, кто использовал ggplot, идея глифов по сути та же, что и у геом, которые добавляются к графу по одному «слою» за раз.) Глифы могут принимать множество форм в зависимости от желаемого использования: круги, линии , патчи, бары, дуги и так далее. Давайте проиллюстрируем идею глифов, сделав базовую диаграмму с квадратами и кругами. Во-первых, мы строим сюжет, используяfigureметод, а затем мы добавляем наши глифы к графику, вызывая соответствующий метод и передавая данные. Наконец, мы показываем наш график (я использую Блокнот Jupyter, который позволяет вам видеть графики прямо под кодом, если вы используетеoutput_notebookвызов).

Это создает немного скучный сюжет ниже:

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

Давайте теперь приступим к отображению данных о задержке рейсов Прежде чем мы сможем перейти прямо в график, мы должны загрузить данные и провести их краткую проверку (смелыйэто вывод кода):

# Read the data from a csv into a dataframe
flights = pd.read_csv('../data/flights.csv', index_col=0)# Summary stats for the column of interest
flights['arr_delay'].describe()count 327346.000000
mean 6.895377
std 44.633292
min -86.000000
25% -17.000000
50% -5.000000
75% 14.000000
max 1272.000000

Сводная статистика дает нам информацию для принятия решений о заговоре: у нас 327 346 рейсов, с минимальной задержкой -86 минут (то есть полет был ранний на 86 минут) и максимальной задержкой 1272 минуты, поразительные 21 час! Квантиль 75% находится всего в 14 минутах, поэтому мы можем предположить, что числа свыше 1000 минут, вероятно, являются выбросами (что не означает, что они незаконны, просто экстремальны). Я сосредоточусь на задержках от -60 минут до +120 минут для нашей гистограммы.

гистограммаявляется распространенным выбором для начальной визуализации одной переменной, поскольку она показывает распределение данных. Положение x - это значение переменной, сгруппированной в интервалы, называемые ячейками, а высота каждого столбца представляет количество (число) точек данных в каждом интервале. В нашем случае позиция x будет представлять задержку прибытия в минутах, а высота - количество полетов в соответствующем бункере. Bokeh не имеет встроенного глифа гистограммы, но мы можем сделать свой собственный, используяquadглиф, который позволяет нам указывать нижний, верхний, левый и правый края каждого столбца.

Для создания данных для баров мы будем использоватьNumPyhistogramфункциякоторый вычисляет количество точек данных в каждом указанном бине. Мы будем использовать корзины продолжительностью 5 минут, что означает, что функция будет подсчитывать количество рейсов в каждом пятиминутном интервале задержки. После генерации данных мы помещаем их вpandas dataframe для хранения всех данных в одном объекте.Код здесь не имеет решающего значения для понимания Bokeh, но тем не менее он полезен из-за распространенности numpy и pandas в науке о данных!

"""Bins will be five minutes in width, so the number of bins 
is (length of interval / 5). Limit delays to [-60, +120] minutes using the range."""arr_hist, edges = np.histogram(flights['arr_delay'],
bins = int(180/5),
range = [-60, 120])# Put the information in a dataframe
delays = pd.DataFrame({'arr_delay': arr_hist,
'left': edges[:-1],
'right': edges[1:]})

Наши данные выглядят так:

flightsстолбец - это количество рейсов в каждом интервале задержки отleftвright, Отсюда мы можем создать новую фигуру Боке и добавить четырехугольник glpyh, указав соответствующие параметры:

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

Существуют более простые способы создания базовой гистограммы в Python, и тот же результат можно получить, используя несколько строк:matplotlib, Однако отдача от разработки, необходимой для построения графика Боке, заключается в инструментах и ​​способах взаимодействия с данными, которые мы теперь можем легко добавить в график.

Добавление интерактивности

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

Основная всплывающая подсказка

Чтобы добавить всплывающие подсказки, нам нужно изменить наш источник данных сColumnDataSource, ключевая концепция в Bokeh.Это объект, специально используемый для построения графиков, который включает в себя данные, а также несколько методов и атрибутов. ColumnDataSource позволяет нам добавлять аннотации и интерактивность к нашим графам, и может быть создан из кадра данных pandas. Фактические данные хранятся в словаре, доступном через атрибут данных ColumnDataSource. Здесь мы создаем источник из нашего фрейма данных и смотрим на ключи словаря данных, которые соответствуют столбцам нашего фрейма данных.

# Import the ColumnDataSource class
from bokeh.models import ColumnDataSource# Convert dataframe to column data source
src = ColumnDataSource(delays)
src.data.keys()dict_keys(['flights', 'left', 'right', 'index'])

Когда мы добавляем глифы с использованием ColumnDataSource, мы передаем ColumnDataSource какsourceпараметр и ссылаться на имена столбцов, используя строки:

# Add a quad glyph with source this time
p.quad(source = src, bottom=0, top='flights',
left='left', right='right',
fill_color='red', line_color='black')

Обратите внимание, как код ссылается на конкретные столбцы данных, такие как «полеты», «влево» и «вправо», одной строкой вместоdf['column']формат, как и раньше.

HoverTool в Боке

Поначалу синтаксис HoverTool может показаться немного запутанным, но с практикой его довольно легко создать. Мы передаем нашиHoverToolэкземпляр спискаtooltipsкакКортежи Pythonгде первый элемент является меткой для данных, а второй ссылается на конкретные данные, которые мы хотим выделить. Мы можем ссылаться либо на атрибуты графика, такие как положение x или y, используя «$», либо на определенные поля в нашем источнике, используя «@». Это, вероятно, звучит немного запутанно, так что вот пример HoverTool, где мы делаем оба:

# Hover tool referring to our own data field using @ and
# a position on the graph using $
h = HoverTool(tooltips = [('Delay Interval Left ', '@left'),
('(x,y)', '($x, $y)')])

Здесь мы ссылаемся наleft поле данных в ColumnDataSource (которое соответствует «левому» столбцу исходного фрейма данных) с помощью «@», а мы указываем (x, y) позицию курсора с помощью «$» Результат ниже:

Всплывающая подсказка, показывающая различные ссылки на данные

Положение (x, y) соответствует положению мыши на графике и не очень полезно для нашей гистограммы, потому что мы находим число рейсов в данном баре, которое соответствует вершине бара. Чтобы исправить это, мы изменим наш экземпляр всплывающей подсказки, чтобы он ссылался на правильный столбец. Форматирование данных, отображаемых во всплывающей подсказке, может быть неприятным, поэтому я обычно создаю другой столбец в моем фрейме данных с правильным форматированием. Например, если я хочу, чтобы моя подсказка показывала весь интервал для данного бара, я создаю отформатированный столбец в моем фрейме данных:

# Add a column showing the extent of each interval
delays['f_interval'] = ['%d to %d minutes' % (left, right) for left, right in zip(delays['left'], delays['right'])]

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

В стиле Bokeh мы включаем элементы в нашу диаграмму, добавляя их к исходному рисунку. Обратите внимание наp.quadвызов глифа, есть несколько дополнительных параметров,hover_fill_alphaа такжеhover_fill_color, который меняет внешний вид глифа, когда мы наведем курсор на панель. Я также добавил в стиль с помощьюstyle функция (см. блокнот для кода). Эстетику набирать утомительно, поэтому я обычно пишу функцию, которую можно применить к любому сюжету. Когда я использую стилизацию, я делаю вещи простыми и фокусируюсь на удобочитаемости этикеток Основная цель сюжета - показать данные и добавить только ненужные элементы.умаляет полезность фигуры! Окончательный сюжет представлен ниже:

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

# Import savings function
from bokeh.io import output_file# Specify the output file and save
output_file('hist.html')
show(p)

Дальнейшие шаги и выводы

Мне потребовалось несколько сюжетов, чтобы получить базовый рабочий процесс Bokeh, так что не беспокойтесь, если кажется, что есть чему поучиться. Мы получим гораздо больше практики в течение этой серии! Хотя Боке может показаться, что это большая работа, преимущества приходят, когда мы хотим расширить наши визуальные эффекты за пределы простых статических фигур. Получив базовую диаграмму, мы можем повысить эффективность визуального элемента, добавив больше элементов. Например, если мы хотим посмотреть на задержку прилета авиакомпании, мы можем создать интерактивный график, позволяющий пользователям выбирать и сравнивать авиакомпании. Мы оставим активные взаимодействия, которые изменяют отображаемые данные, до следующего поста, но мы посмотрим, что мы можем сделать:

Активное взаимодействие требует немного более сложных сценариев, но это дает нам шанс поработать над нашим Python! (Если кто-то хочет взглянуть на код для этого графика до следующей статьи,вот.)

В этой серии статей я хочу подчеркнуть, что Bokeh или любой другой библиотечный инструмент никогда не будет универсальным инструментом для всех ваших потребностей в графике. Боке отлично подходит для того, чтобы позволить пользователям исследовать графики, но для других целей, таких как простойисследовательский анализ данных,легкая библиотека, такая какmatplotlibскорее всего будет эффективнее. Эта серия предназначена для того, чтобы показать возможности Bokeh, чтобы дать вам еще один инструмент для построения графиков, на который вы можете положиться при необходимости. Чем больше библиотек вы знаете, тем лучше вы будете использовать правильный инструмент визуализации для этой задачи.

Как всегда, я приветствую конструктивную критику и отзывы. Со мной можно связаться в твиттере@koehrsen_will,

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map