Всем привет! Меня зовут Павел, я главный аналитик данных управления подготовки данных Банка.
В финтехе цена ошибки в данных может быть огромной, особенно когда объемы этих данных растут. У нас возникла задача мониторинга большой витрины на 1500 атрибутов, обновлением которой мы занимались. Вручную было просто невозможно отследить все изменения и проблемы, и нам пришлось разработать собственное решение.
Мы создали инструмент, который начинался как простое средство контроля для одной проблемной витрины, но со временем превратился в полноценную систему профилирования данных (его даже взяли на вооружение коллеги из стрима Data Quality).
В этой статье я расскажу, как мы создали самописный инструмент и библиотеку для проверок качества данных, используя только Python и Airflow, и какую пользу это принесло команде.
Описание базовой функции
Изначально работа инструмента строилась вокруг одной функции, которая берет данные за указанную дату (current_date), получает информацию обо всех полях витрины и для каждого поля запускает ряд SQL-запросов, которые высчитывают определенные показатели (метрики). На выходе мы получаем датафрейм, где в качестве строк — поля витрины, а в качестве столбцов — метрики.
Базовая функция производит расчет следующих метрик:
-
Количество строк
-
Количество заполненных ячеек
-
Количество пустых ячеек
-
Процент пустых ячеек
-
Количество уникальных значений
-
Минимальное значение
-
Максимальное значение
-
Медианное значение
-
Стандартное отклонение
-
Среднее значение
-
Сумму всех атрибутов
Отдельная функция считает и добавляет в результирующий датафрейм расчет перцентилей по 5, 25, 50, 75, 95% значений.
Перцентиль — это статистический показатель, который помогает понять, как распределены данные в группе. Он показывает, какой процент значений в наборе данных меньше или равен определенному значению.
Например, когда есть результаты теста 100 учеников, и нужно узнать, какой перцентиль занимает ученик с баллом 75. Если 80 из 100 учеников набрали баллы ниже 75, то 75 — это 80-й перцентиль. Это значит, что 80% учеников сдали тест хуже или на том же уровне с этим учеником.
Описание полного функционала
В конечном виде алгоритм работы инструмента имеет следующий вид:
-
Запуск базовой функции для текущей даты;
-
Запуск базовой функции для прошлой даты (довольно частая задача — понять, насколько сильно данные за текущую дату (current_date) отличаются от данных за предыдущую дату (comparison_date));
-
Сравнение показателей метрик полей за текущую и прошлую дату (поднятие флагов отклонения);
-
Запуск бэкапов;
-
Расчет PSI и добавление его в результирующий датафрейм (Population Stability Index — это статистическая метрика, которая измеряет стабильность распределения переменной с течением времени, особенно важная для моделей кредитного скоринга и других финансовых моделей);
-
Расчет историчности (все результаты мы складываем в одну таблицу с добавлением историчности срезов — это позволяет пересчитывать показатели, если данные за какой-то период поменялись, не теряя прошлых расчетов);
-
Запись в итоговую таблицу.
Проверяются не только числовые значения — для строковых значений проверка идет по длине строки. Также реализована проверка дат.
Наш инструмент позволяет запускать цикличный расчет — когда мы сразу задаем несколько дат, и инструмент поочередно считает метрики по указанным датам.
Калибровка отклонений
Важный вопрос при сравнении показателей: как понять, что выявленный процент отклонения не является нормой?
Для решения этой проблемы мы создали дополнительный инструмент — расчет калибровочной таблицы. Это SQL-скрипт, который берет данные за последние 12 дат, получает отклонения за эти даты, высчитывает среднее значение и заносит результат в отдельную таблицу. Эта таблица служит базой доверительных интервалов, на которую ориентируется инструмент профилирования на этапе поднятия флага отклонения. По сути, мы создали систему, которая «учится» на истории данных и определяет, какие отклонения считать нормальными, а какие требуют внимания.
Расчет запускается отдельно, отклонения в таблицу можно вносить и вручную на основании собственных наблюдений.
В конечном виде при расчете показателей за дату мы видим в таблице:
-
Все вышеперечисленные метрики + PSI и количество дубликатов;
-
Процент отклонения для каждой метрики;
-
Флаги отклонения, текстовое описание отклонений при поднятом флаге;
-
Поля версионирования (историчности).
Автоматизация
Описанная выше версия инструмента работает с Jupyter Notebook и требует указания параметров и ручного запуска. Однако для регулярного мониторинга данных требовалась автоматизация, позволяющая избежать ежедневного ввода параметров и ручного запуска.
Для этого мы использовали оркестратор Apache Airflow. Airflow позволяет определять последовательности выполнения задач (их называют DAG — Directed Acyclic Graph, или направленный ациклический граф) и автоматически запускать их по расписанию.
Мы реализовали два решения:
1. DAG со своей настроечной таблицей
В настроечной таблице указываются витрины для проверки, частота и даты обновления витрин, частота проверки метрик и отклонений, а также ряд технических параметров. DAG в процессе отработки получает информацию о витрине и, если она была обновлена, запускает для нее код инструмента профилирования. После расчета DAG автоматически обновляет информацию в настроечной таблице.
Таким образом, вы всего раз вносите в таблицу данные о витрине, и далее получаете уведомления о расчете метрик и отклонений для этой витрины каждый раз, когда она обновится.
2. Кастомный оператор в Airflow
Airflow позволяет создавать свои плагины (операторы) для расширения возможностей оркестратора, что мы и сделали. Оператор — это базовый компонент Airflow, который выполняет определенное действие, например запуск SQL-запроса, отправку письма или выполнение Python-функции.
Мы используем Airflow для автоматизации сборки витрин данных. После создания нашего кастомного оператора в существующий пайплайн сборки витрины можно встроить задачу, которая будет запускать код инструмента профилирования. После обновления витрины, помимо записи в таблицу результатов проверки, код в этой задаче будет формировать отчет в виде Excel-файла при наличии отклонений. Отчет будет автоматически отправляться на почту вместе с письмом-уведомлением о сборке витрины.
На этом этапе код инструмента превратился в отдельную библиотеку, так как нельзя было просто переиспользовать код в Airflow.
Гибкость и коробочное решение
На данном этапе мы имеем полноценный набор инструментов:
-
Инструмент профилирования данных для анализа качества;
-
DAG в Airflow для автоматического расчета метрик заданных витрин по расписанию;
-
Кастомный оператор в Airflow для встраивания расчета метрик конкретных витрин непосредственно в момент их сборки.
Настройки и адаптивность
При расчете реализована возможность выбора — нужно ли считать PSI, нужно ли считать перцентили. Расчеты этих метрик занимают больше времени и не всегда нужны.
Кроме того, для каждого вида расчета реализована возможность выбора БД — MS SQL или Impala. Можно проверять витрину и записывать результат в рамках одной БД, можно читать данные из одной БД и записывать результат в другую.
Инструмент легко дорабатывается и быстро разворачивается для отдельного подразделения за счет выноса изменяемой части кода (учетных данных подключений, списка метрик, некоторых запросов) в отдельный файл. Там же можно создать коннекторы и реализовать подключение к дополнительной БД.
Еще одним плюсом является то, что данные профайлинга универсальны и подходят для большинства подаваемых витрин, что позволяет автоматизировать процесс реализации технических проверок.
Пользовательский интерфейс
Чтобы работать было удобнее, мы сделали интерфейс на ipywidgets — это библиотека Python, которая позволяет создавать интерактивные элементы управления в Jupyter Notebook.
Первым этапом интерфейс дает выбор из всех возможных действий (были добавлены еще проверки):

На втором шаге можно открыть и увидеть интерфейс инструмента профилирования:

Визуализация результатов
К результирующей таблице данного инструмента можно подключить дашборд, чтобы получать более наглядный результат. Это сделали наши коллеги из DQ:

Можно выбирать отдельную таблицу и наблюдать за ее показателями.
Выводы
Для того, чтобы эффективно проверять качество данных, не обязательно использовать сложные коммерческие библиотеки или решения. Достаточно иметь под рукой Python и Airflow — инструменты, которые есть практически в каждой data-команде, и такие проверки можно реализовать самостоятельно.
Мы получили очень гибкий, легко разворачиваемый инструмент с подключаемой визуализацией, использовав для этого только Python и Airflow. Конечно, он не решает всех задач проверки данных, но позволяет значительно сузить область проверок, концентрируясь только на тех переменных, которые вышли за пороги доверительных интервалов. Это существенно экономит время аналитиков и повышает качество данных.
ссылка на оригинал статьи https://habr.com/ru/articles/896814/
Добавить комментарий