为什么我会收到此Python索引错误?

时间:2015-08-18 22:58:45

标签: python numpy

使用我的代码时出现以下索引错误。此代码用于Aroon指标,用于股票的技术分析。错误消息说明如下。我使用的是Python27。

追踪(最近一次通话):   文件“C:\ Python \ Aroon.py”,第46行,in     阿隆(20)   文件“C:\ Python \ Aroon.py”,第37行,在aroon中     打印highp [x] IndexError:索引106超出轴0的大小为106

示例数据可以位于http://sentdex.com/sampleData.txt我将其复制到我自己的文本文件中。代码如下。它打印数据,但后来我得到以下错误信息,我试图找出原因。

import numpy as np
import time

sampleData = open("sampleData.txt", "r").read()
splitData = sampleData.split("\n")

date, closep, highp, lowp, openp, volume = np.loadtxt(splitData,delimiter=",", unpack=True)


def aroon(tf):

    AroonUp = []
    AroonDown = []
    AroonDate = []

    x = tf

    while x <= len(date):
        Aroon_Up = ((highp[x-tf:x].tolist().index(max(highp[x-tf:x])))/float(tf))*100#numpy array to list.

        Aroon_Down = ((lowp[x-tf:x].tolist().index(min(lowp[x-tf:x])))/float(tf))*100#numpy array to list.

        AroonUp.append(Aroon_Up)
        AroonDown.append(Aroon_Down)
        AroonDate.append(date[x])

        x+=1

        print "######"
        print highp[x] # THIS IS LINE 37
        print Aroon_Up
        print "=="
        print lowp[x]
        print Aroon_Down
        print "#####"
    return AroonDate,AroonUp,AroonDown


aroon(20)

5 个答案:

答案 0 :(得分:1)

您应该更改此行:

while x <= len(date):

到此:

while x < len(date):

您的文件中有106行,并且它正在寻找第107行(基于零)。

答案 1 :(得分:1)

请记住,在Python中,索引从0而不是len(date) == 106开始,因此最大的有效索引是10 5 ,而不是106.尝试更改while条件到

while x < len(date):

答案 2 :(得分:1)

Python开发人员已竭尽全力确保您几乎不必手动索引,正是因为它容易出错。

更多Pythonic方法解决问题,你想要一个序列中的元素,日期,(可能应该被称为日期顺便说一句)和这些元素的索引是使用枚举:

for x, date in enumerate(dates):
    if x < tf:
        continue
    # more code

或已经建议使用范围:

for x in range(tf, len(dates)):
    # more code

我个人会使用枚举。

另外,我建议使用描述性变量名称,以便其他人(和您自己)更容易阅读代码。

答案 3 :(得分:0)

问题在于如何在Python中指定范围:highp[x-tf:x]

此列表中的最后一个索引是x-1,但您尝试打印索引x

在列表中指定范围时,不包括最后一个元素。请参阅Python shell中的以下示例:

>>> a=[0,1,2,3]
>>> print a[0:1]
[0]
>>> print a[0:4]
[0, 1, 2, 3]
>>> print a[3:4]
[3]
>>> print a[0:5]
[0, 1, 2, 3]
>>> print a[0:6]
[0, 1, 2, 3]
>>> print a[0]
0
>>> print a[3]
3
>>> print a[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> 

lowp[x-tf:x]

会遇到同样的问题

第二个问题是你首先递增x(x+=1),然后在你的print语句中使用x作为索引,你应该颠倒顺序:

print "######"
print highp[x] # THIS IS LINE 37
print Aroon_Up
print "=="
print lowp[x]
print Aroon_Down
print "#####"

x+=1

答案 4 :(得分:0)

你可以使用for循环。参见python shell中的以下示例

  
    
      对于xrange(1,4)中的x,

:       ...打印x       ...       1       2       3