Агрегирование — Aggregate

В Altair данные можно агрегировать двумя способами: в самом кодировании или с помощью преобразования aggregate верхнего уровня.

Свойство aggregate в определении поля вычисляет сводные статистики, например median, min и max, по группам данных.

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

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

import altair as alt
from altair.datasets import data

cars = data.cars.url

alt.Chart(cars).mark_bar().encode(
    y='Cylinders:O',
    x='mean(Acceleration):Q',
)

Сокращённая запись Altair:

# ...
x='mean(Acceleration):Q',
# ...

предоставляется для удобства и эквивалентна полной записи:

# ...
x=alt.X(field='Acceleration', aggregate='mean', type='quantitative'),
# ...

Подробнее о сокращённой записи кодирования см. соответствующий раздел.

Ту же диаграмму можно построить, явно вычислив агрегирование методом Chart.transform_aggregate:

alt.Chart(cars).mark_bar().encode(
    y='Cylinders:O',
    x='mean_acc:Q'
).transform_aggregate(
    mean_acc='mean(Acceleration)',
    groupby=["Cylinders"]
)

Другой вариант — предварительно обработать данные в pandas, а затем построить диаграмму по полученному DataFrame:

cars_df = data.cars()
source = (
   cars_df.groupby('Cylinders')
   .Acceleration
   .mean()
   .reset_index()
   .rename(columns={'Acceleration': 'mean_acc'})
)

alt.Chart(source).mark_bar().encode(
   y='Cylinders:O',
   x='mean_acc:Q'
)

Поскольку Cylinders в DataFrame source имеет тип int64, без явного указания Altair счёл бы его количественным, а не порядковым полем. Тип влияет на результат, поэтому задавать его явно важно. Два иллюстрированных примера приведены в разделах о типах данных и шкале легенды и типах данных и шкале оси. Как правило, лучше явно указывать тип, чем полагаться на неявное преобразование.

Функции без аргументов

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

Следующая диаграмма демонстрирует это, подсчитывая автомобили по странам происхождения:

alt.Chart(cars).mark_bar().encode(
   y='Origin:N',
   # shorthand form of alt.X(aggregate='count')
   x='count()'
)

Наибольшую пользу этот подход приносит функциям для категориальных данных, например count, missing, distinct и valid.

Функции Argmin и Argmax

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

Эти функции нужно применять через метод Chart.transform_aggregate, а не через сокращённую запись. Они возвращают объекты для выбора значений других столбцов, а не сами значения напрямую. Такой объект можно представить как словарь, где столбец служит ключом для извлечения соответствующего значения.

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

alt.Chart(cars).mark_bar().encode(
   x='greatest_hp[Weight_in_lbs]:Q',
   y='Origin:N'
).transform_aggregate(
   greatest_hp='argmax(Horsepower)',
   groupby=['Origin']
)

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

Ещё один пример argmax — линейная диаграмма с пользовательской легендой в галерее. Для argmin подход полностью аналогичен.

Параметры преобразования

Метод Chart.transform_aggregate основан на классе AggregateTransform со следующими параметрами:

Нажмите, чтобы показать таблицу
СвойствоТипОписание
aggregatearray(AggregatedFieldDef)

Массив объектов, задающих поля для агрегирования.

groupbyarray(FieldName)

Поля для группировки. Если не заданы, используется одна группа со всеми объектами данных.

Объекты AggregatedFieldDef поддерживают следующие параметры:

Нажмите, чтобы показать таблицу
СвойствоТипОписание
asFieldName

Имена выходных полей для каждого агрегированного поля.

fieldFieldName

Поле данных, по которому вычисляется функция агрегирования. Обязательно для всех операций, кроме "count".

opAggregateOp

Операция агрегирования, применяемая к полям, например "sum", "average" или "count". Подробнее см. полный список поддерживаемых операций.

Функции агрегирования

Помимо count и average, в Altair встроено много других функций агрегирования. Они перечислены ниже.

Функции подсчёта

Функция Описание Пример
count Общее число объектов данных в группе. Простая тепловая карта
valid Число значений поля, которые не равны null или undefined. —
missing Число значений поля, равных null или undefined. —
distinct Число различных значений поля. —
values Список объектов данных в группе. —

Основные математические операции

Функция Описание Пример
sum Сумма значений поля. Потоковая диаграмма
product Произведение значений поля. —

Показатели центральной тенденции

Функция Описание Пример
mean Среднее значение поля. Диаграмма рассеяния со слоями гистограмм
average Среднее значение поля; эквивалент mean. Линейная диаграмма с цветом и линией
median Медиана значений поля. Диаграмма размаха
variance Выборочная дисперсия значений поля. —
variancep Дисперсия генеральной совокупности. —
stdev Выборочное стандартное отклонение. —
stdevp Стандартное отклонение генеральной совокупности. —
stderr Стандартная ошибка значений поля. —

Статистики распределения

Функция Описание Пример
q1 Нижний квартиль значений. Диаграмма размаха
q3 Верхний квартиль значений. Диаграмма размаха
ci0 Нижняя граница 95%-го доверительного интервала среднего, полученного бутстрэпом. Упорядоченные интервалы погрешностей с доверительным интервалом
ci1 Верхняя граница 95%-го доверительного интервала среднего, полученного бутстрэпом. Упорядоченные интервалы погрешностей с доверительным интервалом

Функции диапазона

Функция Описание Пример
min Минимальное значение поля. Диаграмма размаха
max Максимальное значение поля. Диаграмма размаха
argmin Входной объект данных с минимальным значением поля. —
argmax Входной объект данных с максимальным значением поля. Линейная диаграмма с пользовательской легендой