1. ホーム
  2. Python

移動平均のPython実装

2022-02-13 10:09:13
<パス

PythonによるSliding Averageアルゴリズム(Moving Average)スキーム。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np

# Equivalent to the smooth function in MATLAB, but the smoothing window must be odd.

# yy = smooth(y) smooths the data in the column vector y .
# The first few elements of yy are given by
# yy(1) = y(1)
# yy(2) = (y(1) + y(2) + y(3))/3
# yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
# yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
# ...

def smooth(a,WSZ):
    # a:raw data, NumPy 1-D array containing the data to be smoothed
    # must be 1-D, if not, use np.ravel() or np.squeeze() to transform 
    # WSZ: smoothing window size needs, which must be odd number,
    # as in the original MATLAB implementation
    out0 = np.convolve(a,np.ones(WSZ,dtype=int),'valid')/WSZ
    r = np.range(1,WSZ-1,2)
    start = np.cumsum(a[:WSZ-1])[::2]/r
    stop = (np.cumsumum(a[:-WSZ:-1])[::2]/r)[::-1]
    return np.concatenate(( start , out0, stop ))

# another one, bad edge handling

"""
def movingaverage(data, window_size):
    window = np.ones(int(window_size))/float(window_size)
    return np.convolve(data, window, 'same')
"""

# another one, faster
# The output result is not equal to the original data, assuming the original data is m and the smoothing step is t, the output data is m-t+1

"""
def movingaverage(data, window_size):
    cumsum_vec = np.cumsum(np.insert(data, 0, 0)) 
    ma_vec = (cumsum_vec[window_size:] - cumsum_vec[:-window_size]) / window_size
    return ma_vec
"""