Numpy矩阵不会更新值

时间:2014-09-04 09:11:48

标签: python numpy matrix

因此,我有一个数据集,其中包含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)。这对我来说毫无意义。方程的左边怎么不等于右边?解释非常感谢。

1 个答案:

答案 0 :(得分:1)

您应该复制zeromatrix对象:

import copy

    covfinaldict[row[0]]=copy.copy(zeromatrix)

否则,所有covfinaldict行都将指向同一个对象。

来自Python docs; Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。该模块提供了通用的浅层和深层复制操作(如下所述)。