首页 > 编程语言 >2022-07-03-含有非期望产出的sbm模型python代码

2022-07-03-含有非期望产出的sbm模型python代码

时间:2024-05-22 21:33:07浏览次数:25  
标签:03 07 python s1 ## dmu output counts data

传统的径向DEA模型无法考虑“松弛变量”对效率值的影响,也没有考虑同时使期望产出增加,非期望产出减少的技术变化,以此度量的效率值是不准确或有偏的,为了解决这一问题,Tone(2001)提出了基于投入产出松弛变量的环境效率评价模型,简称SBM模型,在此基础上,他进一步提出了SBM的拓展模型,从而实现了非期望产出条件下对环境效率的评价,含有非期望产出的SBM模型规划式如下图所示:

含有非期望产出的SBM模型规划式

关于求解含有非期望产出的SBM模型的python代码如下:

from scipy.optimize import minimize
import numpy as np
import pandas as pd
import scipy.optimize as op
def sbmeff2(input_variable, desirable_output, undesirable_output, dmu,data,method = 'revised simplex'):
    """用于求解sbm模型
    
    Parameters:
    -----------
    input_variable:
        投入[v1,v2,v3,...] 
    desirable_output:
        期望产出[v1,v2,v3,...]
    undesirable_output:
        非期望产出[v1,v2,v3,...] 
    dmu:
        决策单元
    data:
        主数据
    method:
        求解方法.默认'revised simplex',可选'interior-point'

	Return:
	------
	res : DataFrame
		结果数据框[dmu	TE	slack...]
    """
 
    res = pd.DataFrame(columns = ['dmu','TE'], index = data.index)
    res['dmu'] = data[dmu]
    ## lambda有dmu个数个,S有变量个数个
    dmu_counts = data.shape[0]
     ## 投入个数
    m = len(input_variable)
    ## 期望产出个数
    s1 = len(desirable_output)
    ## 非期望产出个数
    s2 = len(undesirable_output)
    ## x[:dmu_counts] 为lambda
    ## x[dmu_counts:dmu_counts+1] 为 t
    ## x[dmu_counts+1 :dmu_counts + m + 1] 为投入slack
    ## x[dmu_counts+ 1 + m:dmu_counts + 1 + m + s1] 为期望产出slack
    ## x[dmu_counts + 1 + m + s1 :] 为非期望产出lack
    total = dmu_counts + m + s1 + s2 + 1
    cols = input_variable+desirable_output+ undesirable_output
    newcols = []
    for j in cols:
        newcols.append(j+'_slack')
        res[j+'_slack'] = np.nan
    for i in range(dmu_counts):
        
        ## 优化目标
        c = [0] * dmu_counts + [1] +  list(-1 / (m * data.loc[i, input_variable])) + [0] * (s1 + s2)
        
        ## 约束条件
        A_eq = [[0] * dmu_counts + [1] + [0] * m  + list(1/((s1 + s2) * data.loc[i, desirable_output])) + 
                                                    list(1/((s1 + s2) * data.loc[i, undesirable_output]))]
        
        ## 约束条件(1)
        for j1 in range(m):
            list1 = [0] * m
            list1[j1] = 1
            eq1 = list(data[input_variable[j1]]) + [-data.loc[i ,input_variable[j1]]] + list1 + [0] * (s1 + s2)
            A_eq.append(eq1)
        ## 约束条件(2)
        for j2 in range(s1):
            list2 = [0] * s1
            list2[j2] = -1
            eq2 = list(data[desirable_output[j2]]) + [-data.loc[i, desirable_output[j2]]] + [0] * m + list2 + [0] * s2
            A_eq.append(eq2)
        ## 约束条件(3)
        for j3 in range(s2):
            list3 = [0] * s2
            list3[j3] = 1
            eq3 = list(data[undesirable_output[j3]]) + [-data.loc[i, undesirable_output[j3]]] + [0] * (m + s1) + list3
            A_eq.append(eq3)         
        b_eq = [1] + [0] * (m + s1 + s2)               
        bounds = [(0, None)]*total
        ## 求解
        op1 = op.linprog(c = c,A_eq=A_eq,b_eq=b_eq,bounds=bounds,method = method)
        res.loc[i, 'TE'] = op1.fun
        res.loc[i, newcols] = op1.x[dmu_counts+1 :]
    return res

————————————————
版权声明:本文为CSDN博主「wonder1322」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wonder1322/article/details/112987285

