相关文章:

Python xlwt数据保存到 Excel中以及xlrd读取excel文件画图

 先上效果图:

由于高频某些点的波动导致高频曲线非常难看,为了降低噪声干扰,需要对曲线做平滑处理,让曲线过渡更平滑,可以看出经过平滑处理后更明显去除噪声且更加美观。

1.滑动平均滤波

滑动平均滤波法 (又称:递推平均滤波法),它把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。

优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。

缺点: 灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM 。

效果如下:卷积核越大越平滑。

Numpy.convolve函数:numpy.convolve函数官方文档

  1. numpy.convolve(data, kernel, mode=‘full’) # 返回a=data和kernel的离散线性卷积。

参数说明:data:(N,)输入的第一个一维数组

kernel:(M,)输入的第二个一维数组

和一维卷积参数类似,data就是被卷积数据,kernel是卷积核大小。

mode:{‘full’, ‘valid’, ‘same’}参数可选,该参数指定np.convolve函数如何处理边缘。
mode可能的三种取值情况:

  • full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。
  • ‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。
  • ‘valid’  返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。(推荐这种)

代码如下:

  1. import xlwt
  2. import random
  3. import numpy as np
  4. from scipy.signal import savgol_filter
  5. import matplotlib.pyplot as plt
  6. import xlrd
  7. import scipy
  8. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  9. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  10. x_data=[]
  11. y_data=[]
  12. x_data1=[]
  13. y_data1=[]
  14. x_data3=[]
  15. x_data4=[]
  16. data = xlrd.open_workbook('train_reward.xls')
  17. table = data.sheets()[0]
  18. data1 = xlrd.open_workbook('train_reward_2.xls')
  19. table1 = data1.sheets()[0]
  20. cap = table.col_values(1) #读取第二列数据
  21. cap1 = table.col_values(0)#读取第一列数据
  22. #print(cap) #打印出来检验是否正确读取
  23. cap2 = table1.col_values(1) #读取第二列数据
  24. cap3 = table1.col_values(0)#读取第一列数据
  25. #print(cap) #打印出来检验是否正确读取
  26. for i in range(1,9999):
  27. y_data.append(cap[i])
  28. # x_data.append(cap1[i]*50) #对第一列数据扩大50倍
  29. x_data.append(cap1[i]) #对第一列数据扩大50倍
  30. for i in range(1,2231):
  31. y_data1.append(cap2[i])
  32. # x_data.append(cap1[i]*50) #对第一列数据扩大50倍
  33. x_data1.append(cap3[i]) #对第一列数据扩大50倍
  34. #?平滑处理:
  35. modes = ['full', 'same', 'valid'] #模式
  36. # mode可能的三种取值情况:
  37. # full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。
  38. # ‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。
  39. # ‘valid’  返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。
  40. def moving_average(interval, windowsize):
  41. window = np.ones(int(windowsize)) / float(windowsize)
  42. for m in modes:
  43. re = np.convolve(interval, window, 'valid')
  44. return re
  45. for i in range(1,9975):
  46. x_data3.append(i)
  47. for i in range(1,2207):
  48. x_data4.append(i)
  49. plt.plot(x_data, y_data, 'g',label ="TD3",alpha=0.2)
  50. y_av = moving_average(y_data, 25)
  51. plt.plot(x_data3, y_av, 'b',label ="TD3")
  52. y_av2 = moving_average(y_data1, 25)
  53. plt.plot(x_data4, y_av2, 'red',label ="DDPG")
  54. # plt.grid()网格线设置
  55. plt.grid(True)
  56. plt.title('滑动平均滤波/卷积核25')
  57. plt.legend()#标签
  58. plt.xlabel('episodes')
  59. plt.ylabel('Average reward')
  60. plt.show()

2. Savitzky-Golay 滤波器实现曲线平滑

对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。

代码语法:

python中Savitzky-Golay滤波器调用如下:

  1. y_smooth = scipy.signal.savgol_filter(y,53,3)
  2. # 亦或
  3. y_smooth2 = savgol_filter(y, 99, 1, mode= 'nearest')
  4. # 备注:
  5. y:代表曲线点坐标(x,y)中的y值数组
  6. window_length:窗口长度,该值需为正奇整数。例如:此处取值53
  7. k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
  8. mode:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied.

