Ковариационная матрица EWMA с использованием pandas.ewm.cov - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь вычислить экспоненциально взвешенную ковариацию между набором данных, используя функцию pandas.ewm.cov ().Звучит глупо, но у меня возникают проблемы с доступом к результату: в частности, как получить последнюю матрицу (в этом примере 999-й) в качестве фрейма данных панд (нарезка и т. Д., Кажется, также влияет на внутренние индексы 0, 1, 2).Кто-нибудь может предоставить эффективное и масштабируемое решение?

import pandas as pd
import numpy as np

if __name__ == "__main__":
    df = pd.DataFrame(np.random.randn(1000, 3))
    covs = df.ewm(span = 180).cov()

    print(covs)

    print(covs.iloc[-3:,:]) #this does not work anymore If I change the 
                            # dimension of the df from 3 i.e. to 4.

              0         1         2
0   0       NaN       NaN       NaN
    1       NaN       NaN       NaN
    2       NaN       NaN       NaN
1   0  0.032264 -0.163599 -0.125954
    1 -0.163599  0.829545  0.638665
    2 -0.125954  0.638665  0.491707
...         ...       ...       ...
999 0  0.878615  0.011006  0.157368
    1  0.011006  0.905043  0.078750
    2  0.157368  0.078750  1.058194

-----------------------------------

              0         1         2
999 0  1.160964  0.030447 -0.030059
    1  0.030447  0.880037  0.048503
    2 -0.030059  0.048503  0.975215

РЕДАКТИРОВАНИЕ: Только что вышел со следующим решением.Любое предложение для более чистого и / или прямого предложения наиболее ценится.

import pandas as pd
import numpy as np

if __name__ == "__main__":
    df = pd.DataFrame(np.random.randn(1000, col = 3))

    covs = df.ewm(span = 180).cov()

    covs = covs.iloc[-len(df.columns):]

    covs = covs.reset_index(level = 0, drop = True)

    print(covs)
...