各位老师好,如何将以下代码封装到深度实验模型中,下面代码无法输出内容
#------------------------------------------------------------------------------------------------------
# dme.script.port 编写自定义Python脚本的子工具包,包含两个工具类:
# EntryPoint: 当前脚本节点的输入输出端口
# input: 本节点的数据输入,访问某个前置节点的某种数据
# 可以这样:entry.input['数据集节点1'][ResourceType.DATAFRAME 表示
# 获取“数据集节点1”的输出数据集;
# output: 本节点的数据输出,
# dataset: 待输出的数据集;
# model: 待输出的模型;
# pmml: 待输出的pmml;
# images: 待输出的png图片数据,使用方法
# images.put_image_from_plot("图片名字1",plot)
# 注意,目前只支持导出一张png图片;
# ResourceType: 输入输出数据的枚举类型,DATAFRAME表示数据集,MODEL表示模型;
# dme.common.util.to_pmml 用于导出生成模型的PMML文本,支持sklearn、xgboost、lightgbm等常见模型;
# param 用于读取实验的参数信息的字典,使用时用参数名作为key可以获取参数的值,如:a = param['a'
# 现存参数中没有该key的情况下会自动新建空参数,启动实验时会自动弹窗输入,也可以在编辑参数中自行编辑
# 注意该字典为只读,只能取key对应的value,无法对key下的参数值进行赋值。
#------------------------------------------------------------------------------------------------------
import gurobipy
import pandas as pd
from dme.script.port import EntryPoint, ResourceType
# 分页显示数据, 设置为 False 不允许分页
pd.set_option('display.expand_frame_repr', False)
# 最多显示的列数, 设置为 None 显示全部列
pd.set_option('display.max_columns', None)
# 最多显示的行数, 设置为 None 显示全部行
pd.set_option('display.max_rows', None)
class DEA(object):
def __init__(self, DMUs_Name, X, Y, AP=False):
self.m1, self.m1_name, self.m2, self.m2_name, self.AP = X.shape[1, X.columns.tolist(), Y.shape[
1, Y.columns.tolist(), AP # shape 行数 columns.tolist列名
self.DMUs, self.X, self.Y = gurobipy.multidict(
{DMU: [X.loc[DMU.tolist(), Y.loc[DMU.tolist() for DMU in DMUs_Name})
print(f'DEA(AP={AP}) MODEL RUNING...')
def __CCR(self):
for k in self.DMUs:
MODEL = gurobipy.Model()
OE, lambdas, s_negitive, s_positive = MODEL.addVar(), MODEL.addVars(self.DMUs), MODEL.addVars(
self.m1), MODEL.addVars(self.m2)
MODEL.update()
MODEL.setObjectiveN(OE, index=0, priority=1)
MODEL.setObjectiveN(-(sum(s_negitive) + sum(s_positive)), index=1, priority=0)
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i * self.X[i][j for i in self.DMUs if i != k or not self.AP) + s_negitive[
j == OE * self.X[k][j for j in range(self.m1))
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i * self.Y[i][j for i in self.DMUs if i != k or not self.AP) - s_positive[
j == self.Y[k][j for j in range(self.m2))
MODEL.setParam('OutputFlag', 0)
MODEL.optimize()
self.Result.at[k, ('效益分析', '综合技术效益(CCR)') = MODEL.objVal
self.Result.at[k, ('规模报酬分析',
'有效性') = '非 DEA 有效' if MODEL.objVal < 1 else 'DEA 弱有效' if s_negitive.sum().getValue() + s_positive.sum().getValue() else 'DEA 强有效'
self.Result.at[k, ('规模报酬分析',
'类型') = '规模报酬固定' if lambdas.sum().getValue() == 1 else '规模报酬递增' if lambdas.sum().getValue() < 1 else '规模报酬递减'
for m in range(self.m1):
self.Result.at[k, ('差额变数分析', f'{self.m1_name[m]}') = s_negitive[m.X
self.Result.at[k, ('投入冗余率', f'{self.m1_name[m]}') = 'N/A' if self.X[k][m == 0 else s_negitive[m.X / \
self.X[k][m
for m in range(self.m2):
self.Result.at[k, ('差额变数分析', f'{self.m2_name[m]}') = s_positive[m.X
self.Result.at[k, ('产出不足率', f'{self.m2_name[m]}') = 'N/A' if self.Y[k][m == 0 else s_positive[m.X / \
self.Y[k][m
return self.Result
def __BCC(self):
for k in self.DMUs:
MODEL = gurobipy.Model()
TE, lambdas = MODEL.addVar(), MODEL.addVars(self.DMUs)
MODEL.update()
MODEL.setObjective(TE, sense=gurobipy.GRB.MINIMIZE)
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i * self.X[i][j for i in self.DMUs if i != k or not self.AP) <= TE *
self.X[k][j for j in range(self.m1))
MODEL.addConstrs(
gurobipy.quicksum(lambdas[i * self.Y[i][j for i in self.DMUs if i != k or not self.AP) >= self.Y[k][j
for j in range(self.m2))
MODEL.addConstr(gurobipy.quicksum(lambdas[i for i in self.DMUs if i != k or not self.AP) == 1)
MODEL.setParam('OutputFlag', 0)
MODEL.optimize()
self.Result.at[
k, ('效益分析', '技术效益(BCC)') = MODEL.objVal if MODEL.status == gurobipy.GRB.Status.OPTIMAL else 'N/A'
return self.Result
def dea(self):
columns_Page = ['效益分析' * 3 + ['规模报酬分析' * 2 + ['差额变数分析' * (self.m1 + self.m2) + ['投入冗余率' * self.m1 + [
'产出不足率' * self.m2
columns_Group = ['技术效益(BCC)', '规模效益(CCR/BCC)', '综合技术效益(CCR)', '有效性', '类型' + (self.m1_name + self.m2_name) * 2
self.Result = pd.DataFrame(index=self.DMUs, columns=[columns_Page, columns_Group)
self.__CCR()
self.__BCC()
self.Result.loc[:, ('效益分析', '规模效益(CCR/BCC)') = self.Result.loc[:, ('效益分析', '综合技术效益(CCR)') / self.Result.loc[:,
('效益分析',
'技术效益(BCC)')
return self.Result
def analysis(self, file_name=None):
Result = self.dea()
file_name = r'D:\AAA\济南数据可视化\DEA原始数据及结果.xlsx'
Result.to_excel(file_name, 'DEA 数据包络分析报告')
if __name__ == '__main__':
# io = r"D:\AAA\济南数据可视化\DEA原始数据及结果.xlsx"
entry = EntryPoint()
io = entry.input['DEA2023'][ResourceType.DATAFRAME
x = pd.read_excel(io, sheet_name = 0, usecols = [1,2,3,4) # 导入投入数据
y = pd.read_excel(io, sheet_name = 0, usecols = [5,6) # 导入产出数据
country = pd.read_excel(io, sheet_name = 0, usecols = [0)
data = DEA(DMUs_Name= range(0,17), X=x, Y=y)
# data.analysis()
# print(data.dea())
A = data.dea()
# B = A.to_excel(r'D:\AAA\济南数据可视化\DEA 数据包络分析报告.xlsx')
entry.output.dataset = pd.DataFrame(A)
|