Как пролонгировать явно определенную (кодированную) ковариационную матрицу?
Я определил взвешенную матрицу 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)
Я не лучший программист в мире. Поэтому, пожалуйста, сообщите мне, если есть какие-либо недостатки.