python DEA: by-product NDDF DEA模型
点赞发Nature
关注中Science
by-product DEA模型取消了常用的DEA模型中的弱处置性(weak disposability),可以用来模拟副产品与主产品相关性不强的情景。
如,在电力生产中,若安装了APCD,则空气污染物的产生与电力生产量就不具有强的相关性,应当采用by-product模型。
#!/usr/bin/env python
# coding: utf-8import numpy as np
import pandas as pd
import pulpclass DEAProblem:"""Help on class DEAProblemDEAProblem(inputs, outputs, bad_outs, weight_vector, directional_factor=None, returns='CRS',in_weights=[0, None], out_weights=[0, None],badout_weights=[0, None])DEAProblem solves DEA model using directional distance function.Parameters:inputs: input data, DataFrame dataoutputs: output data, DataFrame databad_outs: undesirable output data, DataFrame dataweight_vector: weights for individual inputs and outputs. List data"""def __init__(self,n_inputs,p_inputs,outputs,bad_outs,weight_vector,directional_factor=None,returns="CRS",in_weights=[0, None],out_weights=[0, None],badout_weights=[0, None],):self.n_inputs = n_inputsself.p_inputs = p_inputsself.outputs = outputsself.bad_outs = bad_outsself.returns = returnsself.weight_vector = (weight_vector # weight vector in directional distance function)self.J, self.nI = self.n_inputs.shape # no of DMUs, non-polluting inputs_, self.pI = self.p_inputs.shape # no of polluting inputs_, self.R = self.outputs.shape # no of outputs_, self.S = self.bad_outs.shape # no of bad outputsself._ni = range(self.nI) # iterate over non-polluting inputsself._pi = range(self.pI) # iterable over polluting inputsself._r = range(self.R) # outputsself._s = range(self.S) # bad_outputself._j = range(self.J) # DMUsif directional_factor == None:self.gx1 = self.n_inputsself.gx2 = self.p_inputsself.gy = self.outputsself.gb = self.bad_outselse:self.gx1 = directional_factor[: self.nI]self.gx2 = directional_factor[: (self.nI + self.pI)]self.gy = directional_factor[(self.nI + self.pI) : ((self.nI + self.pI) + self.J)]self.gy = directional_factor[((self.nI + self.pI) + self.J) :]self._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 by-product technology model. Reference: doi.org/10.1111/deci.12421"""# Set up pulpprob = pulp.LpProblem("".join(["DMU_", str(j0)]), pulp.LpMaximize)self.weights_1 = pulp.LpVariable.dicts("Weight_non_polluting", (self._j), lowBound=self._in_weights[0]) # define the weight for non-pulluting unit in the by-product technology modelself.weights_2 = pulp.LpVariable.dicts("Weight_polluting", (self._j), lowBound=self._in_weights[0]) # define the weight for pulluting unit in the by-product technology model# self.betax1 = pulp.LpVariable.dicts(# "scalingFactor_nx", (self._ni), lowBound=0, upBound=1# ) # scaling factor for non-polluting inputs# self.betax2 = pulp.LpVariable.dicts(# "scalingFactor_px", (self._pi), lowBound=0, upBound=1# ) # scaling factor for polluting inputsself.beta = pulp.LpVariable("scalingFactor", lowBound=0) # scaling factor# self.betab = pulp.LpVariable.dicts(# "scalingFactor_b", (self._s), lowBound=0, upBound=1# ) # scaling factor for undesirable factor# Set up objective functionprob += pulp.lpSum(self.beta)# Set up constraintsfor ni in self._ni:prob += (pulp.lpSum([(self.weights_1[j0] * self.n_inputs.values[j0][ni])for j0 in self._j])<= self.n_inputs.values[j0][ni])for pi in self._pi:prob += (pulp.lpSum([(self.weights_1[j0] * self.p_inputs.values[j0][pi])for j0 in self._j])<= self.p_inputs.values[j0][pi])# strong disposability for desirable output in non-pulluting processfor r in self._r:prob += (pulp.lpSum([(self.weights_1[j0] * self.outputs.values[j0][r])for j0 in self._j])>= self.outputs.values[j0][r] + self.beta * self.gy.values[j0][r])for pi in self._pi:prob += (pulp.lpSum([(self.weights_2[j0] * self.p_inputs.values[j0][pi])for j0 in self._j])>= self.p_inputs.values[j0][pi])# strong disposability for undesirable output in polluting processfor s in self._s:prob += (pulp.lpSum([(self.weights_2[j0] * self.bad_outs.values[j0][s])for j0 in self._j])<= self.bad_outs.values[j0][s] - self.beta * self.gb.values[j0][s])# Set returns to scaleif self.returns == "VRS":prob += sum([self.weights_1[j] for j in self.weights_1]) == 1prob += sum([self.weights_2[j] for j in self.weights_2]) == 1return probdef solve(self):"""Iterate over the dictionary of DMUs' problems, solve them, and collatethe results into a pandas dataframe."""sol_status = {}sol_weights = {}sol_efficiency = {}for ind, problem in list(self.dmus.items()):problem.solve(pulp.PULP_CBC_CMD(msg=0))sol_status[ind] = pulp.LpStatus[problem.status]sol_weights[ind] = {}for v in problem.variables():sol_weights[ind][v.name] = v.varValuesol_efficiency[ind] = pulp.value(problem.objective)
# for name, c in list(problem.constraints.items()):
# print(name, ":", c, "\t", c.pi, "\t\t", c.slack)return sol_status, sol_efficiency, sol_weights
使用的案例可以见我的Github
代码相关的文章工作还在进行中,代码有用的话,请考虑引用我的论文~
Cite my works
F. Yang, H. Lee. An innovative provincial CO2 emission quota allocation scheme for Chinese low-carbon transition. Technological forecast and social change. 2022. In press.
————————
我目前奥尔堡大学做博士后(我的google scholar, 我的Github),关注能源转型过程中的环境、经济问题。
专注于分享利用python科研的技巧,欢迎一起交流、学习、合作。
关于我的博客内容、其他相关的研究问题,有问题可以下方
python DEA: by-product NDDF DEA模型相关推荐
- 1-2 用Python编写【房价预测】模型----paddle
课程>我的课程>百度架构师手把手教深度学习>1-2 用Python编写[房价预测]模型> 1-2 用Python编写[房价预测]模型 paddle初级教程第一章 第二节 王然( ...
- python使用matplotlib对比多个模型在测试集上的效果并可视化、设置模型性能可视化结果柱状图(bar plot)标签的小数点位数(例如,强制柱状图标签0.7显示为两位小数0.70)
python使用matplotlib对比多个模型在测试集上的效果并可视化.设置模型性能可视化结果柱状图(bar plot)标签的小数点位数(例如,强制柱状图标签0.7显示为两位小数0.70) 目录
- python使用matplotlib对比多个模型的在训练集上的效果并使用柱状图进行可视化:基于交叉验证的性能均值(mean)和标准差(std)进行可视化分析、使用标准差信息添加误差区间条yerr
python使用matplotlib对比多个模型的在训练集上的效果并使用柱状图进行可视化:基于交叉验证的性能均值(mean)和标准差(std)进行可视化分析.使用标准差信息添加误差区间条yerr 目录
- Python使用tpot获取最优模型并抽取最优模型模型参数
Python使用tpot获取最优模型并抽取最优模型模型参数 目录 Python使用tpot获取最优模型并抽取最优模型模型参数 #数据划分
- Python使用tpot获取最优模型、将最优模型应用于交叉验证数据集(5折)获取数据集下的最优表现,并将每一折(fold)的预测结果、概率、属于哪一折与测试集标签、结果、概率一并整合输出为结果文件
Python使用tpot获取最优模型.将最优模型应用于交叉验证数据集(5折)获取数据集下的最优表现,并将每一折(fold)的预测结果.概率.属于哪一折与测试集标签.结果.概率一并整合输出为结果文件 目 ...
- Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型
Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录
- Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型
Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录
- DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略
DL框架之Keras:深度学习框架Keras框架的简介.安装(Python库).相关概念.Keras模型使用.使用方法之详细攻略 目录 Keras的简介 1.Keras的特点 2.Keras四大特性 ...
- [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析
从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...
- python做马尔科夫模型预测法_Python实现HMM(隐马尔可夫模型)
1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别.文本翻译.序列预测.中文分词等多个领域.虽然近年来,由于RNN等深度学习方法的发展,HMM模型逐 ...
最新文章
- 多无人机对组网雷达的协同干扰问题 数学建模
- BZOJ4066: 简单题
- php 在对象中递归 坑,PHP递归问题,数据总是对不上
- 5. OD-把限制的功能恢复,把阉割的功能添加(未注册版本,部分功能不可使用的修改)
- Ubuntu 安装 Linux Deepin 截图工具(.deb)
- ssh tar_2015年最佳情侣:tar和ssh
- WP7 Tip:改变启动页
- 每日一C(函数指针)
- 想要好用的录音转文字软件?推荐三款音频转文字软件免费版
- 计算机word虚线分割,Word文档里的波浪线、虚线、分割线都是怎么打出来的?
- 【无标题】**数据库课设:三天完成学生信息管理系统**
- 考研二战日记-第16天小结
- ​力扣解法汇总728-自除数
- java类名遵从法_程序员必知的Java基础:5条命名规范和8种数据类型归纳
- 名词解释第八讲:公钥
- C# 简单的前方交会程序设计
- 记录一下自己常用的数据库,以备不时之需
- i.MX6模组MYC-6ULX使用
- python+appium实现自动化测试的示例代码
- IDEA警告:Boolean method ‘xxx‘ is always inverted
热门文章
- cophenet matlab,Matlab聚类分析[转]
- android 通用驱动程序下载,安卓手机通用驱动官方下载-安卓手机通用驱动(Universal Adb Driver)下载v2017 官方最新版-当易网...
- php cms 新闻采集,自动新闻采集软件快速入门图文详细教程
- 网页采集器,全自动网站采集发布(图文)
- python双星号什么运算_Python中的*(星号)和**(双星号)完全详解
- widi软件|widi音频转换软件
- 初次涉足手机广告联盟行业
- ZooKeeper下载安装(Windows版本)
- Windows 2000 下载
- 通信与协议Netty+Protobuf-游戏设计与开发(1)