我正在尝试为我正在构建的模型创建一个成对关联表,并且我的数据集中有一些numpy.nan值(NAN)。出于某种原因,当我使用np.corrcoef()执行相关时,我得到的结果与使用pd.df.corr()不同:
例如:
dataset = np.array([[1,np.nan,np.nan,1,1],[1,np.nan,np.nan,3000,1]])
pandas_data = pd.DataFrame(dataset.transpose())
print np.corrcoef(dataset)
我得到了:
[[ nan nan]
[ nan nan]]
但是使用pandas数据帧我有一个结果:
print pandas_data.corr()
0 1
0 NaN NaN
1 NaN 1
他们处理NaN的方式有什么根本区别,或者我错过了什么? (另外,如果我有不同的值,为什么我的相关性为1?)谢谢
答案 0 :(得分:1)
NumPy的默认行为是传播NaN。也就是说,它使用整个数组执行计算,每次将某些内容添加到NaN(或乘以等)时,结果为NaN。这是合理的:如果a = 5且b = NaN,则a + b应为NaN。因此,包含至少一个NaN的数组的方差是NaN,因此该数组与任何其他数组的相关性也是如此。
大熊猫的原始数据导向性质导致不同的设计决策:它试图从不完整的数据中提取尽可能多的信息。特别是,设计corr
方法(和documented)以排除NaN。
要在NumPy中重现pandas行为,请使用如下的布尔掩码valid
:它要求列中没有NaN值。
dataset = np.array([[1, 2, 3, 4, np.nan], [1, 0, np.nan, 8, 9]])
valid = ~np.isnan(dataset).any(axis=0)
numpy_corr = np.corrcoef(dataset[:, valid])
pandas_data = pd.DataFrame(dataset.transpose())
pandas_corr = pandas_data.corr()
两种相关方法现在都返回相同的结果:
[[ 1. , 0.90112711],
[ 0.90112711, 1. ]])
对角线条目表示数组与自身的相关性,它始终为1(理论上;实际上它在机器精度范围内为1)。