【问题标题】:IndexError: index out of bounds when using 'and' operatorsIndexError:使用“和”运算符时索引超出范围
【发布时间】:2020-11-10 05:45:39
【问题描述】:

我正在尝试为股票图表创建支撑和阻力。但是,我收到了这个错误。 这是我的代码:

def isResistance(df,i):
    resistance = df['High'][i] > df['High'][i-1]  and df['High'][i] > df['High'][i+1] \
    and df['High'][i] > df['High'][i+2] and df['High'][i] > df['High'][i-2] \
    and df['High'][i] > df['High'][i+3] and df['High'][i] > df['High'][i-3] 
    
    return resistance

我正在尝试通过使用以下方式获取所有支撑和阻力列表:

levels = []
for i in range(2,df.shape[0]-2):
    
    if isSupport(df,i):
        levels.append((i,df['Low'][i]))
    elif isResistance(df,i):
        levels.append((i,df['High'][i]))

那么这个部分就出现了错误:

and df['High'][i] > df['High'][i+3] and df['High'][i] > df['High'][i-3]

但是,在这段代码中没有任何错误:

def isSupport(df,i):
    support = df['Low'][i] < df['Low'][i-1]  and df['Low'][i] < df['Low'][i+1] \
    and df['Low'][i] < df['Low'][i+2] and df['Low'][i] < df['Low'][i-2] \
    and df['Low'][i] < df['Low'][i+3] and df['Low'][i] < df['Low'][i-3]
    
    return support

你有解决这个问题的想法吗? 谢谢

【问题讨论】:

  • 假设 df 是 Pandas 数据帧,难道不应该通过利用某种切片 + 广播来用更少的代码来做到这一点吗? all(df['High'][i] &gt; df['High'][i-3:i+4]) 之类的东西(除了我完全不确定 Pandas 切片是如何工作的......)

标签: python pandas


【解决方案1】:

在Python中,逻辑是按顺序执行的,即

对于a and b and c,将首先评估a,然后是b,最后是c。如果a是False,则b和c不会被执行和检查。

因此,在您的情况下,由于df['High'][i] &gt; df['High'][i+3] and df['High'][i] &gt; df['High'][i-3] 之前的子句可能评估为False,因此该逻辑链的执行结束并且不会评估具有IndexError 的语句。但是如果它们都被评估为True,则具有IndexError 的语句将被评估并因此向您抛出错误。

要修复它,您可以简单地在其前面再添加一个子句len(df['High']) &gt;= 3,以利用此逻辑链评估顺序并阻止它访问无效索引。或者我将它重写为更长的if 语句以获得更简洁的代码。

更多关于 herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2019-11-25
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多