顾名思义,我想知道在Python / pandas中计算协方差矩阵时是否有一种简洁的方法来处理丢失的数据。
考虑数据框

df = pd.DataFrame({'var1': [1,2,3, np.nan, 5, np.nan], 'var2': [1, 1.5, 2, 2.5, np.nan, 3.5]})


如果我们只是简单地执行np.cov(df.var1.dropna(), df.var2.dropna()),则将出现错误,因为第一和第二列中缺失值的数量不同。
我发现有两种解决方法:

rowind = list(set(df.var1.dropna().index).intersection(set(df.var2.dropna().index)))




rowind = (~np.isnan(data.resid1f1)) & (~np.isnan(data.resid1f2))


然后计算np.cov(df.loc[rowind, "var1"], df.loc[rowind, "var2"])。但是,我想知道是否某个内置函数可以以不太冗长的方式执行此操作。

最佳答案

呼叫dropna,然后呼叫cov

In [110]:
df.dropna().cov()

Out[110]:
      var1  var2
var1   1.0  0.50
var2   0.5  0.25


匹配np.cov

In [111]:
rowind = (~np.isnan(df.var1)) & (~np.isnan(df.var2))
np.cov(df.loc[rowind, "var1"], df.loc[rowind, "var2"])

Out[111]:
array([[ 1.  ,  0.5 ],
       [ 0.5 ,  0.25]])


这与df.cov不同,后者给出不同的结果,文档指出它排除了丢失的数据,但不清楚如何处理它们:

In [107]:
df.cov()

Out[107]:
          var1   var2
var1  2.916667  0.500
var2  0.500000  0.925


好的,只是弄清楚了上面的操作:

In [115]:
df.fillna(df.mean(axis=1)).cov()

Out[115]:
          var1   var2
var1  2.916667  0.500
var2  0.500000  0.925

关于python - 在numpy.cov中处理缺失观测值的简洁方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30733378/

10-10 16:56