【发布时间】:2016-01-15 06:16:54
【问题描述】:
我有各种时间序列,我想将它们相互关联 - 或者更确切地说,交叉关联 - 以找出相关因子在哪个时间滞后时最大。
我发现 various questions 和答案/链接讨论如何使用 numpy 进行操作,但这意味着我必须将我的数据帧转换为 numpy 数组。而且由于我的时间序列经常涵盖不同的时期,我怕我会陷入混乱。
编辑
我在使用所有 numpy/scipy 方法时遇到的问题是,它们似乎缺乏对我数据的时间序列性质的认识。当我将一个从 1940 年开始的时间序列与从 1970 年开始的时间序列关联起来时,pandas corr 知道这一点,而 np.correlate 只生成一个 1020 个条目(较长系列的长度)数组,其中包含 nan。
关于这个主题的各种 Q 表明应该有一种方法来解决不同长度的问题,但到目前为止,我还没有看到关于如何在特定时间段内使用它的迹象。我只需要以 1 为增量移动 12 个月,以查看一年内最大相关性的时间。
编辑2
一些最小的样本数据:
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)
由于各种处理步骤,这些 dfs 最终更改为 df,索引从 1940 年到 2015 年。这应该重现:
bigdates = pd.date_range('01/01/1940', '01/01/2015', freq = 'MS')
big1 = pd.DataFrame(index = bigdates)
big2 = pd.DataFrame(index = bigdates)
big1 = pd.concat([big1, df1],axis = 1)
big2 = pd.concat([big2, df2],axis = 1)
这是我与 pandas 关联并移动一个数据集时得到的结果:
In [451]: corr_coeff_0 = big1[0].corr(big2[0])
In [452]: corr_coeff_0
Out[452]: 0.030543266378853299
In [453]: big2_shift = big2.shift(1)
In [454]: corr_coeff_1 = big1[0].corr(big2_shift[0])
In [455]: corr_coeff_1
Out[455]: 0.020788314779320523
并尝试 scipy:
In [456]: scicorr = scipy.signal.correlate(big1,big2,mode="full")
In [457]: scicorr
Out[457]:
array([[ nan],
[ nan],
[ nan],
...,
[ nan],
[ nan],
[ nan]])
根据whos是
scicorr ndarray 1801x1: 1801 elems, type `float64`, 14408 bytes
但我只想有 12 个条目。 /Edit2
我想出的想法是自己实现一个时滞相关性,如下所示:
corr_coeff_0 = df1['Data'].corr(df2['Data'])
df1_1month = df1.shift(1)
corr_coeff_1 = df1_1month['Data'].corr(df2['Data'])
df1_6month = df1.shift(6)
corr_coeff_6 = df1_6month['Data'].corr(df2['Data'])
...and so on
但这可能很慢,我可能正在尝试在这里重新发明轮子。 编辑 上面的方法似乎有效,我把它放到一个循环中,通过一年中的所有 12 个月,但我仍然更喜欢内置方法。
【问题讨论】:
-
如果您还没有看到这些,请考虑使用
scipy.signal.correlate和scipy.signal.correlate2d。我会说转换为 numpy 数组可能是你最好的选择。 -
我见过这些,但我想避免使用 numpy,因为在这一步之后,我必须转换回数据框,以便进一步计算。我想我会尝试重新发明轮子,然后……
-
据我所知,这是一个非常常见的工作流程,转换为 numpy 并返回。我认为这样做没有必要犹豫。我建议将您的数组写入磁盘,这样您就不会在代码中重复转换。结帐
pd.HDFStore和h5py。如果您想重新发明轮子,那就去做吧。 -
顺便检查一下pandas apply/ufunc object。不过,您可能已经发现了这一点。您实际上可以将一个 numpy 函数放入 pandas 应用对象中。所以这可以解决问题
-
不知道
series.apply,谢谢,以后可能会派上用场。我在使用所有 numpy/scipy 方法时遇到的问题是它们似乎缺乏对我数据的时间序列性质的认识。当我将一个从 1940 年开始的时间序列与一个从 1970 年开始的时间序列关联起来时,pandascorr知道这一点,而np.correlate只生成一个包含nan的 1020 个条目数组。我只需要在一年内看到最大相关性。
标签: python numpy pandas correlation cross-correlation