在R,我正在使用ccf或acf计算成对的互相关函数,以便我可以找出哪个班次给了我最大值.从它的外观,R给我一个标准化的值序列.在Python的scipy中是否有类似的东西,或者我应该使用该fft模块来做它?目前,我的工作如下:
xcorr = lambda x,y : irfft(rfft(x)*rfft(y[::-1]))
x = numpy.array([0,0,1,1])
y = numpy.array([1,1,0,0])
print xcorr(x,y)
Run Code Online (Sandbox Code Playgroud) 我有各种各样的时间序列,我想要相互关联 - 或者更确切地说,相互关联 - 以找出相关因子最大的时滞.
我找到了各种 问题和答案/链接,讨论如何用numpy来做,但那些意味着我必须把我的数据帧变成numpy数组.由于我的时间序列经常涵盖不同的时期,我担心我会陷入混乱.
编辑
我遇到的所有numpy/scipy方法的问题是,他们似乎缺乏对数据时间序列性质的认识.当我将1940年开始的时间序列与1970年开始的时间序列相关联时,熊猫corr知道这一点,而np.correlate只产生1020个条目(长序列的长度),这个数组充满了nan.
关于这个主题的各种Q表明应该有一种方法来解决不同长度的问题,但到目前为止,我没有看到如何在特定时间段内使用它的迹象.我只需要以1为增量移动12个月,以便在一年内查看最大相关时间.
EDIT2
一些最小样本数据:
import pandas as pd
import numpy as np
dfdates1 = pd.date_range('01/01/1980', '01/01/2000', freq = 'MS')
dfdata1 = (np.random.random_integers(-30,30,(len(dfdates1)))/10.0) #My real data is from measurements, but random between -3 and 3 is fitting
df1 = pd.DataFrame(dfdata1, index = dfdates1)
dfdates2 = pd.date_range('03/01/1990', '02/01/2013', freq = 'MS')
dfdata2 = (np.random.random_integers(-30,30,(len(dfdates2)))/10.0)
df2 = pd.DataFrame(dfdata2, index = dfdates2)
Run Code Online (Sandbox Code Playgroud)
由于各种处理步骤,这些dfs最终变为df,从1940年到2015年被索引.这应该重现:
bigdates = pd.date_range('01/01/1940', '01/01/2015', freq = 'MS') …Run Code Online (Sandbox Code Playgroud) 假设这两个系列是:
x = [4,4,4,4,6,8,10,8,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
y = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,8,10,8,6,4,4]
Run Code Online (Sandbox Code Playgroud)
系列 x 明显滞后 y 12 个时间段。但是,按照Python 互相关中的建议使用以下代码:
import numpy as np
c = np.correlate(x, y, "full")
lag = np.argmax(c) - c.size/2
Run Code Online (Sandbox Code Playgroud)
导致错误的滞后 -0.5。
这是怎么回事?