Errors
Great Expectations

Great Expectations: How to run Great Expectations expectations on multiple columns?

Нужно прогнать один и тот же набор проверок Great Expectations по десятку колонок. Ручками копипастить expectation на каждую — не наш метод. Тем более когда кол

Нужно прогнать один и тот же набор проверок Great Expectations по десятку колонок. Ручками копипастить expectation на каждую — не наш метод. Тем более когда колонки нужно ещё и отфильтровать по имени, как в случае с class id для моделей компьютерного зрения.

Встроенного expect_columns_to_... для такого сценария нет — старый тикет в GitHub закрыт, но фичу не добавили. Придется делать самим.

Ключ в понимании того, с чем вы работаете. batch в контексте PandasDataset — это не просто абстракция. Это наследник pandas.DataFrame. Проверить можно через type(batch).

А раз так, то к нему применимы все методы pandas. Включая filter() для отбора колонок по паттерну, например, filter(like='class_id_'). Документация Great Expectations про это молчит, но это работает.

Фильтруете колонки в цикле, но само ожидание выполняете на оригинальном batch, передавая в него имя отфильтрованной колонки. Примерный подход:

columns_to_check = [col for col in batch.columns if 'class_id_' in col]
for column in columns_to_check:
    batch.expect_column_values_to_be_between(
        column=column,
        min_value=0,
        max_value=1
    )

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

Главный подводный камень — не пытайтесь запустить expectation на отфильтрованном датафрейме. Вызов batch.filter() вернет вам обычный pandas.DataFrame, а не PandasDataset. У него нет метода save_expectation_suite().

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

Итог: фильтруйте колонки через batch.filter() или list comprehension, но в expectation передавайте имя колонки и оригинальный batch. Сьюту сохраняйте тоже из него. Это обходной путь, но он эффективен и не требует хаков.