Вычисление среднего истинного диапазона в кадре данных Pandas
Я пытаюсь добавить столбец "Средний истинный диапазон" к фрейму данных, который содержит исторические данные о запасах.
Код, который я использую до сих пор:
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().
Я несколько дней гуглял, пытаясь узнать, как устранить эту ошибку или сделать код лучше и т. Д., И не нашел ничего, что помогло бы мне в этом.
Любая помощь в следующем будет высоко ценится:
Как устранить ошибку
Как сделать код лучше - я не имею в виду, что я должен кодировать его таким образом, и могут быть более эффективные способы сделать это.
Спасибо заранее
2 ответа
TL; Dr Использование
dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1)
объяснение
Вы не можете использовать встроенный max
на объектах панд. Поскольку первый аргумент вы передаете max
повторяется, эта подпись max
вызывается:
max
(повторяемый [ , ключ ])
Это неявно выполняет __nonzero__
(правдивость) проверьте первый аргумент, чтобы определить, является ли итерируемая пустым, откуда и происходит ваша ошибка. Объекты Numpy и Pandas не приводят к логическим расчетам.
Вы ищете что-то вроде этого:
dataframe['TrueRange'] = dataframe[['ATR1', 'ATR2', 'ATR3']].max(axis=1)
Это вычисляет максимум ATR*
столбцы вдоль горизонтальной оси и возвращает результат в виде Series
, который вы затем добавляете как новый TrueRange
столбец в вашем фрейме данных.