Короткий ответ
Добавьте проверки полноты, допустимых диапазонов, уникальности ключей и отклонений от исторических значений. Если критическая проверка не пройдена, остановите публикацию или пометьте отчёт для проверки и уведомите ответственного.
Как это работает подробнее
Проверяйте, что ожидаемые даты, аккаунты и кампании присутствуют, записи не дублируются, расход и клики неотрицательны, а отношения метрик лежат в допустимых пределах. Сравнивайте показатели с предыдущими периодами с учётом сезонности и порогов, специфичных для бизнеса.
- Уровни проверок. Выполняйте валидацию схемы и строк при загрузке, затем сверяйте агрегаты перед публикацией.
- Реакция. Классифицируйте предупреждения и блокирующие ошибки, назначьте владельца и сохраняйте причину отказа.
Пример кода
qa_checks.py
def validate(rows, expected_dates):
dates = {row["date"] for row in rows}
if not expected_dates.issubset(dates):
raise ValueError("Missing report dates")
keys = [(row["date"], row["campaign_id"]) for row in rows]
if len(keys) != len(set(keys)):
raise ValueError("Duplicate campaign-day rows")
if any(row["spend"] < 0 or row["clicks"] < 0 for row in rows):
raise ValueError("Invalid negative metric")Что использовать на практике
- Калибруйте пороги. Учитывайте сезонность, задержку конверсий и нормальные колебания объёма до введения автоматических блокировок.
- Отслеживайте качество. Храните результаты проверок по запускам, чтобы видеть повторяющиеся источники проблем.
Подводные камни
- Ложные тревоги. Один глобальный порог для всех кампаний может блокировать нормальную волатильность.
- Тихая публикация. Не заменяйте отсутствующие данные нулём без явной маркировки; это скрывает сбой источника.