与熊猫的互相关(时滞相关)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与熊猫的互相关(时滞相关)?相关的知识,希望对你有一定的参考价值。

我有各种各样的时间序列,我想要相互关联 - 或者更确切地说,相互关联 - 以找出相关因子最大的时滞。

我发现various questions和答案/链接讨论如何用numpy做,但那些意味着我必须把我的数据帧变成numpy数组。由于我的时间序列经常涵盖不同的时期,我担心我会陷入混乱。

编辑

我遇到的所有numpy / scipy方法的问题是,他们似乎缺乏对数据时间序列性质的认识。当我将1940年开始的时间序列与1970年开始的时间序列相关联时,pandas corr知道这一点,而np.correlate只产生1020个条目(长序列的长度),数组充满了nan。

关于这个主题的各种Q表明应该有一种方法来解决不同长度的问题,但到目前为止,我没有看到如何在特定时间段内使用它的迹象。我只需要以1为增量移动12个月,以便在一年内查看最大相关时间。

Aaditi

一些最小样本数据:

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个月,但我仍然更喜欢内置方法。

答案

据我所知,没有一种内置方法可以完全满足您的要求。但是如果你看一下pandas Series方法autocorr的源代码,你会发现你有正确的想法:

def autocorr(self, lag=1):
    """
    Lag-N autocorrelation

    Parameters
    ----------
    lag : int, default 1
        Number of lags to apply before performing autocorrelation.

    Returns
    -------
    autocorr : float
    """
    return self.corr(self.shift(lag))

因此,简单的时间延迟交叉协方差函数将是

def crosscorr(datax, datay, lag=0):
    """ Lag-N cross correlation. 
    Parameters
    ----------
    lag : int, default 0
    datax, datay : pandas.Series objects of equal length

    Returns
    ----------
    crosscorr : float
    """
    return datax.corr(datay.shift(lag))

然后,如果你想看看每个月的互相关,你就可以做到

 xcov_monthly = [crosscorr(datax, datay, lag=i) for i in range(12)]
另一答案

有一种更好的方法:您可以创建一个在调用corr()之前先移动数据帧的函数。

获取此数据框就像一个例子:

d = 'prcp': [0.1,0.2,0.3,0.0], 'stp': [0.0,0.1,0.2,0.3]
df = pd.DataFrame(data=d)

>>> df
   prcp  stp
0   0.1  0.0
1   0.2  0.1
2   0.3  0.2
3   0.0  0.3

你的功能是移动其他列(目标除外):

def df_shifted(df, target=None, lag=0):
    if not lag and not target:
        return df       
    new = 
    for c in df.columns:
        if c == target:
            new[c] = df[target]
        else:
            new[c] = df[c].shift(periods=lag)
    return  pd.DataFrame(data=new)

假设您的目标是将prcp(降水变量)与stp(大气压力)进行比较

如果你现在做的将是:

>>> df.corr()
      prcp  stp
prcp   1.0 -0.2
stp   -0.2  1.0

但是如果你将所有其他列的1(一)个时间段移动并保留目标(prcp):

df_new = df_shifted(df, 'prcp', lag=-1)

>>> print df_new
   prcp  stp
0   0.1  0.1
1   0.2  0.2
2   0.3  0.3
3   0.0  NaN

请注意,现在列stp在句点处向上移位一个位置,因此如果调用corr(),则将:

>>> df_new.corr()
      prcp  stp
prcp   1.0  1.0
stp    1.0  1.0

所以,你可以用滞后-1,-2,-n !!

另一答案

要建立安德烈的答案 - 如果你只关心(滞后)与目标的相关性,但想要测试各种滞后(例如,看看哪个滞后给出最高的相关性),你可以做这样的事情:

lagged_correlation = pd.DataFrame.from_dict(
    x: [df[target].corr(df[x].shift(-t)) for t in range(max_lag)] for x in df.columns)

这样,每一行对应一个不同的滞后值,每列对应一个不同的变量(其中一个是目标本身,给出自相关)。

以上是关于与熊猫的互相关(时滞相关)?的主要内容,如果未能解决你的问题,请参考以下文章

与熊猫的加权相关系数

数字信号处理相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )

数字信号处理相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )

数字信号处理相关函数 ( 功率信号 | 功率信号的互相关函数 | 功率信号的自相关函数 )

数字信号处理相关函数 ( 功率信号 | 功率信号的互相关函数 | 功率信号的自相关函数 )

Sycl 部分+ DPCPP 中的互相关和错误