计算 Pandas 数据框中的平均真实范围列 [重复]

Posted

技术标签:

【中文标题】计算 Pandas 数据框中的平均真实范围列 [重复]【英文标题】:Calculating Average True Range column in Pandas dataframe [duplicate] 【发布时间】:2016-06-15 16:49:29 【问题描述】:

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

目前我使用的代码是:

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】:

tl;dr 使用

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

说明

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

max(可迭代 [ ,键 ]

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

你正在寻找这样的东西:

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

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

【讨论】:

Igor,您的代码完美运行!非常感谢您如此迅速地做出回应并提供了如此出色的解决方案!你刚刚结束了我几天的挫败感。 没问题,请参阅编辑以了解您收到该特定错误的原因。 另外,我回答得太仓促了,你的问题有重复的here :) 他们建议的解决方案是相同的 我只是在一分钟前注意到重复的内容,并且在谷歌搜索和搜索该网站的日子里没有遇到它 - 抱歉我没有早点找到它,再次感谢您抽出宝贵时间提供帮助。跨度> 【参考方案2】:

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

【讨论】:

感谢您的建议。我遇到过 pd.max 但没有看到逐行使用它的方法

以上是关于计算 Pandas 数据框中的平均真实范围列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中查找每三列的平均值

如何从 pandas 数据框中的大型每日 JSON 数据集计算平均月值?

在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”

通过 Pandas 中的函数替换 NaN 时索引超出范围

用相关列的平均值替换数据框中的 NaN 值的函数

规范化 pandas 中的数据