因此,我有一个数据集,其中包含2008年至2011年的(商业)每日数据,其中包含5个存储在名为storeddata
的pandas DataFrame中的变量。我想计算每天的指数加权移动平均协方差矩阵。我有一个启动期(让我们说从2008-01-01到2009-01-01),我计算了协方差矩阵,一个5x5矩阵,称为covmat1
。
现在我想迭代storeddata
- DataFrame,并在2009-01-01之后更新一个名为covfinaldict
的dict,每个工作日有一个5x5矩阵。我尝试过这段代码:
from pandas.tseries.offsets import BDay
import pandas as pd
import numpy as np
import datetime as dt
zeromatrix=np.mat(np.zeros((5,5)))
for row in storeddata.iterrows():
if row[0]>dt.datetime(2009,01,01):
mat1=covfinaldict[row[0]-BDay(1)]
for x in range(5):
for y in range(5):
if x==y:
zeromatrix[x,y]=sqrt(0.93*(mat1[x,y]**2)+0.07*(row[1][x+1]**2))
else:
zeromatrix[x,y]=0.93*mat1[x,y]+0.07*row[1][x+1]*row[1][y+1]
covfinaldict[row[0]]=zeromatrix
else:
covfinaldict[row[0]]=covmat1
公式是指数加权移动平均线的近似值,其详细信息无关紧要。从2009-01-01之后的每一天我获得相同的5x5矩阵(尽管它与covmat1
不同),计算不起作用。此外,如果我在控制台中运行sqrt(0.93*(mat1[x,y]**2)+0.07*(row[1][x+1]**2))
,我会0.1613
,如果我运行zeromatrix[x,y]
,我会得到0.158
(x = 4,y = 4)。这对我来说毫无意义。方程的左边怎么不等于右边?解释非常感谢。
答案 0 :(得分:1)
您应该复制zeromatrix对象:
import copy
和
covfinaldict[row[0]]=copy.copy(zeromatrix)
否则,所有covfinaldict行都将指向同一个对象。
来自Python docs; Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。该模块提供了通用的浅层和深层复制操作(如下所述)。