Визуализация данных с помощью Altair (часть 2)

Open in Colab


Подписка на онлайн-обучение telegram

Биннинг и агрегация

В первой части уроков мы обсудили данные, метки, кодировки и типы кодирования. Следующая важная часть API Altair - это подход к группированию и агрегированию данных.

Group-By в Pandas

Одной из ключевых операций в исследовании данных является группировка (group-by), подробно описанная в статье. Короче говоря, группировка разбивает данные в соответствии с некоторым условием, применяет некоторую агрегацию в этих группах, а затем объединяет данные обратно вместе:

Split Apply Combine figure Источник картинки

Что касается данных об автомобилях, вы можете разделить их по происхождению (Origin), вычислить среднее значение миль на галлон (miles per gallon), а затем объединить результаты.

В Pandas операция выглядит так:

В Altair такой вид "разделения-применения-комбинирования" (split-apply-combine) может быть выполнен путем передачи оператора агрегирования внутри строки в любую кодировку (encoding).

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

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

Одномерные биннинги: гистограммы

Одно из наиболее распространенных применений биннинга - создание гистограмм. Например, вот гистограмма миль на галлон (miles per gallon):

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

Например, если мы присвоим цвету (color) количество миль на галлон (miles per gallon), то получим следующее представление данных:

Это дает лучшее представление о доле MPG (миль на галлон) в каждой стране.

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

Видим, что более половины автомобилей в США относятся к категории "с низким пробегом" (low mileage).

Снова изменив кодировку (encoding), давайте сопоставим цвет с количеством color='count()':

Видим набор данных, похожий на тепловую карту!

Это одна из прекрасных особенностей Altair: через грамматику API он показывает отношения между разными типами диаграмм, например, двухмерная тепловая карта кодирует те же данные, что и гистограмма с накоплением (stacked)!

Прочие агрегаты

Агрегаты (aggregates) также могут использоваться с данными, которые неявно объединены в группы. Например, посмотрите на этот график MPG (миль на галлон) с течением времени:

Тот факт, что точки пересекаются, затрудняет просмотр важных частей данных; мы можем сделать его более ясным, построив среднее значение в каждой группе (здесь среднее значение каждой комбинации Год/Страна):

Однако совокупное среднее значение (mean) отражает лишь часть истории: Altair также предоставляет встроенные инструменты для вычисления нижней и верхней границ доверительных интервалов для среднего.

Мы можем использовать здесь mark_area() и указать нижнюю и верхнюю границы области, используя y и y2:

Временной биннинг

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

Если мы попытаемся построить график по этим данным с помощью Altair, то получим ошибку MaxRowsError:

alt.Chart(temps).mark_line().encode(
    x='date:T',
    y='temp:Q'
)
---------------------------------------------------------------------------
MaxRowsError                              Traceback (most recent call last)

Как Altair кодирует данные

Мы решили возбудить исключение MaxRowsError для наборов данных размером более 5000 строк из-за наших наблюдений за учащимися, использующими Altair, потому что, если вы не задумаетесь о том, как представлены данные, то довольно легко получить очень большие Jupyter блокноты, в которых снизится производительность.

Когда вы передаете фрейм данных pandas в диаграмму Altair, то в результате данные преобразуются в JSON формат и сохраняются в спецификации диаграммы. Затем эта спецификация встраивается в выходные данные Jupyter блокнота, и если вы сделаете таким образом несколько десятков диаграмм с достаточно большим набором данных, то это может значительно замедлить работу вашей машины.

Так как же обойти эту ошибку? Есть несколько способов:

1) Используйте меньший набор данных. Например, мы могли бы использовать Pandas для суммирования дневных температур:

import pandas as pd
   temps = temps.groupby(pd.DatetimeIndex(temps.date).date).mean().reset_index()

2) Отключите MaxRowsError, используя

alt.data_transformers.enable('default', max_rows=None)

Но учтите, что это может привести к очень большим Jupyter блокнотам, если вы не будете осторожны.

3) Обслуживайте свои данные с локального поточного сервера. Пакет сервера данных altair упрощает это.

alt.data_transformers.enable('data_server')

Обратите внимание, что этот подход может не работать с некоторыми облачными сервисами для Jupyter ноутбуков.

4) Используйте URL-адрес, указывающий на источник данных. Создание gist - это быстрый и простой способ хранить часто используемые данные.

Обратите внимание, что вместо включения всего набора данных используется только URL-адрес.

Теперь давайте попробуем еще раз с нашим графиком:

Эти данные явно переполнены. Предположим, что мы хотим отсортировать данные по месяцам. Сделаем это с помощью TimeUnit Transform на дату:

Станет понятнее, если мы просуммируем температуры:

Можем разделить даты двумя разными способами, чтобы получить интересное представление данных, например:

Или можем посмотреть на среднечасовую температуру как функцию месяца:

Этот вид преобразования может оказаться полезным при работе с временными данными.

Дополнительная информация о TimeUnit Transform доступна здесь

Составные диаграммы

Altair предоставляет краткий API для создания многопанельных и многоуровневых диаграмм, таких как:

Мы кратко рассмотрим их далее.

Наслоение

Наслоение (layering) позволяет размещать несколько меток (marks) на одной диаграмме. Один из распространенных примеров - создание графика с точками и линиями, представляющими одни и те же данные.

Давайте использовать данные об акциях (stocks) для этого примера:

Вот простой линейный график данных по акциям:

А вот тот же график с кружком (circle mark):

Можем наложить эти два графика вместе с помощью оператора +:

Оператор + всего лишь сокращение для функции alt.layer(), которая делает то же самое:

Один из шаблонов, который мы будем часто использовать, - это создать базовую диаграмму с общими элементами и сложить две копии с одним изменением:

Горизонтальная конкатенация

Так же, как мы можем накладывать диаграммы друг на друга, мы можем объединить их по горизонтали, используя alt.hconcat или, что то же самое, оператор |:

Это может пригодиться для создания многопанельных представлений, например, вот набор данных iris:

Вертикальная конкатенация

Вертикальная конкатенация (vertical concatenation) очень похожа на горизонтальную, но с использованием либо функции alt.hconcat(), либо оператора &:

Повторить диаграмму

Поскольку это очень распространенный шаблон для объединения диаграмм по горизонтали и вертикали при изменении одной кодировки, Altair предлагает для этого сокращение, используя оператор repeat().

Этот API все еще не так оптимизирован, как мог бы, но мы будем над этим работать.

читать далее Часть 3

Подписка на онлайн-обучение telegram