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
相关产品推荐
相关产品推荐

