Трансформация cross и crossfilter

Трансформация cross относится к семейству операций над данными в Vega и используется для построения декартова произведения двух наборов данных. Результатом является новый набор, содержащий все возможные комбинации строк из исходных источников.

Базовая семантика

Пусть заданы два массива данных:

  • набор A: a₁, a₂, ..., aₙ
  • набор B: b₁, b₂, ..., bₘ

Трансформация cross формирует результат:

  • (a₁, b₁), (a₁, b₂), ..., (a₁, bₘ)
  • (a₂, b₁), (a₂, b₂), ..., (a₂, bₘ)
  • (aₙ, b₁), (aₙ, b₂), ..., (aₙ, bₘ)

Итоговый размер данных: n × m


Синтаксис в спецификации Vega

{
  "type": "cross",
  "with": "datasetB",
  "as": ["a", "b"]
}

или в более общем виде:

{
  "type": "cross",
  "with": "otherDataset",
  "diagonal": false,
  "as": ["left", "right"]
}

Параметры трансформации

with Определяет вторичный источник данных, с которым выполняется декартово произведение.

as Задаёт имена полей для элементов из первой и второй таблицы. Без этого поля результат становится менее структурированным.

diagonal Логический параметр, определяющий необходимость исключения пар вида (aᵢ, aᵢ) при самосопряжении данных.


Поведение и особенности

Трансформация не выполняет сравнение значений и не учитывает ключи. Она строго формирует все возможные пары, что делает её вычислительно затратной операцией.

Сложность:

  • временная: O(n × m)
  • пространственная: O(n × m)

При увеличении объёма данных рост становится квадратичным, что критично для интерактивных визуализаций.


Типовые сценарии применения

1. Матрицы расстояний

Используется для вычисления попарных расстояний между объектами перед визуализацией heatmap или clustering map.

2. Анализ всех пар наблюдений

Например, сравнение всех точек между собой для поиска корреляций.

3. Построение графовых структур

Ребра графа могут формироваться из всех комбинаций узлов с последующей фильтрацией.

4. Подготовка данных для диаграмм взаимодействий

Chord diagram и adjacency matrix часто требуют предварительного формирования пар.


Пример использования

{
  "data": {"name": "points"},
  "transform": [
    {
      "type": "cross",
      "with": "points",
      "as": ["p1", "p2"]
    },
    {
      "type": "formula",
      "as": "distance",
      "expr": "sqrt(pow(datum.p1.x - datum.p2.x, 2) + pow(datum.p1.y - datum.p2.y, 2))"
    }
  ]
}

Оптимизация и ограничения

При использовании cross важно учитывать:

  • экспоненциальный рост объёма данных при самосочетании
  • невозможность раннего фильтрования до генерации пар
  • необходимость последующего отбора через filter или formula

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


Отличие от join-операций

В отличие от lookup или join, трансформация cross:

  • не требует ключей
  • не сопоставляет значения
  • не выполняет условного связывания

Она является базовой комбинаторной операцией, а не семантическим объединением данных.


Трансформация crossfilter в Vega-Lite

Понятие crossfilter в контексте Vega-Lite связано не с прямой трансформацией данных, а с моделью интерактивной фильтрации, основанной на связке выборок (selections) и реактивных фильтров.


Концепция crossfiltering

Crossfiltering реализует поведение, при котором:

  • выборка в одной визуализации
  • автоматически ограничивает данные в других представлениях

Это создаёт систему взаимосвязанных фильтров между несколькими графиками.


Основной механизм Vega-Lite

Crossfilter реализуется через:

  • selection
  • filter с привязкой к selection
  • параметрические выражения

Базовая структура

{
  "selection": {
    "brush": {
      "type": "interval"
    }
  },
  "mark": "point",
  "encoding": {
    "x": {"field": "x", "type": "quantitative"},
    "y": {"field": "y", "type": "quantitative"}
  },
  "transform": [
    {"filter": {"selection": "brush"}}
  ]
}

Интервальные выборки как основа crossfilter

Интервальная выборка (interval selection) позволяет выделять диапазоны значений по осям.

"selection": {
  "brush": {
    "type": "interval",
    "encodings": ["x", "y"]
  }
}

Такая конструкция формирует двумерный фильтр, который и является ядром crossfilter поведения.


Связывание нескольких визуализаций

Crossfilter проявляется при использовании одного и того же selection в разных слоях или графиках:

  • один график определяет selection
  • другие используют filter на основе этого selection
{
  "transform": [
    {"filter": {"selection": "brush"}}
  ]
}

Механика реактивности

При изменении selection происходит:

  1. пересчёт активного набора данных
  2. применение фильтра ко всем связанным визуализациям
  3. обновление рендера без пересборки спецификации

Типы crossfilter-поведения

1. Однонаправленное фильтрование

Один график управляет остальными.

2. Взаимное фильтрование

Несколько визуализаций используют общие selection-параметры.

3. Комбинированные фильтры

Несколько selection объединяются через логические операции:

  • AND (пересечение)
  • OR (объединение)
  • NOT (исключение)

Пример многослойного crossfilter

{
  "selection": {
    "sel": {
      "type": "interval"
    }
  },
  "layer": [
    {
      "mark": "point",
      "encoding": {
        "x": {"field": "a"},
        "y": {"field": "b"}
      }
    },
    {
      "transform": [
        {"filter": {"selection": "sel"}}
      ],
      "mark": "circle",
      "encoding": {
        "x": {"field": "a"},
        "y": {"field": "b"},
        "color": {"value": "red"}
      }
    }
  ]
}

Отличие crossfilter от обычного filter

Обычный filter:

  • статичен
  • задаётся декларативно
  • не зависит от пользовательского ввода

Crossfilter-подход:

  • реактивен
  • зависит от интерактивного состояния
  • изменяет данные в реальном времени

Производительность crossfilter-систем

Основные факторы влияния:

  • количество точек данных
  • количество связанных представлений
  • сложность selection-выражений

Оптимизация достигается через:

  • агрегацию до визуализации
  • использование упрощённых selection-областей
  • ограничение числа одновременно активных связей

Связь crossfilter с архитектурой Vega-Lite

Crossfilter в Vega-Lite является частью декларативной модели реактивности:

  • данные остаются неизменяемыми
  • selection описывает состояние интерфейса
  • transform фильтрует представление, а не источник

Это создаёт разделение:

  • данные
  • состояние взаимодействия
  • визуальное представление

Типовые сценарии применения

  • связные scatterplot матрицы
  • дашборды с фильтрацией по нескольким графикам
  • интерактивный анализ распределений
  • исследование выбросов через brushing
  • динамическая сегментация данных

Логика взаимодействия между cross и crossfilter

Обе концепции связаны с комбинированием данных, но на разных уровнях:

  • cross формирует новые структуры данных до визуализации
  • crossfilter изменяет отображение уже существующих данных

Первое работает в плоскости подготовки данных, второе — в плоскости интерактивного управления состоянием визуализации