Проверка статистических данных для pandas с помощью модуля pandera

Open in Colab

telegram

pandera - инструмент проверки данных, который предоставляет интуитивно понятный, гибкий и выразительный API для проверки структур данных pandas во время выполнения.

Начем с показательного примера:

Основные понятия pandera - schemas (схемы), schema components (компоненты схемы) и checks (чекеры).

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

Например, рассмотрим простой набор данных, содержащий данные о людях, где каждая строка - это человек, а каждый столбец - атрибут об этом человеке:

Изучив имена столбцов и значения данных, можем заметить, что возможно привнести некоторые знания о мире в предметную область, чтобы выразить наши предположения о том, что считать достоверными данными:

Проверка чекеров

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

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

Приведенное выше определение схемы устанавливает следующие свойства данных:

Отчеты об ошибках и отладка

Если фрейм данных, переданный в вызываемый объект схемы (schema), не проходит проверки, pandera выдает информативное сообщение об ошибке:

# данные, которые не проходят проверку:
invalid_dataframe = pd.DataFrame({
    "person_id": [6, 7, 8, 9],
    "height_in_feet": [-10, 20, 20, 5.1],
    "date_of_birth": pd.to_datetime([
        "2005", "2000", "1995", "2000",
    ]),
    "education": [
        "highschool", "undergrad", "grad", "undergrad",
    ],
})

checked_schema(invalid_dataframe)

Ошибка:

SchemaError: <Schema Column(name=height_in_feet, type=float)> failed element-wise validator 0:
<Check in_range: in_range(0, 10)>
failure cases:
   index  failure_case
0      0         -10.0
1      1          20.0

Причины ошибки SchemaError отображаются в виде фрейма данных, где индекс failure_case - это конкретное значение данных, которое не соответствует правилу проверки Check.in_range, столбец индекса содержит список местоположений индекса в недействительном фрейме данных с ошибочными значениями, а столбец count суммирует количество случаев сбоя этого конкретного значения.

Для более тонкой отладки аналитик может перехватить исключение с помощью шаблона try ... except для доступа к данным и случаям сбоя в качестве атрибутов в объекте SchemaError:

from pandera.errors import SchemaError

try:
    checked_schema(invalid_dataframe)
except SchemaError as e:
    print("Failed check:", e.check)
    print("\nInvalidated dataframe:\n", e.data)
    print("\nFailure cases:\n", e.failure_cases)

Таким образом, пользователи могут легко получить доступ и проверить недопустимый фрейм данных и случаи сбоя, что особенно полезно в контексте длинных цепочек методов преобразования данных:

raw_data = ... # получение сырых данных
schema = ... # определение схемы

try:
    clean_data = (
        raw_data
        .rename(...)
        .assign(...)
        .groupby(...)
        .apply(...)
        .pipe(schema)
    )
except SchemaError as e:
    # e.data будет содержать итоговый фрейм данных 
    # для вызова groupby().apply()
    ...

Расширенные возможности

Проверка гипотезы

Чтобы предоставить специалистам полнофункциональный инструмент проверки данных, pandera наследует подклассы от класса Check для определения Hypothesis с целью выражения проверок статистических гипотез.

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

Еще до сбора данных мы можем определить схему, которая выражает наши ожидания относительно положительного результата:

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

Другой распространенной проверкой гипотез может быть проверка нормального распределения выборки. Используя функцию scipy.stats.normaltest, можно написать:

Правила условной проверки

Если мы хотим проверить значения одного столбца, связанного с другим, мы можем указать имя другого столбца в аргументе groupby. Это изменяет ожидаемую сигнатуру функции Check для входного словаря, где ключи представляют собой уровни дискретных групп в условном столбце, а значения представляют собой объекты Series pandas, содержащие подмножества интересующего столбца.

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

Дополнительные материалы:

telegram