Одна панель, чтобы объединить все визуализации. Panel for Python

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Качественная визуализация данных не менее важна для анализа данных, чем методы математической обработки. На сегодняшний день существуют десятки (если не сотни) библиотек для визуализации наборов данных на Python, но иногда в них встречаются уникальные возможности и хотелось бы иметь возможность объединить различные инструменты в единой панели. В статье мы рассмотрим основы библиотеки panel для реализации реактивной модели интерактивных визуализаций и попробуем объединить визуализации из разных библиотек в одном dashboard.

Среди библиотек, которые часто используются для визуализации, можно обозначить следующие:

  • Altair - декларативное описание визуализации, поддерживает большое количество стандартных диаграмм (bar chart, line chart, scatter plot, …), а также несколько видов интерактивных диаграмм, диаграммы Гантта, …

  • Bokeh - интерактивные диаграммы на JavaScript. Кроме стандартных диаграмм и гистограмм поддерживаются 3D-поверхности, визуализация графов. Предоставляет возможность приближения и перемещения по линии времени и шкале значений.

  • HoloViews - конструктор многослойных визуализаций, поддерживает взаимодействие с Bokeh и Matplotlib, предоставляет возможность приближения и перемещения по линии времени и шкале значений.

  • Matplotlib - универсальный построитель графиков и диаграмм, часто используется для подготовки изображений для научных публикаций. Часто используется совместно с Pandas / Seaborn. Для 3d графики доступна библиотека mplot3d.

  • Plotly - библиотека для интерактивной 3d-визуализации, основана на библиотеке plotly.js и представляет удобный интерфейс для описания параметров визуализации

  • Folium - визуализация данных с геопривязкой (была подробно разобрана в этой статье)

Panel предлагает подход к реактивному описанию интерактивной визуализации данных с возможностью интеграции результатов построения различных библиотек в общий dashboard и созданием вспомогательных панелей для управления связанными объектами.

Начнем с установки и подготовим простой проект:

pip install panel

Для ускорения отладки можно запустить проект через panel:

panel serve script.py --show --autoreload

Также можно использовать IPython или Jupyter notebook.

Создадим функцию для исследования изменения температуры и сделаем ее параметризируемой:

import pandas as pd
import numpy as np

from matplotlib.figure import Figure
data = pd.read_csv('https://raw.githubusercontent.com/holoviz/panel/master/examples/assets/occupancy.csv')
data['date'] = data.date.astype('datetime64[ns]')
data = data.set_index('date')

def mpl_plot(avg, highlight):
    fig = Figure()
    ax = fig.add_subplot()
    avg.plot(ax=ax)
    if len(highlight):
        highlight.plot(style='o', ax=ax)
    return fig

def find_outliers(variable='Temperature', window=30, sigma=10, view_fn=mpl_plot):
    avg = data[variable].rolling(window=window).mean()
    residual = data[variable] - avg
    std = residual.rolling(window=window).std()
    outliers = (np.abs(residual) > std * sigma)
    return view_fn(avg, avg[outliers])

При запуске мы увидим график для соответствующих значений, но что если мы хотели бы исследовать поведение графика при изменении параметров. Передадим функцию find_outliers в виджет interact от panel.

import panel as pn
pn.extension()                    # Использовать BokehJS, можно подключить расширения latex и др.
pn.interact(find_outliers)
Интерактивный график
Интерактивный график

Давайте разберемся как работает interact, это поможет в понимании работы panel в целом. Основным элементом panel является виджет, который может входить в состав группы виджетов (колонки, столбца и др.). Виджет принимает функцию, которая будет создавать график (с использованием одного или нескольких параметров) и обеспечивает встраивание результата функции в финальную страницу и обновление результата при изменении значения аргументов. Дополнительно в pn.interact можно передать определение диапазона значений через kwargs, например, можно ограничить изменение значения sigma и добавить выпадающий список для выбора названия параметра, который будет изображен на графике.

pn.interact(find_outliers, sigma=(10,20), variable=list(data.columns)) 

Альтернативно можно создать параметризированную панель как класс-расширение от param.Parametrized:

class OccupancyAnalysis(param.Parameterized):
    variable  = param.Selector(objects=sorted(list(data.columns)))
    window = param.Integer(default=10, bounds=(1, 40))
    sigma = param.Number(default=10, bounds=(10, 20))

    def view(self):
        return find_outliers(self.variable, self.window, self.sigma)

