Python 计算数据帧中的平均真范围列

Python 计算数据帧中的平均真范围列,python,pandas,technical-indicator,Python,Pandas,Technical Indicator,我正在尝试将Average True Range列添加到包含历史股票数据的数据框中 我目前使用的代码是: def add_atr_to_dataframe (dataframe): dataframe['ATR1'] = abs (dataframe['High'] - dataframe['Low']) dataframe['ATR2'] = abs (dataframe['High'] - dataframe['Close'].shift()) dataframe['

我正在尝试将Average True Range列添加到包含历史股票数据的数据框中

我目前使用的代码是:

def add_atr_to_dataframe (dataframe):
    dataframe['ATR1'] = abs (dataframe['High'] - dataframe['Low'])
    dataframe['ATR2'] = abs (dataframe['High'] - dataframe['Close'].shift())
    dataframe['ATR3'] = abs (dataframe['Low'] - dataframe['Close'].shift())
    dataframe['TrueRange'] = max (dataframe['ATR1'], dataframe['ATR2'], dataframe['ATR3'])
    return dataframe
包含max函数的最后一行给出了错误:

ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
我已经在谷歌上搜索了几天,试图学习如何解决这个错误,或者以更好的方式编写代码,等等,但没有发现任何对我有帮助的东西

如果您在以下方面有任何帮助,我们将不胜感激:

  • 如何解决错误

  • 如何以更好的方式编写代码-我不是说我必须以这种方式编写代码,可能有更好的方式来编写代码


  • 提前感谢。

    我不太确定我是否明白你的意思,但我建议在有问题的行中使用而不是max()

    不太确定我是否明白你的意思,但我建议在有问题的行中使用而不是max()

    tl;dr使用

    dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1)
    

    解释

    不能在对象上使用内置的
    max
    。由于传递给
    max
    的第一个参数是iterable,因此调用
    max
    的签名:

    max
    (iterable[,key]

    这会隐式地对第一个参数执行
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuu非零(truthiness)检查,以确定iterable是否为空,这就是错误的来源。Numpy和Pandas对象不会通过设计强制为布尔对象

    您正在寻找类似以下内容:

    dataframe['TrueRange'] = dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1)
    

    这将计算沿水平轴的
    ATR*
    列的最大值,并将结果作为
    系列返回,然后将其作为新的
    TrueRange
    列添加到数据帧中。

    tl;dr使用

    dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1)
    

    解释

    不能在对象上使用内置的
    max
    。由于传递给
    max
    的第一个参数是iterable,因此调用
    max
    的签名:

    max
    (iterable[,key]

    这会隐式地对第一个参数执行
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuu非零(truthiness)检查,以确定iterable是否为空,这就是错误的来源。Numpy和Pandas对象不会通过设计强制为布尔对象

    您正在寻找类似以下内容:

    dataframe['TrueRange'] = dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1)
    

    这将计算沿水平轴的
    ATR*
    列的最大值,并将结果作为
    系列返回,然后将其添加为数据帧中的新
    TrueRange
    列。

    Igor,您的代码工作得非常好!非常感谢您以如此快速的响应和如此出色的解决方案!你刚刚结束了我几天的沮丧。没问题,请参阅编辑,了解你为什么会出现那个具体错误。而且,我在回答问题时太仓促了,你的问题有一个重复:)他们建议的解决方案是相同的。我一分钟前刚注意到这个重复,在谷歌搜索这个网站的几天里没有发现它-很抱歉我没有更早地找到它,再次感谢你花时间来帮我。Igor,你的代码工作得很好!非常感谢您以如此快速的响应和如此出色的解决方案!你刚刚结束了我几天的沮丧。没问题,请参阅编辑,了解你为什么会出现那个具体错误。而且,我在回答问题时太仓促了,你的问题有一个副本:)他们建议的解决方案是相同的我一分钟前才注意到这个副本,在谷歌搜索这个网站的几天里没有发现它-很抱歉我没有更早地找到它,再次感谢你花时间帮助我。谢谢你的建议。我曾经遇到过pd.max,但没有找到一种方法来逐行使用它。谢谢你的建议。我曾经遇到过pd.max,但没有找到一种逐行使用它的方法