熊猫-按等级计算滚动方差

时间:2019-05-10 17:03:37

标签: python pandas dataframe

我有以下两个数据框:

          1         2         3         4         5         6
0  0.022135  0.007161  0.002604  0.009847  0.004476  0.003255
1  0.011515  0.000529  0.009481  0.003215  0.002157  0.003621
2  0.011556  0.000326  0.009440  0.003255  0.002116  0.003581
3  0.011556  0.000326  0.009440  0.003255  0.002116  0.003581
4  0.011556  0.000326  0.009440  0.003255  0.002116  0.003581
5  0.011556  0.000326  0.009196  0.003255  0.002360  0.003581
6  0.011353  0.000366  0.009155  0.003296  0.002319  0.003540
7  0.011353  0.000610  0.009155  0.003296  0.002563  0.003540
8  0.011312  0.000570  0.008952  0.003255  0.002604  0.003581
9  0.011312  0.000570  0.008952  0.003255  0.002604  0.003581
         1  2  3  4  5  6
level_0                  
0        3  6  5  2  4  1
1        2  5  4  6  3  1
2        2  5  4  6  3  1
3        2  5  4  6  3  1
4        2  5  4  6  3  1
5        2  5  4  6  3  1
6        2  5  4  6  3  1
7        2  5  4  6  3  1
8        2  5  4  6  3  1
9        2  5  4  6  3  1

我想按第二个数据帧中指定的顺序获取第一个数据帧中每一行的滚动方差。这种滚动差异需要进入第一个数据帧的新列,在这里我可以将其与原始列值相关联。

例如,第二个数据帧中的第一行是[3,6,5,5,2,4,1]。

第一个数据帧的第一行是[0.022135, 0.007161, 0.002604, 0.009847, 0.004476, 0.003255]

因此,滚动方差为:

var([0.002604]), in column 3
var([0.002604, 0.003255]), in column 6

等等。

此外,我需要知道此滚动方差中使用的值的数量。

所以结果的第一行将是:

(var[0.002604], 1) in column 3
(var[0.002604, 0.003255], 2) in column 6

等等

理想的情况下,不使用apply()的方法是什么?我怀疑这是不可能的。

1 个答案:

答案 0 :(得分:0)

您可以将具有排名信息的第二个数据帧转换为列索引的ndarray,然后使用NumPy的索引工具之一基于此索引数组转换原始数据帧。以下是使用numpy.take()进行转换的示例。

  1. 将第二个数据帧从排名转换为索引(从1到0):

    df_rank = df_rank - 1
    
  2. 使用 np.take()重建数据框:

    df_new = pd.DataFrame([ 
        np.take(df.values[i,:], df_rank.values[i,:]) for i in range(df.shape[0])
    ], columns = df.columns)
    
    #In [96]: df_new                                                                                                              
    #Out[96]: 
    #          1         2         3         4         5         6
    #0  0.002604  0.003255  0.004476  0.007161  0.009847  0.022135
    #1  0.000529  0.002157  0.003215  0.003621  0.009481  0.011515
    #2  0.000326  0.002116  0.003255  0.003581  0.009440  0.011556
    #3  0.000326  0.002116  0.003255  0.003581  0.009440  0.011556
    #4  0.000326  0.002116  0.003255  0.003581  0.009440  0.011556
    #5  0.000326  0.002360  0.003255  0.003581  0.009196  0.011556
    #6  0.000366  0.002319  0.003296  0.003540  0.009155  0.011353
    #7  0.000610  0.002563  0.003296  0.003540  0.009155  0.011353
    #8  0.000570  0.002604  0.003255  0.003581  0.008952  0.011312
    #9  0.000570  0.002604  0.003255  0.003581  0.008952  0.011312
    
  3. 在常规数据帧上执行所需的任何操作:

    df_new.expanding(1,axis=1).var(0)