Как искать и исправлять проблемы в данных с временными интервалами и дефолтными значениями
Что проверяют
Умеете ли вы заметить данные, которые выглядят правдоподобно, но врут: пропусков нет, потому что вместо них стоят заглушки, а интервалы пересекаются. Следом обычно спрашивают, как вы встроите такие проверки в пайплайн, чтобы проблема не вернулась.
Как отвечать
Начните с того, что искать, а потом как:
- даты-заглушки:
1970-01-01,1900-01-01,9999-12-31вместо «неизвестно» или «бессрочно». Ловятся частотой:value_counts()по дате или пик на гистограмме; - дефолты в числах и строках:
0,-1,'unknown', пустая строка. Признак тот же: одно значение встречается аномально часто или приходит от одного источника; - время загрузки вместо времени события: колонка с
DEFAULT now()показывает, когда строка попала в базу, а не когда случилось событие; - интервалы:
valid_from >= valid_to, пересечения версий одной сущности и дыры между ними. В SQL проверяется оконнымиLAG/LEADпо ключу, в pandas сортировкой иshift(); - пропуски во временном ряду: сравните с полной сеткой через
pd.date_rangeиreindexилиgenerate_seriesв PostgreSQL; - часовые пояса: смесь UTC и локального времени, двойные и пропавшие часы при переходе на летнее время. Приводите всё к UTC через
tz_localize/tz_convert.
Исправление идёт в два шага. Сначала заглушки превращаются в NaN/NULL, чтобы честно увидеть масштаб пропусков. Потом решение по смыслу: восстановить из источника, заполнить (ffill для состояния, интерполяция для плавных величин), пометить флагом или выбросить. Проверки закрепляются тестами в dbt, Great Expectations или pandera, иначе через месяц всё повторится.
Где спотыкаются
Считают заглушку настоящим значением. Даты рождения 1900-01-01 дают клиентов по 126 лет, и средний возраст тихо уезжает вверх.
Заполняют пропуски до разбиения на train и test или интерполяцией, которая берёт соседнюю точку из будущего. В прогнозной задаче это прямая утечка.
Сразу предлагают модель для восстановления значений, не выяснив, откуда дефолт взялся. Часто это баг выгрузки, который чинится одной правкой у источника.