Изучаем Анализ данных с помощью библиотеки Bokeh в Python

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

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

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

В этом контексте библиотека Bokeh для Python выделяется как одно из наиболее мощных и гибких средств для визуализации данных. Bokeh обеспечивает интерактивные и красочные графики, которые можно легко встраивать в веб-приложения и даже динамически изменять в режиме реального времени.

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

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

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

Установим Bokeh:

$ pip install bokeh

Основы создания графиков на Bokeh

Создание линейных графиков с использованием Bokeh

Линейные графики – это одни из самых распространенных и полезных инструментов визуализации данных. Они позволяют отобразить зависимость между двумя непрерывными переменными, что позволяет нам видеть тренды, паттерны и изменения в данных.

Давайте начнем с создания простого линейного графика с использованием Bokeh. Сначала нам необходимо импортировать необходимые модули:

from bokeh.plotting import figure, output_file, show

Здесь мы импортируем figure для создания графической фигуры, output_file для указания имени файла для сохранения графика и show для отображения графика в браузере. Далее, мы можем создать фигуру и добавить на нее данные:

# Создание графической фигуры
p = figure(title='Пример линейного графика', x_axis_label='X-ось', y_axis_label='Y-ось')

# Данные для графика
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]

# Добавление линии на график
p.line(x, y, legend_label='Линия', line_width=2)

# Отображение графика
output_file('линейный_график.html')
show(p)
Результат
Результат

Здесь мы создаем фигуру p с заголовком и метками для осей. Далее, мы создаем данные x и y, которые будут отображены на графике. С помощью метода line мы добавляем линию на график, задавая ей ширину линии и метку для легенды. Наконец, мы используем output_file для сохранения графика в HTML-файл и show для его отображения.

Настройка осей, меток и заголовков графика

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

# Настройка осей и меток
p.xaxis.axis_label = 'Время'
p.yaxis.axis_label = 'Значение'

# Настройка заголовка
p.title.text = 'Пример линейного графика с настроенными осями и заголовком'
p.title.text_font_size = '16pt'

Здесь мы задаем метки для осей x и y с помощью axis_label, а также настраиваем заголовок с помощью title.text и title.text_font_size.

Использование различных стилей линий и маркеров

Чтобы сделать ваши графики более наглядными и разнообразными, вы можете использовать различные стили линий и маркеров. Bokeh предоставляет множество опций для настройки внешнего вида ваших графиков.

# Создание графической фигуры
p = figure(title='Пример графика с разными стилями линий и маркеров')

# Данные для графика
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [8, 5, 3, 6, 7]

# Добавление линий с разными стилями
p.line(x, y1, legend_label='Линия 1', line_color='blue', line_width=2)
p.line(x, y2, legend_label='Линия 2', line_color='red', line_dash='dashed', line_width=2)

# Добавление маркеров
p.circle(x, y1, legend_label='Маркеры 1', fill_color='white', size=8)
p.square(x, y2, legend_label='Маркеры 2', fill_color='black', size=8)

# Отображение графика
output_file('стили_графика.html')
show(p)
Результат
Результат

Здесь мы создаем графическую фигуру и добавляем две линии с разными стилями. Первая линия имеет синий цвет и обычную сплошную линию, вторая линия – красная с пунктирной линией. Мы также добавляем маркеры к каждой линии, указывая цвет заполнения и размер маркеров.

Визуализация с использованием различных графических элементов

Создание столбчатых диаграмм для анализа категориальных данных

Столбчатые диаграммы – это прекрасный инструмент для визуализации категориальных данных, таких как категории продуктов, регионы, временные периоды и многое другое. Они позволяют наглядно сравнивать значения разных категорий, что делает их незаменимыми для анализа и сравнения данных.

Чтобы создать столбчатую диаграмму с использованием Bokeh, мы можем использовать функцию vbar. Давайте рассмотрим пример:

from bokeh.plotting import figure, output_file, show

# Создание графической фигуры
p = figure(x_range=['A', 'B', 'C', 'D'], title='Пример столбчатой диаграммы', x_axis_label='Категории', y_axis_label='Значения')

