Pandas列之间的成对相关性

时间:2018-01-22 22:12:04

标签: python pandas correlation

我想运行每列的Spearman关联与pandas中的所有其他列。我只需要分配相关(数组),而不是相关矩阵。

我知道我可以使用pd.pivot_table(data=df, values="Value",columns="Name",index="Date").plot() ,但我只需要成对相关,而不是整个相关矩阵或对角线。我认为这可能会加速计算,因为我只会计算((N ^ 2) - N)/ 2个相关,而不是N ^ 2.

然而,这只是一个假设 - 因为矩阵是对称的,也许大熊猫已经通过​​计算相关矩阵的一半然后相应地填充其余部分来工作。

到目前为止,我的非常低效的解决方案是:

In[]:
idx = ["2017-12-28","2017-12-29","2017-12-30","2017-12-31"] * 2
name = ['Bitcoin'] * 4 + ['CannaCoin'] * 4
vals = np.random.rand(8) * 1000
df = pd.DataFrame({"Date":idx, "Name":name, "Value":vals})
print(df)

Out[]:
         Date       Name       Value
0  2017-12-28    Bitcoin  788.547631
1  2017-12-29    Bitcoin  572.695484
2  2017-12-30    Bitcoin  661.859195
3  2017-12-31    Bitcoin  205.473883
4  2017-12-28  CannaCoin  270.291858
5  2017-12-29  CannaCoin  683.827404
6  2017-12-30  CannaCoin  447.808772
7  2017-12-31  CannaCoin  616.927833

In[]:
pd.pivot_table(data=df, values="Value",columns="Name",index="Date").plot()

是否有任何内置或矢量化的API可以更快地运行?

1 个答案:

答案 0 :(得分:1)

熊猫解决方案实际上比我想象的要容易:

import numpy as np
import pandas as pd

# d is a pandas DataFrame
d = d.corr(method='spearman')
d = d.where(np.triu(np.ones(d.shape)).astype(np.bool))
np.fill_diagonal(d.values, np.nan)
d = d.stack().reset_index()
corr = d.iloc[:, 2]

如果你能提供一种只计算一半相关矩阵的方法,那么请随意编辑(我的原始矩阵是高维的,因此这个解决方案的计算成本可能会爆炸)。