Errors
Great Expectations

Great Expectations: Great Expectations expect column to contain only integers fails for all rows when only one is bad

Ты загружаешь CSV, пишешь простую проверку в Great Expectations — `expect_column_values_to_be_of_type('age','int')` — и готовишься увидеть аккуратную ошибку для

Ты загружаешь CSV, пишешь простую проверку в Great Expectations — expect_column_values_to_be_of_type('age','int') — и готовишься увидеть аккуратную ошибку для одной строки. Вместо этого получаешь оглушительный провал по всему столбцу: 100% данных не соответствуют ожиданию. Знакомое чувство, когда инструмент делает ровно то, что ты просил, но совсем не то, что ты имел в виду.

Всё дело в том, как pandas, на котором построен GE, читает данные. Столбец с одним нечисловым значением — например, символом ‘' — автоматически получает тип object. Проверка expect_column_values_to_be_of_typeработает честно: она смотрит на фактический тип данных каждого элемента в pandas Series. И если весь столбец прочитан какobject, то каждый элемент в нём — это Python-строка (str`), даже те, что выглядят как числа.

Поэтому проверка и падает на всех записях. Она не проверяет, можно ли значение преобразовать в integer, она проверяет, является ли оно integer прямо сейчас. А это не так.

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

Вот как это работает:

import great_expectations as ge

my_df = ge.read_csv("bad.csv")
pattern = r'^\d+$'
result = my_df.expect_column_values_to_match_regex('age',
                                                   pattern,
                                                   result_format={'result_format': 'COMPLETE'})

# Посмотреть на проблемные значения
print(result['result']['unexpected_list'])
print(result['result']['unexpected_index_list'])

В результате получится детальный отчёт, который чётко укажет на строку с символом ‘`’ как на несоответствующую. Упадет только она, а корректные числа пройдут проверку.

Если нужно разрешить знак плюса или минуса перед числом, шаблон можно адаптировать: pattern = r'^[+-]?\d+$'.

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