搜了很久也没找到Python怎么设置有权重的5点平滑滤波器,就自己写了一个1-2-4-2-1五点平滑。
为了让平滑后的时间序列边缘值不为空,往外扩展了2个数,是用边缘的数据平均得出的,这样平滑后不会太失真。
import csv
def smooth_5(data):
import numpy as np
if type(data) == "xarray.core.dataarray.DataArray":
data=data.data.tolist()
elif type(data) == 'array':
data=data.tolist()
data = [float(i) for i in data]
# 扩展边缘值
data_02 = (data[0]+data[1]+data[2])/3.0
data_01 = (data[0]+data[1]+data[2]+data[3])/4.0
data_1 = (data[-1]+data[-2]+data[-3]+data[-4])/4.0
data_2 = (data[-1]+data[-2]+data[-3])/3.0
data = [data_02,data_01]+data+[data_1,data_2]
# 乘上各个位置的系数
arr_02 = np.array(data)[:-4]*0.1
arr_01 = np.array(data)[1:-3]*0.2
arr_00 = np.array(data)[2:-2]*0.4
arr_1 = np.array(data)[3:-1]*0.2
arr_2 = np.array(data)[4:]*0.1
# 合并数组
arr_data = arr_02+arr_01+arr_00+arr_1+arr_2
return arr_data
Id=[]
with open('Id_norm.csv',encoding='gb18030',errors="ignore") as d:
csv_file = csv.reader(d)
for row in csv_file :
Id.append(row)
Id_norm=Id[1]
Id_5=smooth_5(Id_norm)
实测能用
同理,还可以做1-2-1,1-3-4-3-1等等滤波器,只需要修改相应系数即可
欢迎交流
祝各位科研顺利~



