用熊猫来计算野生动物的移动平均值

问题描述 投票:1回答:1

我正试图在熊猫数据框中计算韦尔斯·怀尔德的移动平均线(也称为累积移动平均线)。

计算系列“ 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)
python pandas moving-average
1个回答
1
投票

您可以使用Pandas ewm()方法,其行为与ewm()时所描述的完全相同:

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

adjust=False

如果要对前一个[[period项进行简单平均,则可以先对它进行平均,然后将weighted_average[0] = arg[0]; weighted_average[i] = (1-alpha)*weighted_average[i-1] + alpha*arg[i] 应用于结果。

您可以使用前一个

period

项的平均值,然后是其他逐字重复的其他项,使用公式计算平均值的序列:ewm()
因此,为了计算怀尔德移动平均值并将其存储在新列pd.Series(
    data=[df['A'].iloc[:period].mean()],
    index=[df['A'].index[period-1]],
).append(
    df['A'].iloc[period:]
)
中,可以使用:

'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()
,并且您会发现差值几乎为零(浮点数存在一些舍入误差。)因此,这等效于使用循环进行的计算。

您可能要考虑跳过前

period

个项目之间的直接平均值,而只是从头开始应用df['B'] - df['C'],这将假定第一行is是第一次计算中的前一个平均值。结果将略有不同,但是一旦您经过几个periods,则这些初始值几乎不会影响结果。这将是一种更简单的计算方法:

ewm()

© www.soinside.com 2019 - 2024. All rights reserved.