多索引DataFrame两种相关系数计算结果差异疑问
先明确X和Y的本质
X(
a.corr(b)的结果):
pandas的corr()是把两个DataFrame的所有行(所有多索引对应的样本点)作为观测值,计算a的每一列与b的每一列之间的全局Pearson相关系数。比如如果你的多索引是(日期, 标的),那就是把所有日期、所有标的的数值合并起来,计算列与列的整体相关——这和你说的“逐日相关”不是一回事,除非你的DataFrame每行对应一个日期(单索引)。Y(
a.mean().corr(b.mean())的结果):
这里是先对a的每一列取全局均值(覆盖所有多索引行,每列得到一个平均值),得到一个Series;对b做同样操作得到另一个均值Series。然后计算这两个Series的相关系数——本质是列均值的相关:把a的列均值集合当成一组数据,b的列均值集合当成另一组,计算这两组数的相关性。
为什么重排b索引后结果还是X?
你用b.reindex_like(a)只是对齐了索引顺序,但mean()默认是对所有行取全局均值,重排不改变数值的总和和行数,所以b.reindex_like(a).mean()和原b.mean()结果完全一致。你说结果是X,大概率是你对corr()的调用逻辑有误解——比如你以为a.corr(b)是逐日计算相关再平均,但实际上它是直接计算全局列相关。如果要实现“逐日相关”,正确的写法应该是(假设多索引第一层级是日期):
daily_corrs = a.groupby(level=0).corrwith(b) X = daily_corrs.mean()
Y的核心含义
Y反映的是两个DataFrame各列的全局平均水平之间的相关性,和逐行/逐日的样本波动相关性完全不是一个维度。举个例子:如果a的列1均值很高、列2均值很低,而b的列1均值也高、列2均值也低,那Y会是正相关,但这和列1、列2在每日的涨跌相关性没有任何关系。
内容的提问来源于stack exchange,提问作者senorita.xi

