我试图在熊猫数据中计算Welles的移动平均类型(也称为累积移动平均)。
计算级数'A‘的'n’周期的Wilder移动平均的方法是:
我的问题是:如何以矢量化的方式实现这一点?
我试图在dataframe上进行迭代(我所读到的内容并不推荐,因为它很慢)。它有效,值是正确的,但是我得到了一个错误
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)
发布于 2020-02-27 19:06:31
您可以使用Pandas ewm()
方法,它的行为与adjust=False
时所描述的完全相同。
在调整错误时,按以下方式递归计算加权平均值:
weighted_average = arg;weighted_averagei =(1-α)*加权平均-1+α*argi
如果您想要对第一个句点项做简单的平均值,您可以先这样做,并将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()
https://stackoverflow.com/questions/60444037
复制