2016-03-02 136 views
0

我正在尝试将平均真实范围列添加到包含历史库存数据的数据框。计算熊猫数据框中的平均真实范围列

我使用至今的代码是:

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. 如何做好代码以更好的方式 - 我的意思并不是说我有代码这样做,可能有更好的方法来做到这一点。

提前感谢。

回答

0

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

+0

感谢您的建议rde。我遇到过pd.max,但没有看到一种方法可以逐行使用它 – ironfish

3

TL;博士使用

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

说明

不能对大熊猫对象使用内置max。由于要传递到max第一个参数是迭代的maxthis签名被调用:

max(iterable[, key])

这隐含执行__nonzero__(感实性)检查的第一个参数来确定迭代是否为空,这就是你的错误来自于。 Numpy和Pandas物体不会通过设计强制布尔值。

您正在寻找这样的事情:

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

这个计算的最大沿水平轴的ATR*列,并返回结果作为Series,然后您可以添加为新的TrueRange列的数据帧。

+0

Igor,您的代码完美无缺!非常感谢你如此快速地回应,并带来了这么好的解决方案!你刚刚结束了对我的挫折日子。 – ironfish

+0

没问题,请参阅编辑为什么你会得到那个特定的错误。 –

+0

另外,我太急于回答,你的问题有一个重复[这里](http:// stackoverflow。com/questions/20033111/python-pandas-max-value-of-selected-columns):)他们建议的解决方案是相同的 –