点赞发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. 1-2 用Python编写【房价预测】模型----paddle

    课程>我的课程>百度架构师手把手教深度学习>1-2 用Python编写[房价预测]模型> 1-2 用Python编写[房价预测]模型 paddle初级教程第一章 第二节 王然( ...

  2. python使用matplotlib对比多个模型在测试集上的效果并可视化、设置模型性能可视化结果柱状图(bar plot)标签的小数点位数(例如,强制柱状图标签0.7显示为两位小数0.70)

    python使用matplotlib对比多个模型在测试集上的效果并可视化.设置模型性能可视化结果柱状图(bar plot)标签的小数点位数(例如,强制柱状图标签0.7显示为两位小数0.70) 目录

  3. python使用matplotlib对比多个模型的在训练集上的效果并使用柱状图进行可视化:基于交叉验证的性能均值(mean)和标准差(std)进行可视化分析、使用标准差信息添加误差区间条yerr

    python使用matplotlib对比多个模型的在训练集上的效果并使用柱状图进行可视化:基于交叉验证的性能均值(mean)和标准差(std)进行可视化分析.使用标准差信息添加误差区间条yerr 目录

  4. Python使用tpot获取最优模型并抽取最优模型模型参数

    Python使用tpot获取最优模型并抽取最优模型模型参数 目录 Python使用tpot获取最优模型并抽取最优模型模型参数 #数据划分

  5. Python使用tpot获取最优模型、将最优模型应用于交叉验证数据集(5折)获取数据集下的最优表现,并将每一折(fold)的预测结果、概率、属于哪一折与测试集标签、结果、概率一并整合输出为结果文件

    Python使用tpot获取最优模型.将最优模型应用于交叉验证数据集(5折)获取数据集下的最优表现,并将每一折(fold)的预测结果.概率.属于哪一折与测试集标签.结果.概率一并整合输出为结果文件 目 ...

  6. Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  7. Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  8. DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略

    DL框架之Keras:深度学习框架Keras框架的简介.安装(Python库).相关概念.Keras模型使用.使用方法之详细攻略 目录 Keras的简介 1.Keras的特点 2.Keras四大特性 ...

  9. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...

  10. python做马尔科夫模型预测法_Python实现HMM(隐马尔可夫模型)

    1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别.文本翻译.序列预测.中文分词等多个领域.虽然近年来,由于RNN等深度学习方法的发展,HMM模型逐 ...

最新文章

  1. 多无人机对组网雷达的协同干扰问题 数学建模
  2. BZOJ4066: 简单题
  3. php 在对象中递归 坑,PHP递归问题,数据总是对不上
  4. 5. OD-把限制的功能恢复,把阉割的功能添加(未注册版本,部分功能不可使用的修改)
  5. Ubuntu 安装 Linux Deepin 截图工具(.deb)
  6. ssh tar_2015年最佳情侣:tar和ssh
  7. WP7 Tip:改变启动页
  8. 每日一C(函数指针)
  9. 想要好用的录音转文字软件?推荐三款音频转文字软件免费版
  10. 计算机word虚线分割,Word文档里的波浪线、虚线、分割线都是怎么打出来的?
  11. 【无标题】**数据库课设:三天完成学生信息管理系统**
  12. 考研二战日记-第16天小结
  13. ​力扣解法汇总728-自除数
  14. java类名遵从法_程序员必知的Java基础:5条命名规范和8种数据类型归纳
  15. 名词解释第八讲:公钥
  16. C# 简单的前方交会程序设计
  17. 记录一下自己常用的数据库,以备不时之需
  18. i.MX6模组MYC-6ULX使用
  19. python+appium实现自动化测试的示例代码
  20. IDEA警告:Boolean method ‘xxx‘ is always inverted

热门文章

  1. cophenet matlab,Matlab聚类分析[转]
  2. android 通用驱动程序下载,安卓手机通用驱动官方下载-安卓手机通用驱动(Universal Adb Driver)下载v2017 官方最新版-当易网...
  3. php cms 新闻采集,自动新闻采集软件快速入门图文详细教程
  4. 网页采集器,全自动网站采集发布(图文)
  5. python双星号什么运算_Python中的*(星号)和**(双星号)完全详解
  6. widi软件|widi音频转换软件
  7. 初次涉足手机广告联盟行业
  8. ZooKeeper下载安装(Windows版本)
  9. Windows 2000 下载
  10. 通信与协议Netty+Protobuf-游戏设计与开发(1)