Поиск и соединение данных — Lookup
Преобразование lookup дополняет основной источник данных значениями из другого источника. Оно похоже на одностороннее соединение. Добавить его на верхнем уровне диаграммы можно методом Chart.transform_lookup.
Представим два источника данных, которые нужно объединить и отобразить: список людей с ростом и весом и сведения о группах, к которым они относятся. Демонстрационные данные доступны в пакете altair.datasets:
from altair.datasets import data
people = data.lookup_people()
groups = data.lookup_groups()
Каждый из этих наборов можно отобразить отдельно:
import altair as alt
top = alt.Chart(people).mark_square(size=200).encode(
x=alt.X('age:Q').scale(zero=False),
y=alt.Y('height:Q').scale(zero=False),
color='name:N',
tooltip='name:N'
).properties(
width=400, height=200
)
bottom = alt.Chart(groups).mark_rect().encode(
x='person:N',
y='group:O'
).properties(
width=400, height=100
)
alt.vconcat(top, bottom)
Чтобы показать характеристики, использующие оба набора, например средний возраст каждой группы, данные нужно объединить. Это можно сделать заранее средствами pandas или прямо в визуализации с помощью LookupTransform в Altair.
Объединение наборов данных с pandas.merge
В pandas есть много инструментов объединения и соединения наборов данных. Подробные примеры приведены в разделе документации pandas «Merge, Join, and Concatenate».
Для наших данных объединение и построение диаграммы выглядят так:
import pandas as pd
merged = pd.merge(groups, people, how='left',
left_on='person', right_on='name')
alt.Chart(merged).mark_bar().encode(
x='mean(age):Q',
y='group:O'
)
Здесь задано левое соединение: для каждой записи столбца person из groups ищется соответствующая запись столбца name из people, после чего её значения добавляются к данным. По результату легко построить столбчатую диаграмму среднего возраста в каждой группе.
Объединение наборов данных преобразованием Lookup
Для некоторых источников, например данных по URL или потоковых данных, удобно выполнять соединение без предварительной загрузки и обработки в pandas. Для этого предназначен метод Chart.transform_lookup.
Чтобы повторить предыдущую диаграмму, объединив наборы прямо в спецификации, можно сделать следующее:
alt.Chart(groups).mark_bar().encode(
x='mean(age):Q',
y='group:O'
).transform_lookup(
lookup='person',
from_=alt.LookupData(data=people, key='name',
fields=['age', 'height'])
)
lookup задаёт поле набора groups, по которому выполняется сопоставление. Аргумент from_ задаёт структуру LookupData: второй набор, ключ поиска и поля, которые нужно извлечь.
Пример: Lookup в географической визуализации
Для географических визуализаций lookup особенно важен: табличные данные часто нужно объединить с данными географических границ. Например, покажем уровень безработицы по округам США:
import altair as alt
from altair.datasets import data
counties = alt.topo_feature(data.us_10m.url, 'counties')
unemp_data = data.unemployment.url
alt.Chart(counties).mark_geoshape().encode(
color='rate:Q'
).transform_lookup(
lookup='id',
from_=alt.LookupData(unemp_data, 'id', ['rate'])
).properties(
projection={'type': 'albersUsa'},
width=500, height=300
)
Параметры преобразования
Метод Chart.transform_lookup основан на классе LookupTransform, который поддерживает следующие параметры:
Нажмите, чтобы показать таблицу
| Свойство | Тип | Описание |
|---|---|---|
as | anyOf(FieldName, array(FieldName)) | Выходные поля для найденных значений. При поиске в данных можно не задавать, если указан |
default | any | Значение при отсутствии результата поиска. По умолчанию: |
from | anyOf(LookupData, LookupSelection) | Источник данных или выбор для обращения к дополнительным данным. |
lookup | string | Ключ основного источника данных. |