Вычислить попарные корреляции скользящего окна в pandas

Я новичок в python и пытаюсь вычислить скользящие взаимные корреляции между доходностью разных акций. Мой фрейм данных огромен и содержит много NaN. Таким образом, roll_corr() работает не очень хорошо.

Вот фрагмент моего фрейма данных введите здесь описание изображения

Я создал функцию, которая генерирует корреляционную матрицу и возвращает ее обратно во фрейм данных следующим образом:

def corr_func(df,n=None):
    cmat = df.corr(method='pearson', min_periods=n)
    mask = np.ones(cmat.shape,dtype='bool')
    mask[np.triu_indices(len(cmat))] = False
    dfnew = cmat[cmat.notnull()&mask]    
    dfnew = dfnew.stack()
    dfnew = dfnew.reset_index(level=1)
    dfnew.columns = ['PERMNO2','Value']
    dfnew.reset_index(inplace=True)
    dfnew=dfnew.rename(columns = {'PERMNO':'PERMNO1'})
    # Associate with the window (first date and last date)
    df.reset_index(inplace=True)
    df.sort_values('date',inplace=True)
    dfnew['date_first'] = df['date'].iloc[0]
    dfnew['date_last'] = df['date'].iloc[-1]
    return(dfnew)

Результирующий фрейм данных объединяет уникальные парные корреляции доходности акций в моей выборке. Вот фрагмент полученного фрейма данных: введите здесь описание изображения

Я пытался реализовать скользящие кросс-корреляции с помощью roll_apply и этой функции (corr_func), но безуспешно. Есть ли элегантный способ агрегировать скользящие кросс-корреляции во фрейме данных с помощью roll_apply или других методов?


person polly    schedule 12.04.2017    source источник
comment
Хорошие решения показаны по этому вопросу.   -  person feetwet    schedule 05.02.2018