顾名思义,我想知道在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"])
。但是,我想知道是否某个内置函数可以以不太冗长的方式执行此操作。 最佳答案
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/