Как создать инструмент для DQ только на Python и Airflow?

от автора

Всем привет! Меня зовут Павел, я главный аналитик данных управления подготовки данных Банка.

В финтехе цена ошибки в данных может быть огромной, особенно когда объемы этих данных растут. У нас возникла задача мониторинга большой витрины на 1500 атрибутов, обновлением которой мы занимались. Вручную было просто невозможно отследить все изменения и проблемы, и нам пришлось разработать собственное решение.

Мы создали инструмент, который начинался как простое средство контроля для одной проблемной витрины, но со временем превратился в полноценную систему профилирования данных (его даже взяли на вооружение коллеги из стрима Data Quality).

В этой статье я расскажу, как мы создали самописный инструмент и библиотеку для проверок качества данных, используя только Python и Airflow, и какую пользу это принесло команде.

Описание базовой функции

Изначально работа инструмента строилась вокруг одной функции, которая берет данные за указанную дату (current_date), получает информацию обо всех полях витрины и для каждого поля запускает ряд SQL-запросов, которые высчитывают определенные показатели (метрики). На выходе мы получаем датафрейм, где в качестве строк — поля витрины, а в качестве столбцов — метрики.

Базовая функция производит расчет следующих метрик:

  • Количество строк

  • Количество заполненных ячеек

  • Количество пустых ячеек

  • Процент пустых ячеек

  • Количество уникальных значений

  • Минимальное значение

  • Максимальное значение

  • Медианное значение

  • Стандартное отклонение

  • Среднее значение

  • Сумму всех атрибутов

Отдельная функция считает и добавляет в результирующий датафрейм расчет перцентилей по 5, 25, 50, 75, 95% значений.

Перцентиль — это статистический показатель, который помогает понять, как распределены данные в группе. Он показывает, какой процент значений в наборе данных меньше или равен определенному значению.

Например, когда есть результаты теста 100 учеников, и нужно узнать, какой перцентиль занимает ученик с баллом 75. Если 80 из 100 учеников набрали баллы ниже 75, то 75 — это 80-й перцентиль. Это значит, что 80% учеников сдали тест хуже или на том же уровне с этим учеником.

Описание полного функционала

В конечном виде алгоритм работы инструмента имеет следующий вид:

  1. Запуск базовой функции для текущей даты;

  2. Запуск базовой функции для прошлой даты (довольно частая задача — понять, насколько сильно данные за текущую дату (current_date) отличаются от данных за предыдущую дату (comparison_date));

  3. Сравнение показателей метрик полей за текущую и прошлую дату (поднятие флагов отклонения);

  4. Запуск бэкапов;

  5. Расчет PSI и добавление его в результирующий датафрейм (Population Stability Index — это статистическая метрика, которая измеряет стабильность распределения переменной с течением времени, особенно важная для моделей кредитного скоринга и других финансовых моделей);

  6. Расчет историчности (все результаты мы складываем в одну таблицу с добавлением историчности срезов — это позволяет пересчитывать показатели, если данные за какой-то период поменялись, не теряя прошлых расчетов);

  7. Запись в итоговую таблицу.

Проверяются не только числовые значения — для строковых значений проверка идет по длине строки. Также реализована проверка дат.

Наш инструмент позволяет запускать цикличный расчет — когда мы сразу задаем несколько дат, и инструмент поочередно считает метрики по указанным датам.

Калибровка отклонений

Важный вопрос при сравнении показателей: как понять, что выявленный процент отклонения не является нормой?

Для решения этой проблемы мы создали дополнительный инструмент — расчет калибровочной таблицы. Это 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:

Визуализация показателей в Superset

Визуализация показателей в Superset

Можно выбирать отдельную таблицу и наблюдать за ее показателями.

Выводы

Для того, чтобы эффективно проверять качество данных, не обязательно использовать сложные коммерческие библиотеки или решения. Достаточно иметь под рукой Python и Airflow — инструменты, которые есть практически в каждой data-команде, и такие проверки можно реализовать самостоятельно.

Мы получили очень гибкий, легко разворачиваемый инструмент с подключаемой визуализацией, использовав для этого только Python и Airflow. Конечно, он не решает всех задач проверки данных, но позволяет значительно сузить область проверок, концентрируясь только на тех переменных, которые вышли за пороги доверительных интервалов. Это существенно экономит время аналитиков и повышает качество данных.


ссылка на оригинал статьи https://habr.com/ru/articles/896814/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *