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

时间:2016-03-02 17:16:06

标签: 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['ATR3'] = abs (dataframe['Low'] - dataframe['Close'].shift())
    dataframe['TrueRange'] = max (dataframe['ATR1'], dataframe['ATR2'], dataframe['ATR3'])
    return dataframe

包含max函数的最后一行给出错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我已经搜索了几天,试图学习如何解决此错误,或以更好的方式执行代码等,并且找不到任何可以帮助我的事情。

以下任何帮助都将非常感谢:

  1. 如何解决错误

  2. 如何以更好的方式执行代码 - 我并不是说我必须以这种方式编写代码,并且可能有更好的方法来执行此操作。

  3. 提前致谢。

2 个答案:

答案 0 :(得分:5)

tl; dr 使用

# \e not supported by POSIX; use \033 (octal) instead.
PASSED=$(printf '\033[32mPASSED\033[0m')
printf '[ %s ] some test\n' "$PASSED"

<强>解释

您无法在Pandas对象上使用内置dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1) 。由于您传递给max的第一个参数是可迭代的,因此会调用max的{​​{3}}签名:

  

max (可迭代的 [ ,密钥 ] < EM>)

这隐式对第一个参数执行max(真实性)检查,以确定iterable是否为空,这是您的错误来自哪里。 Numpy和Pandas对象不会通过设计强制给布尔值。

你正在寻找这样的东西:

__nonzero__

这会计算水平轴上dataframe['TrueRange'] = dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1) 列的最大值,并将结果作为ATR*返回,然后将其添加为数据框中的新Series列。

答案 1 :(得分:0)

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