Класс представляет два свойства для использования в панелях:

  • param - виджет с настройкам значений аргументов

  • view - график (создается функцией view в определении класса)

В случае использования holoviews есть возможность связывания значений, отображаемых на экране с текущими выбранными значениями (например, можно получить значение по линии времени hv.streams.pointerX и определить значение текста зависимым от выбранного X):

class OccupancyAnalysis(param.Parameterized):
    variable  = param.Selector(objects=sorted(list(data.columns)))
    window = param.Integer(default=10, bounds=(1, 40))
    sigma = param.Number(default=10, bounds=(10, 20))

    def view(self):
        return find_outliers(self.variable, self.window, self.sigma)

Виджетом может быть как график (полученный из любой поддерживаемой библиотеки), так и текст (строка, pn.Str или pn.HTML, а также pn.Markdown), таблица (pandas Series), элементы управления (из pn.widgets) и виджеты компоновки (pn.Row - ряд из виджетов, pn.Column - колонка виджетов, pn.Tabs - переключаемые вкладки, pn.GridSpec для определения сеток). Виджеты могут модифицироваться программно (например, в колонку можно добавлять новые виджеты). GridSpec модифицируется как двумерный массив, при этом для объединения ячеек сетки можно использовать слайсы, например 0..2). Для представления любого объекта в виде виджета его можно передать в вызов pn.Pane().

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

  • pn.widgets.IntSlider - выбор целочисленного значения в диапазоне start - end с шагом step

  • pn.widgets.FloatSlider - выбор значения с плавающей точкой

  • pn.widgets.Checkbox / pn.widgets.Toggle - флажок для выбора логического значения

  • pn.widgets.DataPicker - выбор даты

  • pn.widgets.DataSlider - выбор даты в диапазоне

  • pn.widgets.TextInput - ввод текста (также pn.widgets.PasswordInput для скрытия вводимого текста)

  • pn.widgets.Select - выбор из выпадающего списка

  • pn.widgets.RadioButtonGroup / pn.widgets.RadioBoxGroup - выбор одного из вариантов в группе

  • pn.widgets.ColorPicker - выбор цвета

  • pn.widgets.Button - произвольная кнопка с привязанным действием

  • pn.widgets.DataFrame - просмотр и редактирование DataFrame

  • pn.widgets.Progress - индикатор прогресса

При определении параметризированного графика можно использовать следующие типы:

  • param.Integer - целое число (можно определить диапазон изменения значений bounds)

  • param.Number - число с плавающей точкой

  • param.Range - диапазон значений (задается интервалом)

  • param.String - строковое значение

  • param.Date - дата (может быть задан диапазон возможных значений в bounds)

  • param.DataFrame - присоединенный pandas DataFrame

  • param.Color - цвет

Для наблюдения за параметрами виджетов можно подписаться на значение методом widget.param.watch, которому передается функция-наблюдатель (первым аргументом) и строка с названием наблюдаемого параметра.

Большое количество примеров по использованию библиотеки можно найти на официальном сайте.


В преддверии старта курса "Python для аналитики" приглашаю всех на бесплатный урок в рамках которого будут рассмотрены возможности применения в Python практик использования RFM сегментации клиентов.

  • Зарегистрироваться на бесплатный урок

Источник: https://habr.com/ru/company/otus/blog/682500/


Интересные статьи

Интересные статьи

Привет, Хаброжители! Если программирование напоминает волшебство, то веб-скрапинг — это очень сильное колдунство. Написав простую автоматизированную программу, можно отправлять запросы н...
Привет! Мы – часть команды разработки «Рамблер/Медиа» (портал «Рамблер»). На протяжении трех лет мы поддерживаем и развиваем несколько больших python-приложений. Чуть больше года назад ...
Внедряем оплату BTC куда угодно (Python)- генерация кошелька на основе seed фразы- проверка баланса и транзакций- отправка BTC на другие кошельки- создаем телеграм бота д...
Осенью прошлого года в московском офисе Яндекса прошла первая Школа бэкенд-разработки. Мы сняли занятия на видео и сегодня рады поделиться на Хабре полным видеокурсом Школы. Он позволит вам научи...
С версии 12.0 в Bitrix Framework доступно создание резервных копий в автоматическом режиме. Задание параметров автоматического резервного копирования производится в Административной части на странице ...