如何基于Pandas列值调用返回DataFrame的Python类方法?
问题:基于DataFrame值动态调用对应模型方法是否可行?
我有一个包含商品、销售地点、各商品最优模型(MAPE最低)的Pandas DataFrame,示例代码如下:
import pandas as pd model = ['autoarima', 'prophet', 'TES'] item = ['102354','215898','302584'] MAPE = [46.2, 23.5, 15.6] location = ['KR_DC', 'KR_DC','KR_DC'] df_dict = {'fcast_item':item, 'location':location, 'mape':MAPE, 'best_model':model} df = pd.DataFrame.from_dict(df_dict)
我希望根据DataFrame中best_model列的值,调用statmod.stats_models类中对应的模型方法(这些方法会返回DataFrame)。例如:
- 当模型为'TES'时,执行:
df = [statmod.stats_models(df).tesa_model(target='corrected_demand', combo = combo, length=length_) for combo in combos] - 当模型为'autoarima'时,执行:
df = [statmod.stats_models(df).arima_model(target='corrected_demand', combo = combo, length=length_) for combo in combos]
代码中除模型方法名外其余部分固定,请问这种基于DataFrame值的动态编码是否可行?
回答
完全可行,核心是利用Python的getattr()函数动态获取类实例的方法,配合模型名称与方法名的映射关系即可实现,无需写冗余的分支判断代码。
具体实现步骤
定义模型名称与方法名的映射字典
由于模型名称(如TES)和对应方法名(如tesa_model)不完全一致,先建立映射关系:model_method_map = { 'autoarima': 'arima_model', 'TES': 'tesa_model', 'prophet': 'prophet_model' # 补充prophet对应的方法名 }初始化模型类实例
提前创建statmod.stats_models的实例,避免重复初始化:stats_model_inst = statmod.stats_models(df)动态遍历并调用对应方法
遍历目标组合(combos),根据DataFrame中对应组合的最优模型,动态获取并执行方法:results = [] for combo in combos: # 从DataFrame中找到当前组合对应的最优模型 target_row = df[(df['fcast_item'] == combo[0]) & (df['location'] == combo[1])].iloc[0] best_model = target_row['best_model'] # 校验模型是否支持 if best_model not in model_method_map: raise ValueError(f"不支持的模型类型: {best_model}") # 动态获取对应方法并执行 model_method = getattr(stats_model_inst, model_method_map[best_model]) result_df = model_method(target='corrected_demand', combo=combo, length=length_) results.append(result_df)处理结果
最终results列表中存储了每个组合对应最优模型的输出DataFrame,可根据需求合并或单独使用。
优势说明
- 扩展性强:新增模型时,只需在
model_method_map中添加新的映射关系,无需修改核心调用逻辑 - 代码简洁:避免了大量
if-elif分支,提升代码可读性和维护性
内容的提问来源于stack exchange,提问作者Jordan Howell
相关产品推荐
相关产品推荐

