【问题标题】:Python Rolling Spearman Rank Correlation (between order rank and value rank) from seriesPython Rolling Spearman Rank Correlation (order rank and value rank) from series
【发布时间】: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


    【解决方案1】:

    我发现pandas有apply rolling功能,这段代码比我之前的操作要快。 250 个数据大约需要 0.72 秒(快 10 倍)。如果有人可以加快此代码的速度,我很高兴

    def spearmanCorr(seriesData, n):
        orderRank = pd.Series(range(n, 0, -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)
    

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多