用 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),仅供参考

相关新闻

5个避坑指南:反病毒技术实战项目选型对比

5个避坑指南:反病毒技术实战项目选型对比

5个避坑指南:反病毒技术实战项目选型对比 官方文档动辄几百页,翻半天找不到重点?做反病毒技术实战项目,最头疼的不是代码难写,而是选错轮子。很多人照着文档抄,结果上线就崩。别急,今天把主流方案掰开揉碎讲清楚。 核心差异先看表: 维度…

2026/9/21 19:29:01 阅读更多 →
local_auth_android 演进全解析:从 1.0.0 到 1.0.18 的 Android 本地生物认证插件变迁

local_auth_android 演进全解析:从 1.0.0 到 1.0.18 的 Android 本地生物认证插件变迁

local_auth_android 演进全解析:从 1.0.0 到 1.0.18 的 Android 本地生物认证插件变迁 【免费下载链接】plugins Plugins for Flutter maintained by the Flutter team 项目地址: https://gitcode.com/gh_mirrors/pl/plugins 导读 local_auth_android 是 Fl…

2026/9/21 19:29:01 阅读更多 →
检波数据坑太深?3个核心代码带你搞定公路工程检测

检波数据坑太深?3个核心代码带你搞定公路工程检测

检波数据坑太深?3个核心代码带你搞定公路工程检测 看了一堆教程还是不会写项目?别急,这其实是大多数工程师从理论到实战的断层。很多人盯着课本上的公式发呆,一上手处理真实的检测数据就卡壳,要么报错看不懂,要么结果对不上。这篇保姆级教程,不整虚的…

2026/9/21 19:29:01 阅读更多 →

最新新闻

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南

猴子摘鲜果源码解析:新手避坑与多语言选型实战指南 配置环境就卡半天,是不是你的常态?很多刚入行的应届生朋友,面对经典的“猴子摘鲜果”算法题,还没开始写逻辑,就在 Python 和 Java 的环境切换中耗尽了耐心。这种 新手避坑…

2026/9/21 20:05:17 阅读更多 →
3个不可能的任务性能优化方案,面试必问实战拆解

3个不可能的任务性能优化方案,面试必问实战拆解

3个不可能的任务性能优化方案,面试必问实战拆解 看了一堆教程还是不会写项目?这是不是你的常态?视频里代码跑得飞快,自己一动手就报错。更扎心的是,面试官抛出一个性能优化场景,你愣在原地,脑子里全是 for 循环和 map…

2026/9/21 20:05:17 阅读更多 →
乔布斯癌症面试真题完整示例:3步拆解考点与避坑

乔布斯癌症面试真题完整示例:3步拆解考点与避坑

乔布斯癌症面试真题完整示例:3步拆解考点与避坑 刚拿到“乔布斯癌症”相关的面试题,复制网上的答案背了半小时,结果面试官问第二层逻辑时直接卡壳。那种感觉就像你手里攥着一把生锈的钥匙,硬插进锁孔,怎么都拧不动。别慌,这种“复制来的代码跑不通不知…

2026/9/21 20:05:17 阅读更多 →
xxxsss常见报错与解决

xxxsss常见报错与解决

3个核心避坑指南:培训机构选型与通过率真相 刚拿到那份“高薪就业”的推荐名单?别急着交钱。 你是不是也遇到过这种情况:网上搜了一堆“最佳实践”,复制下来的代码在本地环境里跑不通,报错信息看得人头大,完全不知道从哪开始调。…

2026/9/21 20:05:17 阅读更多 →
5步搞定搜索快捷键:源码解析背后的性能优化实战

5步搞定搜索快捷键:源码解析背后的性能优化实战

5步搞定搜索快捷键:源码解析背后的性能优化实战 看了一堆教程还是不会写项目?这种挫败感我太懂了。你盯着屏幕上的代码,明明每个字符都认识,合起来就是跑不通。问题往往不在语法,而在你对底层逻辑的“黑盒”认知缺失。今天我们就拿【搜索快捷键】这个看…

2026/9/21 20:05:17 阅读更多 →
欲练此功必先自宫:后端开发最佳实践与面试避坑指南

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

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

2026/9/21 20:04:17 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →