features.tabular

Табличные фичи для CatBoost-трека (батч и онлайн — одна функция на точку).

Точка прогноза — (tr_id, T). Все признаки строятся строго по данным, доступным на момент T:

  • телеметрия с event_time <= T (своя), очищенная clean_traffic;

  • плановое расписание (план известен заранее; факт time_fact_begin не используется вообще — в validate и на живом потоке его нет);

  • подсказка cur_dev_s.

Ключевая идея — фактические прибытия на пройденные остановки восстанавливаются из GPS (gps_history): ТС ближе всего к точке остановки, потом отъехало. Так получаем честную историю отклонений на момент T, одинаковую для train / test / validate / NDTP-потока.

Вторая идея — рейсы. Разрыв планового расписания > TRIP_GAP_S = конечная. Внутри рейса задержка соседних остановок коррелирует на ~0.96, через конечную — на ~0.02. Поэтому признаки «сколько конечных между T и целью» и «где цель внутри рейса» решают, можно ли доверять текущему отклонению.

Functions

build_features(points, traffic, schedule[, ...])

DataFrame признаков (index = sample_id) для набора точек; route_of — tr_id -> маршрут (для клонов).

clean_traffic(t)

Невалидные навигационные ячейки NDTP -> NaN; служебные значения speed/alt -> NaN; дубли пакетов убираем.

clone_sources(schedule_train)

Синтетические ТС (id >= 9_000_000) -> реальный прототип по совпадению последовательности адресов.

dist_m(lon1, lat1, lon2, lat2)

gps_history(tg, sg, T)

Прибытия на пройденные к моменту T «автоматические» остановки.

index_schedule(schedule)

index_traffic(traffic)

load_split(dataset_dir, split)

Точки, телеметрия и плановое расписание сплита (факт расписания отбрасывается).

make_tele(ts, lon, lat, speed[, valid])

Телеметрия одного ТС из массивов (онлайн-путь).

point_features(T, tgt_id, tgt_plan, cur_dev, ...)

Все признаки одной прогнозной точки.

tele_sec(values)

Время пакета в целых секундах с округлением вверх: пакет 03:35:00.5 позже T = 03:35:00 и в прогноз на этот момент не попадает (строгое event_time <= T).

to_sec(values)

Classes

Stops(id, plan, lon, lat, mf, trip, ...)

Tele(ts, lon, lat, speed)

class features.tabular.Stops(id: 'np.ndarray', plan: 'np.ndarray', lon: 'np.ndarray', lat: 'np.ndarray', mf: 'np.ndarray', trip: 'np.ndarray', idx_in_trip: 'np.ndarray', trip_len: 'np.ndarray', gap_prev: 'np.ndarray', cum_dist: 'np.ndarray')[исходный код]

Базовые классы: object

__init__(id: numpy.ndarray, plan: numpy.ndarray, lon: numpy.ndarray, lat: numpy.ndarray, mf: numpy.ndarray, trip: numpy.ndarray, idx_in_trip: numpy.ndarray, trip_len: numpy.ndarray, gap_prev: numpy.ndarray, cum_dist: numpy.ndarray) → None
cum_dist: numpy.ndarray
gap_prev: numpy.ndarray
id: numpy.ndarray
idx_in_trip: numpy.ndarray
lat: numpy.ndarray
lon: numpy.ndarray
mf: numpy.ndarray
plan: numpy.ndarray
trip: numpy.ndarray
trip_len: numpy.ndarray
class features.tabular.Tele(ts: 'np.ndarray', lon: 'np.ndarray', lat: 'np.ndarray', speed: 'np.ndarray')[исходный код]

Базовые классы: object

__init__(ts: numpy.ndarray, lon: numpy.ndarray, lat: numpy.ndarray, speed: numpy.ndarray) → None
lat: numpy.ndarray
lon: numpy.ndarray
speed: numpy.ndarray
ts: numpy.ndarray
features.tabular.build_features(points: pandas.DataFrame, traffic: pandas.DataFrame, schedule: pandas.DataFrame, route_of: dict | None = None) → pandas.DataFrame[исходный код]

DataFrame признаков (index = sample_id) для набора точек; route_of — tr_id -> маршрут (для клонов).

features.tabular.clean_traffic(t: pandas.DataFrame) → pandas.DataFrame[исходный код]

Невалидные навигационные ячейки NDTP -> NaN; служебные значения speed/alt -> NaN; дубли пакетов убираем.

features.tabular.clone_sources(schedule_train: pandas.DataFrame) → dict[int, int][исходный код]

Синтетические ТС (id >= 9_000_000) -> реальный прототип по совпадению последовательности адресов.

features.tabular.dist_m(lon1, lat1, lon2, lat2)[исходный код]
features.tabular.gps_history(tg: Tele, sg: Stops, T: int) → numpy.ndarray[исходный код]

Прибытия на пройденные к моменту T «автоматические» остановки.

Идём по остановкам в порядке маршрута; прибытие = минимум расстояния (< ARR_RADIUS_M) в окне [plan − WIN_EARLY_S, plan + WIN_LATE_S] ∩ (prev_arrival, T], после которого ТС отъехало на LEAVE_M. Возвращает массив строк (stop_pos, plan, delay, arrival, dwell).

features.tabular.index_schedule(schedule: pandas.DataFrame) → dict[int, Stops][исходный код]
features.tabular.index_traffic(traffic: pandas.DataFrame) → dict[int, Tele][исходный код]
features.tabular.load_split(dataset_dir: Path | str, split: str) → tuple[pandas.DataFrame, pandas.DataFrame, pandas.DataFrame][исходный код]

Точки, телеметрия и плановое расписание сплита (факт расписания отбрасывается).

features.tabular.make_tele(ts, lon, lat, speed, valid=None) → Tele[исходный код]

Телеметрия одного ТС из массивов (онлайн-путь). Те же правила очистки, что в clean_traffic.

features.tabular.point_features(T: int, tgt_id, tgt_plan: int, cur_dev: float, tg: Tele | None, sg: Stops) → dict[исходный код]

Все признаки одной прогнозной точки. Используется и в батче, и в онлайн-сервисе.

features.tabular.tele_sec(values) → numpy.ndarray[исходный код]

Время пакета в целых секундах с округлением вверх: пакет 03:35:00.5 позже T = 03:35:00 и в прогноз на этот момент не попадает (строгое event_time <= T).

features.tabular.to_sec(values) → numpy.ndarray[исходный код]