【问题标题】:Why is Pandas and Numpy producing different results for pairwise correlations with NaN?为什么 Pandas 和 Numpy 对与 NaN 的成对相关产生不同的结果?
【发布时间】:2016-03-11 05:50:53
【问题描述】:

我正在尝试为我正在构建的模型创建一个成对相关表,并且我的数据集中有一些 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?)谢谢

【问题讨论】:

  • 我没有遇到过这个,但为什么不检查一下文档:http://pandas.pydata.org/pandas-docs/stable/computation.html#computing-rolling-pairwise-covariances-and-correlationshttp://pandas.pydata.org/pandas-docs/stable/computation.html#computation-covariance-caveats
  • 在第一列使用不同的值。 [1,1,1] 的方差为零。或者查看协方差而不是相关系数(使用方差归一化为 1)。
  • 谢谢@roadrunner66,它解释了pandas确实跳过了np.nan值,但是如果它本质上是一个带有numpy NaN的numpy数组,为什么不是numpy?
  • 感谢@JohnE 对计算的澄清

标签: python numpy pandas


【解决方案1】:

NumPy 的默认行为是传播 NaN。也就是说,它对整个数组执行计算,并且每次将某些内容添加到 NaN(或乘以等),结果都是 NaN。这是合理的:如果 a = 5 且 b = NaN,则 a + b 应该是 NaN。因此,包含至少一个 NaN 的数组的方差为 NaN,该数组与任何其他数组的相关性也是如此。

pandas 以原始数据为导向的特性导致了不同的设计决策:它试图从不完整的数据中提取尽可能多的信息。特别是,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)。

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 2019-08-02
    • 1970-01-01
    • 2021-09-09
    • 2014-10-18
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多