Matlab及python实现移动平均法(一次/二次)

597 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

matlab实现移动平均

引言

移动平均法是用一组最近的实际数据值来预测未来一期或几期内公司产品的需求量、公司产能等的一种常用方法。移动平均法适用于即期预测。当产品需求既不快速增长也不快速下降,且不存在季节性因素时,移动平均法能有效地消除预测中的随机波动,是非常有用的。移动平均法根据预测时使用的各元素的权重不同,可以分为:简单移动平均和加权移动平均。 移动平均法是一种简单平滑预测技术,它的基本思想是:根据时间序列资料、逐项推移,依次计算包含一定项数的序时平均值,以反映长期趋势的方法。因此,当时间序列的数值由于受周期变动和随机波动的影响,起伏较大,不易显示出事件的发展趋势时,使用移动平均法可以消除这些因素的影响,显示出事件的发展方向与趋势(即趋势线),然后依趋势线分析预测序列的长期趋势。

算法

本文主要实现一次移动平均及二次移动平均 一次移动平均法有三个特点:
①预测值是离预测期最近的一组历史数据(实际值)平均的结果;
②参加平均的历史数据的个数(即跨越期数)是固定不变的;
③参加平均的一组历史数据是随着预测期的向前推进而不断更新的,每当吸收一个新的历史数据参加平均的同时,就剔除原来一组历史数据中离预测期最远的那个历史数据。

运用一次移动平均法求得的移动平均值,存在滞后偏差。特别是在时间序列数据呈现线性趋势时,移动平均值总是落后于观察值数据的变化。二次移动平均法,正是要纠正这一滞后偏差,建立预测目标的线性时间关系数学模型,求得预测值。二次移动平均预测法解决了预测值滞后于实际观察值的矛盾,适用于有明显趋势变动的市场现象时间序列的预测, 同时它还保留了一次移动平均法的优点。二次移动平均法适用于时间序列呈现线性趋势变化的预测。

源代码

Matlab

具体代码如下,其中X为序号Y为数据,在此基础上实现了一次与二次移动平均

clc,clear
x=[1 2 3 4 5 6 7 8 9 10];
y=[20 13 27 36 55 79 62 88 95 78];
m=length(y);
n=[3,4,5];
l=length(n);

%一次移动平均
for i=1:length(n)
    for j=1:m-n(i)+1
        data1{i}(j)=sum(y(j:j+n(i)-1))/n(i);
    end
    fanca(i)=sqrt(mean((y(n(i)+1:m)-data1{i}(1:end-1)).^2));
end
fanca


%二次移动平均
data2=data1{1};
n=3;
for j=1:m-n-1
    data3(j)=sum(data2(j:j+n-1))/n;
end
a11=2*data2(end)-data3(end);
b11=(2/(n-1))*(data2(end)-data3(end));
x11=a11+b11*(11-length(y));
x11

python

一次移动平均

import pandas as pd #导入数据分析包并命名为pd
import itertools
import numpy as np
from collections import deque

#data = pd.read_csv('train1.csv') #读取数据
#print(data)
#datay = data['Count']
#print(y)

def moving_average(data_array, n):

    it = iter(data_array)
    d = deque(itertools.islice(it, n - 1))
    print(d)
    s = sum(d)
    d.appendleft(0)
    for elem in it:
        s += elem - d.popleft()
        d.append(elem)
        yield s / n

if __name__ == '__main__':
    lst = [12,43,64,94,154,192,255]
    it = moving_average(lst,3)
    print(list(it))