Как вы справляетесь с отсутствующими данными с помощью numpy/scipy?

Одна из вещей, которые я рассматриваю в большинстве случаев очистки данных, - это отсутствие значений. R имеет дело с этой скважиной, используя метку "Нет данных". В python кажется, что мне придется иметь дело с масками массивов, которые, похоже, являются главной болью для настройки и, похоже, не документированы хорошо. Любые предложения по упрощению этого процесса в Python? Это становится нарушителем транзакций при переходе на Python для анализа данных. Благодаря

Обновить. Очевидно, прошло некоторое время, так как я просмотрел методы в модуле numpy.ma. Похоже, что по крайней мере основные функции анализа доступны для маскированных массивов, а приведенные примеры помогли мне понять, как создавать маскированные маски (спасибо авторам). Я хотел бы узнать, включает ли один из новых статистических методов в Python (разрабатываемый в этом году GSoC) этот аспект и, по крайней мере, делает полный анализ случаев.

Ответ 1

Если вы хотите рассмотреть библиотеку, pandas (http://pandas.pydata.org/) - это библиотека, построенная поверх numpy, которая среди многих других обеспечивает:

Интеллектуальное выравнивание данных и интегральная обработка отсутствующих данных: автоматическое выравнивание меток на основе вычислений и легко манипулирование грязными данными в упорядоченной форме

Я использую его почти год в финансовой индустрии, где недостающие и плохо выровненные данные являются нормой, и это действительно облегчило мою жизнь.

Ответ 2

Я также задаю вопрос с помощью маскированных массивов. Вот несколько примеров:

import numpy as np
data = np.ma.masked_array(np.arange(10))
data[5] = np.ma.masked # Mask a specific value

data[data>6] = np.ma.masked # Mask any value greater than 6

# Same thing done at initialization time
init_data = np.arange(10)
data = np.ma.masked_array(init_data, mask=(init_data > 6))

Ответ 3

Маскированные массивы - это ответ, как описывает DpplerShift. Для быстрого и грязного использования вы можете использовать фантастическую индексацию с булевыми массивами:

>>> import numpy as np
>>> data = np.arange(10)
>>> valid_idx = data % 2 == 0 #pretend that even elements are missing

>>> # Get non-missing data
>>> data[valid_idx]
array([0, 2, 4, 6, 8])

Теперь вы можете использовать valid_idx как быструю маску для других данных.

>>> comparison = np.arange(10) + 10
>>> comparison[valid_idx]
array([10, 12, 14, 16, 18])

Ответ 4

См. sklearn.preprocessing.Imputer

import numpy as np
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))  

Пример из http://scikit-learn.org/