[英]pandas - calculating rolling variance in rank order
我有以下兩個數據框:
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、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()
? 我懷疑這是不可能的。
您可以將具有排名信息的第二個數據幀轉換為列索引的ndarray,然后使用NumPy的索引工具之一基於此索引數組轉換原始數據幀。 以下是使用numpy.take()進行轉換的示例。
將第二個數據幀從排名轉換為索引(從1到0):
df_rank = df_rank - 1
使用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
在常規數據幀上執行所需的任何操作:
df_new.expanding(1,axis=1).var(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.