Как рассчитать np.cov на матрице со значениями np.nan без преобразования в pd.DataFrame? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующее np.array:

my_matrix = np.array([[1,np.nan,3], [np.nan,1,2], [np.nan,1,2]])
array([[ 1., nan,  3.],
       [nan,  1.,  2.],
       [nan,  1.,  2.]])

Если я оцениваю np.cov, я получаю:

np.cov(my_matrix)
array([[nan, nan, nan],
       [nan, nan, nan],
       [nan, nan, nan]])

Но если ядолжны были вычислить это с pd.DataFrame.cov Я получаю другой результат:

pd.DataFrame(my_matrix).cov()
    0   1   2
0   NaN NaN NaN
1   NaN 0.0 0.000000
2   NaN 0.0 0.333333

Я знаю, что согласно pandas документации, они обрабатывают nan значения.

Мой вопрос: как я могу получить такой же (или похожий результат) с numpy?Или как обработать пропущенные данные при расчете ковариации с numpy?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать маскированные массивы Numpy .

import numpy.ma as ma
cv = ma.cov(ma.masked_invalid(my_matrix), rowvar=False)
cv
masked_array(
  data=[[--, --, --],
        [--, 0.0, 0.0],
        [--, 0.0, 0.33333333333333337]],
  mask=[[ True,  True,  True],
        [ True, False, False],
        [ True, False, False]],
  fill_value=1e+20)

Чтобы получить ndarray с заполненными значениями nan, используйте метод filled.

cv.filled(np.nan)
array([[       nan,        nan,        nan],
       [       nan, 0.        , 0.        ],
       [       nan, 0.        , 0.33333333]])

Обратите внимание, что np.cov по умолчанию создает попарные ковариации строк.Чтобы реплицировать поведение Панд (парные ковариации столбцов), вы должны передать rowvar=False ma.cov.

...