代码来自于CSDN的一位博主wonder1322,非常感谢他的分享。

标签:03,07,python,s1,##,dmu,output,counts,data
From: https://www.cnblogs.com/gongju128/p/18207137

相关文章

  • 2022-05-07-无条件、空间静态、空间动态kernel核密度工具
    今天要介绍的是一个目前论文中常用到的方法:无条件kernel核密度、空间静态kernel核密度和空间动态kernel核密度。Kernel核密度估计属于非参数估计方法,不过分依赖模型,可以用来研究各地区的不平衡分布问题。假设f(x)是随机变量X的的密度函数,Xi为独立同分布的观测值,x为均值,h为带宽。......
  • 打印机共享0x0000709错误的解决
    家里两台电脑,一台台式机,一台笔记本,打印机HP1020连接在台式机上,笔记本和台式机连到同一个局域网,之前都能用笔记本直接打印(台式机上打印机己设置共享),曾几何时不能打印了,显示0x0000709错误,如下图百度了好几篇文章,多种方法试了,没效果,还有一个号称“完美解决的工具”,安装后一运行......
  • 【PYTHON3】认识python语言
    一、什么是pythonPython是一种高级的开发语言,和java、C/C++等开发语言一样。其主要的方向是人工智能、爬虫、大数据、自动化等注意这里指的是主要用途,但并不代表python不能开发WEB、GUI、游戏等程序二、发展史以下解释来源菜鸟教程网址,因为我觉得菜鸟教程上的说明已经很清......
  • CSP历年复赛题-P1044 [NOIP2003 普及组] 栈
    原题链接:https://www.luogu.com.cn/problem/P1044题意解读:一组数入栈、出栈的方案数,如果了解卡特兰数,此题可以秒杀;如果不了解,也可以通过递归或者递推来解决;最次,可以通过DFS暴搜出方案数,当然对于n个数,一共有n次入栈、n次出栈,一共2n次,每次要么入栈要么出栈,总搜索次数在22n规模,n最......
  • CSP历年复赛题-P1045 [NOIP2003 普及组] 麦森数
    原题链接:https://www.luogu.com.cn/problem/P1045题意解读:要计算2p-1的位数和最后500位,实际上只需要计算2p,两者位数一致,前者比后者个位减1即可,且个位肯定不会是0,比较容易处理。解题思路:如果直接采用高精度乘法计算2p,p最大3.1*106,高精度所用数组最长大概9*105,一共最多计算3.......
  • CSP历年复赛题-P1043 [NOIP2003 普及组] 数字游戏
    原题链接:https://www.luogu.com.cn/problem/P1043题意解读:将n个环形数分成任意m组,组内求和再%10、负数转正,组间相乘,求所有分组方案中得到结果的最小值和最大值。解题思路:比赛题的首要目的是上分!此题一看就是DP,但是苦苦思索了半天,想不清楚状态表示,那么可以换换策略,先暴力得分再......
  • python 实现公众号模板消息推送(亲测有效)
    APPID='xxxxxxxxx'APPSECRET='xxxxxxxxxxxxxx'response=requests.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.format(APPID,APPSECRET))ACCESS_TOKEN=response.js......
  • python直接调用InstantID进行图片生成
    项目地址https://github.com/InstantID/InstantID克隆到本地,根据要求pip安装依赖模型文件上篇文章讲了如何下载https://www.cnblogs.com/qcy-blog/p/18202276我用的windows,所以改了一下示例infer.py源码,主要是修改了模型得绝对路径。importcv2importtorchimportnumpy......
  • Python使用Mypy进行静态变量审查
    python作为一个动态语言,可以对变量不进行类型定义就使用,这就导致随着项目的增大,我们很难回顾以前某些模块中每一个变量是什么类型(特别是在函数定义里,如果不进行类型检查,很可能对一个str类型进行了()调用等等),为了在编码时能够让编译器提醒我们,也防止在运行时出现问题,采用静态变......
  • python 自然语言处理模块
    Python中有几个流行的自然语言处理(NLP)模块,这些模块提供了广泛的工具和库,用于文本分析、处理和理解。以下是一些广泛使用的NLP模块:NLTK(NaturalLanguageToolkit)NLTK是Python中最著名的NLP库之一,它提供了文本处理的丰富工具,包括分词、词性标注、句法分析、语义推理等。网......