Поиск и соединение данных — 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, который поддерживает следующие параметры:

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

Выходные поля для найденных значений. При поиске в данных можно не задавать, если указан from.fields: используются эти имена. Если from.fields не задан, as должен быть строкой. При поиске в выборе свойство необязательно: без него найденные значения сохраняются в свойстве с именем выбора; если оно задано, должно соответствовать from.fields.

defaultany

Значение при отсутствии результата поиска. По умолчанию: null.

fromanyOf(LookupData, LookupSelection)

Источник данных или выбор для обращения к дополнительным данным.

lookupstring

Ключ основного источника данных.