尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用 Python 与 Plotly 实现数据平滑:Savitzky-Golay 滤波与三角移动平均完整实战
数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载本文以 plotly.py 官方文档 doc/python/smoothing.md 为核心结合仓库中plotly.graph_objects的 Scatter 轨迹源码系统讲解如何在 Python 中对含噪数据做平滑处理从 Savitzky-Golay 滤波SciPy 内置到自实现三角移动平均TMA并完整演示如何用go.Scatter将原始信号、含噪信号与平滑结果叠加在同一张图中。读完本文你将掌握两类主流平滑算法的原理与参数调优方法并能直接用 Plotly 可视化验证平滑效果。为什么需要对数据做平滑处理平滑Smoothing是一种消除数据集中噪声的技术。真实世界采集到的数据传感器读数、实验测量值、金融时间序列等几乎都叠加了不同程度的随机扰动平滑算法的共同目的就是磨平棱角roughing out the edges让数据呈现出其背后潜在的结构与趋势。但平滑并非无代价。只有当数据中几乎没有小尺度结构时平滑才是有意义的——如果数据本身蕴含高频细节尖峰、快速振荡、短时突变平滑会把这些真实特征一并抹掉从而歪曲数据原本的含义。从科学严谨性出发使用平滑算法时必须至少能解释清楚为什么要对这份数据做平滑选择了哪种算法、哪些参数平滑后保留了什么、丢失了什么。本文将演示的两种方法——Savitzky-Golay 滤波与三角移动平均——恰好代表了两种不同的平滑哲学前者用低阶多项式拟合滑动窗口以尽量保留数据形状后者用加权平均压低噪声。环境准备导入依赖本文所有示例基于 Python 3 Plotly并依赖 NumPy、Pandas 与 SciPy 生态对应文档参见 doc/python/getting-started.mdimport plotly.graph_objects as go import numpy as np import pandas as pd import scipy from scipy import signal其中plotly.graph_objects提供底层、声明式的绘图接口通过go.Figure与go.Scatter精确控制每条轨迹的样式numpy用于生成测试数据linspace、sin、随机噪声pandas是 Plotly 生态常用的数据容器也便于后续替换为真实数据集scipy.signal提供本文的核心滤波函数savgol_filter。准备测试数据正弦信号 均匀噪声为了让平滑效果可对比先构造一组干净正弦 均匀分布噪声的合成数据并固定随机种子以保证结果可复现np.random.seed(1) x np.linspace(0, 10, 100) y np.sin(x) noise 2 * np.random.random(len(x)) - 1 # 均匀分布于 [-1, 1] y_noise y noise这里共 100 个采样点噪声幅度与信号幅度相当±1 对比正弦振幅 1属于高噪声场景正好能直观检验两种平滑算法的去噪能力。方法一Savitzky-Golay 滤波原理滑动窗口内的低阶多项式拟合Savitzky-Golay 滤波参见 SciPy 的scipy.signal.savgol_filter实现的核心思想是对数据中相邻的每一个窗口用低阶多项式做最小二乘拟合然后以拟合多项式在窗口中心点的值作为平滑输出。与简单平均相比它在平滑噪声的同时能较好地保留信号的峰值、宽度等形状特征尤其适合光谱、信号处理类数据。从代码结构上看示例中signal.savgol_filter(y_noise, 53, 3)的两个核心参数是参数示例值含义window_length53滑动窗口大小必须是奇数且大于polyorder窗口越大平滑越强但边界截断区间越大polyorder3窗口内拟合多项式的阶数阶数越高越贴合原始形状保留细节越多但抗噪能力下降其余可选参数如deriv指定求导阶数、delta采样间隔、mode边界处理方式默认即可满足常规平滑需求。完整代码与参数说明import plotly.graph_objects as go import numpy as np import pandas as pd import scipy from scipy import signal np.random.seed(1) x np.linspace(0, 10, 100) y np.sin(x) noise 2 * np.random.random(len(x)) - 1 # 均匀分布于 -1 和 1 y_noise y noise fig go.Figure() fig.add_trace(go.Scatter( xx, yy, modemarkers, markerdict(size2, colorblack), nameSine )) fig.add_trace(go.Scatter( xx, yy_noise, modemarkers, markerdict( size6, colorroyalblue, symbolcircle-open ), nameNoisy Sine )) fig.add_trace(go.Scatter( xx, ysignal.savgol_filter(y_noise, 53, # 用于滤波的窗口大小 3), # 拟合多项式阶数 modemarkers, markerdict( size6, colormediumpurple, symboltriangle-up ), nameSavitzky-Golay )) fig.show()运行后图中三条轨迹分别对应真实正弦黑色小圆点、加噪信号蓝色空心圆、平滑结果紫色三角。可以观察到 Savitzky-Golay 输出基本贴合正弦曲线且没有像移动平均那样明显削平波峰波谷——这正是低阶多项式拟合的优势。参数调优建议增大window_length平滑更彻底但会压扁波峰、拉伸波谷失真加剧增大polyorder更忠实于原数据形状但保留的噪声也更多工程上常见组合是window_length约为数据点数的 5%10%、polyorder取 24再根据可视化结果微调。方法二三角移动平均Triangular Moving Average原理两级移动平均加权移动平均的思路是在数据中取一个窗口计算窗口内点的平均值然后窗口向后滑动一个点重复计算得到一串新点即平滑结果。1D 情况下对 $N$ 个数据点 $y_1, y_2, \dots, y_N$取窗口大小 $n N$第 $i$ 个平滑点的**简单移动平均SMA**为$$ \begin{align*} SMA_i \frac{y_i \dots y_{in}}{n} \end{align*} $$而**三角移动平均TMA**是在 SMA 之上再做一次移动平均$$ \begin{align*} TMA_i \frac{SMA_i \dots SMA_{in}}{n} \end{align*} $$两次平均的效果是越靠近当前点的数据获得越高的权重权重分布呈三角形因此 TMA 比 SMA 更平滑同时更重视相邻点减少拖尾。自实现 smoothTriangle 函数以下smoothTriangle是文档给出的 TMA 实现核心是构造一个先升后降的三角权重核然后对每个窗口做加权平均def smoothTriangle(data, degree): triangle np.concatenate((np.arange(degree 1), np.arange(degree)[::-1])) # 先升后降 smoothed [] for i in range(degree, len(data) - degree * 2): point data[i:i len(triangle)] * triangle smoothed.append(np.sum(point) / np.sum(triangle)) # 处理边界 smoothed [smoothed[0]] * int(degree degree / 2) smoothed while len(smoothed) len(data): smoothed.append(smoothed[-1]) return smoothed逐段解读三角权重核np.arange(degree 1)生成[0, 1, ..., degree]np.arange(degree)[::-1]生成[degree-1, ..., 0]拼接后得到长度2*degree1的对称三角序列窗口中心权重最大、两端为 0滑动加权平均对每个位置截取与核等长的数据段逐元素相乘后除以核的总权重np.sum(triangle)即得到该点的加权均值边界处理滑动起始索引为degree结束索引为len(data) - degree * 2因此前后各有一段数据无法生成有效平滑点代码用首尾平滑值做常数延拓前段复制smoothed[0]尾段用smoothed[-1]补齐保证输出长度与输入一致——这也是把smoothed[0]重复degree degree/2次的原因。完整绘图代码fig go.Figure() fig.add_trace(go.Scatter( xx, yy, modemarkers, markerdict( size2, colorrgb(0, 0, 0), ), nameSine )) fig.add_trace(go.Scatter( xx, yy_noise, modemarkers, markerdict( size6, color#5E88FC, symbolcircle-open ), nameNoisy Sine )) fig.add_trace(go.Scatter( xx, ysmoothTriangle(y_noise, 10), # degree 设为 10 modemarkers, markerdict( size6, color#C190F0, symboltriangle-up ), nameMoving Triangle - Degree 10 )) fig.show()这里degree10决定了三角核的半宽核总长 21直接控制平滑强度degree越大参与平均的点越多、平滑越强同时边界延拓区间也越长。与 Savitzky-Golay 相比TMA 对波峰的削平效应更明显——这是加权平均类方法的固有特性需要结合数据特征权衡。源码佐证go.Scatter 如何支撑上述可视化本文所有示例均基于plotly.graph_objects的go.Scatter轨迹其定义位于 plotly/graph_objs/_scatter.pyclass Scatter(_BaseTraceType)。与平滑可视化直接相关的两个属性在源码中有明确说明modeThe mode property is a flaglist... Any combination of [lines, markers, text] joined with characters OR exactly one of [none]见 plotly/graph_objs/_scatter.py。示例统一使用modemarkers以点图形式对比三条轨迹当平滑结果希望展示为曲线时改为modelines或linesmarkers即可markerThe marker property is an instance of Marker见 plotly/graph_objs/_scatter.py其size、color、symbol均可在 plotly/graph_objs/scatter/_marker.py 中找到类型定义其中symbol是枚举型见 plotly/graph_objs/scatter/_marker.py示例用到的circle-open空心圆与triangle-up上三角都是合法取值且可通过symbolcircle-open这类名称后缀快速切换实心/空心/加点样式。换言之对比图的三种视觉区分——颜色color、大小size、形状symbol——全部由 Marker 子对象驱动无需额外引入其他图类型。若需要将平滑结果与原始信号做差值分析还可借助同一go.Figure继续叠加轨迹利用 Plotly 的图例name参数与 hover 信息直接检查残差。小结与选型建议方法实现来源核心参数特点Savitzky-Golayscipy.signal.savgol_filterwindow_length奇数 阶数、polyorder保形性好适合保留峰谷特征的光谱/信号数据三角移动平均自实现smoothTriangledegree三角核半宽实现直观、更平滑但会削平波峰适合趋势提取工程落地建议先在笔记本里用np.random.seed固定种子复现本文示例再替换为真实数据集通过fig.show()反复对比原始、含噪与平滑轨迹同时用window_length/polyorder/degree三组参数做网格微调若数据量很大数万点以上savgol_filter的向量化实现相比纯 Python 循环的smoothTriangle有更优的性能表现。无论选择哪种算法都要回到本文开头的原则在报告中如实说明平滑参数与取舍避免平滑结果被误读为原始测量。赞分享数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载相关推荐Bokeh 天气数据服务应用实战quad 温度带与 Savitzky-Golay 平滑的多城市交互面板Bokeh 天气数据服务应用实战quad 温度带与 Savitzky Golay 平滑的多城市交互面板 本指南以 Bokeh 官方示例 Weather Exa数据可视化图表库时间序列平滑终极指南卡尔曼滤波与移动平均滤波在darts中的应用时间序列平滑终极指南卡尔曼滤波与移动平均滤波在darts中的应用 darts是一个用户友好的Python库专注于时间序列的预测和异常检测。本文将深入探讨如何机器学习深度学习数据分析数据科学上一篇告别鼠标依赖win-vind从命名到深度定制的全面解答下一篇PasteBar高级功能探索网页内容抓取与自定义标签管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

