Агрегирование с присоединением — Join Aggregate

Преобразование joinaggregate почти во всём действует как агрегирование, но присоединяет полученные агрегированные значения к исходному набору данных. Рассмотрим следующий пример:

import pandas as pd
import numpy as np

rand = np.random.RandomState(0)

df = pd.DataFrame({
    'label': rand.choice(['A', 'B', 'C'], 10),
    'value': rand.randn(10),
})
df

Вот операция pandas, эквивалентная преобразованию aggregate в Altair. Для примера вычислим среднее:

mean = df.groupby('label').mean().reset_index()
mean

А вот результат, эквивалентный joinaggregate в Altair:

pd.merge(df, mean, on='label', suffixes=['', '_mean'])

Агрегированные значения присоединяются к исходному DataFrame, поэтому их можно использовать вместе с исходными значениями.

Например, сравним оценки фильмов на IMDB и Rotten Tomatoes, нормализовав их по среднему и стандартному отклонению. Для этого нужны вычисления над объединёнными данными:

import altair as alt
from altair.datasets import data

alt.Chart(data.movies.url).transform_filter(
    'datum["IMDB Rating"] != null  && datum["Rotten Tomatoes Rating"] != null'
).transform_joinaggregate(
    IMDB_mean='mean(IMDB Rating)',
    IMDB_std='stdev(IMDB Rating)',
    RT_mean='mean(Rotten Tomatoes Rating)',
    RT_std='stdev(Rotten Tomatoes Rating)'
).transform_calculate(
    IMDB_Deviation='(datum["IMDB Rating"] - datum.IMDB_mean) / datum.IMDB_std',
    Rotten_Tomatoes_Deviation='(datum["Rotten Tomatoes Rating"] - datum.RT_mean) / datum.RT_std'
).mark_point().encode(
    x='IMDB_Deviation:Q',
    y="Rotten_Tomatoes_Deviation:Q"
)

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

Метод Chart.transform_joinaggregate основан на классе JoinAggregateTransform, который поддерживает следующие параметры:

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

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

joinaggregatearray(JoinAggregateFieldDef)

Определения полей присоединяемого агрегирования и используемых вычислений.