首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中实现良好的移动平均

如何在Python中实现良好的移动平均
EN

Stack Overflow用户
提问于 2018-09-13 06:38:58
回答 3查看 349关注 0票数 1

我正在做一些研究,我正在用Python实现一个基于以下数学表达式的移动平均:

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

我是这样实现的:

代码语言:javascript
复制
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变体,以最小化开始和结束时的信号丢失(现在我使用一个带零的列表)。

有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-13 06:59:31

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-13 20:39:49

您可以使用抽头数均为1的过滤器

代码语言:javascript
复制
import scipy as sp
import scipy.signal as sig

h = sp.ones(10)/10
y = sig.lfilter(h, 1, x)
票数 1
EN

Stack Overflow用户

发布于 2018-09-13 13:16:29

此时,我找到了以下代码:

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52304384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档