(1)window_length对曲线的平滑作用: window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害(备注:该值必须为正奇整数)。

(2)k值对曲线的平滑作用: k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线。

  1. Savitzky-Golay平滑滤波是光谱预处理中的常用滤波方法,其核心思想:是对一定长度窗口内的数据点进行k阶多项式拟合,从而得到拟合后的结果。 对它进行离散化处理后,S-G 滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。
  2. Savitzky-Golay平滑滤波被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器的 最大特点:在滤除噪声的同时可以确保信号的形状、宽度不变
  3. 使用平滑滤波器对信号滤波时,实际上是拟合了信号中的低频成分,而将高频成分平滑出去了。 如果噪声在高频端,那么滤波的结果就是去除了噪声,反之,若噪声在低频段,那么滤波的结果就是留下了噪声。

效果如下:

代码如下:

  1. import xlwt
  2. import random
  3. import numpy as np
  4. from scipy.signal import savgol_filter
  5. import matplotlib.pyplot as plt
  6. import xlrd
  7. import scipy
  8. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  9. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  10. x_data=[]
  11. y_data=[]
  12. x_data1=[]
  13. y_data1=[]
  14. data = xlrd.open_workbook('train_reward.xls')
  15. table = data.sheets()[0]
  16. data1 = xlrd.open_workbook('train_reward_2.xls')
  17. table1 = data1.sheets()[0]
  18. cap = table.col_values(1) #读取第二列数据
  19. cap1 = table.col_values(0)#读取第一列数据
  20. #print(cap) #打印出来检验是否正确读取
  21. cap2 = table1.col_values(1) #读取第二列数据
  22. cap3 = table1.col_values(0)#读取第一列数据
  23. #print(cap) #打印出来检验是否正确读取
  24. for i in range(1,9999):
  25. y_data.append(cap[i])
  26. # x_data.append(cap1[i]*50) #对第一列数据扩大50倍
  27. x_data.append(cap1[i]) #对第一列数据扩大50倍
  28. for i in range(1,2321):
  29. y_data1.append(cap2[i])
  30. # x_data.append(cap1[i]*50) #对第一列数据扩大50倍
  31. x_data1.append(cap3[i]) #对第一列数据扩大50倍
  32. #?平滑处理:
  33. tmp_smooth1 = scipy.signal.savgol_filter(y_data,25,3)
  34. # tmp_smooth2 = scipy.signal.savgol_filter(y_data,63,4)
  35. plt.semilogx(x_data,y_data,label = "TD3",alpha=0.2) #//增加透明度
  36. plt.semilogx(x_data,tmp_smooth1,label = 'TD3-smooth',color = 'red')
  37. # plt.semilogx(x_data,tmp_smooth2,label = 'mic'+str(1)+'拟合曲线-53',color = 'green')
  38. tmp_smooth3 = scipy.signal.savgol_filter(y_data1,25,3)
  39. #% window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害
  40. #! k值推荐3-5k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线
  41. # tmp_smooth2 = scipy.signal.savgol_filter(y_data,63,4)
  42. plt.semilogx(x_data1,y_data1,label = "DDPG",alpha=0.3) #//增加透明度
  43. plt.semilogx(x_data1,tmp_smooth3,label = 'DDPG-smooth',color = 'blue')
  44. # plt.plot(x_data, y_data,color="#006bac")
  45. plt.title('Savitzky-Golay 滤波器25/3')
  46. plt.legend()#标签
  47. plt.xlabel('episodes')
  48. plt.ylabel('Average reward')
  49. plt.show()

参考链接:

python 数据、曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)

python 平滑_Python 生成曲线进行快速平滑处理

