Трансформация sequence

В спецификациях Vega и Vega-Lite генерация последовательностей используется как базовый механизм синтетического построения данных, позволяющий формировать упорядоченные числовые или временные ряды без внешнего источника. Концепция sequence применяется как на уровне данных, так и в составе трансформационных пайплайнов, обеспечивая детерминированное создание диапазонов значений для последующих вычислений, визуализаций и построения производных признаков.


Генерация последовательностей в Vega-Lite

В Vega-Lite последовательность чаще всего задаётся через специальный источник данных sequence, который встроен в объект data. Этот механизм формирует массив значений с равномерным шагом.

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

{
  data: {
    sequence: {
      start: 0,
      stop: 10,
      step: 1,
      as: "x"
    }
  },
  mark: "line",
  encoding: {
    x: { field: "x", type: "quantitative" },
    y: { expression: "datum.x * datum.x" }
  }
}

Параметры sequence

start

  • Начальное значение диапазона
  • Может быть числом или датой

stop

  • Конечное значение (не включается в набор при стандартной семантике)

step

  • Шаг дискретизации
  • Определяет плотность последовательности

as

  • Имя поля, в которое записываются значения

Числовые последовательности

Числовые sequence применяются для построения функций, тестовых распределений и визуализации математических зависимостей.

Пример генерации линейного диапазона:

{
  data: {
    sequence: {
      start: 1,
      stop: 100,
      step: 1,
      as: "n"
    }
  },
  mark: "line",
  encoding: {
    x: { field: "n", type: "quantitative" },
    y: { expression: "log(datum.n)" }
  }
}

Такая конструкция используется для:

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

Временные последовательности

Sequence поддерживает работу с временными диапазонами, где start и stop задаются в формате даты.

{
  data: {
    sequence: {
      start: "2024-01-01",
      stop: "2024-01-10",
      step: 1,
      as: "date"
    }
  },
  mark: "line",
  encoding: {
    x: { field: "date", type: "temporal" },
    y: { expression: "sin(datum.date)" }
  }
}

Особенности временных sequence:

  • шаг интерпретируется как дни при строковом формате дат
  • поддерживается временная интерполяция на уровне Vega runtime
  • используется для симуляции временных рядов

Sequence как основа синтетических датасетов

Sequence часто используется для построения искусственных датасетов, которые затем расширяются через transform-операции.

Пример генерации базовой сетки значений:

{
  data: {
    sequence: {
      start: -5,
      stop: 5,
      step: 0.1,
      as: "x"
    }
  },
  transform: [
    {
      calculate: "datum.x * datum.x",
      as: "y"
    }
  ],
  mark: "point",
  encoding: {
    x: { field: "x", type: "quantitative" },
    y: { field: "y", type: "quantitative" }
  }
}

Sequence здесь выступает как генератор домена функции, а transform формирует зависимую переменную.


Использование sequence в Vega (низкоуровневая модель)

В Vega (в отличие от Vega-Lite) sequence может использоваться как полноценный data source в Dataflow-системе спецификации:

{
  data: [
    {
      name: "table",
      values: { sequence: { start: 0, stop: 50, step: 5 } }
    }
  ]
}

В Vega такая последовательность становится входным потоком, который далее проходит через:

  • фильтрацию
  • агрегацию
  • join-операции
  • window-трансформации

Интеграция sequence с transform-пайплайном

Sequence особенно эффективно работает в связке с вычислительными трансформациями Vega-Lite.

calculate + sequence

{
  data: {
    sequence: {
      start: 0,
      stop: 20,
      step: 1,
      as: "x"
    }
  },
  transform: [
    {
      calculate: "pow(2, datum.x)",
      as: "y"
    }
  ]
}

filter после генерации

{
  data: {
    sequence: {
      start: 0,
      stop: 100,
      step: 1,
      as: "x"
    }
  },
  transform: [
    {
      filter: "datum.x % 2 === 0"
    }
  ]
}

Sequence в этом случае создаёт полный набор, после чего трансформация уменьшает его до нужного подмножества.


Сценарии применения sequence

1. Построение математических графиков

Sequence используется для дискретизации функций:

  • полиномиальные кривые
  • тригонометрические функции
  • экспоненциальные зависимости

2. Симуляция распределений

Генерация плотных сеток для аппроксимации:

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

3. Временные ряды

Создание каркасов временных осей:

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

4. Пространственные сетки

При комбинировании нескольких sequence формируется двумерная сетка:

{
  data: {
    sequence: {
      start: 0,
      stop: 10,
      step: 1,
      as: "x"
    }
  },
  transform: [
    {
      calculate: "sequence(0,10,1)",
      as: "yGrid"
    }
  ]
}

(в Vega чаще реализуется через cross product или lookup, но концептуально sequence формирует ось)


Особенности поведения и ограничения

Дискретность генерации

Sequence всегда создаёт дискретный набор значений, даже при дробном шаге, что может приводить к:

  • накоплению ошибок округления
  • неравномерности при больших диапазонах

Эксклюзивность stop

Значение stop обычно не включается в результат, что влияет на точность границ визуализации.

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

При больших диапазонах:

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

Sequence в контексте декларативной модели Vega-Lite

Sequence является частью декларативного подхода, в котором:

  • данные описываются, а не вычисляются императивно
  • генерация встроена в спецификацию визуализации
  • вычисления выполняются движком Vega runtime

Это позволяет объединять:

  • синтетические данные
  • реальные источники
  • трансформации в едином пайплайне

Комбинирование нескольких sequence

Для построения сложных моделей часто используется несколько последовательностей:

  • одна ось X
  • вторая ось Y
  • третья переменная через facet или color encoding

Пример концептуальной модели:

{
  data: {
    sequence: {
      start: 0,
      stop: 10,
      step: 0.5,
      as: "x"
    }
  },
  transform: [
    {
      calculate: "sin(datum.x)",
      as: "y"
    },
    {
      calculate: "cos(datum.x)",
      as: "z"
    }
  ]
}

Роль sequence в построении вычислительных графов

Sequence часто выступает стартовой точкой графа вычислений:

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

Таким образом формируется поток: sequence → transform → encoding → mark

Этот поток лежит в основе большинства синтетических визуализаций Vega и Vega-Lite.