我想运行每列的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可以更快地运行?
答案 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]
如果你能提供一种只计算一半相关矩阵的方法,那么请随意编辑(我的原始矩阵是高维的,因此这个解决方案的计算成本可能会爆炸)。