Форматы: JSON, CSV, TSV, DSV

В экосистеме Vega и Vega-Lite JSON выполняет двойную роль: он используется и как формат описания визуализации, и как контейнер для данных. Архитектура библиотек построена вокруг декларативного описания, где вся графика выражается через структурированный JSON-объект.

JSON-спецификация визуализации Vega

Vega использует строгую JSON-спецификацию, описывающую:

  • источники данных
  • преобразования
  • масштабы (scales)
  • оси (axes)
  • сигналы (signals)
  • примитивы отрисовки (marks)

Базовая структура выглядит как вложенный объект:

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": 400,
  "height": 200,
  "data": [
    {
      "name": "table",
      "values": [
        {"x": 1, "y": 28},
        {"x": 2, "y": 55},
        {"x": 3, "y": 43}
      ]
    }
  ],
  "marks": [
    {
      "type": "line",
      "from": {"data": "table"},
      "encode": {
        "enter": {
          "x": {"scale": "x", "field": "x"},
          "y": {"scale": "y", "field": "y"}
        }
      }
    }
  ]
}

Ключевой особенностью JSON в Vega является полная декларативность: описание не содержит императивной логики, а фиксирует структуру визуализации.

JSON в Vega-Lite

Vega-Lite является надстройкой над Vega, сокращающей сложность спецификаций. JSON остаётся основным форматом, но структура упрощается:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      {"category": "A", "value": 28},
      {"category": "B", "value": 55}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "category", "type": "nominal"},
    "y": {"field": "value", "type": "quantitative"}
  }
}

В отличие от Vega:

  • отсутствует явное описание scales и axes
  • визуальные элементы задаются через mark и encoding
  • JSON становится более «таблично-ориентированным»

Встроенные JSON-данные и внешние источники

JSON используется не только как формат спецификации, но и как способ передачи данных.

Inline JSON

Inline-данные задаются через массив объектов:

{
  "data": {
    "values": [
      {"year": 2020, "sales": 100},
      {"year": 2021, "sales": 150}
    ]
  }
}

Характерные особенности:

  • данные хранятся внутри спецификации
  • удобно для небольших наборов
  • не требует внешних запросов

JSON из внешнего источника

Vega и Vega-Lite поддерживают загрузку JSON через URL:

{
  "data": {
    "url": "data/sales.json"
  }
}

Дополнительно возможно указание формата:

{
  "data": {
    "url": "data/sales.json",
    "format": {
      "type": "json"
    }
  }
}

JSON в этом контексте является базовым типом, поскольку структура уже соответствует объектной модели JavaScript.


CSV как табличный формат данных

CSV (Comma-Separated Values) является одним из наиболее распространённых форматов для работы с табличными данными в Vega и Vega-Lite.

Базовая загрузка CSV

{
  "data": {
    "url": "data/sales.csv",
    "format": {
      "type": "csv"
    }
  }
}

CSV автоматически преобразуется в массив объектов, где первая строка обычно используется как заголовки полей:

year,sales
2020,100
2021,150

Результат интерпретации:

[
  {"year": "2020", "sales": "100"},
  {"year": "2021", "sales": "150"}
]

Типизация данных

CSV не содержит типов, поэтому Vega/Vega-Lite применяют преобразования:

{
  "data": {
    "url": "data/sales.csv",
    "format": {
      "type": "csv"
    }
  },
  "transform": [
    {
      "calculate": "toNumber(datum.sales)",
      "as": "sales_num"
    }
  ]
}

Особенности:

  • все значения изначально строки
  • требуется явное приведение типов
  • используется transform layer Vega/Vega-Lite

Ограничения CSV

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

TSV как табличный формат с табуляцией

TSV (Tab-Separated Values) является вариацией CSV, где разделителем выступает табуляция.

Использование TSV в Vega

{
  "data": {
    "url": "data/sales.tsv",
    "format": {
      "type": "tsv"
    }
  }
}

Пример данных:

year    sales
2020    100
2021    150

TSV имеет преимущества при работе с данными, содержащими запятые, поскольку табуляция редко встречается внутри значений.

Поведение парсинга

  • первая строка интерпретируется как заголовки
  • значения разделяются символом \t
  • результат аналогичен CSV по структуре

DSV как обобщённый формат разделителей

DSV (Delimiter-Separated Values) представляет собой универсальный формат, позволяющий задавать произвольный разделитель.

Общая структура DSV

{
  "data": {
    "url": "data/sales.dsv",
    "format": {
      "type": "dsv",
      "delimiter": "|"
    }
  }
}

Пример данных:

year|sales|region
2020|100|EU
2021|150|US

Гибкость DSV

DSV используется в случаях, когда:

  • стандартные CSV/TSV не подходят
  • данные содержат запятые и табуляции
  • требуется специфический формат экспорта из систем

Поведение парсинга

  • delimiter задаётся явно
  • структура результата аналогична CSV
  • типизация по умолчанию отсутствует

Сравнение JSON, CSV, TSV и DSV в контексте Vega

Структурные различия

  • JSON:

    • иерархическая структура
    • поддержка вложенных объектов и массивов
    • нативный формат для спецификаций Vega
  • CSV:

    • плоская таблица
    • фиксированный разделитель
    • высокая совместимость с BI-системами
  • TSV:

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

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

Поведение форматов в Vega-Lite data pipeline

Vega-Lite использует единый pipeline обработки данных:

  1. загрузка данных
  2. парсинг формата
  3. приведение типов
  4. трансформации
  5. маппинг через encoding

Пример единого pipeline для CSV

{
  "data": {
    "url": "data/sales.csv",
    "format": {"type": "csv"}
  },
  "transform": [
    {"calculate": "toNumber(datum.sales)", "as": "sales"}
  ],
  "mark": "line",
  "encoding": {
    "x": {"field": "year", "type": "temporal"},
    "y": {"field": "sales", "type": "quantitative"}
  }
}

Формат данных влияет только на этап парсинга, не затрагивая визуальную часть спецификации.


JSON как транспортный формат и как модель данных

В отличие от табличных форматов, JSON в Vega/Vega-Lite:

  • используется для передачи всей спецификации
  • может содержать данные и метаданные одновременно
  • поддерживает сложные структуры (иерархии, массивы, словари)

Смешанный подход

{
  "data": {
    "values": [
      {
        "category": "A",
        "metrics": {"sales": 100, "profit": 20}
      }
    ]
  }
}

Такой формат недоступен для CSV/TSV/DSV без потери структуры.


Типизация и нормализация данных в различных форматах

JSON

  • сохраняет типы (числа, строки, булевы значения)
  • поддерживает вложенные структуры
  • минимальная необходимость трансформаций

CSV / TSV / DSV

  • все значения приходят как строки
  • требуется явное приведение типов
  • используется слой transform Vega

Пример приведения:

{
  "transform": [
    {"calculate": "+datum.value", "as": "value_num"}
  ]
}

Особенности обработки форматов в Vega runtime

Vega runtime использует единый механизм загрузки данных:

  • fetch API для URL-источников
  • встроенные парсеры форматов
  • унифицированное представление dataset как массива объектов

Каждый формат проходит нормализацию:

Формат Результат
JSON объект/массив
CSV массив объектов
TSV массив объектов
DSV массив объектов

Роль форматов в архитектуре визуализации

Форматы данных в Vega/Vega-Lite определяют только один уровень системы — ingestion layer.

Далее система полностью независима от исходного формата:

  • scales работают с нормализованными значениями
  • marks оперируют field-based доступом
  • encoding использует унифицированную модель данных

Такое разделение позволяет:

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