2016-03-02 161 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):)他們建議的解決方案是相同的 –