impute: заполнение пропущенных значений

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


Механизм работы impute

Трансформация impute работает в два этапа:

  1. Формируется полный набор значений ключевого поля (domain ключа).
  2. Для отсутствующих комбинаций создаются новые записи.
  3. Значения вычисляются по выбранному методу или фиксированной логике.

Ключевыми параметрами являются:

  • field — поле, значение которого требуется заполнить
  • key — поле, определяющее ось или последовательность (например, дата, индекс)
  • groupby — разбиение на независимые серии (например, по категориям)
  • method — способ вычисления пропуска
  • value — фиксированное значение при методе "value"
  • keyvals — полный список допустимых значений ключа

Базовая структура трансформации

{
  "transform": [
    {
      "impute": "value",
      "field": "value",
      "key": "date"
    }
  ]
}

Такое определение создаёт недостающие значения по оси date и заполняет их указанным методом.


Заполнение фиксированным значением

Метод "value" используется для простого восстановления данных, когда отсутствие значения интерпретируется как ноль или константа.

{
  "data": { "name": "dataset" },
  "transform": [
    {
      "impute": "value",
      "field": "sales",
      "key": "date",
      "value": 0
    }
  ],
  "mark": "line",
  "encoding": {
    "x": { "field": "date", "type": "temporal" },
    "y": { "field": "sales", "type": "quantitative" }
  }
}

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


Импутация средним значением

Метод "mean" заменяет пропуски средним значением по доступным наблюдениям в пределах группы.

{
  "transform": [
    {
      "impute": "value",
      "field": "temperature",
      "key": "day",
      "method": "mean"
    }
  ]
}

Аналогично доступны:

  • "median" — устойчив к выбросам
  • "min" — минимальное наблюдаемое значение
  • "max" — максимальное наблюдаемое значение

Такие методы особенно полезны при восстановлении временных рядов с шумом.


Группировка серий (groupby)

При работе с несколькими категориями важно разделять независимые ряды, чтобы значения не смешивались между группами.

{
  "transform": [
    {
      "impute": "value",
      "field": "value",
      "key": "date",
      "groupby": ["category"],
      "method": "mean"
    }
  ]
}

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


Полный домен ключа (keyvals)

По умолчанию Vega-Lite формирует ключи на основе существующих данных. Однако для корректного заполнения временных рядов требуется явное определение диапазона.

{
  "transform": [
    {
      "impute": "value",
      "field": "sales",
      "key": "date",
      "keyvals": { "signal": "sequence(datum.start, datum.end, 86400000)" },
      "method": "value",
      "value": 0
    }
  ]
}

keyvals позволяет:

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

Импутация временных рядов

Наиболее частый сценарий — восстановление ежедневных или ежемесячных данных.

{
  "data": { "name": "sales_data" },
  "transform": [
    {
      "timeUnit": "yearmonthdate",
      "field": "date",
      "as": "date"
    },
    {
      "impute": "sales",
      "field": "sales",
      "key": "date",
      "groupby": ["product"],
      "method": "value",
      "value": 0
    }
  ],
  "mark": "line",
  "encoding": {
    "x": { "field": "date", "type": "temporal" },
    "y": { "field": "sales", "type": "quantitative" },
    "color": { "field": "product", "type": "nominal" }
  }
}

Особенность таких схем заключается в предварительном приведении даты к дискретной шкале через timeUnit, что обеспечивает корректное определение пропусков.


Комбинация impute и aggregate

Импутация часто применяется до агрегации или после неё, в зависимости от задачи.

Схема до агрегации:

  • восстановление ряда
  • последующее суммирование или усреднение

Схема после агрегации:

  • агрегирование данных
  • заполнение отсутствующих групп

Поведение при отсутствующих группах

Если комбинация key + groupby отсутствует в данных, Vega-Lite создаёт новую запись. Значение поля field определяется:

  • методом value
  • агрегатной функцией (mean, median, min, max)
  • либо остаётся null, если параметры не заданы

Особенности вычисления mean/median

При использовании статистических методов вычисление происходит по текущей группе данных:

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

Это делает impute детерминированной трансформацией, не зависящей от порядка входных данных.


Импутация и временные интервалы

При работе с временными рядами важно учитывать:

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

Типичная ошибка — применение impute без нормализации временной оси. В таких случаях необходимо предварительное преобразование через timeUnit, иначе ключи не будут совпадать.


Поведение при множественных полях

Если визуализация содержит несколько измеряемых полей, impute применяется только к одному field. Остальные значения:

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

Ограничения трансформации

Impute не выполняет интерполяцию в математическом смысле. Отсутствующие значения:

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

Для линейной интерполяции требуется комбинация:

  • impute
  • window трансформации с frame

Связка impute и window

Для более сложного восстановления используется следующий паттерн:

  • impute создаёт структуру без пропусков
  • window вычисляет скользящие значения
{
  "transform": [
    {
      "impute": "value",
      "field": "value",
      "key": "date",
      "groupby": ["series"],
      "value": 0
    },
    {
      "window": [
        {
          "op": "mean",
          "field": "value",
          "as": "smoothed"
        }
      ],
      "frame": [-2, 2]
    }
  ]
}

Поведение в больших наборах данных

При значительных объёмах данных эффективность impute зависит от:

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

Расширение key domain через keyvals может существенно увеличить количество генерируемых строк, что влияет на производительность последующих этапов pipeline.


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

  • восстановление временных рядов продаж
  • заполнение пропусков сенсорных измерений
  • нормализация дискретных событий по календарю
  • подготовка данных для line chart и area chart
  • унификация категориальных последовательностей в панелях сравнения