如何在不转换为pd.DataFrame的情况下,在具有np.nan值的矩阵上计算np.cov?

时间:2018-12-12 19:49:18

标签: python python-3.x pandas numpy covariance

我有以下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 :(得分:4)

您可以使用Numpy的masked arrays

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