【问题标题】:How to implement a good moving average in Python如何在 Python 中实现一个好的移动平均线
【发布时间】:2019-02-17 15:19:26
【问题描述】:


我正在做一些研究,我正在基于这个数学表达式在 Python 中实现移动平均线:

其中:n = 样本,W1 = 窗口

我是这样实现的:

def movingAverage(signal, window):

   sum = 0
   mAver = []
   k = int((window-1)/2)

   for i in np.arange(k, len(signal)-k):
       for ii in np.arange(i-k, i+k):
           sum = sum + signal[ii]
       #end-for
       mAver.append(sum / window)
       sum = 0
   #end-for

   zeros = [0]*k
   mAver = zeros + mAver + zeros

   return mAver

效果很好。但我试图找到一些方法来实现k 变体,以最大限度地减少开始和最终丢失的信号(现在我使用的是一个零列表)。


有人可以帮我吗?

【问题讨论】:

    标签: python python-3.x signal-processing moving-average


    【解决方案1】:

    您可以只使用 Pandas 并为您的移动平均线指定 center=True

    import numpy as np
    import pandas as pd
    
    np.random.seed(0)
    
    s = pd.Series(np.random.randn(7)).round(1)
    moving_avg = s.rolling(window=3).mean(center=True)
    >>> pd.concat([s, moving_avg.round(2)], axis=1).rename(columns={0: 'signal', 1: 'MA'})
       signal    MA
    0     1.8   NaN
    1     0.4  1.07  # 1.07 = (1.8 + 0.4 + 1.0) / 3
    2     1.0  1.20  # 1.20 = (0.4 + 1.0 + 2.2) / 3
    3     2.2  1.70
    4     1.9  1.03
    5    -1.0  0.63
    6     1.0   NaN
    

    【讨论】:

    • 感谢您的回答,但我正在尝试在不使用库的情况下实现它。用其他语言实现会很好。
    【解决方案2】:

    您可以使用所有 1 个抽头的过滤器

    import scipy as sp
    import scipy.signal as sig
    
    h = sp.ones(10)/10
    y = sig.lfilter(h, 1, x)
    

    【讨论】:

    • 感谢您的回答,但我正在尝试在不使用库的情况下实现它。用其他语言实现会很好。
    • 看起来你已经在使用 numpy. Scipy 包含 numpy 以及为各种信号和数字处理函数添加的附加包。
    • 如果要这样实现移动平均,则必须将a设置为b的长度,所以窗口总和除以结果为平均,否则结束将输入乘以窗口长度。
    • 我刚刚进行了编辑。您可以绘制以前的版本与更正后的版本以查看差异。
    【解决方案3】:

    当时我发现了如下代码:

    def moving_average(samples, wind_len=1000):
        wind_len = int(wind_len)
        cumsum_samples = np.cumsum(samples)
        cumsum_diff = cumsum_samples[wind_len:] - cumsum_samples[:-wind_len]
        samples_average = cumsum_diff / float(wind_len)
        return samples_average
    
    def my_cumsum(samples):
        for ind in range(1, len(samples)):
           samples[ind] = samples[ind] + samples[ind - 1]
    

    【讨论】:

    • 感谢您的回答,但我正在尝试在不使用库的情况下实现它。用其他语言实现会很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2022-11-11
    • 2017-09-01
    • 2013-12-22
    • 2019-12-26
    相关资源
    最近更新 更多