如何从Prophet的AxesSubplot组件图中提取数据定位年度趋势极值日期
提取Prophet组件图数据的两种实现方式
方法一:直接从matplotlib子图提取线条数据集
注:matplotlib Figure对象存储所有子图的属性为axes(你提到的axis为单个坐标轴的代称,属于常见笔误),目标axes[2]为存放年度趋势组件的AxesSubplot对象,所有绘制在子图内的线条对象都存储在子图的lines属性中,可直接调取坐标数据:
- 定位目标子图的线条对象
target_ax = fig2.axes[2] # 组件图内通常只有1条主展示线,取索引0的Line2D对象 plot_line = target_ax.lines[0] - 提取线条对应的原始数值坐标
# x轴是matplotlib数值化处理后的日期值,y轴是对应组件的数值 x_vals = plot_line.get_xdata() y_vals = plot_line.get_ydata() - 将数值化的x日期转回可读的datetime格式
此时得到的import matplotlib.dates as mdates # 去掉时区信息避免类型不匹配 x_dates = [mdates.num2date(x).replace(tzinfo=None) for x in x_vals]x_dates和y_vals就是该子图线条一一对应的日期、组件数值数组。
方法二:直接从forecast结构化结果提取(推荐)
实际上m.predict()生成的forecast本身就是包含所有组件拆分结果的结构化DataFrame,完全不需要从绘图结果绕路提取,准确率更高也更稳定:
- 组件图的子图和DataFrame列是一一对应的:
axes[0]对应全局趋势,在forecast中的列名为trend- 按顺序往后的子图,分别对应周度、年度等季节性分量,默认年度分量在forecast中的列名为
yearly - x轴的日期列统一为forecast的
ds列
- 直接定位年度分量最大值对应的日期,只需执行:
# 定位年度分量最大值的行索引 max_row_idx = forecast['yearly'].idxmax() # 取出对应日期和数值 max_yearly_date = forecast.loc[max_row_idx, 'ds'] max_yearly_val = forecast.loc[max_row_idx, 'yearly']
注意:如果训练模型时自定义过季节性的名称,只需将代码中的
yearly替换为你自定义的分量列名即可。
内容的提问来源于stack exchange,提问作者Travasaurus
相关产品推荐
相关产品推荐

