如果您想将 5 列集合的排名关联到一个 df 中,我认为它很简单,如下所示。
a = np.array(np.meshgrid([2018], [1,2,3,4,5,6],
[f"Stock {i+1}" for i in range(600)],
)).reshape(3,-1)
a = [a[0], a[1], a[2], [round(random.uniform(-1,2.5),1) for e in a[0]]]
df1= pd.DataFrame({"Sharpe":a[3], "Year":a[0], "Month":a[1], "Stock":a[2], })
a = [a[0], a[1], a[2], [round(random.uniform(-1,2.5),1) for e in a[0]]]
df2= pd.DataFrame({"Sharpe":a[3], "Year":a[0], "Month":a[1], "Stock":a[2], })
df1["Sharpe"] = df1["Sharpe"].astype(float)
df2["Sharpe"] = df2["Sharpe"].astype(float)
df3 = pd.DataFrame(
[[i, i+5, df1.iloc[i:i+5,0].rank().corr(df2.iloc[i:i+5,0].rank())]
for i in range(0, len(df1), 5)]
,columns=["start_row","end_row","corr"])
print(f"{df3[:10].to_string(index=False)}\n{df3[-10:].to_string(index=False)}")
输出
start_row end_row corr
0 5 0.394737
5 10 0.300000
10 15 0.921053
15 20 0.700000
20 25 -0.410391
25 30 0.105263
30 35 -0.300000
35 40 0.872082
40 45 0.200000
45 50 0.461690
start_row end_row corr
3550 3555 -0.153897
3555 3560 0.718185
3560 3565 -0.948683
3565 3570 0.100000
3570 3575 -0.820783
3575 3580 -0.670820
3580 3585 -0.131579
3585 3590 0.102598
3590 3595 0.872082
3595 3600 0.872082
所有列
df3 = pd.DataFrame(
{
**{"start_row":[i for i in range(0, len(df1), 5)],
"end_row":[i+5 for i in range(0, len(df1), 5)]
},
**{df1.columns[j]+"_corr":
[df1.iloc[i:i+5,j].rank().corr(df2.iloc[i:i+5,j].rank())
for i in range(0, len(df1), 5)]
for j in range(len(df1.columns))
}
}
)