Я определил взвешенную матрицу 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
Для этого конкретного сценария, как я могу эффективно перевернуть матрицу?
ОБНОВЛЕНИЕ:
После некоторых проб и ошибок мне удалось решить часть моей собственной проблемы, включив цикл for, который повторяется в течение скользящих периодов:
In:
rolling_window = 60
def cm(data):
data = data.values
row_data = data.shape[0]
col_data = data.shape[1]
# Define the number of rolls that have to be made:
rolls = row_data - rolling_window
# Define an empty list which will be filled with COV/VAR matrices:
cov_mat_main = []
for t in range(rolls):
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)
Вышел:
[[ 5.81310317e-07 -1.37889464e-06 -3.57360335e-07]
[-1.37889464e-06 8.73264313e-06 6.19930936e-06]
[-3.57360335e-07 6.19930936e-06 9.02566589e-06]]
[[ 4.03349133e-07 -1.31881055e-06 -6.03769261e-07]
[-1.31881055e-06 8.76683970e-06 6.26991034e-06]
[-6.03769261e-07 6.26991034e-06 8.68739335e-06]]]
Однако похоже, что вывод этой функции не соответствует выводу встроенной функции.
In:
cm = df.rolling(rolling_window).cov()
Вышел:
[[ 4.50638342e-06 -1.47342972e-05 -6.74556002e-06]
[-1.47342972e-05 9.79467608e-05 7.00500328e-05]
[-6.74556002e-06 7.00500328e-05 9.70591532e-05]]
[[ 3.41189600e-06 -9.47500359e-06 -4.76181287e-06]
[-9.47500359e-06 7.50918104e-05 5.93125976e-05]
[-4.76181287e-06 5.93125976e-05 9.40643303e-05]]]
Во фрейме данных нет пропущенных значений, которые могли бы объяснить потенциальное смещение в определенных матрицах по сравнению с матрицами .cov()
.
Надеюсь, кто-нибудь заметит ошибку.
Какие-либо предложения?