python DEA: 零和数据包络分析zero-sum gain Data envelopment analysis
点赞发Nature
关注中Science
在生产可能集中的资源再分配是在环境约束的生产过程中的一个新的研究课题。ZSG-DEA方法是解决资源分配问题的一个新兴方法。ZSG方法假设整个经济中的资源是固定的,因此一个单元的投入资源增加必然导致另一个单元的投入减少。
在解决CO2排放权分配的问题上,很多文献就采用了ZSG-DEA方法。他们假设CO2为input,其他的GDP,人口,资本投入为output,利用ZSG-DEA方法,基于效率对CO2排放权进行分配。
但是,这种假设显然是有悖于实际情况的,在实际情况中,经济体的投入是人口、能源、资本等,期望产出是GDP,CO2是作为非期望产出存在的。因此,以下代码基于与传统DEA方法一致的假设构建模型:
import numpy as np
import pandas as pd
import pulpclass ZSG_DEAProblem:def __init__(self,inputs, # 生产过程投入 dataframe or Series格式outputs, # 生产过程产出 dataframe or Series格式bad_outs, # 生产过程非期望产出 dataframe or Series格式returns="CRS", # 默认假设规模报酬不变in_weights=[0, None], out_weights=[0, None],badout_weights=[0, None], #系数的非零假设):self.inputs = inputs self.outputs = outputsself.bad_outs = bad_outsself.returns = returns #初始化投入、产出向量、鸡舍self.J, self.I = self.inputs.shape # no of DMUs, inputs_, self.R = self.outputs.shape # no of outputs_, self.S = self.bad_outs.shape # no of bad outputsself._i = range(self.I) # inputsself._r = range(self.R) # outputsself._s = range(self.S) # bad_outputself._j = range(self.J) # DMUsself._in_weights = in_weights # input weight restrictionsself._out_weights = out_weights # output weight restrictionsself._badout_weights = badout_weights # bad output weight restrictions# creates dictionary of pulp.LpProblem objects for the DMUsself.dmus = self._create_problems()def _create_problems(self):"""Iterate over the DMU and create a dictionary of LP problems, onefor each DMU."""dmu_dict = {}for j0 in self._j:dmu_dict[j0] = self._make_problem(j0)return dmu_dictdef _make_problem(self, j0):"""Create a pulp.LpProblem for a DMU."""# Set up pulpprob = pulp.LpProblem("".join(["DMU_", str(j0)]), pulp.LpMaximize)self.weights = pulp.LpVariable.dicts("Weight", (self._j), lowBound=self._in_weights[0])self.betax = pulp.LpVariable.dicts("scalingFactor_x", (self._i), lowBound=0, upBound=1)self.betay = pulp.LpVariable.dicts("scalingFactor_y", (self._r), lowBound=0)self.betab = pulp.LpVariable.dicts("scalingFactor_b", (self._s), lowBound=0,)# Set returns to scaleif self.returns == "VRS":prob += pulp.lpSum([weight for weight in self.weights]) == 1# Set up objective functionprob += pulp.lpSum([self.betab[s] for s in self._s])# Set up constraintsfor i in self._i:prob += (pulp.lpSum([(self.weights[j0] * self.inputs.values[j0][i]) for j0 in self._j])<= self.inputs.values[j0][i])for r in self._r:prob += (pulp.lpSum([(self.weights[j0] * self.outputs.values[j0][r]) for j0 in self._j])>= self.outputs.values[j0][r])for s in self._s: # weak disposabilityprob += (pulp.lpSum([(self.weights[j0] * self.bad_outs.values[j0][s]) for j0 in self._j])== self.betab[s] * self.bad_outs.values[j0][s])return probdef solve(self):"""Iterate over the dictionary of DMUs' problems, solve them, and collatethe results into a pandas dataframe."""sol_status = {}sol_weights = {}sol_objective_function = {}for ind, problem in list(self.dmus.items()):problem.solve()sol_status[ind] = pulp.LpStatus[problem.status]sol_weights[ind] = {}for v in problem.variables():sol_weights[ind][v.name] = v.varValuesol_objective_function[ind] = pulp.value(problem.objective)return sol_status, sol_objective_function, sol_weightsdef adjust_und_output(self):"""after solving all the classic DEA efficiency calculation, calculate each DMU's ZSG-DEA efficiency according to its DEA efficiency."""sol_status, sol_objective_function, sol_weights = self.solve()adjust_efficiency = {}for i in list(self._j):eff_ls, ineff_ls, ineff_denom = [], [], []for j in range(self.bad_outs.shape[0]):if sol_objective_function[j] == 1:efficient_DMU_b = sum([self.bad_outs[s][j] for s in range(self.bad_outs.shape[1])])eff_ls.append(efficient_DMU_b)else:inefficient_DMU_b = -sum([self.bad_outs[s][j] for s in range(self.bad_outs.shape[1])])inefficient_DMU_denominator = -sol_objective_function[j] * sum([self.bad_outs[s][j] for s in range(self.bad_outs.shape[1])])ineff_ls.append(inefficient_DMU_b)ineff_denom.append(inefficient_DMU_denominator)eff_DMU_sum, ineff_DMU_sum, ineff_DMU_sumproduct = (sum(eff_ls),sum(ineff_ls),sum(ineff_denom),)adjust_eff = (sol_objective_function[i] * sum([eff_DMU_sum, ineff_DMU_sum])) / sum([eff_DMU_sum, ineff_DMU_sumproduct]) # 计算zsg-efficiencyadjust_efficiency[i] = adjust_effstatus = pd.DataFrame.from_dict(sol_status, orient="index", columns=["status"])objective = pd.DataFrame.from_dict(sol_objective_function, orient="index", columns=["objective_function"])adj_eff = pd.DataFrame.from_dict(adjust_efficiency, orient="index", columns=["adj_score"])weight = pd.DataFrame.from_dict(sol_weights, orient="index")results = pd.concat([status, objective, adj_eff, weight], axis=1)return resultsX = pd.DataFrame(np.array([[20, 320],[22, 280],[26, 270],[15, 200],[18, 240],[11, 222],[19, 321],[14, 231],])
)
y = pd.DataFrame(np.array([[20], [30], [40], [30], [50], [21], [32], [42]]))
b = pd.DataFrame(np.array([[12], [14], [15], [15], [18], [12], [14], [16]]))
names = pd.DataFrame(["Bratislava", "Zilina", "Kosice", "Presov", "Poprad", "ala", "ba", "ca"],columns=["DMU"],
)ZSG_DEAProblem(X, y, b, ).adjust_und_output().round(decimals=4)
结果如下图所示,objective function是调整前DMU的效率,adj_score是调整的系数,调整完后,所有DMU都到达production frontier
强/弱处置性假设下的距离函数
Matlab DEA 程序包
pyDEA安装
非径向距离函数
考虑非期望产出的非径向距离函数
Cite the work
Yang, F.; Choi, Y.: Lee, H. Life-cycle data envelopment analysis to measure efficiency and cost-effectiveness of environmental regulation in China’s transport sector. Ecological indicators 2021
Choi, Y.; Yang, F.; Lee, H. On the Unbalanced Atmospheric Environmental Performance of Major Cities in China. Sustainability 2020, 12, 5391. https://doi.org/10.3390/su12135391
————————
我是仁荷大学的经管博士生(我的google scholar, 我的Github),关注能源转型过程中的环境、经济问题。
专注于分享利用python科研的技巧,欢迎一起交流、学习、合作。
关于我的博客内容、其他相关的研究问题,有问题可以评论、私信我~
python DEA: 零和数据包络分析zero-sum gain Data envelopment analysis相关推荐
- 仁慈型dea matlab程序,数据包络分析(DEA)方法..docx
数据包络分析(DEA)方法. 二.数据包络分析(DEA)方法数据包络分析(data envelopment analysis, DEA)是由著名运筹学家Charnes, Cooper和Rhodes于1 ...
- 数据包络分析法(DEA)在数学建模中的应用
简介 数据包络分析方法(Data Envelopment Analysis,DEA)是运筹学.管理科学与数理经济学交叉研究的一个新领域.它是根据多项投入指标和多项产出指标,利用线性规划的方法,对具有可 ...
- DEA(数据包络分析)程序模板
在人们的生产活动和社会活动中常常会遇到这样的问题:经过一段时间之后,需要对具有相同类型的部门或单位(称为决策单元)进行评价,其评价的依据是决策单元的"输入"数据和"输出& ...
- 数据包络分析DEA(数学建模)
一.模型背景 数据包络分析是线性规划模型的应用之一,常被用来衡量拥有相同目标的运营单位的相对效率. 数据包络分析是一种基于线性规划的用于评价同类型组织(或项目)工作绩效相对有效性的特殊工具手段.这类组 ...
- 数据包络分析(超效率-SBM模型)附python代码
超效率-SBM模型 超效率SBM python代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了. 上阵子挺多人私信我,原谅我记性不好,可能没有回复全. 这篇文章是超效率的扩展. 超效 ...
- matlab包络分析函数,数据包络分析 (MATLAB代码).doc
数据包络分析 (MATLAB代码) X=[] % 输入多指标输入矩阵X Y=[] % 输入多指标输出矩阵Y [n,m]=size(X) % n为输入的指标数,m为决策单元数 s=size(Y) % s ...
- 效率评价方法--数据包络分析
一. 数据包络分析方法概念 1.1 理论背景 我们常常需要对具有相同类型的部门或单位(称为决策单元)进行评价,其评价的依据是决策单元的"输入"数据和"输出"数据 ...
- 数据包络分析-CEA碳减排有关文献分析(第一篇)
数据包络分析-CEA碳减排有关文献分析 基本情况 模型建立-CRS CCR基础模型 CCR文献改进模型 CCR最终模型(文献所用) 模型建立-VRS VRS基础模型 VRS文献改进模型 VRS最终模型 ...
- 数据包络分析--两阶段加性网络DEA--使用优化黄金分割比例算法(第一篇)
数据包络分析-两阶段加性网络-使用黄金分割比例算法 文献介绍 乘子模型 基础信息 黄金分割比例算法 例子 文献介绍 如果阅读过我前面的文章<数据包络分析-加性网络DEA分解>,那么这篇文章 ...
最新文章
- Http和Socket连接区别(ZT)
- 自律到极致-人生才精致:第4期
- Linux中look命令,如何在Linux上使用look命令 | MOS86
- 6678EVM调试K1_STK_v1.1例程中GE_test的时候报错:DDR3 leveling has failed, STATUS = 0x40000064的解决办法
- 【转载】css3 content 生成内容
- 简单易用高性能!一文了解开源迁移学习框架EasyTransfer
- uefi模式下win10安装双系统ubuntu18.04LTS
- left join 效率_人力资源HR的人才测评工具,极大提高招聘效率
- linux 开源邮件 系统,4 个开源的命令行邮件客户端
- prompt set feedback set define的详解
- mysql5.7.11无法启动_MySQL5.7.11免安装版的安装和配置:解决MYSQL 服务无法启动问题...
- 为 Perl 定制 Vim
- 360浏览器集成IE8内核
- Mybatis collection 递归查询并自动装填所有子节点(多参数查询传入参数方法)
- 码神军训(四,五)——代码跳舞军体拳
- 诊断和解决row chained and migrated
- 【详细教程】App inventor连接阿里云平台(APP显示STM32发来的温湿度数据等)
- 曾国藩:成大事者不纠结
- 第一阶段:Python开发基础 day18 模块的使用(三)
- 简谈 Intel altera 和 Xilinx 的 FPGA 区别
热门文章
- 解读2018中国药品零售业新挑战
- Excel公式教程 数组公式基础:数组扩展
- 基于低能耗自适应聚类层次结构(LEACH)(Matlab代码实现)
- Starling Feathers Controls PickerList
- 灰色关联分析,Python实现GRA(gray relation analysis)
- activiti 流程图中使用SeriviceTask(自动服务任务)
- 哇!微软 Excel 竟然还能实现 CV 算法
- 微软excel打开csv文件乱码,wps和txt不乱码,java后台解决
- Word转PDF能免费吗?这3个免费转换技巧很好用
- AI绘画指南 stable diffusion webui (SD webui)如何设置与使用