【问题标题】:Pandas Correlation One Column to Many Columns Group by range of the columnPandas 关联一列到多列按列范围分组
【发布时间】:2020-03-20 04:11:11
【问题描述】:

假设我有一个类似于下面的数据框(实际数据框有百万个观察值),我将如何获得信号列和返回列列表之间的相关性,然后按Signal_Up 列分组?

我尝试了 pandas corrwith 函数,但它没有为我提供 signal_up 列的相关分组

df[['Net_return_at_t_plus1', 'Net_return_at_t_plus5',
           'Net_return_at_t_plus10']].corrwith(df['Signal_Up']))

我正在尝试通过 signal_up 列的各种值来查找信号列与其他净返回列组之间的相关性。

数据和期望的结果如下。

想要的结果

数据

【问题讨论】:

    标签: python pandas pandas-groupby correlation


    【解决方案1】:

    使用下面的简单数据框:

    df= pd.DataFrame({'v1': [1, 3, 2, 1, 6, 7],
                      'v2': [2, 2, 4, 2, 4, 4],
                      'v3': [3, 3, 2, 9, 2, 5],
                      'v4': [4, 5, 1, 4, 2, 5]})
    

    (第一种解释)获得一个变量与其他列相关性的一种方法是:

    correlations = df.corr().unstack().sort_values(ascending=False) # Build correlation matrix
    correlations = pd.DataFrame(correlations).reset_index() # Convert to dataframe
    correlations.columns = ['col1', 'col2', 'correlation'] # Label it
    correlations.query("col1 == 'v2' & col2 != 'v2'") # Filter by variable
    # output of this code will give correlation of column v2 with all the other columns 
    

    (第二种解释)在按列 v2 分组后获得列 v1 与列 v3、v4 的相关性的一种方法是使用这一行:

    df.groupby('v2')[['v1', 'v3', 'v4']].corr().unstack()['v1']
    

    在您的情况下,v2 是“Signal_Up”,v1 是“信号”,v3、v4 列代理“Net_return_at_t_plusX”列。

    【讨论】:

    • 感谢@Zolzaya Luvsandorj 提供的帮助。我刚刚编辑了我原来的问题。我正在寻找信号列和其他净收益列之间的相关性,它们按 signal_up 列的各种值进行分组。因此,本质上是“信号”列与“净回报”列列表之间的相关性,但不是整个列,而是根据“Signal_Up”列的不同类别/范围(-4、-1、3、5、6)。
    • 如果我错了@ClaudeTi,请纠正我,我的想法是:如果我们按 Signal_Up 分组,那么 Signal_Up 列中的分组数据不会有变化(其他列会有变化)。这可能意味着在没有变化的情况下相关性是 nan,不是吗?
    • 谢谢@zolzaya luvsandorj。通过使用“groupby”函数,我可以通过 Signalu_Up 列的各个类别获得相关性。但是,我无法将“corr”函数应用于两列以上。所以,我不得不使用“concat”函数来组合它们。 a = df.groupby('Signal_Up')[['signal,'Net_return_at_t_plus1']].corr().unstack().iloc[:,1] b = df.groupby('Signal_Up')[['signal' ,'Net_return_at_t_plus5']].corr().unstack().iloc[:,1] c = df.groupby('Signal_Up')[['signal','Net_return_at_t_plus10']].corr().unstack() .iloc[:,1] dfCorr = pd.concat([a, b, c], axis=1)
    • 我已经更新了我的答案以包括对这个问题的建议(即不必一一做然后再连接)。
    【解决方案2】:

    我可以通过使用“groupby”函数获得 Signal_Up 列的各个类别的相关性。但是,我无法将“corr”函数应用于两列以上。

    所以,我不得不使用“concat”函数来组合它们。

    a = df.groupby('Signal_Up')[['signal','Net_return_at_t_plus1']].corr().unstack().iloc[:,1] 
    
    b = df.groupby('Signal_Up')[['signal','Net_return_at_t_plus5']].corr().unstack().iloc[:,1] 
    
    c = df.groupby('Signal_Up')[['signal','Net_return_at_t_plus10']].corr().unstack().iloc[:,1] 
    
    dfCorr = pd.concat([a, b, c], axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2018-06-20
      • 2021-02-18
      • 2022-01-27
      相关资源
      最近更新 更多