Агрегирование с присоединением — 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, который поддерживает следующие параметры:
Нажмите, чтобы показать таблицу
| Свойство | Тип | Описание |
|---|---|---|
groupby | array(FieldName) | Поля для разделения объектов данных на группы. Если не заданы, все точки входят в одну группу. |
joinaggregate | array(JoinAggregateFieldDef) | Определения полей присоединяемого агрегирования и используемых вычислений. |