【问题标题】:numpy corrcoef - compute correlation matrix while ignoring missing datanumpy corrcoef - 在忽略缺失数据的同时计算相关矩阵
【发布时间】:2015-10-15 15:50:56
【问题描述】:

我正在尝试计算多个值的相关矩阵。这些值包括一些“nan”值。我正在使用 numpy.corrcoef。对于输出相关矩阵的元素(i,j),我希望使用变量 i 和变量 j 都存在的所有值来计算相关性。

这就是我现在拥有的:

In[20]: df_counties = pd.read_sql("SELECT Median_Age, Rpercent_2008, overall_LS, population_density FROM countyVotingSM2", db_eng)
In[21]: np.corrcoef(df_counties, rowvar = False)
Out[21]: 
array([[ 1.        ,         nan,         nan, -0.10998411],
       [        nan,         nan,         nan,         nan],
       [        nan,         nan,         nan,         nan],
       [-0.10998411,         nan,         nan,  1.        ]])

太多nan的:(

【问题讨论】:

    标签: python numpy pandas correlation


    【解决方案1】:

    如果您希望每个数组中有不同数量的 nan,您可以考虑对非 nan 掩码进行逻辑与。

    import numpy as np
    import numpy.ma as ma
    
    a=ma.masked_invalid(A)
    b=ma.masked_invalid(B)
    
    msk = (~a.mask & ~b.mask)
    
    print(ma.corrcoef(a[msk],b[msk]))
    

    【讨论】:

    • 这对我的回答有影响吗? numpy.ma 不应该足够聪明,从相关系数的计算中删除两个输入中缺少的条目吗? (提示:它没有:D)
    【解决方案2】:

    这将起作用,使用 屏蔽数组 numpy 模块:

    import numpy as np
    import numpy.ma as ma
    
    A = [1, 2, 3, 4, 5, np.NaN]
    B = [2, 3, 4, 5.25, np.NaN, 100]
    
    print(ma.corrcoef(ma.masked_invalid(A), ma.masked_invalid(B)))
    

    它输出:

    [[1.0 0.99838143945703]
     [0.99838143945703 1.0]]
    

    在此处阅读更多信息:https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html

    【讨论】:

      【解决方案3】:

      pandas 的主要特点之一是对NaN 友好。要计算相关矩阵,只需调用df_counties.corr()。下面是一个例子来证明df.corr()NaN 宽容而np.corrcoef 不是。

      import pandas as pd
      import numpy as np
      
      # data
      # ==============================
      np.random.seed(0)
      df = pd.DataFrame(np.random.randn(100,5), columns=list('ABCDE'))
      df[df < 0] = np.nan
      df
      
               A       B       C       D       E
      0   1.7641  0.4002  0.9787  2.2409  1.8676
      1      NaN  0.9501     NaN     NaN  0.4106
      2   0.1440  1.4543  0.7610  0.1217  0.4439
      3   0.3337  1.4941     NaN  0.3131     NaN
      4      NaN  0.6536  0.8644     NaN  2.2698
      5      NaN  0.0458     NaN  1.5328  1.4694
      6   0.1549  0.3782     NaN     NaN     NaN
      7   0.1563  1.2303  1.2024     NaN     NaN
      8      NaN     NaN     NaN  1.9508     NaN
      9      NaN     NaN  0.7775     NaN     NaN
      ..     ...     ...     ...     ...     ...
      90     NaN  0.8202  0.4631  0.2791  0.3389
      91  2.0210     NaN     NaN  0.1993     NaN
      92     NaN     NaN     NaN  0.1813     NaN
      93  2.4125     NaN     NaN     NaN  0.2515
      94     NaN     NaN     NaN     NaN  1.7389
      95  0.9944  1.3191     NaN  1.1286  0.4960
      96  0.7714  1.0294     NaN     NaN  0.8626
      97     NaN  1.5133  0.5531     NaN  0.2205
      98     NaN     NaN  1.1003  1.2980  2.6962
      99     NaN     NaN     NaN     NaN     NaN
      
      [100 rows x 5 columns]
      
      # calculations
      # ================================
      df.corr()
      
              A       B       C       D       E
      A  1.0000  0.2718  0.2678  0.2822  0.1016
      B  0.2718  1.0000 -0.0692  0.1736 -0.1432
      C  0.2678 -0.0692  1.0000 -0.3392  0.0012
      D  0.2822  0.1736 -0.3392  1.0000  0.1562
      E  0.1016 -0.1432  0.0012  0.1562  1.0000
      
      
      np.corrcoef(df, rowvar=False)
      
      array([[ nan,  nan,  nan,  nan,  nan],
             [ nan,  nan,  nan,  nan,  nan],
             [ nan,  nan,  nan,  nan,  nan],
             [ nan,  nan,  nan,  nan,  nan],
             [ nan,  nan,  nan,  nan,  nan]])
      

      【讨论】:

      • 它不允许我编辑帖子,但代码块内的第一行应该是:“... as pd”,而不是“... as np”。跨度>
      • 史诗般的答案!您刚刚帮我处理了丢失的数据从我的代码中删除了一个嵌套的 for 循环。谢谢!
      • 顺便说一句,与 numpy 相比,Pandas corr 函数非常慢。
      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多