# Данные для диаграммы
categories = ['A', 'B', 'C', 'D']
values = [10, 25, 15, 30]

# Добавление столбцов
p.vbar(x=categories, top=values, width=0.5, color='blue')

# Отображение графика
output_file('столбчатая_диаграмма.html')
show(p)
Результат
Результат

Здесь мы создаем графическую фигуру p и используем функцию vbar для добавления столбцов на диаграмму. Мы указываем значения для каждой категории с помощью аргумента top, а также задаем ширину столбцов и цвет.

Использование круговых диаграмм для отображения долей и процентных соотношений

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

Для создания круговой диаграммы в Bokeh, нам нужно использовать метод wedge. Рассмотрим пример создания круговой диаграммы:

from math import pi
from bokeh.plotting import figure, output_file, show
from bokeh.transform import cumsum
import pandas as pd

# Данные
data = pd.Series([0.25, 0.15, 0.3, 0.2], index=['A', 'B', 'C', 'D'])

# Преобразование данных для круговой диаграммы
data = data.reset_index(name='value').rename(columns={'index': 'category'})
data['angle'] = data['value']/data['value'].sum() * 2*pi
data['color'] = ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3']

# Создание графической фигуры
p = figure(plot_height=350, title='Круговая диаграмма', toolbar_location=None,
           tools="hover", tooltips="@category: @value", x_range=(-0.5, 1.0))

# Добавление круговой диаграммы
p.wedge(x=0, y=1, radius=0.4,
        start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
        line_color="white", fill_color='color', legend_field='category', source=data)

# Отображение графика
output_file('круговая_диаграмма.html')
show(p)

В данном примере мы используем библиотеку pandas для удобной работы с данными. Мы задаем доли для каждой категории и преобразуем данные в формат, понятный для круговой диаграммы. Затем мы создаем графическую фигуру, используя метод wedge для добавления круговой диаграммы.

Создание гистограмм для анализа распределения данных

Гистограммы – это графический способ представления распределения данных по различным интервалам. Они помогают нам понять, как данные распределены по значению и выявить наличие аномалий или особенностей в данных.

Для создания гистограммы в Bokeh, мы используем метод quad, который позволяет нам рисовать прямоугольники, представляющие интервалы данных. Рассмотрим пример создания гистограммы:

from math import pi
from bokeh.plotting import figure, output_file, show
from bokeh.transform import cumsum
import pandas as pd

# Данные
data = pd.Series([0.25, 0.15, 0.3, 0.2], index=['A', 'B', 'C', 'D'])

# Преобразование данных для круговой диаграммы
data = data.reset_index(name='value').rename(columns={'index': 'category'})
data['angle'] = data['value']/data['value'].sum() * 2*pi
data['color'] = ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3']

# Создание графической фигуры
p = figure(height=350, title='Круговая диаграмма', toolbar_location=None,
           tools="hover", tooltips="@category: @value", x_range=(-1, 1))

# Добавление круговой диаграммы
p.annular_wedge(x=0, y=1, inner_radius=0.3, outer_radius=0.7,
                start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
                line_color="white", fill_color='color', legend_field='category', source=data)

# Отображение графика
output_file('круговая_диаграмма.html')
show(p)
Результат
Результат

В этом примере мы генерируем случайные данные и создаем гистограмму с помощью метода quad. Мы указываем верхние и нижние границы для каждого интервала данных и задаем цвет заливки столбцов. Таким образом, мы получаем визуализацию распределения данных.

Взаимодействие с графиками

Добавление интерактивности с помощью инструментов Bokeh

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

Чтобы добавить инструменты взаимодействия к графику, мы можем использовать метод add_tools объекта figure. Рассмотрим пример добавления инструментов масштабирования и панорамирования:

from bokeh.plotting import figure, output_file, show

# Данные
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]

# Создание графической фигуры с инструментами
p = figure(title='Интерактивный график', x_axis_label='X-ось', y_axis_label='Y-ось',
           tools='pan,box_zoom,reset,save')

