【问题标题】:Is this an efficient way to compute a moving average?这是计算移动平均线的有效方法吗?
【发布时间】:2017-01-12 01:08:51
【问题描述】:

我有一些{open|high|low|close} 市场数据。我想从每行的close 值计算一个简单移动平均线。

我环顾四周,找不到一个简单的方法来做到这一点。我已经通过下面的方法计算了它。我想知道是否有更好的方法:

data = get_data_period_symbol('1h', 'EURUSD')

empty_list = np.zeros(len(data))

data['SMA10'] = empty_list
ma = 10

for i in range(ma-1, len(data)):
    vals = data['<CLOSE>'][i-(ma-1):i+1].tolist()
    mean = np.average(vals)
    index = data.index[i]
    data.set_value(index, 'SMA10', mean)

【问题讨论】:

  • 您在寻找rolling吗?
  • 查看此 SO thread 以获得有效的滚动平均解决方案。

标签: python pandas dataframe moving-average


【解决方案1】:

Pandas 提供了完成此类工作所需的所有工具。 假设您的数据按时间索引:

data['SMA10'] = data['<close>'].rolling(window=10).mean()

瞧。

编辑: 我想只注意较新的 api 用法。引用自Pandas docs

警告 在 0.18.0 版之前,pd.rolling_、pd.expanding_ 和 pd.ewm* 是模块级函数,现已弃用。这些被使用滚动、扩展和 EWM 替换。对象和相应的方法调用。

【讨论】:

    【解决方案2】:
    data['SMA10'] = pd.rolling_mean(data['<CLOSE>'][:], 10)
    

    是我最初找到的解决方案,但是您收到警告说它已被弃用

    因此:

    data['SMA10'] = data['<CLOSE>'][:].rolling(window=10, center=False).mean()
    

    【讨论】:

      【解决方案3】:

      您可以按照answer 中的建议使用np.convolve。所以这样的事情应该可以工作:

      data.loc[ma-1:, "SMA10"] = np.convolve(data["<CLOSE>"], np.ones((ma,))/ma, mode="valid")
      

      PS: 我刚刚看到你自己的答案,这实际上是一个更好的解决方案!

      【讨论】:

        猜你喜欢
        • 2014-11-18
        • 2017-02-20
        • 2021-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多