如何解决Python Rolling Spearman Rank Correlation在订单等级和价值等级之间来自系列
本网站解释了如何计算两个值(数学排名和英语排名)之间的排名相关性: 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,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,-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)
解决方法
我发现pandas有应用滚动功能,这段代码比我以前的操作快。 250 个数据大约需要 0.72 秒(快 10 倍)。如果有人可以加快此代码的速度,我很高兴
def spearmanCorr(seriesData,n):
orderRank = pd.Series(range(n,-1))
def corr(dat):
valueRank = pd.Series(dat).rank(method='first',ascending=False).reset_index(drop=True)
deltaSum = ((orderRank-valueRank)**2).sum()
value = (1 - (6 * deltaSum) / (n ** 3 - n)) * 100
return value
return seriesData.rolling(window=n).apply(corr)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。