Руководство по проверке DataFrames с помощью Pytest.

В прошлый раз мы говорили о Pydantic как о библиотеке для анализа json-подобных данных, поступающих из источников API во время выполнения. Сегодня мы хотим кратко представить, как вы можете проверить свои кадры данных с помощью Pytest. Согласно официальной документации, Pytest — это библиотека для тестирования Python, которая упрощает написание небольших тестов, но масштабируется для поддержки сложного функционального тестирования приложений и библиотек. . Этот шаг проверки важен, так как обычно вы хотите убедиться, что данные правильно преобразованы, прежде чем сохранять их в базе данных, и это обычно происходит на уровне фреймов данных для структурированных таблиц данных, а не структур json непосредственно из API.

Когда следует проверять данные:

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

1. Проверка данных должна проводиться как можно раньше и как можно чаще.

2. Проверка данных должна выполняться всеми разработчиками данных, включая разработчиков, которые подготавливают данные (инженер данных), и разработчиков, которые используют данные (аналитик данных или специалист по данным).

3. Проверка данных должна выполняться как для ввода данных, так и для вывода данных.

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

Тестирование источника данных:

Мы используем тот же источник данных, Ipstack, для продолжения нашего предыдущего поста, в котором основное внимание уделяется получению данных из API перед преобразованием данных. Из Ipstack, который представляет собой API, предоставляющий геолокационные и идентификационные данные для IP-адресов.

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

https://ipstack.com/

Пример ответа от API:

Что проверять:

1. Проверьте фрейм данных, чтобы проверить наличие повторяющихся строк. Если да, провалите тест. Если нет, то тест проходит успешно.

2. Проверьте типы данных каждого столбца фрейма данных. Если типы данных не совпадают, тест проваливается. Если они все совпадают, то тест считается успешным.

3. Проверьте, содержит ли кадр данных все необходимые столбцы. Если нет, провалите тест. Если да, то тест прошел успешно.

Как это настроить:

$ pip install pytest

В тестовом файле вы хотели бы импортировать модуль со следующим оператором импорта. Обратите внимание, что имя вашего тестового файла должно начинаться с «test», чтобы Pytest распознал его.

#test_pytest_example.py file name has to follow test*
import pytest

Мы также хотим создать нашу предварительную пошаговую функцию, чтобы получать кадры данных для наших тестов. Обратите внимание, что мы получаем данные непосредственно из классов Pydantic, что помогло нам проанализировать и проверить данные из API. Проверьте предыдущее сообщение, если хотите узнать, как определяются эти классы Pydantic.

Компоненты теста:

Как правило, тест включает в себя следующие компоненты:

  1. Предварительные шаги: необходимые шаги для сбора данных для подачи в фикстуры pytest. Здесь вы можете написать свои собственные шаги для сбора данных.
  2. Pytest Fixture: этап настройки для вызова вашей тестовой функции. Фикстура Pytest представлена ​​декоратором @pytest.fixture.
  3. Тестовая функция: фактическая функция, которая включает в себя приспособление Pytest и оператор утверждения для выполнения теста.

Как создавать тесты:

#1. Validate if there are any duplicated rows. If yes, fail the test. If not, then the test succeeds.

Чтобы оценить, есть ли повторяющиеся строки, мы можем получить фрейм данных, который будет содержать повторяющиеся строки. И тогда мы можем оценить, пуст ли фрейм данных. Поэтому мы пишем pytest.fixture, чтобы получить дублированный кадр данных. А затем мы передаем это фактической тестовой функции, чтобы оценить, пуста ли она, с помощью инструкции assert.

Примечание. Так же, как и в имени файла, фактические тестовые функции должны называться с «test» в начале.

#2. Validate data types of each column of the dataframe. If data types don’t match, fail the test. If they all match, then the test succeeds.

Чтобы проверить типы данных каждого столбца фрейма данных, мы можем использовать атрибут pd.DataFrame.dtypes и преобразовать его в словарь. И затем мы можем оценить, соответствует ли этот словарь типам данных из потенциальной базы данных, которую мы настроили.

3. Validate if the dataframe contains all the columns needed. If not, fail the test. If yes, then the test succeeds.

Чтобы проверить, содержит ли кадр данных все столбцы, которые нам нужны для правильной отправки этого кадра данных в базу данных, мы можем просто оценить, соответствует ли pd.DataFrame.columns.tolist() списку столбцов, которые мы в настоящее время используем для базы данных. Опять же, фактический тест выполняется с оператором assert.

Выполнение тестов:

Вы можете запустить тест, выполнив следующую команду. Обратите внимание, что имя файла должно начинаться с «test», чтобы pytest распознавал его.

$pytest test_pytest_example.py

Как видите, все мои тесты прошли успешно!

Но как узнать, обнаруживают ли мои тесты недопустимые кадры данных?

Подтверждение тестов:

Давайте настроим тесты, чтобы подтвердить, что они могут проверять неправильные кадры данных.

Давайте добавим дублированный IP-адрес «162.83.220.50», чтобы подтвердить, работает ли первый тест.

Давайте изменим схему базы данных на объекты или строки, чтобы убедиться, что второй тест работает:

Давайте удалим поле из списка database_schema_columns, чтобы убедиться, что третий тест работает:

А затем снова запустим тесты:

Большой. Первый тест завершился неудачно с ошибкой утверждения. Как мы знаем, мы ввели дублированный IP-адрес. Поэтому дублированный фрейм данных больше не пуст, поэтому тест не проходит.

Второй тест также провалился, как и ожидалось, так как теперь словарь database_schema_data_types больше не соответствует типам данных выходного фрейма данных.

Наконец, третий тест также провалился, как и ожидалось, так как теперь столбцы выходного фрейма данных больше не соответствуют списку database_schema_column.

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

Надеюсь, вы найдете это полезным! Спасибо, что прочитали совет этой недели!

Ознакомьтесь с другими советами по работе с данными на Dataproducts.io.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.