【问题标题】:Efficient calculation of rolling pearson correlation滚动皮尔逊相关性的有效计算
【发布时间】:2019-12-14 23:52:20
【问题描述】:

如这个问题Calculating rolling correlation of pandas dataframes 所示,我需要获取长度为 N 的数组与第二个数组长度 M 中的每个窗口的相关性。

x= np.random.randint(0,100,10000)
y= [4,5,4,5]
corrs = []
for i in range(0,(len(x)-len(y) ) +1):
    corrs.append( np.corrcoef(x[i:i+4],y)[0,1] )

我发现的每个与此类似的问题都讨论了如何在 NxK 到 MxK 的矩阵上执行此操作。但是我尝试的那些不适用于一维数据。在链接的问题中,建议翻转熊猫框架,这很慢。有没有更快的计算方法?

上面的代码大约需要 0.4 秒,示例链接中的代码需要 1.6 秒:

corr = x.rolling(4).apply(lambda x: np.corrcoef(x,y)[0,1],raw=False ).dropna(how='all',axis=0)

有没有更有效的方法来做到这一点?

【问题讨论】:

  • 到目前为止您尝试过哪些改进?

标签: python performance vectorization correlation


【解决方案1】:

将相关系数存储在 numpy 数组中,而不是常规的 python 列表中(每次插入元素时都会调整列表的大小)

corrs = np.zeros([len(x)-len(y)+1])
for i in range(0,(len(x)-len(y) ) +1):
    corrs[i] = np.corrcoef(x[i:i+4],y)[0,1]

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2020-05-23
    • 2018-07-23
    • 2022-01-25
    • 2013-10-12
    • 1970-01-01
    • 2011-09-13
    • 2014-11-13
    相关资源
    最近更新 更多