top*_*ntz 4 python correlation pandas
我有一堆股票数据,我正在尝试构建一个数据框,从相关矩阵中获取前两个和底部的股票,以及它们的实际相关性。
假设矩阵corr如下所示:
A B C D E
A 1.00 0.65 0.31 0.94 0.55
B 0.87 1.00 0.96 0.67 0.41
C 0.95 0.88 1.00 0.72 0.69
D 0.64 0.84 0.99 1.00 0.78
E 0.71 0.62 0.89 0.32 1.00
Run Code Online (Sandbox Code Playgroud)
我想要做的是能够返回股票 A、B、C、D 和 E 的最佳两只和最不相关的股票及其相关性,同时降低每只股票与自身之间明显的 1.00 相关性。
生成的数据框,或任何最容易显示的数据框如下所示:
Stock 1st 1st_Val 2nd 2nd_Val Last Last_Val
A D 0.94 B 0.65 C 0.31
B C 0.96 A 0.87 E 0.41
C A 0.95 B 0.88 E 0.69
D C 0.99 B 0.84 A 0.64
E C 0.89 A 0.71 D 0.32
Run Code Online (Sandbox Code Playgroud)
到目前为止,通过我的尝试,我已经能够使用corr[stock].nlargest().index[0:].tolist(),返回相关股票名称,然后从每个列表中获取[1],[2]并将[-1]它们粘贴到字典中并从那里构建数据框。但是我无法返回相关值,并且我怀疑无论如何我都没有以最有效的方式执行此操作。
任何帮助真的很感激,干杯
您的条件很难概括为一个命令,但这是您可以采用的一种方法。
import numpy as np
np.fill_diagonal(corr.values, np.nan)
print(corr)
# A B C D E
#A NaN 0.65 0.31 0.94 0.55
#B 0.87 NaN 0.96 0.67 0.41
#C 0.95 0.88 NaN 0.72 0.69
#D 0.64 0.84 0.99 NaN 0.78
#E 0.71 0.62 0.89 0.32 NaN
Run Code Online (Sandbox Code Playgroud)
您可以使用在每个 Pandas 数据帧行中查找前 n 个最高值列的名称的答案来获取每行的前 2 个和后一个值(Stock)。
order_top2 = np.argsort(-corr.values, axis=1)[:, :2]
order_bottom = np.argsort(corr.values, axis=1)[:, :1]
result_top2 = pd.DataFrame(
corr.columns[order_top2],
columns=['1st', '2nd'],
index=corr.index
)
result_bottom = pd.DataFrame(
corr.columns[order_bottom],
columns=['Last'],
index=corr.index
)
result = result_top2.join(result_bottom)
# 1st 2nd Last
#A D B C
#B C A E
#C A B E
#D C B A
#E C A D
Run Code Online (Sandbox Code Playgroud)
现在用于pandas.DataFrame.lookup为中corr的每一列获取相应的列值result
for x in result.columns:
result[x+"_Val"] = corr.lookup(corr.index, result[x])
print(result)
# 1st 2nd Last 1st_Val 2nd_Val Last_Val
#A D B C 0.94 0.65 0.31
#B C A E 0.96 0.87 0.41
#C A B E 0.95 0.88 0.69
#D C B A 0.99 0.84 0.64
#E C A D 0.89 0.71 0.32
Run Code Online (Sandbox Code Playgroud)
print(result[['1st', '1st_Val', '2nd', '2nd_Val', 'Last', 'Last_Val']])
# 1st 1st_Val 2nd 2nd_Val Last Last_Val
#A D 0.94 B 0.65 C 0.31
#B C 0.96 A 0.87 E 0.41
#C A 0.95 B 0.88 E 0.69
#D C 0.99 B 0.84 A 0.64
#E C 0.89 A 0.71 D 0.32
Run Code Online (Sandbox Code Playgroud)