1

過去の株式データを含むデータフレームに 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. より良い方法でコードを作成する方法 - この方法でコーディングしなければならないという意味ではなく、より良い方法があるかもしれません。

ありがとうございます。

4

2 に答える 2

6

tl;dr使用

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

説明

maxPandas オブジェクトではビルトインを使用できません。渡す最初の引数maxは反復可能であるため、の署名maxが呼び出されます。

max(イテラブル [ , キー ])

これは、最初の引数に対して(真実性)チェックを暗黙的に実行して__nonzero__、反復可能オブジェクトが空であるかどうかを判断します。これがエラーの原因です。Numpy および Pandas オブジェクトは、意図的にブール値に強制されません。

あなたはこのようなものを探しています:

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

ATR*これは、横軸に沿って列の最大値を計算し、結果を として返します。Seriesこれをデータフレームに新しいTrueRange列として追加します。

于 2016-03-02T17:28:01.263 に答える
0

あなたが何を意味するのか正確にはわかりませんが、問題のある行で はmax( )の代わりにpd.max()を使用することをお勧めします。

于 2016-03-02T17:25:41.840 に答える