2014-09-04 6 views
0

Итак, у меня есть набор данных с (бизнес) ежедневными данными за период с 2008 по 2011 год для 5 переменных, хранящихся в pandas DataFrame под названием storeddata. Я хочу вычислить экспоненциально взвешенную скользящую среднюю матрицу ковариации за каждый день. У меня есть период инициации (скажем, с 2008-01-01 по 2009-01-01), для которого я вычисляю матрицу ковариации, матрицу 5x5, называемую covmat1.Матрица Numpy не обновляет значение

Теперь я хочу итерации через storeddata -DataFrame и после 2009-01-01 обновить dict под названием covfinaldict с матрицей 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 

Формулы аппроксимация экспоненциально взвешенного скользящего среднего, детали которых не имеют никакого отношения. Вычисление не работает в том смысле, что я получаю одну и ту же матрицу 5x5 (хотя она отличается от covmat1) на каждый день после 2009-01-01. Кроме того, если я запускаю 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

Вы должны скопировать zeromatrix объект:

import copy 

и

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

В противном случае, все covfinaldict строки будут указывать на тот же объект.

От Python docs; Операторы присваивания в Python не копируют объекты, они создают привязки между объектом и объектом. Для коллекций, которые изменяются или содержат изменяемые элементы, иногда требуется копия, поэтому можно изменить одну копию, не изменяя другую. Этот модуль обеспечивает общие операции с мелким и глубоким копированием (поясняется ниже).

+0

Ницца, работал! У вас не было бы объяснений, почему это исправление или, возможно, ссылка? – 2014-09-04 09:27:07

+0

Добавлено как объяснение, так и ссылка, спасибо –

Смежные вопросы