【问题标题】:Is it possible to do running correlation with one fixed series in Python?是否可以在 Python 中与一个固定系列进行运行关联?
【发布时间】:2020-07-17 05:36:00
【问题描述】:

我想知道是否有一种快速的方法可以在 Python 中使用一个固定系列进行运行关联?我尝试使用 Pandas,例如:df1.rolling(4).corr(df2)。但是,它要求两个 DataFrame 具有相同的长度。 有没有一种类似于上述 Pandas 示例的方法,但修复了一个 DataFrame?

为了澄清,我想计算下面的 df2 和 df1 中的值之间的相关系数。

示例: df2 和 df1.loc[0:3] 之间的第一个相关性 df2 和 df1.loc[1:4] 的第二个相关性

等等

我已经设法通过创建一个循环来做到这一点。但是,我发现在处理较大的 DataFrame 时效率低下。

df1 = pd.DataFrame([1,3,2,4,5,6,3,4])
df2 = pd.DataFrame([1,2,3,2])

【问题讨论】:

    标签: python pandas correlation


    【解决方案1】:

    您可以使用返回的pandas.DataFrame.rolling pandas.core.window.Rolling 具有 apply 方法。然后你可以将任何计算你想要的修正的函数传递给apply()

    示例

    import pandas as pd
    from scipy.stats import pearsonr 
    import numpy as np 
    
    
    df1 = pd.DataFrame([1,3,2,4,5,6,3,4,1,2,3,2,2,3,2,5,1,2,1,2,8,8,8,8,8,8,8])
    df2 = pd.DataFrame([1,2,3,2])
    
    CORR_VALS = df2[0].values
    def get_correlation(vals):
        return pearsonr(vals, CORR_VALS)[0]
    
    df1['correlation'] = df1.rolling(window=len(CORR_VALS)).apply(get_correlation)
    
    
    • 请注意,df1.rolling() 中的 window 参数的长度应与您计算相关性所依据的数组的长度相同。

    这个输出

    In [5]: df1['correlation'].values
    Out[5]:
    array([        nan,         nan,         nan,  0.31622777,  0.31622777,
            0.71713717,  0.63245553, -0.63245553, -0.39223227, -0.63245553,
           -0.63245553,  1.        ,  0.        , -0.70710678,  0.81649658,
            0.        ,  0.47809144, -0.23570226, -0.64699664,  0.        ,
            0.        ,  0.7570333 ,  0.76509206,  0.11043153, -0.77302068,
           -0.11043153,  0.86164044])
    

    看起来像这样:

    【讨论】:

    • 太棒了。谢谢!以前,我使用 .iterrows() 循环,但这样更快更有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多