
# 1. 均值滤波函数def moving_average(data, window=5): size = window - 1 arr_value = list(data.values) fill_left = arr_value[0] for i in range(size): arr_value.insert(0, fill_left) dat = pd.Series(arr_value) dat_roll = dat.rolling(window).mean() return dat_roll.dropna().reset_index(drop=True)具体应用到数据上:高频数据未完全拟合,其他数据也与源数据拟合程度一般


具体的python实现代码如下:
# 2. 中值滤波函数def median_filter(data: pd.Series, window=5): return pd.Series(scipy.signal.medfilt(data, window))应用到数据上:中值滤波将高频拟合,其他数据也与源数据拟合程度一般


对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。
python代码实现:
from scipy.signal import savgol_filter# 3. Savitzky-Golay滤波函数newans = savgol_filter(data, 5, 3, mode= 'nearest')plt.plot(index,data,label='源网络流量',color='r',linestyle='-',marker='*')plt.plot(index,newans,label='SG滤波网络流量',color='b')#添加linestyle设置线条类型plt.legend()plt.show()
# 备注:
data:代表曲线点坐标(x,y)中的y值数组
window_length:窗口长度,该值需为正奇整数。例如:此处取值5
k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
mode:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied. )

python原理手写代码实现:
# 3. Savitzky-Golay滤波函数""" data - list格式的1×n纬数据 window_size - 拟合的窗口大小 rank - 拟合多项式阶次 ndata - 修正后的值"""def savgol(data: list, window_size: int, rank: int): m = int((window_size - 1) / 2) odata = data[:] # 处理边缘数据,首尾增加m个首尾项 for i in range(m): odata.insert(0, odata[0]) odata.insert(len(odata), odata[len(odata)-1]) # 创建X矩阵 x = create_x(m, rank) # 计算加权系数矩阵B b = (x * (x.T * x).I) * x.T a0 = b[m] a0 = a0.T # 计算平滑修正后的值 ndata = [] for i in range(len(data)): y = [odata[i + j] for j in range(window_size)] y1 = np.mat(y) * a0 y1 = float(y1) ndata.append(y1) return ndata""" 创建系数矩阵X size - 2×size+1 = window_size rank - 拟合多项式阶次 x - 创建的系数矩阵"""def create_x(size, rank): x = [] for i in range(2 * size + 1): m = i - size row = [m**j for j in range(rank)] x.append(row) x = np.mat(x) return xnewans = savgol(list(data), 5, 3)plt.plot(index,data,label='源网络流量',color='r',linestyle='-',marker='*')plt.plot(index,newans,label='SG滤波网络流量',color='b')#添加linestyle设置线条类型plt.legend()plt.show()应用到数据上效果:此图更加接近源曲线,并且将高频部分进行平滑处理,拟合低频部分
