You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用类方法报AttributeError: Series无plot_residuals属性修复

问题根因

核心报错原因:persistence_model方法原实现直接返回原生pd.Series对象,plot_residuals被错误加上@classmethod装饰器定义为类方法,pandas Series本身没有绑定这个自定义绘图方法,调用时必然抛出AttributeError。

修复方案

调整类的逻辑,将残差计算结果存储为类实例属性,把绘图方法改为实例方法,同时扩展自定义绘图能力,完整修复代码如下:

import pandas as pd
import matplotlib.pyplot as plt

class ResidualErrors():
    def __init__(self, data: pd.Series):
        self.data = data
        self.residuals = None  # 存储persistence_model计算得到的残差结果

    def _persistence_forecast_model_nrows(self, test_rows):
        slicer = test_rows + 1
        errors = self.data[-slicer:].diff().dropna()
        return errors

    def _persistence_forecast_model_percrows(self, train_perc):
        n = len(self.data)
        ntrain = int(n * train_perc)
        errors = self.data[ntrain:].diff().dropna()
        return errors

    def persistence_model(self, test_rows=None, train_perc=None):
        if (not test_rows) and (not train_perc):
            raise TypeError("Please provide 'test_rows' or 'train_perc' arguments.")
        if test_rows and train_perc:
            raise TypeError("Please choose one argument either 'test_rows' or 'train_perc'.")
        if test_rows:
            self.residuals = self._persistence_forecast_model_nrows(test_rows)
        else:
            self.residuals = self._persistence_forecast_model_percrows(train_perc)
        return self  # 返回实例本身,兼容原有链式调用写法

    def plot_residuals(self, title="Persistence Model Residuals", xlabel="Index", ylabel="Residual Value", hline_values=None):
        if self.residuals is None:
            raise ValueError("请先调用persistence_model()计算残差后再绘图")
        # 绘制残差序列
        ax = self.residuals.plot()
        # 绘制水平线,默认绘制残差0值基准线
        if hline_values is None:
            hline_values = [0]
        for y_val in hline_values:
            ax.axhline(y=y_val, color="crimson", linestyle="--", alpha=0.7)
        # 应用自定义图表配置
        ax.set_title(title)
        ax.set_xlabel(xlabel)
        ax.set_ylabel(ylabel)
        plt.tight_layout()
        plt.show()
使用方式

完全兼容原有链式调用逻辑,同时支持自定义绘图参数:

# 构造测试数据
data = pd.Series([12,15,14,18,20,19,22,25,24,27,29,28,31,33,32])
# 原调用逻辑不会再报错
res = ResidualErrors(data).persistence_model(test_rows=10)
# 自定义绘图参数
res.plot_residuals(
    title="测试集残差分布(近10条测试样本)",
    xlabel="样本序号",
    ylabel="预测残差",
    hline_values=[0, 2, -2]  # 除0基准线外,额外绘制±2阈值水平线
)

也支持分步调用:

res_cal = ResidualErrors(data)
res_cal.persistence_model(train_perc=0.8)
res_cal.plot_residuals()
关键修改点
  • 移除plot_residuals错误的@classmethod装饰器,改为实例方法,不再依赖外部传入的Series对象
  • 新增实例属性residuals存储计算结果,避免返回裸pandas Series导致自定义方法丢失的问题
  • persistence_model返回实例本身,完全兼容原有链式调用习惯
  • 绘图方法扩展自定义能力:支持传入自定义标题、X轴标签、Y轴标签;默认绘制0值残差基准线,也可通过hline_values参数传入列表,自定义需要绘制的水平线位置
  • 增加前置校验,未计算残差直接绘图时抛出明确提示

内容的提问来源于stack exchange,提问作者matt.aurelio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:21:26