【问题标题】:Welles Wilder's moving average with pandasWelles Wilder 与熊猫的移动平均线
【发布时间】:2020-06-12 02:29:57
【问题描述】:

我正在尝试在熊猫数据框中计算 Welles Wilder 的移动平均类型(也称为累积移动平均)。

计算“A”系列“n”个周期的怀尔德移动平均线的方法是:

  • 计算“A”中前“n”个值的平均值,并将其设置为“n”位置的平均值。
  • 对于以下值,使用以 (n-1) 加权的先前平均值和以 1 加权的系列的当前值并除以“n”。

我的问题是:如何以矢量化的方式实现这一点?

我尝试对数据帧进行迭代(不推荐我阅读的内容,因为速度很慢)。它有效,值是正确的,但我得到一个错误

SettingWithCopyWarning:
正在尝试在 DataFrame 中的切片副本上设置值

这可能不是最有效的方法。

到目前为止我的代码:

import pandas as pd
import numpy as np

#Building Random sample:
datas = pd.date_range('2020-01-01','2020-01-31')
np.random.seed(693)
A = np.random.randint(40,60, size=(31,1))
df = pd.DataFrame(A,index = datas, columns = ['A'])

period = 12 # Main parameter
initial_mean = A[0:period].mean() # Equation for the first value.

size = len(df.index)
df['B'] = np.full(size, np.nan)
df.B[period-1] = initial_mean

for x in range(period, size):
    df.B[x] = ((df.A[x] + (period-1)*df.B[x-1]) / period) # Equation for the following values. 

print(df)

【问题讨论】:

  • 供参考,Pandas TA 项目已经实施了怀尔德的移动平均线。

标签: python pandas moving-average


【解决方案1】:

您可以使用 Pandas ewm() 方法,其行为与您在 adjust=False 时描述的完全一样:

当 adjust 为 False 时,加权平均值递归计算为:

weighted_average[0] = arg[0];
weighted_average[i] = (1-alpha)*weighted_average[i-1] + alpha*arg[i]

如果您想对前期间项进行简单平均,您可以先进行此操作,然后将ewm() 应用于结果。

您可以用前期间项的平均值计算一个系列,然后逐字重复其他项目,公式为:

pd.Series(
    data=[df['A'].iloc[:period].mean()],
    index=[df['A'].index[period-1]],
).append(
    df['A'].iloc[period:]
)

因此,为了计算 Wilder 移动平均线并将其存储在新列 'C' 中,您可以使用:

df['C'] = pd.Series(
    data=[df['A'].iloc[:period].mean()],
    index=[df['A'].index[period-1]],
).append(
    df['A'].iloc[period:]
).ewm(
    alpha=1.0 / period,
    adjust=False,
).mean()

此时,您可以计算df['B'] - df['C'],您会发现差值几乎为零(浮点数存在一些舍入误差。)所以这相当于您使用循环进行计算。

您可能要考虑跳过前 期间 项之间的直接平均值,并从头开始应用 ewm(),这将假定第一行 第一次计算中的先前平均值。结果会略有不同,但一旦您经历了几个时期,那么这些初始值几乎不会影响结果。

这将是一种更简单的计算方式:

df['D'] = df['A'].ewm(
    alpha=1.0 / period,
    adjust=False,
).mean()

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2021-08-26
    • 2021-10-23
    相关资源
    最近更新 更多