1

我正在尝试将平均真实范围列添加到包含历史股票数据的数据框中。

到目前为止我使用的代码是:

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. 如何以更好的方式编写代码 - 我并不是说我必须以这种方式编写代码,并且可能有更好的方式来编写代码。

提前谢谢。

4

2 回答 2

6

tl;博士使用

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

解释

max您不能使用Pandas 对象的内置功能。由于您传递给的第一个参数max是可迭代的,因此调用签名:max

max(可迭代 [ , 键 ])

这隐含地对第一个参数执行__nonzero__(真实性)检查以确定可迭代对象是否为空,这就是您的错误的来源。Numpy 和 Pandas 对象不会通过设计强制转换为布尔值。

你正在寻找这样的东西:

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

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

于 2016-03-02T17:28:01.263 回答
0

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

于 2016-03-02T17:25:41.840 回答