Как пролонгировать явно определенную (кодированную) ковариационную матрицу?

Я определил взвешенную матрицу COVAR. Сейчас я пытаюсь свернуть это со временем. То есть я хочу получить взвешенную матрицу COVAR с скользящим окном 60. Я думал о том, как сделать это эффективно, но я не могу понять это.

В качестве примера я возьму ковариационную матрицу населения:

def cm(data):
    data = data.values
    row_data = data.shape[0]
    col_data = data.shape[1]

    cov_mat = np.zeros([col_data, col_data])

    for i in range(0, col_data):
        for j in range(0, col_data):
            mean_1 = np.mean(data[:,i])
            mean_2 = np.mean(data[:,j])
            total = 0

            for k in range(0, row_data):
               total = total + (data[k][i]-mean_1)*(data[k][j]-mean_2)

            cov_mat[i][j] = total * (1/row_data)

    return cov_mat

Для этого конкретного сценария, как я могу эффективно перевернуть матрицу? Я попытался уменьшить 'row_data', чтобы приравнять мое скользящее окно и добавить 1 к началу и концу этого периода оценки. Тем не менее, я продолжаю терпеть неудачу.

Надеюсь, вы можете помочь!

Заранее спасибо.

1 ответ

После некоторых проб и ошибок мне удалось решить собственную проблему. Для тех, кто заинтересован в решении:

rolling_window = 30

def cm(data):
     data = data.values
     rolls = row_data - rolling_window        

     row_data = data.shape[0]
     col_data = data.shape[1]

     cov_mat_main = []

     t = 0
     for t in range(rolls):
         t = t + 1
         cov_mat = np.zeros([col_data, col_data])

         for i in range(0, col_data):
             for j in range(0, col_data):
                 mean_1 = np.mean(data[t:rolling_window+t,i])
                 mean_2 = np.mean(data[t:rolling_window+t:,j])

                 total = 0
                 for k in range(t, rolling_window+t):
                     total = total + (data[k][i]-mean_1)*(data[k][j]-mean_2)

                 cov_mat[i][j] = total * (1/row_data)

         cov_mat_main.append(cov_mat)

     cov_mat_main = np.array(cov_mat_main)

cm(df)

Я не лучший программист в мире. Поэтому, пожалуйста, сообщите мне, если есть какие-либо недостатки.

Другие вопросы по тегам