2017-08-24 79 views
1

我有一個合理大小的時間序列數據DataFrame,我希望以合理的格式進行滾動成對關聯數據。簡化熊貓中的滾動關聯輸出爲單個索引DataFrame

熊貓有一個非常有趣的「滾動」功能,做正確的計算

dfCorrelations = dfReturns.rolling(correlation_window).corr() 

但輸出時間序列相關性的網格是不方便我在給定日期以後使用(樣本輸出的一個子集顯示)。

enter image description here

有沒有辦法做同樣的計算,而是要一個簡單的時間序列數據幀只與獨特,非對角線相關的輸出?與列索引說,看起來像

['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', ...] 

回答

1
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 
+0

謝謝!非常有效的解決方案。 – rhaskett