В первой части уроков мы обсудили данные, метки, кодировки и типы кодирования. Следующая важная часть API Altair - это подход к группированию и агрегированию данных.
import altair as alt
from vega_datasets import data
# загрузили набор данных про машины
cars = data.cars()
cars.head()
Name | Miles_per_Gallon | Cylinders | Displacement | Horsepower | Weight_in_lbs | Acceleration | Year | Origin | |
---|---|---|---|---|---|---|---|---|---|
0 | chevrolet chevelle malibu | 18.0 | 8 | 307.0 | 130.0 | 3504 | 12.0 | 1970-01-01 | USA |
1 | buick skylark 320 | 15.0 | 8 | 350.0 | 165.0 | 3693 | 11.5 | 1970-01-01 | USA |
2 | plymouth satellite | 18.0 | 8 | 318.0 | 150.0 | 3436 | 11.0 | 1970-01-01 | USA |
3 | amc rebel sst | 16.0 | 8 | 304.0 | 150.0 | 3433 | 12.0 | 1970-01-01 | USA |
4 | ford torino | 17.0 | 8 | 302.0 | 140.0 | 3449 | 10.5 | 1970-01-01 | USA |
Что касается данных об автомобилях, вы можете разделить их по происхождению (Origin
), вычислить среднее значение миль на галлон (miles per gallon), а затем объединить результаты.
В Pandas операция выглядит так:
cars.groupby('Origin')['Miles_per_Gallon'].mean()
Origin Europe 27.891429 Japan 30.450633 USA 20.083534 Name: Miles_per_Gallon, dtype: float64
В Altair такой вид "разделения-применения-комбинирования" (split-apply-combine) может быть выполнен путем передачи оператора агрегирования внутри строки в любую кодировку (encoding).
Например, мы можем отобразить график, представляющий вышеуказанную агрегацию, следующим образом:
alt.Chart(cars).mark_bar().encode(
y='Origin',
x='mean(Miles_per_Gallon)'
)
Обратите внимание, что группировка выполняется неявно внутри кодировок: здесь мы группируем только по происхождению (Origin
), а затем вычисляем среднее значение по каждой группе.
Одно из наиболее распространенных применений биннинга - создание гистограмм. Например, вот гистограмма миль на галлон (miles per gallon):
alt.Chart(cars).mark_bar().encode(
alt.X('Miles_per_Gallon', bin=True),
alt.Y('count()'),
alt.Color('Origin')
)
Интересно то, что декларативный подход Altair позволяет присваивать эти значения разным кодировкам, чтобы увидеть другие представления тех же данных.
Например, если мы присвоим цвету (color
) количество миль на галлон (miles per gallon), то получим следующее представление данных:
alt.Chart(cars).mark_bar().encode(
color=alt.Color('Miles_per_Gallon', bin=True),
x='count()',
y='Origin'
)
Это дает лучшее представление о доле MPG
(миль на галлон) в каждой стране.
При желании мы можем нормализовать количество по оси x
, чтобы напрямую сравнивать пропорции:
alt.Chart(cars).mark_bar().encode(
color=alt.Color('Miles_per_Gallon', bin=True),
x=alt.X('count()', stack='normalize'),
y='Origin'
)
Видим, что более половины автомобилей в США относятся к категории "с низким пробегом" (low mileage).
Снова изменив кодировку (encoding), давайте сопоставим цвет с количеством color='count()'
:
alt.Chart(cars).mark_rect().encode(
x=alt.X('Miles_per_Gallon', bin=alt.Bin(maxbins=20)),
color='count()',
y='Origin',
)
Видим набор данных, похожий на тепловую карту!
Это одна из прекрасных особенностей Altair: через грамматику API он показывает отношения между разными типами диаграмм, например, двухмерная тепловая карта кодирует те же данные, что и гистограмма с накоплением (stacked)!
Агрегаты (aggregates) также могут использоваться с данными, которые неявно объединены в группы. Например, посмотрите на этот график MPG
(миль на галлон) с течением времени:
alt.Chart(cars).mark_point().encode(
x='Year:T',
color='Origin',
y='Miles_per_Gallon'
)