【发布时间】:2021-07-06 16:02:19
【问题描述】:
本网站解释了如何计算两个值(数学排名和英语排名)之间的排名相关性: https://statistics.laerd.com/statistical-guides/spearmans-rank-order-correlation-statistical-guide-2.php
在我的例子中,我想计算顺序排名和价值排名之间的滚动相关性。
seriesData = [81,114,2,32,16,9,7,4,3,26,8,5,3,6,7] #15 length
corr = rolling_corr(seriesData, 4)
例如,我想计算与周期 4 的相关性,所以我必须执行 12 个窗口。我必须得到每个窗口的顺序和价值排名并计算相关性。
我已经构建了代码,但是它太慢了,因为我必须执行多达 500000 系列长度。这是第一个窗口计算的例子:
seriesValue order_rank value_rank delta
81 4 2 4
114 3 1 4
2 2 4 4
32 1 3 4
Rho Value for 1st window : -0.6000000000000001
seriesValue order_rank value_rank delta
114 4 1 9
2 3 4 1
32 2 2 0
16 1 3 4
Rho Value for 2nd window : -0.3999999999999999
你能帮我加快计算速度吗,谢谢。
def rolling_corr(seriesData, window):
corr = []
for j in range(len(seriesData)):
if j < window:
corr.append(np.nan)
else:
data = pd.DataFrame()
data['seriesValue'] = list(seriesData[j - window:j])
###Create Value rank and Order Rank for this window / period
data = data.reset_index()
data = data.rename(columns={'index': 'original_index'})
data = data.sort_values('seriesValue', ascending=False).reset_index(drop=True)
data = data.reset_index()
data['index'] = [i + 1 for i in data['index']]
data = data.rename(columns={'index': 'value_rank'})
data = data.set_index('original_index')
data = data.sort_index()
data['order_rank'] = np.arange(window, 0, -1)
####
# Calculate
data['delta'] = [(data.loc[ii, 'value_rank'] - data.loc[ii, 'order_rank']) ** 2 for ii in range(len(data))]
d = data['delta'].sum()
value = (1 - (6 * d) / (window ** 3 - window))
#print(data[['seriesValue', 'order_rank', 'value_rank', 'delta']].to_string(index=False))
#print("Rho Value for window " + str(j) + " : " +str(value))
corr.append(value)
return corr
corr = rolling_corr(seriesData, 4)
【问题讨论】:
标签: python pandas scipy statistics