Визуализация данных с боке в 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, и, если мы разумно относимся к нашей структуре, мы можем повторно использовать фреймворк для дополнительных проектов.

Ключевые моменты, которые следует извлечь из этого проекта, применимы ко многим проектам в области науки о данных в целом:

  1. Наличие надлежащей структуры / структуры до того, как вы приступите к задаче по анализу данных - боке или чему-то еще - имеет решающее значение. Таким образом, вы не потеряетесь в лесу кода, пытаясь найти ошибки. Кроме того, как только мы разработаем работающую структуру, ее можно будет повторно использовать с минимальными усилиями, что приведет к выплате дивидендов в будущем.
  2. Очень важно найти цикл отладки, позволяющий быстро перебирать идеи. Цикл записи кода - увидеть результаты - исправить ошибки, разрешенный Jupyter Notebook, обеспечивает продуктивный цикл разработки (по крайней мере, для небольших проектов).
  3. Интерактивные приложения в Bokeh улучшат ваш проект и будут способствовать вовлечению пользователей. Информационная панель может быть отдельным исследовательским проектом или отображать всю сложную аналитическую работу, которую вы уже проделали!
  4. Вы никогда не знаете, где вы найдете следующий инструмент, который будете использовать в своей работе или побочных проектах. Держите глаза открытыми и не бойтесь экспериментировать с новым программным обеспечением и технологиями!

Это все для этого поста и для этой серии, хотя я планирую выпустить дополнительные автономные руководства по боке в будущем. С такими библиотеками, как Bokeh и plot.ly, становится проще создавать интерактивные фигуры, а возможность убедительно представить свои результаты в области науки о данных имеет решающее значение. Ознакомьтесь со всей моей работой в этом репозитории Bokeh GitHub и не стесняйтесь разветвляться и начинать свои собственные проекты. А пока мне не терпится увидеть, что могут создать все остальные!

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