【问题标题】:Heatmap correlation using values of column?使用列值的热图相关性?
【发布时间】:2020-06-02 02:10:07
【问题描述】:

假设我有以下美国各州重复观察的数据,这些数据具有一定的价值:

US_State Value
Alabama  1
Alabama  10
Alabama  9
Michigan 8
Michigan 9
Michigan 2
...

如何为所有 US_State 组合之间的 Value 生成成对相关性?我尝试了一些不同的方法(pivot、groupby 等),但我似乎无法理解正确的方法。

理想的输出应该是这样的:

          Alabama   Michigan    ...
Alabama      1          0.5
Michigan     0.5        1
...

【问题讨论】:

    标签: python heatmap correlation


    【解决方案1】:

    有一种方法可以最大限度地利用 Pandas,但这只是假设输入数据集中的每个状态具有相同数量的观察值,否则相关系数没有真正意义,结果会变得有点古怪.

    import pandas as pd
    
    df = pd.DataFrame()
    df['US_State'] = ["Alabama", "Alabama", "Alabama", "Michigan", "Michigan", "Michigan", "Oregon", "Oregon", "Oregon"]
    df['Value'] = [1, 10, 9, 8, 9, 2, 6, 1, 2]
    
    pd.DataFrame(df.groupby("US_State")['Value'].apply(lambda x: list(x))).T.apply(lambda x: pd.Series(*x), axis=0).corr()
    

    导致

    US_State   Alabama  Michigan    Oregon
    US_State                              
    Alabama   1.000000 -0.285578 -0.996078
    Michigan -0.285578  1.000000  0.199667
    Oregon   -0.996078  0.199667  1.000000
    

    代码的基本作用是将每个状态的数据作为列表收集到单个单元格中,将数据帧转置为状态列,然后将收集到的列表数据单元格扩展为每个状态的数据帧行。然后你就可以调用 pandas 数据框的标准corr() 方法了。

    【讨论】:

    • 哎呀,这是一个很好的答案!我发誓我以各种方式击中了这个小部件。我实际上是根据组合编写一个手动循环到子集,计算相关性,并在您的答案出现时将其存储为矩阵。如此优雅!如果您不介意我问 - 这部分 pd.Series(*x), axis=0) 在做什么(特别是 (*x)?
    • 谢谢,没问题。星号基本上意味着将列表中的所有值作为输入参数,请看这里digitalocean.com/community/tutorials/…。在这个例子中,tbh 并不是真正需要的,等效的方法是写pd.Series(x[0]),因为只有 1 个参数。因为 lambda 中的输入参数 x 基本上是一个类似于列表的列表,所以我们只需要它是一个列表,星号就可以了。
    • 啊,太棒了!感谢您的解释和链接:D
    【解决方案2】:

    Pandas DataFrame 具有内置的相关矩阵函数。您将需要以某种方式将数据放入 DataFrame(采用 numpy 对象、普通 dict(显示)等)。

    from pandas import DataFrame
    
    data = {'AL': [1,10,9],
            'MI': [8,9,2],
            'CO': [11,5,17]
            }
    
    df = DataFrame(data)
    
    corrMatrix = df.corr()
    print(corrMatrix)
    
    # optional heatmap
    import seaborn as sn
    sn.heatmap(corrMatrix, annot=True, cmap='coolwarm')
    
    
              AL        MI        CO
    AL  1.000000 -0.285578 -0.101361
    MI -0.285578  1.000000 -0.924473
    CO -0.101361 -0.924473  1.000000
    

    【讨论】:

    • 感谢您的快速响应,这是我理解它应该做的,但我无法让我的数据看起来像您的 df。当我尝试旋转它时 - df.pivot(columns = 'US_State', values = 'Value') 我得到一堆 NaN (而不是它们都具有相同的行数。我是否缺少索引的内容?
    • 您可以添加一个索引“index”作为组内的排名:df2['index'] = df2.groupby('State')["Value"].rank() 然后df2.pivot(columns='State',values='Value', index='index')
    • 应该可以,但得到“索引包含重复条目,无法重塑”。可能是我的数据的一个特定问题,无法概括!所以我会坚持下去 - 谢谢你的回答:)
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2015-06-17
    • 2021-06-08
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多