将 Pandas 中的滚动相关输出简化为单个索引数据帧

rha*_*ett 2 python correlation dataframe pandas

我有一个大小合理的时间序列数据 DataFrame,并且我希望以合理的格式滚动成对相关数据。

Pandas 有一个非常有趣的“滚动”功能,可以进行正确的计算

dfCorrelations = dfReturns.rolling(correlation_window).corr()
Run Code Online (Sandbox Code Playgroud)

但相关网格的输出时间序列对我以后的使用不方便(显示给定日期的子集的示例输出)。

在此输入图像描述

有没有办法进行相同的计算,但在简单的时间序列 DataFrame 中获取仅具有唯一的非对角相关性的输出?用看起来像这样的列索引说

['III LN x ABN NA', 'III LN x AGN NA', 'III LN x AGS BB', 'ABN NA x AGN NA', 'ABN NA x AGS BB', ...]
Run Code Online (Sandbox Code Playgroud)

Ale*_*der 5

from itertools import combinations

# Create sample dataset.
idx = pd.MultiIndex(
    levels=[[u'2017-1-1', u'2017-1-2'], [u'A', u'B', u'C']],
    labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]],
    names=[u'date', u'ticker'])
df = pd.DataFrame(np.random.randn(6, 3), index=idx, columns=list('ABC'))
for tup in zip(range(6), range(3) * 2):
    df.iloc[tup] = 1

>>> df
                        A         B         C
date     ticker                              
2017-1-1 A       1.000000  0.440276 -1.087536
         B      -0.809949  1.000000 -0.548897
         C       0.922866 -0.788699  1.000000
2017-1-2 A       1.000000 -0.106493  0.034319
         B       0.080990  1.000000  0.218323
         C       0.051651 -0.680358  1.000000

# Unstack and remove duplicates.
tickers = df.columns.tolist()
df = df.unstack().sort_index(axis=1)
pairs = df.columns.get_values().tolist()
df.columns = ["{0} vs. {1}".format(*pair) for pair in pairs]
mask = [n for n, pair in enumerate(pairs) if pair in list(combinations(tickers, 2))]
df = df.iloc[:, mask]
>>> df
           A vs. B   A vs. C   B vs. C
date                                  
2017-1-1 -0.809949  0.922866 -0.788699
2017-1-2  0.080990  0.051651 -0.680358
Run Code Online (Sandbox Code Playgroud)