Поле transform в Vega-Lite представляет собой
декларативный конвейер преобразований данных, который применяется к
исходному набору данных до этапа визуального отображения. Каждый элемент
массива transform описывает отдельную операцию, а порядок
их следования определяет последовательность обработки.
В базовой структуре спецификации Vega-Lite поле
transform является массивом объектов:
{
"data": { "url": "data.csv" },
"transform": [
{ "...": "..." },
{ "...": "..." }
],
"mark": "line",
"encoding": { }
}
Каждый объект внутри массива соответствует одному преобразованию данных. В отличие от императивных подходов, здесь не описывается алгоритм выполнения, а задаётся декларация результата для каждого шага.
Ключевой принцип — конвейерность: результат каждого преобразования становится входом для следующего.
Порядок элементов в transform строго определяет
вычислительную последовательность:
Изменение порядка трансформаций может радикально изменить результат, особенно при комбинации фильтрации, агрегации и вычисляемых полей.
Каждый элемент массива описывается объектом с одним ключевым типом операции:
{
"transform": [
{ "filter": "datum.value > 10" },
{ "calculate": "datum.a + datum.b", "as": "sum" }
]
}
Особенность Vega-Lite заключается в том, что тип трансформации
определяется ключом объекта (filter,
calculate, aggregate и т.д.), а не отдельным
полем type, как в Vega.
Фильтрация ограничивает набор строк по условию:
{ "filter": "datum.sales > 100" }
Условие записывается в выражении Vega Expression Language, где
datum представляет текущую запись.
Позволяют создавать новые поля на основе существующих:
{
"calculate": "datum.price * datum.quantity",
"as": "revenue"
}
Поле as задаёт имя нового атрибута, добавляемого в поток
данных.
Агрегация группирует данные и вычисляет статистики:
{
"aggregate": [
{ "op": "sum", "field": "sales", "as": "total_sales" }
],
"groupby": ["category"]
}
Ключевые элементы:
op — операция (sum, mean, count, min, max)field — исходное полеas — имя результатаgroupby — поля группировкиИспользуется для разбиения числовых данных на интервалы:
{
"bin": true,
"field": "age",
"as": "age_bin"
}
Также возможно явное задание параметров биннинга:
{
"bin": { "maxbins": 10 },
"field": "age",
"as": "age_bin"
}
Позволяет извлекать компоненты даты:
{
"timeUnit": "yearmonth",
"field": "date",
"as": "year_month"
}
Часто используется для группировки временных рядов.
Применяется для работы с вложенными массивами:
{
"flatten": ["tags"]
}
Каждый элемент массива превращается в отдельную строку.
Используется для денормализации таблиц:
{
"fold": ["Q1", "Q2", "Q3", "Q4"],
"as": ["quarter", "value"]
}
Преобразует строки в колонки:
{
"pivot": "quarter",
"value": "sales",
"groupby": ["product"]
}
Позволяет выполнять вычисления по скользящим окнам:
{
"window": [
{ "op": "rank", "as": "rank" }
],
"sort": [{ "field": "sales", "order": "descending" }]
}
Поддерживаются:
Позволяют присоединять внешние данные:
{
"lookup": "id",
"from": {
"data": { "url": "table2.csv" },
"key": "id",
"fields": ["name"]
}
}
transform часто используется как цепочка разнородных
операций:
"transform": [
{ "filter": "datum.value != null" },
{ "calculate": "datum.value * 2", "as": "double" },
{ "bin": { "maxbins": 20 }, "field": "double", "as": "binned" },
{
"aggregate": [
{ "op": "count", "as": "count" }
],
"groupby": ["binned"]
}
]
Такая структура демонстрирует принцип последовательной трансформации данных от сырого состояния к агрегированному виду, пригодному для визуализации.
Во всех выражениях transform доступен объект datum,
представляющий текущую запись, а также стандартные функции Vega
Expression Language:
Пример:
{ "filter": "datum.score > mean(datum.score)" }
Хотя transform выполняет предобработку, результат
напрямую влияет на encoding. Например, вычисляемое поле
может стать источником для осей:
"transform": [
{ "calculate": "datum.x * datum.y", "as": "metric" }
],
"encoding": {
"x": { "field": "metric", "type": "quantitative" }
}
Эти ограничения компенсируются выразительностью отдельных transform-операторов и их комбинаций.
В Vega-Lite трансформации декларативно упрощены:
typeВ Vega же трансформации описываются более низкоуровнево:
{
"type": "filter",
"expr": "datum.value > 10"
}
transform занимает промежуточный слой между источником
данных и визуальной кодировкой. Его функция заключается в приведении
данных к форме, оптимальной для визуального представления:
Именно этот слой определяет, какие данные фактически попадут в
систему визуальных каналов (x, y,
color, size и т.д.).