当前位置: 首页 > news >正文

用Python的Pulp库搞定NDDF模型:一个环境经济学研究生的效率测算实战笔记

用Python的Pulp库实现NDDF模型:环境经济学研究生的效率测算指南

当我在撰写关于绿色全要素生产率的硕士论文时,NDDF(非径向方向距离函数)模型的理论推导让我头疼不已。直到发现Python的Pulp库,这个开源的线性规划工具竟然能完美解决我的计算需求。本文将分享如何从零开始用Pulp实现NDDF模型,避开我踩过的那些坑。

1. 为什么选择Pulp而非商业工具

在环境经济学领域,Gurobi和CPLEX常被推荐用于效率测算。但作为学生研究者,Pulp提供了三个不可替代的优势:

  • 零成本门槛:完全开源,无需担心许可证费用
  • 轻量级集成:与Python科学计算栈(Pandas/NumPy)无缝衔接
  • 灵活建模:支持多种求解器后端(包括CBC、GLPK等)

特别在处理NDDF模型时,Pulp的语法几乎可以直接映射数学公式。比如弱可处置性约束的代码表达:

if self.disp == "weak disposability": for s in self._s: prob += pulp.lpSum([self.weights[j] * self.bad_outs.values[j][s] for j in self._j]) == self.bad_outs.values[j0][s] - self.betab[s] * self.gb.values[j0][s]

2. 数学公式到代码的转换技巧

NDDF的核心是方向向量的处理,这里最容易出错。根据Zhou(2012)的规范,正确的约束条件设置应遵循:

  1. 变量定义规则

    • λ(前沿面权重):pulp.LpVariable.dicts("Weight", self._j)
    • β(缩放系数):分投入/产出定义上下界
  2. 方向向量陷阱

    • 文献中g=(-E,Y,-D)的负号已在公式中体现
    • 代码中方向向量应统一用非负值:
directional_factor = [0, 0, 1, 1, 1] # 对应(K,L,E,Y,D) self.gx = directional_factor[:self.I] * self.inputs
  1. 弱可处置性实现: 通过disp参数切换强弱处置模式,关键区别在于非期望产出的约束符号(==或≥)

3. 数据准备与预处理实战

我的Excel数据常出现以下问题,导致模型报错:

  • 数据类型不一致:用df = pd.read_excel().astype(float)统一类型
  • 负值处理:非期望产出存在负值时需标准化:
bad_outs = (bad_outs - bad_outs.min()) / (bad_outs.max() - bad_outs.min())
  • 权重向量配置示例:
    • 3项投入+1项好产出+3项坏产出:
    weight = [1/9,1/9,1/9, 1/3, 1/9,1/9,1/9]

完整的数据加载模板:

inputs = pd.read_excel('data.xlsx', usecols='A:C') outputs = pd.read_excel('data.xlsx', usecols='D') bad_outs = pd.read_excel('data.xlsx', usecols='E:G')

4. 结果解读与可视化分析

模型输出包含四个关键部分:

  1. 效率值(β):值越大表示无效率程度越高
  2. 前沿面权重(λ):反映参考DMU的构成
  3. 状态码:检查是否所有DMU都成功求解

建议用以下方法分析结果:

results = pd.concat([ pd.DataFrame.from_dict(solve_results[1], orient='index', columns=['inefficiency']), pd.DataFrame.from_dict(solve_results[2], orient='index') ], axis=1) results.to_excel('results.xlsx')

典型问题排查表:

错误现象可能原因解决方案
无解状态方向向量符号错误检查g向量与公式一致性
β值全为0权重配置不当调整weight_vector比例
异常大值数据量纲不统一对数据做标准化处理

5. 进阶应用:Luenberger指数计算

获得各期NDDF结果后,可按以下公式计算生产率变化:

GML = 0.5 * [(β_t - β_t+1) + (β'_t - β'_t+1)]

实现代码片段:

def luenberger_index(beta_t, beta_t1, beta_prime_t, beta_prime_t1): return 0.5 * ((beta_t - beta_t1) + (beta_prime_t - beta_prime_t1))

记得在结果中添加时间标识列,方便面板数据分析。这是我用Pulp完成NDDF测算后最深刻的体会:好的代码组织能节省后续90%的分析时间。

http://www.gsyq.cn/news/1429013.html

相关文章:

  • 2018技术趋势盘点:AI伦理、数据隐私与平台治理的反思与应对
  • beweb目录结构审视
  • Arduino节奏训练器:状态机与时间精度在嵌入式交互中的实践
  • 如何用AntiDupl.NET免费开源工具智能清理重复图片:完整指南
  • 从关节点动到笛卡尔空间:手把手教你用Codesys实现SCARA机器人两种点动模式切换
  • 告别手动水印烦恼:智能相机参数批量添加工具解放摄影后期
  • 2026年工厂获客难的隐形破局:靠谱GEO优化公司怎么选 - 奔跑123
  • 你家附近有没有靠谱的腕表养护门店?亨得利本地官方服务中心全公开:9城直达、明码标价、原厂配件,400电话一键预约 - 亨得利腕表维修中心
  • 好用的随身 wifi 推荐性价比高,2026场景机型实测,日常上网首选 - 资讯纵览
  • 基于PIC16F84A的11路LED流水灯:从电路设计到代码实现的完整实践
  • 2026年沈阳热熔标线施工厂家多维梳理 适配各类工程场景需求 - 兔兔不是荼荼
  • 达梦数据库约束排查实战:从系统视图all_constraints出发,解决数据校验和ETL中的常见坑
  • 基于树莓派Pico的赛博朋克智能家居模型:从3D打印到物联网编程
  • 字画回收怕被坑?认准京城信德斋,上门服务更安心 - 深鉴新闻
  • ESP32-S3开发实战:从GPIO控制到TFT游戏开发全解析
  • 别再复制粘贴了!保姆级Hadoop 3.1.3三节点集群搭建避坑指南(附防火墙/SSH/环境变量完整配置)
  • 从零开始:在SiFive Unleashed开发板上手把手调试RISC-V中断(以Xv6为例)
  • 保姆级教程:解决R语言gwasglue包安装时GitHub API速率限制的403错误
  • 网易云音乐NCM格式解锁指南:3步实现音乐跨平台自由
  • VR视频转换终极指南:让3D内容在普通屏幕绽放的免费开源方案
  • 2026 锁鲜枸杞品牌推荐,中老年养生采购指南,盘点高留存营养靠谱枸杞大品牌 - 品牌榜中榜
  • 保姆级教程:手把手教你将STM32+BC26的数据成功上报至华为云IoTDA(含MQTT三元组生成与调试)
  • 2026 年 Q1 宁波装修公司终极测评|8 家热门装企硬核对比✨ - 资讯纵览
  • 2026年PDF去水印方法:免费工具手把手教你轻松搞定 - 软件小管家
  • Python 操作 MySQL 事务:从入门到避坑
  • 避坑指南:Unity Input Field事件(OnValueChanged/OnEndEdit)的触发时机与常见误用
  • 2026年泸州白酒OEM代工与企业定制:源头酒厂直营模式解读 - 优质企业观察收录
  • 2026 杭州除异味公司推荐,厨卫地下室顽固臭味治理,甄选长效不反弹靠谱治理企业 - 品牌榜中榜
  • 3步告别公式噩梦:LaTeX2Word-Equation如何让数学公式迁移变得轻松
  • 模拟电路图到网表的自动化转换技术解析