小波降噪与重构例子 python

简单例子,python版
读取数据

import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
import pywt
import pywt.data
txt = pd.read_csv('电价.csv',header=None,names=['时间','当前时刻电价'])
print(txt.head())

小波降噪与重构例子 python_第1张图片
#小波降噪与重构画图

txt=np.array(txt)
def plot_signal_decomp(data, w,title):
    data = data[:, -1]  # 只对电价数据进行去噪重构
    mode = pywt.Modes.smooth
    """Decompose and plot a signal S.
    S = An + Dn + Dn-1 + ... + D1
    """
    w = pywt.Wavelet(w)#选取小波函数
    a = data
    ca = []#近似分量
    cd = []#细节分量
    for i in range(1):
        (a, d) = pywt.dwt(a, w, mode)#进行1阶离散小波变换
        ca.append(a)
        cd.append(d)

    rec_a = []
    rec_d = []

    for i, coeff in enumerate(ca):
        coeff_list = [coeff, None] + [None] * i
        rec_a.append(pywt.waverec(coeff_list, w))#重构

    for i, coeff in enumerate(cd):
        coeff_list = [None, coeff] + [None] * i
        rec_d.append(pywt.waverec(coeff_list, w))
    fig = plt.figure()
    plt.subplot(3, 1,1)
    plt.plot(data,label='原始电价数据曲线')
    plt.legend()

    plt.subplot(3, 1,2)
    plt.plot(rec_a[-1],'r', label='电价数据曲线趋势')
    plt.legend()

    plt.subplot(3, 1,3)
    plt.plot(rec_d[0],'g', label='电价数据曲线噪声')
    plt.legend()
    plt.show()
plot_signal_decomp(txt, 'sym5','sym5')#这里选择sym5小波,小波还有

小波降噪与重构例子 python_第2张图片
#获取重构后的趋势部分和噪声

def choose(data, w):
    data=data[:,-1]#只对电价数据进行去噪重构
    mode = pywt.Modes.smooth

    w = pywt.Wavelet(w)  # 选取小波函数
    a = data
    ca = []  # 近似分量
    cd = []  # 细节分量
    for i in range(1):#1阶变换
        (a, d) = pywt.dwt(a, w, mode)  # 进行1阶离散小波变换 dwt为分解
        ca.append(a)
        cd.append(d)

    rec_a = []
    rec_d = []

    for i, coeff in enumerate(ca):
        coeff_list = [coeff, None] +[None] * i#填充长度
        rec_a.append(pywt.waverec(coeff_list, w))  # waverec重构
    rec_a=np.array(rec_a[-1])#-1取最后一个基波
    rec_a=rec_a.reshape(-1,1)
    for i, coeff in enumerate(cd):
        coeff_list = [None, coeff] + [None] * i
        rec_d.append(pywt.waverec(coeff_list, w))#取出所有噪声波,1阶变换,有3个噪声
    rec_d=np.array(rec_d)
    return  rec_a,rec_d#取出趋势,噪声
trainingrec_a, trainingrec_d=choose(txt, 'sym5')#训练集电价趋势 和噪声

trainingrec_a为趋势
trainingrec_d为噪声

你可能感兴趣的:(算法,数据分析,python)