Большие ожидания ожидают, что столбец, содержащий только целые числа, завершится сбоем для всех строк, если только одна плохая - PullRequest
0 голосов
/ 31 октября 2018

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

Файл, который я использую, содержит только целые числа в столбце возраста, за исключением одной строки, в которой вместо этого есть символ «». Это то, что я хочу, чтобы ожидания уловили. Я также проверил файл .csv в текстовом редакторе и могу подтвердить, что возраст в столбце возраста не заключен в кавычки.

Однако ожидание не выполняется на 100% данных. Я думаю, это потому, что pandas читает столбец как тип объекта (то есть строку) из-за одной неверной строки. Я могу предварительно обработать это, используя что-то вроде .astype(int), потому что в этой строке произойдет сбой. А завертывание .astype(int) в try блоке полностью уничтожит цель использования больших ожиданий для этого.

Вот минимальный рабочий пример:

good.csv:

age,name
34,Fred
22,Bob
54,Mary

bad.csv:

age,name
34,Fred
`,Bob
54,Mary

Код:

import great_expectations as ge

df = ge.read_csv("./good.csv");
my_df.expect_column_values_to_be_of_type('age','int')

df = ge.read_csv("./bad.csv");
my_df.expect_column_values_to_be_of_type('age','int')

Первый случай возвращает

{'success': True,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 0,
  'unexpected_percent': 0.0,
  'unexpected_percent_nonmissing': 0.0,
  'partial_unexpected_list': []}}

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

{'success': False,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 3,
  'unexpected_percent': 1.0,
  'unexpected_percent_nonmissing': 1.0,
  'partial_unexpected_list': ['34', '`', '54']}}

Так что, я думаю, я ожидаю что-то вроде этого:

{'success': False,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 1,
  'unexpected_percent': 0.33,
  'unexpected_percent_nonmissing': 1.0,
  'partial_unexpected_list': ['`']}}

Есть ли что-то, что я делаю неправильно, или пакет просто не способен на это?

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

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

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'})

result
# In my case I'm only interested in where it went wrong
# print(result['result']['unexpected_list'])
# print(result['result']['unexpected_index_list'])

, что дает:

{'success': False,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 1,
  'unexpected_percent': 0.3333333333333333,
  'unexpected_percent_nonmissing': 0.3333333333333333,
  'partial_unexpected_list': ['`'],
  'partial_unexpected_index_list': [1],
  'partial_unexpected_counts': [{'value': '`', 'count': 1}],
  'unexpected_list': ['`'],
  'unexpected_index_list': [1]}}

Обратите внимание: если вы хотите разрешить начальное + или - вам нужно изменить шаблон на:

pattern = r'^[+-]?\d+$'
0 голосов
/ 31 октября 2018

Это ошибка, которая известна, но еще не устранена (по состоянию на 9/2018):

https://github.com/great-expectations/great_expectations/issues/110

Разработчики активно работают над улучшением поведения:

  1. pect_column_values_to_be_of_type (текущее ожидание) было очищены до сих пор быть ближе к тому, что мы думаем, люди ожидают, и мы планируем переименовать его в ожидаемую колонку

  2. Мы планируем ввести новое ожидание wait_column_values_to_be_parseasble_as_type, который принимает: string, float, int, bool (другие?) и фокусируется на более семантическом осмысленное понимание типа (то есть, если значение является строкой, но строка "1.0", тогда она будет передаваться как string, float и int).

И, надеюсь, скоро будут результаты:

Начинается реализация 1 и 2, но мы все еще открыты для предложений ...

0 голосов
/ 31 октября 2018

Проблема в том, что ваши значения на самом деле не являются целыми числами, это строки. Когда вы читаете свой CSV с помощью great_expectations.read_csv(), он использует pandas.read_csv() для внутреннего использования, что по умолчанию для данных в вашем age column соответствует строкам из-за ´.

Метод expect_column_values_to_be_of_type() является очень простым, то есть он будет проверять, является ли ваше значение тем типом, который вы ищете (isinstance()), а не «может» ли это тип.

0 голосов
/ 31 октября 2018

Я не в курсе great_expectations, но вы можете решить это в пандах, просто используя это,

print df[pd.to_numeric(df['age'].fillna(0),errors='coercs').isnull()]['age'].tolist()

Выход для good.csv

[]

Вывод для bad.csv

['`']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...