2013-08-01 2 views
3

Я хотел бы вычислить скользящую ранговую корреляцию между двумя столбцами в кадре данных. Однако текущий rolling_corr в пандах не поддерживает ранговую корреляцию. Я попытался выполнить скользящую ранговую корреляцию с rolling_apply, но не имел никакого успеха. Кажется, что rolling_apply принимает только один массив в качестве входного аргумента, но для корреляции нужны два массива. Есть ли умный способ реализации скользящей ранговой корреляции с rolling_apply или некоторыми другими методами? Ранговая корреляция будет хорошим дополнением к rolling_corr, если это возможно.Как вычислить скользящее ранжирование с использованием Pandas

ответ

4

Не думаю, что rolling_apply можно использовать для коррекции качения, поскольку он, по-видимому, разбивает DataFrames на 1-мерные массивы. Там могут быть лучшие способы сделать это, но одно решение сделать генератор, чтобы получить кусочек для каждого окна сами:

def window(length, size=2, start=0): 
    while start + size <= length: 
     yield slice(start, start + size) 
     start += 1 

, а затем петлю через него ..

In [144]: from pandas import DataFrame 
    ...: import numpy as np 
    ...: 
    ...: df = DataFrame(np.arange(10).reshape(2,5).T, columns=['a','b']) 
    ...: 
    ...: df.iloc[0,1] = -1  #still perfect with ranked correlation, but not with pearson's r 
    ...: 
    ...: for w in window(len(df), size=3): 
    ...:  df_win = df.iloc[w,:] 
    ...:  spearman = df_win['a'].rank().corr(df_win['b'].rank()) 
    ...:  pearson = df_win['a'].corr(df_win['b']) 
    ...:  print w.start, spearman, pearson 
    ...:  
0 1.0 0.917662935482 
1 1.0 1.0 
2 1.0 1.0 
Смежные вопросы