statsmodels 中的互相关图

cross correlation plot in statsmodels

考虑下面从

借来的简单示例
import pandas as pd
import numpy as np
import statsmodels.tsa.stattools as smt
import matplotlib.pyplot as plt

np.random.seed(123)
test = pd.DataFrame(np.random.randint(0,25,size=(79, 2)), columns=list('AB'))

我知道如何创建互相关函数的 forwardbackward 滞后(参见上面的 SO link),但问题是如何获得包含的正确数据帧正确的滞后顺序。我想出了以下解决方案。

backwards = smt.ccf(test['A'][::-1], test['B'][::-1], adjusted=False)[::-1]

forwards = smt.ccf(test['A'], test['B'], adjusted=False)

#note how we skip the first lag (at 0) because we have a duplicate with the backward values otherwise
a = pd.DataFrame({'lag': range(1, len(forwards)),
              'value' : forwards[1:]})

b = pd.DataFrame({'lag':  [-i for i in list(range(0, len(forwards)))[::-1]],
              'value' : backwards})

full = pd.concat([a,b])
full.sort_values(by = 'lag', inplace = True)
full.set_index('lag').value.plot()

但是,对于概念上非常简单的东西(只是附加两个列表),这似乎是很多代码。这段代码可以精简吗?

谢谢!

好吧,您可以尝试“仅附加到列表”:

# also
# cc = list(backards) + list(forwards[1:])
cc = np.concatenate([backwards, forwards[1:]])
full = pd.DataFrame({'lag':np.arange(len(cc))-len(backwards), 
                     'value':cc})
full.plot(x='lag')

另外:

full = (pd.DataFrame({'value':np.concatenate([backwards, forwards[1:]])})
          .assign(lag=lambda x: x.index - len(backwards) )
       )

输出:

注意如果你只想绘制两个数组,那么这就可以了

plt.plot(-np.arange(len(backwards)), backwards, c='C0')
plt.plot(forwards, c='C0')