# Добавление линии на график
p.line(x, y, legend_label='Линия', line_width=2)

# Отображение графика
output_file('интерактивный_график.html')
show(p)
Результат (обведены добавленные функции)
Результат (обведены добавленные функции)

Здесь мы используем строку 'pan,box_zoom,reset,save' в аргументе tools, чтобы добавить инструменты панорамирования, масштабирования прямоугольником, сброса масштаба и сохранения графика.

Создание всплывающих подсказок для точек данных

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

Для добавления всплывающих подсказок мы можем использовать инструмент HoverTool. Давайте рассмотрим пример:

from bokeh.plotting import figure, output_file, show
from bokeh.models import HoverTool

# Данные
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]

# Создание графической фигуры с всплывающей подсказкой
p = figure(title='График с всплывающей подсказкой', x_axis_label='X-ось', y_axis_label='Y-ось',
           tools='hover,reset,save')

# Добавление линии на график
line = p.line(x, y, legend_label='Линия', line_width=2)

# Настройка всплывающей подсказки
hover = HoverTool()
hover.tooltips = [('X', '@x'), ('Y', '@y')]  # Определение формата подсказки
hover.renderers = [line]  # Применение подсказки к конкретному рендереру
p.add_tools(hover)

# Отображение графика
output_file('график_с_подсказкой.html')
show(p)
Результат
Результат

В этом примере мы создаем объект HoverTool и настраиваем формат подсказки с использованием tooltips. Затем мы применяем подсказку к конкретному рендереру (в данном случае, к линии на графике) и добавляем инструмент hover к графической фигуре.

Применение масштабирования и панорамирования для удобства анализа

Интерактивность Bokeh также включает в себя возможности масштабирования и панорамирования. Пользователи могут масштабировать графики для более детального анализа или панорамировать по графику для навигации по большим данным.

Как мы уже видели, инструменты масштабирования и панорамирования можно добавить к графику, указав соответствующие инструменты в аргументе tools метода figure. Например:

Комплексные графические решения

Создание множественных графиков с использованием layout функций

Часто для анализа данных требуется объединение нескольких графиков на одной странице для сравнения, контраста или агрегации информации. Bokeh предоставляет функциональность для создания множественных графиков с использованием различных layout функций.

Одним из способов создания комплексных множественных графиков является использование функции gridplot. Эта функция позволяет размещать несколько графиков в виде сетки. Рассмотрим пример создания сетки из двух графиков:

from bokeh.plotting import figure, gridplot, output_file, show

# Данные
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [3, 8, 5, 9, 2]

# Создание графиков
p1 = figure(title='График 1', x_axis_label='X-ось', y_axis_label='Y-ось')
p1.line(x, y1, legend_label='Линия 1', line_width=2)

p2 = figure(title='График 2', x_axis_label='X-ось', y_axis_label='Y-ось')
p2.circle(x, y2, legend_label='Точки', size=10)

# Создание сетки из графиков
grid = gridplot([[p1, p2]])

# Отображение сетки
output_file('сетка_графиков.html')
show(grid)
Результат
Результат

В этом примере мы создаем два графика p1 и p2, а затем объединяем их в сетку с помощью gridplot. Сетка графиков позволяет нам отобразить несколько графиков на одной странице для сравнения результатов.

Составление дашбордов для комплексного отображения данных

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

Чтобы создать дашборд, мы можем использовать функцию layout и объединить различные графические элементы и инструменты в один контейнер. Рассмотрим пример создания простого дашборда:

from bokeh.layouts import layout
from bokeh.models.widgets import Slider
from bokeh.plotting import figure, curdoc

# Создание графика
p = figure(title='Дашборд', x_axis_label='X-ось', y_axis_label='Y-ось')
line = p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2)

# Создание слайдера
slider = Slider(start=1, end=10, step=1, value=1, title='Множитель')

# Функция для обновления графика на основе значения слайдера
def update(attr, old, new):
    line.data_source.data['y'] = [6*slider.value, 7*slider.value,

 2*slider.value, 4*slider.value, 5*slider.value]