【6】python生成数据曲线平滑处理——(Savitzky-Golay 滤波器、convolve滑动平均滤波)方法介绍,推荐玩强化学习的小伙伴收藏的更多相关文章

  1. [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

  2. python生成数据后,快速导入数据库

    1.使用python生成数据库文件内容 # coding=utf-8import randomimport time def create_user():    start = time.time() ...

  3. Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...

    小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...

  4. python基础——4(数字、字符串、列表类型的内置方法介绍)

    目录 一.可变与不可变类型 二.数字类型 三.字符串类型 四.列表类型 一.可变与不可变类型 可变类型:值改变,但是id不变,证明就是在改变原值,是可变类型 不可变类型:值改变,id也跟着改变,证明产 ...

  5. Python大数据与机器学习之NumPy初体验

    本文是Python大数据与机器学习系列文章中的第6篇,将介绍学习Python大数据与机器学习所必须的NumPy库. 通过本文系列文章您将能够学到的知识如下: 应用Python进行大数据与机器学习 应用 ...

  6. JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决

    JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...

  7. Python中数据的保存和读取

    在科学计算的过程中,往往需要保存一些数据,也经常需要把保存的这些数据加载到程序中,在 Matlab 中我们可以用 save 和 lood 函数很方便的实现.类似的在 Python 中,我们可以用 nu ...

  8. python 生成18年写过的博客词云

    文章链接:https://mp.weixin.qq.com/s/NmJjTEADV6zKdT--2DXq9Q 回看18年,最有成就的就是有了自己的 博客网站,坚持记录,写文章,累计写了36篇了,从一开 ...

  9. python爬虫+数据可视化项目(关注、持续更新)

    python爬虫+数据可视化项目(一) 爬取目标:中国天气网(起始url:http://www.weather.com.cn/textFC/hb.shtml#) 爬取内容:全国实时温度最低的十个城市气 ...

  10. python调用数据返回字典dict数据的现象2

    python调用数据返回字典dict数据的现象2 思考: 话题1连接:https://www.cnblogs.com/zwgbk/p/10248479.html在打印和添加时候加上内存地址id(),可 ...

随机推荐

  1. python os模块 高频函数(未完待续)

    os.listdir 返回目录下所有的文件,包括文件和文件夹 例如:当前文件夹下为: >>> import os >>> os.listdir() ['Annota ...

  2. 比文件操作os库更优异的标准库pathlib

    pathlib 库从 python3.4 开始作为内置库,到 python3.6 已经比较成熟.相比于老式的 os.path 有几个优势: 老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 ...

  3. Mongodb--用户/权限

    mongodb分为管理员用户和普通用户,并且还有个验证库,建立用户时use到的库(验证库),信息就存储在admin数据库下. 在使用用户时,要加上验证库才能登录,对于管理员用户,必须在admin下创建 ...

  4. 《vuejs快跑构建触手可及的高性能web应用》读书笔记

    1.cdn:内容分发网络(CDN)是将资源托管到全世界各处的服务器上以实现快速分发.CDN版本对于开发和快速验证比较有用,但是将unpkg应用于生产环境前,需要检查它是否适合你. 2.假值包括fals ...

  5. Laravel路由匹配

    Route常规用法如下,特别是最后一个传参之后可以进行正则匹配,非常好用. //@后面内容为所要访问的方法 Route::get('foo', 'Photos\AdminController@meth ...

  6. SQLServer 性能报表的学习与使用

    SQLServer 性能报表的学习与使用 背景 前面连续学习了 SQLServer如何优化等事宜. 但是一开始总是么有找到对应的问题解决思路 周天时想到了 SQLSERVER的MDW工具 但是并没有找 ...

  7. [转帖]InfluxDB 修改数据存储路径

    1.创建数据存储目录 mkdir -p /home/data/influxdb 说明:目录可以根据实际情况进行修改. 2.设置目录访问权限 sudo chown influxdb.influxdb / ...

  8. [转帖]Shell 判断文件或文件夹是否存在(不存在则创建)

    目录 1. 文件夹不存在创建文件夹 2. 判断文件夹是否存在 3. 判断文件是否存在 4. 常用的文件比较符 1. 文件夹不存在创建文件夹 if [ ! -d "/data/" ] ...

  9. Prometheus+alertmanager实现告警的简单验证

    Prometheus+alertmanager实现告警的简单验证 背景 学习源自: http://www.mydlq.club/article/126/ 上午没搞定, 中午睡不着,继续学习处理. 发现 ...

  10. [转帖]Linux命令学习手册-readelf

    https://www.jianshu.com/p/405844abefae readelf elf-file(s) 功能 用于显示 elf 格式文件的信息. 描述 readelf 用来显示一个或者多 ...