Визуализация данных в Vega и Vega-Lite часто начинается с вопроса формы данных. Одна из ключевых операций подготовки — преобразование «широкого» набора столбцов в «длинный» формат. Для этого используется трансформация fold, которая выполняет функцию, аналогичную unpivot в SQL или melt в pandas.
Широкий формат (wide) представляет каждую категорию как отдельный столбец:
| месяц | продажи_A | продажи_B | продажи_C |
|---|---|---|---|
| Jan | 10 | 15 | 8 |
| Feb | 12 | 18 | 9 |
Такое представление удобно для таблиц, но плохо масштабируется при визуализации множественных серий.
Длинный формат (long) объединяет категории в строки:
| месяц | тип | значение |
|---|---|---|
| Jan | продажи_A | 10 |
| Jan | продажи_B | 15 |
| Jan | продажи_C | 8 |
Именно такой формат является нативным для большинства визуальных
encodings Vega-Lite: color, detail,
shape, facet.
Трансформация fold преобразует набор столбцов в пары:
Это делает возможным:
{
"transform": [
{
"fold": ["sales_A", "sales_B", "sales_C"],
"as": ["category", "value"]
}
]
}
fold — массив имён столбцов, которые будут преобразованы
as — массив из двух элементов:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"month": "Jan", "A": 10, "B": 15, "C": 8},
{"month": "Feb", "A": 12, "B": 18, "C": 9}
]
},
"transform": [
{
"fold": ["A", "B", "C"],
"as": ["series", "value"]
}
],
"mark": "line",
"encoding": {
"x": {"field": "month", "type": "ordinal"},
"y": {"field": "value", "type": "quantitative"},
"color": {"field": "series", "type": "nominal"}
}
}
Здесь fold создаёт нормализованную структуру, позволяющую отрисовать
несколько линий через одну шкалу y.
Исходные данные проходят трансформацию:
as[0]as[1]Результат становится пригодным для унифицированных encoding-каналов.
Когда каждая колонка — это отдельный показатель:
fold позволяет превратить их в одну ось значений с разделением через
color или detail.
Без fold пришлось бы:
fold устраняет необходимость в предварительном ETL-слое.
Если структура данных неизвестна заранее, fold может использоваться вместе с вычисляемыми списками полей (в Vega через expression или data join), что позволяет строить универсальные графики.
| Инструмент | Операция |
|---|---|
| pandas melt | wide → long |
| SQL UNPIVOT | wide → long |
| Vega fold | wide → long |
fold концептуально является декларативным аналогом этих операций внутри графического pipeline.
После применения fold исходные поля исключаются из результата трансформации. Это важно учитывать при дальнейших вычислениях.
Каждая исходная строка превращается в N строк, где N — количество folded-полей.
fold часто комбинируется с aggregate:
{
"transform": [
{
"fold": ["A", "B", "C"],
"as": ["series", "value"]
},
{
"aggregate": [
{"op": "mean", "field": "value", "as": "avg"}
],
"groupby": ["series"]
}
]
}
Это позволяет вычислять статистику по исходным колонкам после их унификации.
После fold новые поля становятся стандартными каналами Vega-Lite:
color: series → разделение линий или баровx: category → категориальная осьy: value → количественная осьТаким образом fold выступает как мост между структурой данных и визуальной моделью.
fold эффективно работает при следующих условиях:
Однако он менее удобен, если:
flatten, join или lookup)fold выполняется на этапе трансформаций до encoding. Это означает:
Порядок важен, поскольку последующие шаги уже не «знают» о широком формате.
fold часто выступает как точка нормализации данных внутри декларативной модели:
В сложных dashboard-конфигурациях fold становится стандартным способом унификации метрик разного происхождения в одном графике.