sqlc 字段与结构体重命名(rename)完整指南:从列名到 Go 类型的精准控制

sqlc 字段与结构体重命名(rename)完整指南:从列名到 Go 类型的精准控制

sqlc 字段与结构体重命名(rename)完整指南:从列名到 Go 类型的精准控制 【免费下载链接】sqlc Generate type-safe code from SQL 项目地址: https://gitcode.com/gh_mirrors/sq/sqlc 导读 本文围绕 sqlc 的 rename 配置映射展开&…

📅 2026/9/21 19:18:29
browser-harness 网络请求观测指南:用 CDP Network 事件推断模糊页面状态(提交、下载与 SPA 流程)

browser-harness 网络请求观测指南:用 CDP Network 事件推断模糊页面状态(提交、下载与 SPA 流程)

browser-harness 网络请求观测指南:用 CDP Network 事件推断模糊页面状态(提交、下载与 SPA 流程) 【免费下载链接】browser-harness Browser Harness | Self-healing harness that enables LLMs to complete any task. 项目地址: https://…

📅 2026/9/21 19:18:29
3步搞懂flyioi源码解析:告别只会语法不会搭项目

3步搞懂flyioi源码解析:告别只会语法不会搭项目

3步搞懂flyioi源码解析:告别只会语法不会搭项目 刚写完Hello World,脑子一热想做个完整业务系统,结果卡在“代码该怎么组织”上?这太常见了。 你背熟了API,却面对flyioi的复杂结构发懵。…

