【问题标题】:Calculate Average True Range directly with Dataframe直接使用 Dataframe 计算平均真实范围
【发布时间】:2022-04-12 21:43:02
【问题描述】:

我想知道是否有一种简单直接的方法可以从 DataFrame 对象计算ATR。我被困在 max() 部分。这就是我想要做的:

df['atr']=max( (df['High']-df['Low']), (df['High']-df['Close'].shift()).abs(), (df['Low']-df['close'].shift()).abs() )

上面的代码给出了这个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我知道在这种情况下使用 max() 不适合数据框对象。但如果它有效,这将是相当优雅和简单的。只是想知道数据框对象中是否有内置函数来实现这一点。

【问题讨论】:

  • 在谷歌上的快速搜索给了我这个:learnpythonwithrune.org/…也许它会帮助你
  • 谢谢。我实际上已经成功地计算了 ATR,但我更想寻找一种更优雅、更直接的方法来使用 DF 来计算。我的问题更像是是否有某种神奇的 max() 函数可以与 DF 一起使用并帮助在此过程中创建 df 列。

标签: pandas


【解决方案1】:

按照您的方法:

np.max( ((df['High']-df['Low']).values, np.abs(df['High']-df['Close'].shift()), np.abs(df['Low']-df['Close'].shift())) , axis=0)

一个函数可以是这个(没有熊猫复制警告):

def ATR(data: pd.DataFrame, window=14, use_nan=True) -> pd.Series:
    df_ = data.copy(deep=True)

    df_.loc[:, 'H_L'] = df_['High'] - df_['Low']
    df_.loc[:, 'H_Cp'] = abs(df_['High'] - df_['Close'].shift(1))
    df_.loc[:, 'L_Cp'] = abs(df_['Low'] - df_['Close'].shift(1))
    df_.loc[:, 'TR'] = df_[["H_L", "H_Cp", "L_Cp"]].max(axis=1)
    df_.loc[:, 'ATR'] = df_['TR'].rolling(window).mean()

    for i in range(window, len(df_)):
        df_.iloc[i, df_.columns.get_loc('ATR')] = (((df_.iloc[i - 1, df_.columns.get_loc('ATR')]) * (window - 1)) + df_.iloc[
            i, df_.columns.get_loc('TR')]) / window

    if use_nan:
        df_.iloc[:window, df_.columns.get_loc('ATR')] = np.nan

    return df_['ATR']

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2021-10-13
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多