Короткий ответ
Единственного правильного решения нет: набор проверок можно выстроить вокруг нескольких уровней — структурные инварианты (схема, типы), статистические инварианты (диапазоны значений, доля пропусков) и бизнес-инварианты (сумма метрики не может упасть ниже определённого порога без алерта) — но чем больше проверок, тем выше стоимость их поддержки и риск ложных срабатываний.
Как это работает подробнее
структурные проверки (наличие и тип ожидаемых столбцов, отсутствие дублей по ключу) дёшевы и редко ложно срабатывают; статистические проверки (диапазон значений, резкое изменение доли пропусков день к дню) более информативны, но требуют настройки разумных порогов, которые со временем могут устаревать; бизнес-инварианты (например, "сумма выручки не должна отличаться от вчерашней более чем на X% без видимой причины") самые ценные для раннего обнаружения проблем, но и самые сложные в калибровке.
Пример кода
import pandas as pd
def validate_daily_report(df: pd.DataFrame, prev_total: float) -> list:
issues = []
if df['order_id'].duplicated().any():
issues.append('Duplicate order_id found')
if df['amount'].isna().mean() > 0.05:
issues.append('Too many missing amounts')
current_total = df['amount'].sum()
if prev_total and abs(current_total - prev_total) / prev_total > 0.3:
issues.append(f'Total changed too much: {prev_total} -> {current_total}')
return issuesЧто использовать на практике
- На практике. разумно начинать с дешёвых структурных проверок на каждом шаге пайплайна и постепенно добавлять статистические/бизнес-проверки только в тех местах, где уже случались или наиболее вероятны реальные инциденты, не пытаясь сразу покрыть все возможные сценарии; результаты проверок стоит логировать отдельно от самого отчёта, чтобы можно было анализировать, какие проверки чаще всего срабатывают и насколько они полезны.
- Проверка. функцию можно прогнать на синтетических данных с намеренно внесёнными проблемами (дубликат order_id, резкий скачок amount) и убедиться, что соответствующий issue действительно появляется в списке, а на "нормальных" данных список остаётся пустым.
Подводные камни
- Частые ошибки. строят слишком жёсткие статистические пороги без учёта естественной волатильности метрики (сезонность, выходные), что приводит к частым ложным алертам и постепенному игнорированию всей системы проверок командой; или не инвестируют в проверки вообще, полагаясь на то, что проблемы будут замечены вручную при чтении отчёта, что работает плохо на масштабе и при автоматизации.