📅 2026/9/21 19:18:29
MORE NEWS

更多资讯

📰

3步搞定小娜怎么关闭,程序员从入门到精通避坑指南

3步搞定小娜怎么关闭,程序员从入门到精通避坑指南 复制来的代码跑不通,报错红一片,你是不是也对着屏幕抓狂?别慌,这种“小娜怎么关闭”式的系统级配置问题,往往不是代码逻辑错误,而是环境或权限的错位。很多开发者在从入门到精通的过程中,最容易卡在…

📰

a35证书补办全攻略:3个新手避坑细节,别花冤枉钱

a35证书补办全攻略:3个新手避坑细节,别花冤枉钱 官方文档里关于a35证书的补办流程写得那叫一个细,密密麻麻全是条款,新手一眼看过去直接晕头转向。抓不住重点,不知道先办哪一步,结果跑断腿还办不下来,这才是真正的 新手避坑 死穴。…

📰

3个软接避坑技巧:读懂源码解析,API升级不再崩

3个软接避坑技巧:读懂源码解析,API升级不再崩 版本升级后 API 全变了?别慌,这通常是“软接”配置没跟上导致的。很多新手以为换个版本号就行,结果项目直接报错,这时候光看文档不够,得深入 源码解析…

📰

搞定一生伏首拜阳明高频面试题源码拆解

搞定一生伏首拜阳明高频面试题源码拆解 复制来的代码跑不通,报错信息像天书,不知道从哪开始调?这是很多应届生面试时的噩梦。在备战高频面试题时,光背八股文没用,得看懂底层逻辑。今天咱们拿“一生伏首拜阳明”这个概念做比喻,拆解一套真实项目的核心源…

📰

欲练此功必先自宫:后端开发最佳实践与面试避坑指南

欲练此功必先自宫:后端开发最佳实践与面试避坑指南 面试被问原理答不上来,是不是觉得脑子里一片浆糊?别慌,这不是你笨,而是你一直只记结论,没摸透底层逻辑。很多新人学编程,就像练绝世武功,光背招式口诀,连内力运行路线都没搞清,遇到变招直接卡壳。…

📰

Ceph ceph-volume lvm 深度解析:LVM Tag 元数据体系与 OSD 发现机制

Ceph ceph-volume lvm 深度解析:LVM Tag 元数据体系与 OSD 发现机制 【免费下载链接】ceph Ceph is a distributed object, block, and file storage platform 项目地址: https://gitcode.com/gh_mirrors/ce/ceph 导读 ceph-volume lvm 是 Ceph 官方推荐的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