Я использую numpy genfromtxt, и мне нужно определить как отсутствующие данные, так и неверные данные. В зависимости от пользовательского ввода я могу захотеть отбросить неверное значение или вызвать ошибку. По сути, я хочу рассматривать отсутствующие и неверные данные как одно и то же.
Скажем, у меня есть такой файл, где столбцы имеют типы данных date, int, float
date,id,value
2017-12-4,0, # BAD. missing data
2017-12-4,1,XYZ # BAD. value should be float, not string.
2017-12-4,2,1.0 # good
2017-12-4,3,1.0 # good
2017-12-4,4,1.0 # good
Я хотел бы обнаружить оба. Итак, я делаю это
dtype=(np.dtype('<M8[D]'), np.dtype('int64'), np.dtype('float64'))
result = np.genfromtxt(filename, delimiter=',', dtype=dtype, names=True, usemask=True, usecols=('date', 'id', 'value'))
И результат такой
masked_array(data=[(datetime.date(2017, 12, 4), 0, --),
(datetime.date(2017, 12, 4), 1, nan),
(datetime.date(2017, 12, 4), 2, 1.0),
(datetime.date(2017, 12, 4), 3, 1.0),
(datetime.date(2017, 12, 4), 4, 1.0)],
mask=[(False, False, True), (False, False, False),
(False, False, False), (False, False, False),
(False, False, False)],
fill_value=('NaT', 999999, 1.e+20),
dtype=[('date', '<M8[D]'), ('id', '<i8'), ('value', '<f8')])
Я думал, что весь смысл masked_array в том, что он может обрабатывать отсутствующие данные И неверные данные. Но здесь он обрабатывает только отсутствующие данные.
result['value'].mask
возвращается
array([ True, False, False, False, False])
Плохие данные на самом деле все равно попадали в массив, так как nan. Я надеялся, что маска даст мне True True False False False
.
Чтобы я понял, что у нас неправильное значение во 2-й строке, мне нужно выполнить дополнительную работу, например проверить наличие nan.
another_mask = np.isnan(result['value'])
good_result = result['value'][~another_mask]
Наконец, это возвращает
masked_array(data=[1.0, 1.0, 1.0],
mask=[False, False, False],
fill_value=1e+20)
Это работает, но я чувствую, что делаю что-то не так. Весь смысл maskedArray заключается в том, чтобы найти отсутствующие и неверные данные, но я каким-то образом использую его только для поиска недостающих данных. И мне нужен собственный чек, чтобы найти неверные данные. Чувствует себя уродливым и не питоническим.
Есть ли способ найти и то, и другое одновременно?
genfromtxt
. Я не могу ссылаться на это прямо сейчас, но не так давно я боролся с этим в другом SO. Кажется, что функция хорошо заполняет пропущенные значения. Менее ясно, полностью ли функциональна замаскированная часть или даже то, что она должна делать. Это плохо документировано - person hpaulj   schedule 15.12.2020nan
, а затем использованияnp.ma.masked_invalid
для маскировки всехnan
. Вы не получите ни одного брауни-поинта за выполнение всего вgenfromtxt
. - person hpaulj   schedule 15.12.2020MaskedArray
, вы должны указать, что нужно маскировать. Этот класс не имеет критерия маскирования по умолчанию.genfrontxt
не документирует использование этого флага. - person hpaulj   schedule 15.12.2020nan
- мое последнее средство. Причина, по которой мне не нравитсяnan
, заключается в том, чтоnan
может быть реальным числом. Но и строка, и пустое пространство являются примерами неверных значений. Я хотел бы различатьnan
и bad_values. Вот почему я подумал, что masked_array будет идеей. - person user3240688   schedule 15.12.2020