1. 返回值为空的情况

出现返回值为空的情况是因为数据的类型不是数值型。用data.info()函数可以查看dataframe的信息。这里举个例子:

###创建一个dataframe,数据类型为object
data = pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c'],dtype=object)

data
Out[23]: 
   a  b  c
0  1  2  3
1  4  5  6

可以看到data的数据类型为object,使用data.corr()计算相关系数返回的值为空。

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
a    2 non-null object
b    2 non-null object
c    2 non-null object
dtypes: object(3)
memory usage: 128.0+ bytes

data.corr()
Out[25]: 
Empty DataFrame
Columns: []
Index: []

用data.apply(lambda x:x.astype(float))将数据的类型改为数值型, 记得要把结果赋值给一个新的变量,否则不会改变数据的类型。然后返回值就不为空了。

data = data.apply(lambda x:x.astype(float))

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
a    2 non-null float64
b    2 non-null float64
c    2 non-null float64
dtypes: float64(3)
memory usage: 128.0 bytes

data.corr()
Out[39]: 
     a    b    c
a  1.0  1.0  1.0
b  1.0  1.0  1.0
c  1.0  1.0  1.0

2. 返回值为NaN的情况

出现返回值存在NaN的一种情况是因为dataframe里面存在一列的值全为一样的,我们再来举一个?,特征a的值全为0:

data = pd.DataFrame([[0,2,9],[0,6,8]],columns=['a','b','c'])

data
Out[44]: 
   a  b  c
0  0  2  9
1  0  6  8

data.corr()
Out[45]: 
    a    b    c
a NaN  NaN  NaN
b NaN  1.0 -1.0
c NaN -1.0  1.0

这个是因为corr()函数调用了get_corr_func(),然后get_corr_func()调用了scipy/stats/spearmanr(),

然后spearmanr()调用了numpy/corrcoef (), 在这个函数里面有一段代码,让输出的结果为NaN。下面这段代码计算了Pearson相关系数,c为协方差矩阵,协方差矩阵的主对角线就是各个维度的方差。

    c = cov(x, y, rowvar)
    try:
        d = diag(c)
    except ValueError:
        # scalar covariance
        # nan if incorrect value (nan, inf, 0), 1 otherwise
        return c / c
    stddev = sqrt(d.real)
    c /= stddev[:, None]
    c /= stddev[None, :]

下面是计算 Pearson相关系数的公式:

                                                              

我们可以看到如果其中一个维度的标准差为0,都会导致nan的输出。当一个维度的数据全为一个值时,标准差就等于0。所以并不是我之前所说的是因为值全为0不准确,而是因为标准差为0. 谢谢下面的评论指出了偶的错误。

【题外话】

俗话说,技多不压身。今天给大家推荐一个PS课程

现在的PS,已经成为了仅次于office办公软件技能下,求职着需要掌握的技能,而不再是设计师的专属。

无论是海报、课程设计、亦或着公众号排版、产品详情页、企业团队宣传招,都需要用到PS。

对于大学生和职场新人来说,多掌握一项技能,你对公司的价值就越大,职场竞争力就更强,也就更容易拿到更高的薪水。

           

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