# Привязка функции обновления к изменению значения слайдера
slider.on_change('value', update)

# Создание комплексного дашборда
dashboard = layout([[p], [slider]])

# Добавление дашборда в текущий документ
curdoc().add_root(dashboard)
Результат
Результат

Для отображения дашборда потребуется необходимо запустить Bokeh Server, выполнив в командной строке команду: bokeh serve --show dashboard.py

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

Интеграция Bokeh графиков в веб-приложения с помощью Bokeh Server

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

Для создания веб-приложения с использованием Bokeh Server, вам необходимо создать скрипт Python, который определяет структуру и поведение приложения. Рассмотрим пример создания простого веб-приложения:

from bokeh.layouts import layout
from bokeh.models.widgets import Slider
from bokeh.plotting import figure, curdoc
from bokeh.server.server import Server

# Создание графика
p = figure(title='Веб-приложение', x_axis_label='X-ось', y_axis_label='Y-ось')
line = p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2)

# Создание слайдера
slider = Slider(start=1, end=10, step=1, value=1, title='Множитель')

# Функция для обновления графика на основе значения слайдера
def update(attr, old, new):
    line.data_source.data['y'] = [6*slider.value, 7*slider.value, 2*slider.value, 4*slider.value, 5*slider.value]

# Привязка функции обновления к изменению значения слайдера
slider.on_change('value', update)

# Создание комплексного дашборда
dashboard = layout([[p], [slider]])

# Добавление дашборда в текущий документ
curdoc().add_root(dashboard)

# Запуск Bokeh Server
server = Server({'/': curdoc()}, num_procs=1)
server.start()

В этом примере мы создаем график и слайдер, также как и в предыдущем примере. Затем мы используем curdoc() для добавления дашборда в текущий документ. Но важное изменение заключается в создании и запуске Bokeh Server с помощью Server(). Это позволяет создать веб-приложение, доступное через веб-браузер.

Работа с географическими данными

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

from bokeh.plotting import figure, output_file, show
from bokeh.tile_providers import get_provider
# Данные
latitudes = [40.71, 34.05, 51.51]
longitudes = [-74.01, -118.24, -0.13]
# Создание графической фигуры с тайловым фоном
tile_provider = get_provider('CARTODBPOSITRON')
p = figure(x_range=(-2000000, 6000000), y_range=(-1000000, 7000000),
x_axis_type='mercator', y_axis_type='mercator', title='Маркеры на карте')
p.add_tile(tile_provider)
# Добавление маркеров на карту
p.circle(x=longitudes, y=latitudes, size=10, color='red')
# Отображение карты с маркерами
output_file('карта_с_маркерами.html')
show(p)
Результат
Результат

В этом примере мы используем функцию get_provider для получения тайлового фона карты. Затем мы создаем графическую фигуру p с этим фоном и добавляем маркеры с помощью функции circle.

Заключение

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

Материал подготовлен в преддверии старта онлайн-курса «Системный аналитик. Advanced».

Источник: https://habr.com/ru/companies/otus/articles/755358/


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

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

Однажды мне пришла в голову мысль, что, зная мощность автомобиля и некоторые потери мощности из-за трения, можно вычислить разгон от 0 до 100 км/ч, используя школьные формулы по физике, и сравнить с п...
Один из современных способов хранения большущего объема данных для платформ обработки и анализа данных - это распределение каждого датасета между несколькими узлами в кластере. Если мы используем обла...
Мы подготовили перевод статьи Райана Сирса об обработке логов Google’s Certificate Transparency, состоящей из двух частей. В первой части дается общее представление о структуре логов и пр...
В это статье я хочу показать пример того, как андроид устройство можно использовать для разработки на таких языках программирования как python с библиотекой opencv в среде VSCode (будет...
Когда Люк работал с Flake8 и одновременно присматривался к Pylint, у него сложилось впечатление, что 95% ошибок, выдаваемых Pylint, были ложными. У других разработчиков был иной опыт взаимодейств...