滚动皮尔逊相关系数的有效计算

时间:2019-08-07 10:53:50

标签: python performance vectorization correlation

如问题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.4s,示例链接中的代码大约需要1.6s:

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

有没有更有效的方法?

1 个答案:

答案 0 :(得分:-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]