Python 将Pandas中的滚动相关输出简化为单索引数据帧
我有一个合理大小的时间序列数据帧,我希望有一个合理格式的滚动成对相关数据 熊猫有一个非常有趣的“滚动”功能,可以进行正确的计算Python 将Pandas中的滚动相关输出简化为单索引数据帧,python,pandas,dataframe,correlation,Python,Pandas,Dataframe,Correlation,我有一个合理大小的时间序列数据帧,我希望有一个合理格式的滚动成对相关数据 熊猫有一个非常有趣的“滚动”功能,可以进行正确的计算 dfCorrelations = dfReturns.rolling(correlation_window).corr() 但相关网格的输出时间序列不便于我以后使用(所示为给定日期子集的样本输出) 有没有一种方法可以进行同样的计算,但只在一个简单的时间序列数据帧中获得唯一的、非对角关联的输出?比如说,使用一个类似 ['III LN x ABN NA', 'III L
dfCorrelations = dfReturns.rolling(correlation_window).corr()
但相关网格的输出时间序列不便于我以后使用(所示为给定日期子集的样本输出)
有没有一种方法可以进行同样的计算,但只在一个简单的时间序列数据帧中获得唯一的、非对角关联的输出?比如说,使用一个类似
['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', ...]
谢谢一个非常有效的解决方案。嗨@Alexander,我希望这个解决方案能为我工作,但我无法让它工作:
pairs=df.columns.get\u values().tolist()
抛出一个错误,说AttributeError:'MultiIndex'对象没有属性“get\u values”
。我认为这可能与Pandas版本有关(我使用的是1.0.5)。我尝试了get_level_values(0)
,但下一步失败了:[“{0}vs.{1}”.format(*pair)for pair in pair in pair]
使用索引器:元组索引超出范围
您(或其他人)介意解释一下那里发生了什么吗?提前谢谢!前一行df.unstack().sort_index(axis=1)
将多索引(日期和股票代码)转换为常规索引(仅日期)。感谢@Alexander的及时回复!事实上,我得到的示例是在python3.5
和pandas=0.20
上工作的,但不是在python3.7.7
和pandas=1.0.5
下工作的。Python 3.5/1.0.5设置中显示的AttributeError:“MultiIndex”对象没有属性“get\u values”
。介于两者之间的某个地方一定发生了变化…从pandas>=1开始,.get\u values()
已被弃用。为了使@Alexander的示例在这种情况下工作,请将pairs=df.columns.get_values().tolist()
更改为pairs=df.columns.to_numpy().tolist()
。
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