微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Rolling Spearman Rank Correlation在订单等级和价值等级之间来自系列

如何解决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 举报,一经查实,本站将立刻删除。