【问题标题】:Calculating cumulative returns in Numpy, problem with array indices在 Numpy 中计算累积回报,数组索引的问题
【发布时间】:2011-09-16 13:09:19
【问题描述】:

我是使用 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

现在我收到一条错误消息,指出使用的数组索引必须是整数或布尔类型。我明白了,因为“行”值也是一个数组,所以它不能索引一个数组对象。那么这样做的正确语法是什么,或者它们是我应该使用的方法?

提前致谢

cum_ret 数组是 float64s 的 2d ndarray,是我要修改的数组。 这是输出的简短 sn-p:

[[ 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

【问题讨论】:

  • cum_ret的数据类型和形状是什么?错误究竟发生在哪里?堆栈跟踪是什么?

标签: python multidimensional-array numpy


【解决方案1】:

如果 cum_ret 是数组,您可以使用numpy.sum(cum_ret, axis=1) 来获取行和,并使用numpy.sum(cum_ret, axis=1) != 0 一次生成整个数组的测试。然后您可以使用numpy.select() 来应用您的条件。

如果您在循环的开头放置 print row 语句,您会注意到它不是整数,而是一个 numpy 数组...这会导致您的错误。顺便说一句,您不需要任何此类循环来执行此操作。

另一个考虑因素:第一行会发生什么?什么被认为是上一行?

编辑:

看完你的 cmets,我想你想要这样的东西:

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)

不需要循环,也不需要检查零行的条件。

【讨论】:

  • 第一行将始终包含所有零条目。这是一个特殊情况,所以我只加 1,否则一切都为 0。方程是递归的,所以第 1 行的新内容取决于第 0 行的值。如果要更改数组中的每个元素,是否不需要循环?
  • 那么其他地方是否有全为 0 的行?
  • 真的需要递归函数吗?您能否提供有关您正在计算的内容的更多详细信息?
  • 累计每日回报是我正在计算的,这就是这样做所需的等式。因此,行是时间段,列是该时间段内不同股票的每日收益。所以第 2 行的累积收益是第 1 行的累积收益 * ( 1+ daily_return of row(2) )。
  • @Aladdin:查看我的编辑。您可以先应用 +1,然后使用 numpy.cumprod() 获取累积乘积。
猜你喜欢
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2016-10-27
  • 2013-12-02
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多