找文章 / 找答案
精选问答 更多内容

[数据处理] 深度分析模型嵌入

yhdata_d1VMgAgN玄铁二 显示全部楼层 发表于 2024-7-8 16:55:48 |阅读模式 打印 上一主题 下一主题
50
未解决

【数据处理】 深度分析模型嵌入

796 2
各位老师好,如何将以下代码封装到深度实验模型中,下面代码无法输出内容
#------------------------------------------------------------------------------------------------------
# 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)


回复

使用道具 举报

精彩评论2

yhdata_lyaa 显示全部楼层 发表于 2024-7-8 17:38:40
是自己开发的插件吗
参考帮助中心

https://www.yonghongtech.com/rea ... lugin_settings.html
回复

使用道具 举报

yhdata_d1VMgAgN玄铁二 显示全部楼层 发表于 2024-7-8 19:57:15
yhdata_lyaa 发表于 2024-7-8 17:38
是自己开发的插件吗
参考帮助中心

不是,是python脚本
回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 免费注册

  • 官方微信

    欢迎关注永洪服务号!收费为0,价值无限

    扫码关注
  • 新浪微博

    让每位用户轻松挖掘数据价值!

    访问新浪微博
  • 智能客服
50W

会员等你来哦

Copyright   ©2012-2024  北京永洪商智科技有限公司  (京ICP备12050607) 京公网安备110110802011451号 |《永洪社区协议》
返回顶部