Расчет совокупной доходности в Numpy, проблема с индексами массива - PullRequest
1 голос
/ 16 сентября 2011

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

# finance equation to apply to each element of array
for row in cum_ret:
   for col in row:
       if sum(row)!=0:
           row[col] = prev_row[col]*(1+row[col])
       else:
           row[col] = 1

       cum_ret[row][col] = row[col]
   prev_row = row
# see changed contents
for row in cum_ret:
print row

Теперь я получаю сообщение о том, что используемые индексы массива должны быть целочисленного или логического типа.Я понял, потому что значение 'row' также является массивом, поэтому он не может индексировать объект массива.Так какой же правильный синтаксис для этого или это метод, который я должен использовать?

Заранее благодарен

Массив cum_ret является 2-ым массивом float64s и является массивомхочу изменить.Вот краткий фрагмент вывода:

[[ 0.          0.          0.          0.          0.        ]
 [ 0.00046187  0.00836672  0.00020435 -0.00048292  0.00342209]
 [-0.07633505 -0.00514199 -0.04133778 -0.02450642 -0.01865075]
 ..., 
 [ 0.01229435  0.00175341  0.00709808  0.00213371  0.0061171 ]
 [-0.0118614  -0.00994933 -0.00557095 -0.00141945 -0.00347423]
 [ 0.01214725 -0.00502466  0.00537611 -0.00035537 -0.00101685]]

И вот, где это происходит:

Traceback (most recent call last):
File "qstk1.py", line 37, in <module>
   cum_ret[row][col] = row[col]

IndexError: arrays used as indices must be of integer (or boolean) type

1 Ответ

6 голосов
/ 16 сентября 2011

Если cum_ret является массивом, вы можете использовать numpy.sum(cum_ret, axis=1), чтобы получить сумму строк, и numpy.sum(cum_ret, axis=1) != 0, чтобы сгенерировать ваш тест сразу для всего массива.Тогда вы можете использовать numpy.select() для применения ваших условий.

Если вы поместите оператор print row в начале вашего цикла, вы заметите, что он не целочисленный, а просто массив с нулевыми значениями ...Это вызывает вашу ошибку.Кстати, для выполнения этой операции вам не нужен такой цикл.

Еще одно соображение: что происходит в первом ряду?Что считается предыдущей строкой?

РЕДАКТИРОВАТЬ:

После прочтения ваших комментариев, я думаю, вы хотите что-то вроде этого:

import numpy
cum_ret = numpy.array([[0,0,0,0],[-0.234,-0.365,-0.634,-0.453], [-0.334,-0.465,-0.534,-0.653],[-0.134,-0.265,-0.334,-0.453]])
b = cum_ret + 1
c = numpy.cumprod(b, axis=0)

Нет необходимости в цикле, и нет необходимостичтобы проверить ваше состояние на наличие нулевых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...