Визуализация данных с боке в Python, часть III: создание полной панели инструментов
Создание приложения для интерактивной визуализации в боке
Иногда я изучаю технику науки о данных для решения конкретной проблемы. В других случаях, например, с Bokeh, я пробую новый инструмент, потому что вижу несколько крутых проектов в Twitter и думаю: «Выглядит неплохо. Не знаю, когда буду использовать, но может пригодиться. Почти каждый раз, когда я это говорю, я нахожу применение этому инструменту. Наука о данных требует знания множества различных навыков, и вы никогда не знаете, откуда взойдет следующая идея, которую вы будете использовать!
В случае с Bokeh, через несколько недель после его опробования, я нашел идеальный вариант использования в своей работе в качестве исследователя в области науки о данных. Мой исследовательский проект предполагает повышение энергоэффективности коммерческих зданий с помощью науки о данных, и для недавней конференции нам нужен был способ продемонстрировать результаты многих применяемых нами методов. Обычное предложение PowerPoint выполняет свою работу, но на самом деле ничем не выделяется. К тому времени, когда большинство людей на конференции видят свою третью презентацию, они уже перестают обращать внимание. Хотя я еще не очень хорошо знал Боке, я вызвался попробовать создать интерактивное приложение с библиотекой, думая, что это позволит мне расширить свой набор навыков и создать увлекательный способ продемонстрировать наш проект. Скептически настроенная, наша команда подготовила резервную копию презентации, но после того, как я показал им несколько прототипов, они полностью поддержали ее. Итоговая интерактивная панель управления была особенным на конференции и будет принята нашей командой для использования в будущем:
Хотя не каждая идея, которую вы видите в Твиттере, вероятно, будет полезной для вашей карьеры, я думаю, можно с уверенностью сказать, что знание дополнительных методов науки о данных вряд ли повредит. Исходя из этого, я начал эту серию, чтобы поделиться возможностями Bokeh, мощной библиотеки построения графиков на Python, которая позволяет создавать интерактивные графики и информационные панели. Хотя я не могу поделиться панелью мониторинга для своих исследований, я могу показать основы построения визуализаций в Bokeh с использованием общедоступного набора данных. Этот третий пост является продолжением моей серии статей о боке: Часть I посвящена построению простого графика и Часть II показывает, как добавить взаимодействия к графику с эффектом боке. В этом посте мы увидим, как настроить полное приложение Bokeh и запустить локальный сервер Bokeh, доступный в вашем браузере!
В этой статье основное внимание будет уделено структуре приложения Bokeh, а не деталям сюжета, но полный код для всего можно найти на GitHub. Мы продолжим использовать набор данных NYCFlights13, реальный сбор информации о рейсах, вылетающих из 3 аэропортов Нью-Йорка в 2013 году. В наборе данных более 300 000 рейсов, и для нашей информационной панели мы сосредоточимся в первую очередь на изучении информации о задержке прибытия. .
Чтобы запустить приложение полностью, убедитесь, что у вас установлен Bokeh (с помощью pip install bokeh
), загрузите bokeh_app.zip
folder с GitHub, распакуйте его, откройте командное окно в каталоге и введите bokeh serve --show bokeh_app
. Это настроит локальный сервер Bokeh и откроет приложение в вашем браузере (вы также можете сделать графики Bokeh общедоступными в Интернете, но пока мы будем придерживаться локального хостинга).
Конечный продукт
Прежде чем вдаваться в подробности, давайте взглянем на конечный продукт, к которому мы стремимся, чтобы увидеть, как части сочетаются друг с другом. Ниже приведен короткий видеоролик, показывающий, как мы можем взаимодействовать со всей панелью управления:
Здесь я использую приложение Bokeh в браузере (в полноэкранном режиме Chrome), который работает на локальном сервере. Вверху мы видим несколько вкладок, каждая из которых содержит отдельный раздел приложения. Идея панели инструментов состоит в том, что, хотя каждая вкладка может стоять сама по себе, мы можем объединить многие из них вместе, чтобы обеспечить полное исследование данных. В видео показан диапазон диаграмм, которые мы можем создать с помощью боке, от гистограмм и графиков плотности до таблиц данных, которые мы можем сортировать по столбцам, и до полностью интерактивных карт. Помимо набора фигур, которые мы можем создать в боке, еще одним преимуществом использования этой библиотеки является взаимодействие. Каждая вкладка имеет интерактивный элемент, который позволяет пользователям взаимодействовать с данными и делать свои собственные открытия. По опыту, при изучении набора данных люди любят приходить к пониманию самостоятельно, что мы можем позволить, позволяя им выбирать и фильтровать данные с помощью различных элементов управления.
Теперь, когда у нас есть представление о панели инструментов, к которой мы стремимся, давайте посмотрим, как создать приложение Bokeh. Я настоятельно рекомендую скачать код себе, чтобы следить за ним!
Структура приложения с эффектом боке
Прежде чем писать какой-либо код, важно создать основу для нашего приложения. В любом проекте легко увлечься кодированием и вскоре потеряться в беспорядке незавершенных скриптов и ненужных файлов данных, поэтому мы хотим заранее создать структуру для всех наших кодов и данных. Эта организация поможет нам отслеживать все элементы в нашем приложении и поможет в отладке, когда что-то неизбежно пойдет не так. Кроме того, мы можем повторно использовать эту структуру для будущих проектов, чтобы наши первоначальные вложения на этапе планирования окупились в будущем.
Чтобы настроить приложение Bokeh, я создаю один родительский каталог для хранения всего, что называется bokeh_app
. В этом каталоге у нас будет подкаталог для наших данных (называемый data
), подкаталог для наших скриптов (scripts
) и main.py
скрипт, чтобы собрать все вместе. Как правило, для управления всем кодом я решил, что лучше всего хранить код для каждой вкладки в отдельном скрипте Python и вызывать их все из одного основного скрипта. Ниже приведена файловая структура, которую я использую для приложения Bokeh, адаптированная из официальной документации.
bokeh_app | +--- data | +--- info.csv | +--- info2.csv | +--- scripts | +--- plot.py | +--- plot2.py | +--- main.py
Для приложения «Полеты» структура соответствует общему плану:
Есть три основных части: data
, scripts
и main.py,
в одном каталоге parentbokeh_app
. Когда приходит время запустить сервер, мы приказываем Bokeh обслуживать каталог bokeh_app
, и он автоматически ищет и запускает main.py
script. Имея общую структуру, давайте взглянем на main.py
, который я называю исполнителем приложения Bokeh (не технический термин)!
main.py
Сценарий main.py
похож на исполнительную программу приложения Bokeh. Он загружает данные, передает их другим сценариям, возвращает полученные графики и организует их на одном дисплее. Это будет единственный сценарий, который я покажу полностью из-за того, насколько он важен для приложения:
Мы начинаем с необходимого импорта, включая функции для создания вкладок, каждая из которых хранится в отдельном скрипте в каталоге scripts
. Если вы посмотрите на файловую структуру, обратите внимание, что в каталоге scripts
есть __init__.py
файл. Это полностью пустой файл, который необходимо поместить в каталог, чтобы мы могли импортировать соответствующие функции, используя относительные операторы (например, from scripts.histogram import histogram_tab
). Я не совсем понимаю, зачем это нужно, но это работает (вот Ответ на переполнение стека, который я использовал, чтобы понять это).
После импорта библиотеки и скрипта считываем необходимые данные с помощью Python __file__
attribute. В этом случае мы используем два фрейма данных pandas (flights
и map_data
), а также данные штатов США, которые включены в Bokeh. После считывания данных сценарий переходит к делегированию: он передает соответствующие данные каждой функции, каждая функция рисует и возвращает вкладку, а основной сценарий организует все эти вкладки в едином макете под названием tabs
. В качестве примера того, что делает каждая из этих отдельных функций вкладок, давайте рассмотрим функцию, которая рисует map_tab
.
Эта функция принимает map_data
(форматированную версию данных о рейсах) и данные штата США и создает карту маршрутов полетов для выбранных авиакомпаний:
Мы рассмотрели интерактивные сюжеты во второй части этой серии, и этот сюжет - всего лишь реализация этой идеи. Общая структура функции:
def map_tab(map_data, states): ... def make_dataset(airline_list): ... return new_src def make_plot(src): ... return p def update(attr, old, new): ... new_src = make_dataset(airline_list) src.data.update(new_src.data) controls = ... tab = Panel(child = layout, title = 'Flight Map') return tab
Мы видим знакомые функции make_dataset
, make_plot
и update
, используемые для рисования графика с помощью интерактивных элементов управления. После того, как мы настроили сюжет, последняя строка возвращает весь сюжет основному сценарию. Каждый отдельный сценарий (их 5 на 5 вкладок) следует одному и тому же шаблону.
Возвращаясь к основному скрипту, последний штрих - собрать вкладки и добавить их в единый документ.
# Put all the tabs into one application tabs = Tabs(tabs = [tab1, tab2, tab3, tab4, tab5]) # Put the tabs in the current document for display curdoc().add_root(tabs)
Вкладки появляются в верхней части приложения, и, как и вкладки в любом браузере, мы можем легко переключаться между ними для просмотра данных.
Запуск сервера Bokeh
После всей настройки и кодирования, необходимых для построения графиков, запустить локальный сервер Bokeh довольно просто. Мы открываем интерфейс командной строки (я предпочитаю Git Bash, но подойдет любой), переходим в каталог, содержащий bokeh_app
, и запускаем bokeh serve --show bokeh_app
. Если все написано правильно, приложение автоматически откроется в нашем браузере по адресу http://localhost:5006/bokeh_app
. Затем мы можем получить доступ к приложению и изучить нашу панель управления!
Отладка в Jupyter Notebook
Если что-то пойдет не так (как это, несомненно, будет в первые несколько раз, когда мы будем писать информационную панель), может быть неприятно останавливать сервер, вносить изменения в файлы и перезапускать сервер, чтобы увидеть, оказали ли наши изменения желаемый эффект. Чтобы быстро перебирать и решать проблемы, я обычно разрабатываю графики в Jupyter Notebook. Jupyter Notebook - отличная среда для разработки Bokeh, потому что вы можете создавать и тестировать полностью интерактивные графики прямо из записной книжки. Синтаксис немного отличается, но как только у вас есть законченный сюжет, код нужно просто немного изменить, а затем его можно скопировать и вставить в автономный .py
скрипт. Чтобы увидеть это в действии, взгляните на Jupyter Notebook, который я использовал для разработки приложения.
Выводы
Полностью интерактивная панель управления Bokeh выделяет любой проект в области науки о данных. Часто я вижу, что мои коллеги выполняют много отличной статистической работы, но затем не могут четко сообщить результаты, а это означает, что вся эта работа не получает должного признания. На собственном опыте я также убедился, насколько эффективными могут быть приложения Bokeh для передачи результатов. Хотя создание полной панели инструментов - это большая работа (это более 600 строк кода!), Результаты того стоят. Более того, когда у нас есть приложение, мы можем быстро поделиться им с помощью GitHub, и, если мы разумно относимся к нашей структуре, мы можем повторно использовать фреймворк для дополнительных проектов.
Ключевые моменты, которые следует извлечь из этого проекта, применимы ко многим проектам в области науки о данных в целом:
- Наличие надлежащей структуры / структуры до того, как вы приступите к задаче по анализу данных - боке или чему-то еще - имеет решающее значение. Таким образом, вы не потеряетесь в лесу кода, пытаясь найти ошибки. Кроме того, как только мы разработаем работающую структуру, ее можно будет повторно использовать с минимальными усилиями, что приведет к выплате дивидендов в будущем.
- Очень важно найти цикл отладки, позволяющий быстро перебирать идеи. Цикл записи кода - увидеть результаты - исправить ошибки, разрешенный Jupyter Notebook, обеспечивает продуктивный цикл разработки (по крайней мере, для небольших проектов).
- Интерактивные приложения в Bokeh улучшат ваш проект и будут способствовать вовлечению пользователей. Информационная панель может быть отдельным исследовательским проектом или отображать всю сложную аналитическую работу, которую вы уже проделали!
- Вы никогда не знаете, где вы найдете следующий инструмент, который будете использовать в своей работе или побочных проектах. Держите глаза открытыми и не бойтесь экспериментировать с новым программным обеспечением и технологиями!
Это все для этого поста и для этой серии, хотя я планирую выпустить дополнительные автономные руководства по боке в будущем. С такими библиотеками, как Bokeh и plot.ly, становится проще создавать интерактивные фигуры, а возможность убедительно представить свои результаты в области науки о данных имеет решающее значение. Ознакомьтесь со всей моей работой в этом репозитории Bokeh GitHub и не стесняйтесь разветвляться и начинать свои собственные проекты. А пока мне не терпится увидеть, что могут создать все остальные!
Как всегда, я приветствую отзывы и конструктивную критику. Со мной можно связаться в Twitter @koehrsen_will.