小波分解处理非平稳时序数据(降噪)

最近在搞毕业论文的预测部分,我收集到的销售数据波动性较大,尤其是存在尖峰数据,我导师给我提供了两种降噪的方法,一种是小波分解,一种是经验模式分解。这两种方法按照老师的话来说就是方法很旧,但是很有效。关于小波分解,我主要的工作如下

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')#去噪后数据保存路径

注意:在将去噪后数据导入到新的csv文件中,要先把数据以DataFrame的格式转化过来。即pd.DataFrame(data_denoising)

你可能感兴趣的:(笔记,python,机器学习,开发语言)