如问题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)
有没有更有效的方法?
答案 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]