Смешанные типы данных в полях данных - PullRequest
0 голосов
/ 10 января 2019

Я пишу код, предназначенный для обнаружения ошибок индекса и отчета, обнаруженных в очень больших наборах данных. Я читаю в наборе данных (csv), используя pandas, создавая dataframe с десятками столбцов. Числовые ошибки просты, если преобразовать интересующий столбец в массив np и использовать базовое логическое выражение и функцию np.where. Бам!

Одна из ошибок, которую я ищу, это

неверный тип данных

Например, если столбец должен был представлять собой массив чисел с плавающей запятой, но по неосторожности была введена строка в середине всех поплавков. При преобразовании в массив np он ТОГДА преобразует все значения в строки и вызывает сбой логических выражений (как и следовало ожидать).

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

неверный тип данных

с записанными значениями. Затем он заменит значение на NaN, преобразует массив строк в первоначально запланированные значения с плавающей запятой и затем продолжит оценку числовых проверок ошибок.

Это можно было бы просто решить для циклов for с помощью нескольких операторов try / catch. Но быть новичком в питоне. Я надеюсь на более элегантное решение.

Есть предложения?

1 Ответ

0 голосов
/ 11 января 2019

Взгляните на большие ожидания , которые направлены на решение аналогичной проблемы. Обратите внимание, что пока они не реализуют свои expect_column_values_to_be_parseable_as_type, вы можете заставить столбец быть строкой и использовать вместо этого регулярное выражение для проверок. Например, скажем, у вас есть столбец с именем 'AGE' и вы хотите проверить его как целое число от 18 до 120

import great_expectations as ge

gf = ge.read_csv("my_datacsv",
                 dtype={
                     'AGE':str,
                 })

result = gf.expect_column_values_to_match_regex('AGE',
                                                r'1[8-9]|[2-9][0-9]',
                                                result_format={'result_format': 'COMPLETE'})

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

import numpy as np

@np.vectorize
def is_num(num):
    try:
        float(num)
        return True
    except:
        return False

A = np.array([1,2,34,'e',5])
is_num(A)

, который возвращает

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