Временные агрегации

Библиотека Kepler.gl строится вокруг идеи интерактивного анализа пространственно-временных данных, где время рассматривается не как дополнительный атрибут, а как полноценная ось измерения. Временные агрегации в этом контексте представляют собой механизм преобразования «сырых» событий с временной меткой в структурированные представления: интервалы, окна, бины и анимированные последовательности, позволяющие выявлять динамику процессов.

Основой временного анализа в Kepler.gl является наличие временного поля в датасете. Чаще всего это:

  • UNIX timestamp (миллисекунды или секунды)
  • ISO-строка даты и времени
  • числовой индекс временного шага (например, номер дня)

При загрузке данных библиотека выполняет автоматическое определение потенциальных временных колонок. Это становится фундаментом для дальнейших операций агрегации и фильтрации.

Ключевой момент: время в Kepler.gl не является просто фильтром, оно участвует в построении вычисляемых представлений слоёв (layers).

Временной фильтр как базовая форма агрегации

На уровне интерфейса и состояния приложения временная агрегация начинается с временного фильтра (Time Filter). Он задаёт:

  • диапазон времени (min/max)
  • текущий активный интервал
  • шаг дискретизации (time step)
  • режим анимации

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

Математическая модель окна

Для набора событий E и временного окна W(t, Δ):

  • t — текущее положение временного курсора
  • Δ — ширина окна

Фильтрация:

E_filtered = { e ∈ E | time(e) ∈ [t, t + Δ] }

Это базовая операция, на которой строятся все последующие агрегаты.

Дискретизация времени (time binning)

Следующий уровень временной агрегации — разбиение непрерывной шкалы времени на интервалы.

Поддерживаются типовые стратегии:

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

После разбиения каждый объект попадает в определённый временной слот:

bin_id = floor((time(e) - t0) / Δt)

Где:

  • t0 — начало временной шкалы
  • Δt — размер интервала

Агрегация точек по временным слоям

В слоях типа Point Layer и Screen Grid Layer временная агрегация реализуется через пересчёт геометрии в каждом временном шаге.

Point Layer

Временная агрегация здесь проявляется как:

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

При анимации происходит последовательная перестройка множества точек:

P(t) = { p ∈ P | t_start ≤ time(p) ≤ t }

Screen Grid Layer

Для экранной сетки временная агрегация приобретает форму пространственно-временного накопления:

  • каждая ячейка сетки агрегирует точки внутри себя
  • расчёт ведётся отдельно для каждого временного шага

Формально:

cell_value(t) = Σ weight(p), p ∈ cell ∧ time(p) ∈ W(t)

Это создаёт эффект «тепловой динамики» без явного построения heatmap.

Hexagon и H3 временные агрегаты

В слоях Hexagon Layer и H3 Hexagon Layer добавляется дополнительное измерение — пространственная индексация через гексагональную сетку.

Каждый временной шаг приводит к построению:

  • пространственного разбиения (hex bins)
  • временного среза
  • агрегированного значения внутри каждой ячейки

Комбинированная модель:

H(h, t) = Σ f(p), p ∈ h ∧ time(p) ∈ W(t)

Где:

  • h — гексагональная ячейка
  • t — временной шаг
  • f(p) — функция веса (count, sum, mean)

Таким образом формируется трёхмерная агрегация: широта, долгота, время.

Временные анимации как форма агрегации

Анимация в Kepler.gl не является визуальным эффектом поверх данных — это последовательная пересборка агрегированных состояний.

Каждый кадр анимации соответствует:

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

Модель можно описать как поток состояний:

State(t) → Aggregate(State(t)) → Render

Интерполяция между шагами

Для сглаживания переходов используется интерполяция:

  • линейная (для числовых значений)
  • пространственная (для координат)
  • дискретная (для категорий)

Пример линейной интерполяции:

v(t) = v1 + (v2 - v1) * α

где α — нормализованный коэффициент времени между двумя бинами.

Кумулятивные временные агрегаты

Отдельный класс представляют накопительные (cumulative) агрегации.

Вместо пересчёта «с нуля» для каждого шага используется наращивание состояния:

C(t) = C(t-1) + Δ(t)

Где Δ(t) — новые события в текущем временном интервале.

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

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

Временные агрегации в слоях Path и Trip

Для траекторных слоёв временная компонента становится основной.

Path Layer

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

path = sort(points, time)

Агрегация включает:

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

Trip Layer

В этом случае временная агрегация превращается в непрерывное движение объектов:

  • интерполяция между точками маршрута
  • расчёт позиции в момент t
  • синхронизация множества траекторий
position(t) = interpolate(p_i, p_{i+1}, t)

Оптимизация временных агрегаций

При больших объёмах данных ключевым становится вопрос производительности.

Используются подходы:

Предагрегация

  • вычисление бин-значений на этапе загрузки
  • хранение промежуточных агрегатов

Кэширование состояний

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

Инкрементальные обновления

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

Связь временной агрегации с deck.gl моделью

Kepler.gl построен поверх deck.gl, где временные агрегации реализуются как изменение props слоёв.

Каждый слой получает:

  • filtered data
  • aggregated attributes
  • animation state

и пересчитывается в GPU-пайплайне, что позволяет обрабатывать миллионы точек в реальном времени.

Многослойная временная агрегация

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

  • один слой может использовать 1-часовые бины
  • другой — 1-дневные интервалы
  • третий — непрерывную интерполяцию

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

Временная нормализация данных

Перед агрегацией часто выполняется нормализация временных значений:

  • приведение к UTC
  • унификация форматов
  • устранение пропусков
  • выравнивание по общей оси времени

Это обеспечивает корректную работу всех агрегирующих функций и предотвращает смещение временных интервалов.

Роль временной гранулярности

Гранулярность определяет качество агрегации:

  • высокая (секунды, минуты) — детализация событий
  • средняя (часы, дни) — тренды
  • низкая (месяцы, годы) — макроанализ

Изменение гранулярности фактически меняет характер агрегированного представления без изменения исходных данных.

Композиция временных функций

В сложных сценариях временные агрегации комбинируются:

  • фильтр окна + биннинг + кумулятивная агрегация
  • пространственная агрегация + временная интерполяция
  • мультислойные временные срезы

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