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. Сьюту сохраняйте тоже из него. Это обходной путь, но он эффективен и не требует хаков.