最近在搞毕业论文的预测部分,我收集到的销售数据波动性较大,尤其是存在尖峰数据,我导师给我提供了两种降噪的方法,一种是小波分解,一种是经验模式分解。这两种方法按照老师的话来说就是方法很旧,但是很有效。关于小波分解,我主要的工作如下
1、导入csv数据,
#导入相关库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
import pywt
path = r"D:\桌面文件夹哦\数据统计\小虫\总训练集 - 副本 (2).CSV" # 原数据路径
# 提取数据
data = pd.read_csv(path)
data = data.iloc[:, 0] # 取第一列数据
plt.plot(data)
plt.show()
2、根据设计的优化函数,将数据输入进去,进行降噪(这一步不用改,封装好的)
def sgn(num):
if (num > 0.0):
return 1.0
elif (num == 0.0):
return 0.0
else:
return -1.0
def wavelet_noising(new_df):
data = new_df
data = data.values.T.tolist() # 将np.ndarray()转为列表
w = pywt.Wavelet('sym8') # 选择sym8小波基
[ca5, cd5, cd4, cd3, cd2, cd1] = pywt.wavedec(data, w, level=5) # 5层小波分解
length1 = len(cd1)
length0 = len(data)
Cd1 = np.array(cd1)
abs_cd1 = np.abs(Cd1)
median_cd1 = np.median(abs_cd1)
sigma = (1.0 / 0.6745) * median_cd1
lamda = sigma * math.sqrt(2.0 * math.log(float(length0), math.e)) # 固定阈值计算
usecoeffs = []
usecoeffs.append(ca5) # 向列表末尾添加对象
# 软硬阈值折中的方法
a = 0.5
for k in range(length1):
if (abs(cd1[k]) >= lamda):
cd1[k] = sgn(cd1[k]) * (abs(cd1[k]) - a * lamda)
else:
cd1[k] = 0.0
length2 = len(cd2)
for k in range(length2):
if (abs(cd2[k]) >= lamda):
cd2[k] = sgn(cd2[k]) * (abs(cd2[k]) - a * lamda)
else:
cd2[k] = 0.0
length3 = len(cd3)
for k in range(length3):
if (abs(cd3[k]) >= lamda):
cd3[k] = sgn(cd3[k]) * (abs(cd3[k]) - a * lamda)
else:
cd3[k] = 0.0
length4 = len(cd4)
for k in range(length4):
if (abs(cd4[k]) >= lamda):
cd4[k] = sgn(cd4[k]) * (abs(cd4[k]) - a * lamda)
else:
cd4[k] = 0.0
length5 = len(cd5)
for k in range(length5):
if (abs(cd5[k]) >= lamda):
cd5[k] = sgn(cd5[k]) * (abs(cd5[k]) - a * lamda)
else:
cd5[k] = 0.0
usecoeffs.append(cd5)
usecoeffs.append(cd4)
usecoeffs.append(cd3)
usecoeffs.append(cd2)
usecoeffs.append(cd1)
recoeffs = pywt.waverec(usecoeffs, w) # 信号重构
return recoeffs
3、输出降噪后的数据,导出一份新的csv文件
data_denoising = wavelet_noising(data) # 调用函数进行小波阈值去噪
print(data_denoising)
plt.plot(data_denoising) # 显示去噪结果
plt.show()
df = pd.DataFrame(data_denoising)
df.to_csv(r"D:\桌面文件夹哦\数据统计\小虫\去噪数据.csv",float_format='%.1f')#去噪后数据保存路径