ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于 Plotly 与 PeakUtils 的 Python 峰拟合实战:从峰检测到高斯拟合的可视化全流程

基于 Plotly 与 PeakUtils 的 Python 峰拟合实战:从峰检测到高斯拟合的可视化全流程 基于 Plotly 与 PeakUtils 的 Python 峰拟合实战从峰检测到高斯拟合的可视化全流程【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址: https://gitcode.com/gh_mirrors/pl/plotly.py本指南以 plotly.py 仓库中 peak-fitting.md 文档为核心完整演示在 Python 中基于 PeakUtils 进行峰检测Peak Detection、对局部峰做高斯函数拟合Gaussian Fit并用 Plotly 交互式图表把原始数据、检测到的峰值与拟合曲线叠加在同一张图上的完整流程。读完本文你将掌握peakutils.indexes阈值峰检测、peakutils.gaussian_fit参数拟合、基于go.Scatter的多 trace 叠加可视化以及如何用当前仓库的 FigureFactory 表格工厂快速预览源数据。一、技术栈与前置准备文档涉及的四个核心库在源码中均有直接依据NumPy为波形数据提供向量化数组运算峰拟合阶段的np.asarray、np.exp、np.power都依赖它Pandas负责读取 CSV 数据文档使用pd.read_csv载入股票数据SciPy科学计算基础库峰检测环节的scipy.signal模块可提供其他信号处理工具PeakUtils峰检测与高斯拟合的核心库本文使用其peakutils.indexes峰位置检测与peakutils.gaussian_fit高斯参数拟合两个 API。1.1 环境安装pip install numpy pandas scipy plotly peakutils1.2 导入依赖import numpy as np import pandas as pd import scipy import peakutils from scipy import signal1.3 关于py.iplot的现代替代写法原始文档源自早期 Plotly 版本使用import plotly.plotly as py与py.iplot(...)联网绘图接口。在当前 plotly.py 仓库中plotly.plotly子模块已不存在联网绘图功能集中在 plotly/offline/offline.py其iplot函数签名在 plotly/offline/offline.py#L261-L271。现代 Jupyter/Notebook 环境中建议改用以下两种方式之一# 方式一offline 模式无需联网适合 Jupyter Notebook from plotly.offline import init_notebook_mode, iplot init_notebook_mode(connectedTrue) # 方式二推荐直接构建 Figure 并用 plotly.io 展示/保存 import plotly.graph_objects as go import plotly.io as pio fig go.Figure(datatraces, layoutlayout) fig.show() # 交互式展示 pio.write_html(fig, peak_fit.html) # 导出独立 HTML二、载入数据并预览FigureFactory.create_table文档先用 Pandas 读取 Plotly 官方数据集中的股票数据截取前 15 行并用表格工厂做数据预览stock_data pd.read_csv(https://raw.githubusercontent.com/plotly/datasets/master/stockdata.csv) df stock_data[0:15] table FF.create_table(df) py.iplot(table, filenamestockdata-peak-fitting)其中FF.create_table来自文档引用的from plotly.tools import FigureFactory as FF。在当前仓库中FigureFactory已作为弃用别名保留在 plotly/tools.py#L560-L604其create_table方法会抛出弃用警告并转发到真正的实现plotly.figure_factory.create_table。因此现代写法应直接from plotly.figure_factory import create_table table create_table(df)从源码 plotly/figure_factory/_table.py#L25-L99 可以看到create_table支持以下关键参数参数默认值说明colorscale[[0, #00083e], [0.5, #ededee], [1, #ffffff]]表头、奇数行、偶数行的条纹配色font_colors[#ffffff, #000000, #000000]字体颜色可传 1 种、3 种或每行 1 种indexFalse是否生成索引列index_title索引列标题height_constant30行高系数表格总高度为行数 * height_constant 50其实现本质是使用typeheatmaptrace 的 z 矩阵get_table_matrix生成表头/奇数行/偶数行颜色条带layout.Annotation逐格注入文本见 plotly/figure_factory/_table.py#L199-L279因此create_table返回的是标准graph_objs.Figure对象。三、可视化原始数据并高亮拟合区间3.1 整体数据 高亮区间的双 trace 构图文档选取SBUX星巴克列通过手动指定左右端点left_endpt1857、right_endpt1940来圈出将要拟合的波形区间left_endpt 1857 right_endpt 1940 original_trace go.Scatter( x[j for j in range(len(stock_data[SBUX]))], ystock_data[SBUX][0:left_endpt].tolist() [None for k in range(right_endpt - left_endpt)] stock_data[SBUX][right_endpt 1:len(stock_data[SBUX])].tolist(), modelines, nameFull Data, markerdict(colorrgb(160,200,250)) ) highlighted_trace go.Scatter( x[j for j in range(left_endpt, right_endpt)], ystock_data[SBUX][left_endpt:right_endpt], modelines, nameHighlighted Section, markerdict(colorrgb(0,56,210)) ) data [original_trace, highlighted_trace] py.iplot(data, filenamestock-data-SBUX)技巧要点第二个 trace 的 y 序列在区间外填充NonePlotly 的Scatter会把None视为断点从而在整条曲线上挖出高亮段。这样既保留了完整数据的上下文又清晰标注了拟合区域——这是用go.Scatter做区间高亮时的常用手法。四、峰检测peakutils.indexes在拟合之前必须先定位波形中的局部极大值。文档对高亮区间[1857, 1940)内的数据调用peakutils.indexesx [j for j in range(len(stock_data))][left_endpt:right_endpt] y stock_data[SBUX][left_endpt:right_endpt] y y.tolist() cb np.array(y) indices peakutils.indexes(cb, thres0.75, min_dist0.1) trace go.Scatter( xx, yy, modelines, markerdict(colorrgb(0,56,210)), nameHighlighted Plot ) trace2 go.Scatter( xindices left_endpt, # 还原到全量数据的全局索引 y[y[j] for j in indices], modemarkers, markerdict(size8, colorrgb(255,0,0), symbolcross), nameDetected Peaks ) data [trace, trace2] py.iplot(data, filenamestock-data-with-peaks)4.1 参数语义thres0.75峰高阈值01 归一化数值越高只保留越突出的峰。对于基线漂移明显的股票数据适当抬高阈值可以滤除小幅噪声波动min_dist0.1相邻峰之间的最小距离以数据点数为单位用于抑制同一峰附近的冗余检测返回值indices是局部极大值在切片内的索引数组因此绘图时要用indices left_endpt映射回全量数据的 x 轴坐标。4.2 交互可视化要点检测结果用modemarkers叠加红色十字标记symbolcross尺寸 8与蓝色折线同图对比。若改用现代go.Figure写法只需将data列表传入构造器即可等价于文档中的py.iplot(data, ...)。五、峰拟合peakutils.gaussian_fit 与高斯叠加检测到全部局部极大值后选取其中一个峰indices[6]在其邻域[1894, 1910)上做高斯拟合def gaussian(x, mu, sig): return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.))) first_index indices[6] left_gauss_bound 1894 right_gauss_bound 1910 x_values_1 np.asarray(x[left_gauss_bound - left_endpt:right_gauss_bound - left_endpt]) y_values_1 np.asarray(y[left_gauss_bound - left_endpt:right_gauss_bound - left_endpt]) gaussian_params_1 peakutils.gaussian_fit(x_values_1, y_values_1, center_onlyFalse) gaussian_y_1 [gaussian(x_dummy, gaussian_params_1[1], 1.5) for x_dummy in x_values_1] trace go.Scatter( xx, yy, modelines, markerdict(colorrgb(0,56,210)), nameHighlighted Plot ) trace2 go.Scatter( xindices left_endpt, y[y[j] for j in indices], modemarkers, markerdict(size8, colorrgb(255,0,0), symbolcross), nameDetected Peaks ) trace3 go.Scatter( x[item_x 1.5 for item_x in x_values_1], y[item_y 38.2 for item_y in gaussian_y_1], modelines, markerdict(size2, colorrgb(200,0,250)), nameGaussian Fit ) data [trace, trace2, trace3] py.iplot(data, filenamestock-data-with-peaks-and-fit)5.1 拟合流程拆解定义高斯核gaussian(x, mu, sig)即标准高斯函数exp(-(x-mu)²/(2·sig²))其中mu为峰中心sig为标准差截取拟合窗口x_values_1、y_values_1用left_gauss_bound - left_endpt这类偏移量把全局索引换算成切片内索引切出单个峰的局部数据调用拟合器peakutils.gaussian_fit(x, y, center_onlyFalse)返回高斯参数数组依次为幅值、中心位置、标准差等center_onlyFalse表示返回完整参数而非仅中心位置生成拟合曲线用返回的中心参数gaussian_params_1[1]配合设定的sig1.5重建高斯曲线文档用1.5与38.2对拟合曲线做微小平移以便与原始峰更好地视觉对齐实际业务中可直接用拟合返回的全部参数重建。5.2 三 trace 叠加的意义最终图形同时包含Highlighted Plot蓝色折线原始高亮区间的真实波形Detected Peaks红色十字peakutils.indexes检测到的全部局部峰位置Gaussian Fit紫色折线对目标峰的高斯拟合结果。三个 trace 分别对应数据—检测—建模三个阶段这正是峰拟合任务的标准可视化范式用拟合曲线与原始波形的重合度来直观验证拟合质量。六、峰拟合的标准工作流总结结合文档与仓库实现可将基于 Plotly 的峰拟合任务归纳为以下可复用的四步流程数据准备pd.read_csv载入数据按业务需求截取待分析区间峰检测peakutils.indexes(data, thres..., min_dist...)定位局部极大值将阈值与最小间距作为主要调参对象局部拟合围绕目标峰截取邻域窗口peakutils.gaussian_fit提取高斯参数中心、幅值、宽度也可替换为scipy.signal中的其他拟合/滤波函数做信号预处理可视化验证用多个go.Scattertrace 分别绘制原始数据、峰标记与拟合曲线通过go.Figure或 offline 的iplot在 Notebook 中交互检查或write_html导出为可分享的 HTML 报告。现代项目建议统一使用plotly.graph_objectsplotly.figure_factory的新式 API旧式plotly.tools.FigureFactory已在 plotly/tools.py 标记弃用同时将py.iplot替换为fig.show()即可获得与本文完全等价、且无需联网的交互式峰拟合体验。【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址: https://gitcode.com/gh_mirrors/pl/plotly.py创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表