【Python】基于Python利用熵权法计算数据权重——一个简单的图形用户界面编程

2023-11-20

1 简介

师弟又催我给他公众号写文了,这次还点名要这个题目……所以我就先到自己的博客里写写练练手……
(下面是正式的简介)
根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响(即权重)就越大,如果某项指标的值全部相等,则该指标在综合评价中不起作用。因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。
(上段直接拷贝自百度百科)

2 技术流程

参考相关的文献,我们知道要做熵值法赋权,首先要进行标准化,把所有指标的数据拉到一个尺度然后才有对比的价值。因此,第一步就是对数据进行标准化处理。在此之上,我们第二步再开始进行熵值法的赋权计算
(其实本来应该分三步的,即第一步是数据标准化,第二步是求各指标信息熵,第三步是求各指标权重,但是由于之前写代码我把后两部合并了,所以……两步到位吧……)
然后,基于这个技术流程,我们会写两个GUI。为什么是两个呢,因为我其他工作也用到了数据标准化处理,所以我把数据标准化处理的GUI单独写了一个(我的锅)。

3 数据

我拿我上上篇文章(基于python的机器学习回归:可视化、预测及预测结果保存(附代码))的数据删掉target就当作这次的实验示范数据吧!
数据长下面这个样子:
在这里插入图片描述
一共551行,共计550条数据,10个指标:
在这里插入图片描述
然后我们的目的就是算出这10个指标的熵权,熵权总和必须为1。

4 代码

4.1 代码:极差标准化

又到了喜闻乐见的代码部分。
首先,我们先写一个极差标准化的代码,预处理一下我们的数据。(这边就不多介绍极差标准化了,看了公式就明白什么意思了)

import tkinter as tk
from tkinter.filedialog import *
from tkinter.messagebox import *
import xlrd
import xlwt



# 极差标准化部分
##########1.读取Excel文件##########
def load_data(FilePath,ExcelSheet):
    workbook = xlrd.open_workbook(str(FilePath))       #excel路径
    sheet = workbook.sheet_by_name(ExcelSheet)             #sheet表
    return sheet

##########2.极差标准化运算########
def normalization(sheet,StartCol,EndCol,StartRow,EndRow,ConverseCol,SavePath):           #起始列,终止列,起始行,终止行,逆向指标所在列(列表格式),保存路径
    #######创建一个workbook########
    workbook = xlwt.Workbook(encoding = 'utf-8')    # 创建一个workbook 设置编码
    worksheet = workbook.add_sheet('Sheet')    # 创建一个worksheet
    #######读取行列,并计算极差标准化值#######
    for j in range(StartCol-1,EndCol):         #获取列代码
        Cols = sheet.col_values(j)
        #ColsName = Cols[0]         #获取列名并删除
        del Cols[0]            #删除列名
        ColsMax = max(Cols)                  #获取整列的最大值,最小值
        ColsMin = min(Cols)
        ExtremeSub = ColsMax - ColsMin         #计算极差
        for i in range(StartRow-1,EndRow):       #获取行代码
            PreValue = sheet.cell(i,j).value     #获取对应行列单元格里数据
            Value = (PreValue-ColsMin)/ExtremeSub
            for Conve in ConverseCol:           #计算逆向指标
                if j == Conve-1:       #如果是逆向指标列,采用另一种计算方法
                    Value = (ColsMax-PreValue)/ExtremeSub   #逆向指标值计算
            worksheet.write(i , j , label=Value)             #写入对应单元格
    workbook.save(str(SavePath))      #保存



# GUI相关函数
# 初始文件路径
def Get_FilePath():
	file_get = askopenfilename()  # 选择打开什么文件,返回文件名
	file_path.set(file_get)             # 设置变量filename的值

# 获取保存路径
def Get_SavePath():
	save_get = asksaveasfilename(defaultextension='.xls')   # 设置保存文件,并返回文件名,指定文件名后缀为.xls
	save_path.set(save_get)             # 设置变量filename的值

# 极差标准化执行模块
def exe_norma():
	try:
		Sheet = load_data(str(file_path.get()),str(read_sheet_name.get()))          #读取Sheet
		normalization(Sheet,int(start_col.get()),int(end_col.get()),int(start_row.get()),int(end_row.get()),eval(converse_col.get()),
		str(save_path.get()))          #极差标准化与保存Sheet
		#从上面读取的sheet,起始列,终止列,起始行,终止行,逆向指标所在列(列表格式),保存路径
		showinfo(title='执行完毕', message=f'极差标准化计算成功,结果保存在{str(save_path.get())}')
	except:
		showwarning(title='执行出错', message='无法执行极差标准化计算,请检查所输入的信息')



# GUI界面部分
root = tk.Tk()
root.title('极差标准化工具')
root.geometry('800x380')
file_path = tk.StringVar()
save_path = tk.StringVar()

# 选择文件、获取路径
tk.Label(root, text='选择文件:').place(x=10,y=20)
tk.Entry(root, textvariable=file_path, width=90).place(x=80,y=20)
tk.Button(root, text='打开文件', command=Get_FilePath).place(x=730,y=15)

# 读取的sheet名称
tk.Label(root, text='读取sheet:').place(x=10,y=70)
read_sheet_name = tk.Entry(root, width=90)
read_sheet_name.place(x=80,y=70)

# 起始、终止行列
tk.Label(root, text='起始列:').place(x=10,y=120)
start_col = tk.Entry(root, width=13)
start_col.place(x=80,y=120)
tk.Label(root, text='终止列:').place(x=190,y=120)
end_col = tk.Entry(root, width=13)
end_col.place(x=260,y=120)
tk.Label(root, text='起始行:').place(x=370,y=120)
start_row = tk.Entry(root, width=13)
start_row.place(x=440,y=120)
tk.Label(root, text='终止行:').place(x=550,y=120)
end_row = tk.Entry(root, width=13)
end_row.place(x=620,y=120)

# 逆向指标所在列
tk.Label(root, text='逆向指标列:').place(x=10,y=170)
converse_col = tk.Entry(root, width=30)
converse_col.place(x=80,y=170)
tk.Label(root, text='用中括号"[ ]"括起,列号用英文输入下的逗号","分隔,如无逆向指标输入""').place(x=310,y=170)

# 保存路径
tk.Label(root, text='保存路径:').place(x=10,y=220)
tk.Entry(root, textvariable=save_path, width=90).place(x=80,y=220)
tk.Button(root, text='选择目录', command=Get_SavePath).place(x=730,y=215)

# 运行按钮
tk.Button(root, text='开始进行极差标准化计算', command=exe_norma, width=30, height=2).place(x=290,y=280)

root.mainloop()

之前的文章里代码我一般不会解释的,更何况这里我们写的是GUI~都在注释里惹。
想直接用的朋友们可以直接拷贝,然后运行就行了(只要该有的import包你都有,基本上没有什么问题)。
运行出来会出现一个界面,长这个样子:
在这里插入图片描述
剩下具体的操作在后面再说。

4.2 代码:熵权法赋权

与上一节相同,这里仍然是GUI界面,所以我直接贴代码。
把代码拷贝到另一个.py文件里运行就行了。

import tkinter as tk
from tkinter.filedialog import *
from tkinter.messagebox import *
import xlrd
import xlwt
from math import log



# 熵值法处理数据部分
##########1.读取Excel文件##########
def load_data(FilePath,ExcelSheet):
    workbook = xlrd.open_workbook(str(FilePath))       #excel路径
    sheet = workbook.sheet_by_name(ExcelSheet)             #sheet表
    return sheet

##########2.熵值法运算########
def get_entropy(sheet,StartCol,EndCol,StartRow,EndRow,SavePath):           #起始列,终止列,起始行,终止行,保存路径
    #######创建一个workbook########
    workbook = xlwt.Workbook(encoding = 'utf-8')    # 创建一个workbook 设置编码
    worksheet = workbook.add_sheet('Sheet')    # 创建一个worksheet
    ######获取样本数和指标数######
    m = EndCol+1-StartCol       #指标数
    n = EndRow+1-StartRow       #样本数
    ColBlank = StartCol - 1     #前面的空列数
    #####获取计算熵值法需要的元素#######
    AbovePartList = []
    LCLSBVS = []
    for j in range(StartCol-1,EndCol):         #获取列代码
        ColLSBV = []
        Cols = sheet.col_values(j)
        #ColsName = Cols[0]         #获取列名并删除
        del Cols[0]            #删除列名
        EachSampleInThisIndicatorSum = sum(Cols)   #每个样本的该列指标求和
        for i in range(StartRow-1,EndRow):
            PreValue = sheet.cell(i,j).value
            if PreValue == 0:
                PreValue = 0.000000001
            LnSumBracketVar = (PreValue/EachSampleInThisIndicatorSum) * log(PreValue/EachSampleInThisIndicatorSum)
            ColLSBV.append(LnSumBracketVar)
        ColLSBVSum = sum(ColLSBV)       #计算括号内的和
        LnCLSBVS = ColLSBVSum / log(n)   #除以 ln(n)
        LCLSBVS.append(LnCLSBVS)
    #########熵值法公式上下部分######
        AbovePart = 1 + LnCLSBVS       #上半部分
        AbovePartList.append(AbovePart)   #把上半部分存为列表
    LCLSBVSSum = sum(LCLSBVS)
    BelowPart = m + LCLSBVSSum         #下半部分固定值
    ##########写入#############
    for j in range(0,m):     #指标数
        Value = AbovePartList[j] / BelowPart    #值等于上半部分除以下半部分
        worksheet.write(StartRow-1 , j+ColBlank , label=Value)   #写入
    workbook.save(str(SavePath))      #保存



# GUI相关函数
# 初始文件路径
def Get_FilePath():
	file_get = askopenfilename()  # 选择打开什么文件,返回文件名
	file_path.set(file_get)             # 设置变量filename的值

# 获取保存路径
def Get_SavePath():
	save_get = asksaveasfilename(defaultextension='.xls')   # 设置保存文件,并返回文件名,指定文件名后缀为.xls
	save_path.set(save_get)             # 设置变量filename的值

# 极差标准化执行模块
def exe_norma():
	try:
		Sheet = load_data(str(file_path.get()),str(read_sheet_name.get()))          #读取Sheet
		get_entropy(Sheet,int(start_col.get()),int(end_col.get()),int(start_row.get()),int(end_row.get()),
        str(save_path.get()))          #极差标准化与保存Sheet
		#从上面读取的sheet,起始列,终止列,起始行,终止行,逆向指标所在列(列表格式),保存路径
		showinfo(title='执行完毕', message=f'熵值法处理数据成功,结果保存在{str(save_path.get())}')
	except:
		showwarning(title='执行出错', message='无法执行熵值计算,请检查所输入的信息')



# GUI界面部分
root = tk.Tk()
root.title('熵值法处理工具')
root.geometry('800x330')
file_path = tk.StringVar()
save_path = tk.StringVar()

# 选择文件、获取路径
tk.Label(root, text='选择文件:').place(x=10,y=20)
tk.Entry(root, textvariable=file_path, width=90).place(x=80,y=20)
tk.Button(root, text='打开文件', command=Get_FilePath).place(x=730,y=15)

# 读取的sheet名称
tk.Label(root, text='读取sheet:').place(x=10,y=70)
read_sheet_name = tk.Entry(root, width=90)
read_sheet_name.place(x=80,y=70)

# 起始、终止行列
tk.Label(root, text='起始列:').place(x=10,y=120)
start_col = tk.Entry(root, width=13)
start_col.place(x=80,y=120)
tk.Label(root, text='终止列:').place(x=190,y=120)
end_col = tk.Entry(root, width=13)
end_col.place(x=260,y=120)
tk.Label(root, text='起始行:').place(x=370,y=120)
start_row = tk.Entry(root, width=13)
start_row.place(x=440,y=120)
tk.Label(root, text='终止行:').place(x=550,y=120)
end_row = tk.Entry(root, width=13)
end_row.place(x=620,y=120)

# 保存路径
tk.Label(root, text='保存路径:').place(x=10,y=170)
tk.Entry(root, textvariable=save_path, width=90).place(x=80,y=170)
tk.Button(root, text='选择目录', command=Get_SavePath).place(x=730,y=165)

# 运行按钮
tk.Button(root, text='开始进行熵值法处理计算', command=exe_norma, width=30, height=2).place(x=290,y=230)

root.mainloop()

运行了也会出现一个界面,长这个样子:
在这里插入图片描述
具体的操作依然在后面。

5 实验操作与流程

首先,我们现在手上已经get到数据了。是一个10个指标的,550条的数据集合(10列,550行)。把这个数据的excel文件放在我们找得到的地方。
然后打开极差标准化GUI的代码,运行之。把该写的信息写上。如下图:
在这里插入图片描述
选择文件,点右边的打开文件然后找到你的文件双击就行了。
读取sheet,就是看你excel里sheet的名称是什么。
起始列终止列,就是你的指标列,我们是10个指标,并且从第1列放到第10列,所以写1和10就行。
起始行终止行,就是你数据条,因为第一行是label,所以我们就从2开始到551。
逆向指标列,就是那种值越小最后的数值越好的指标(相反我们常用的正向指标列是值越大越好)。比如说我之前做的一个城市评价体系,其中有一个是人口老龄化占比,这个就是典型的逆向指标;而什么城镇人口,GDP这些就是正向指标。因为实验中我们没逆向指标,所以就直接填[];如果有的话,比如第4列第5列是逆向指标,那么我们填[4, 5]
保存路径,就是你要保存的位置,这个打开方式和选择文件一样。
最后,我们点击下面的大按钮“开始进行极差标准化计算”。就会出现这么一个窗口:
在这里插入图片描述

到它说的这个位置,就会看到一个新的excel。打开它,大概长这样:
在这里插入图片描述
同样是10列,550行,只不过这里我们第一行没了label。这个就是我们数据的极差标准化后的结果,两个excel单元格是一一对应的。
然后我们接下来打开熵权法赋权的GUI的.py文件,运行之。与上面一样,填上该填的信息。如下图:
在这里插入图片描述

选择文件,我们就选我们极差标准化处理后的文件(一定不要选到一开始那个数据文件,不然权重会出错的!!!)。
读取sheet,填入sheet名。
起始列终止列,起始行终止行,和前面一样。
保存路径,这个计算后就是最终的结果了,选一个你找得到的想保存的路径。
最后,点击下面的“开始运行熵值法处理计算”。弹出这么一个窗口:
在这里插入图片描述
打开生成的excel文件,这个就是它的权重了。
在这里插入图片描述
然后我们把一开始的那个数据的label贴上去,并且求和看看:
在这里插入图片描述
一一对应!破费科特!

6 关于数据获取

这篇文章用到的样本集数据获取本来是免费的,但是因为联系我的太多了(而且并没有人打赏),所以我打算有偿获取(收点费用意思一下,5元以上)。需要的小伙伴们可以联系我邮箱(chinshuuichi@qq.com)并且贴上打赏付款证明(码在下面),我看到后就会发送数据。

另外我及不及时回复比较随缘了,我尽量一天看一次邮箱。

(我的乞讨码在下面)~
-----------------------分割线(以下是乞讨内容)-----------------------
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】基于Python利用熵权法计算数据权重——一个简单的图形用户界面编程 的相关文章

随机推荐

  • 程序员教你如何用Python爬取付费小说

    小说相信大家都爱看吧一章接一章具有极大的吸引力 看了还想看 当然付费小说价格也不便宜 看到一半突然收费 猝不及防 在我们程序员这里 收费是不存在的 万物皆可爬 什么是网络爬虫 网络爬虫 又被称为网页蜘蛛 网络机器人 在FOAF社区中间 更经
  • 【Colab】【使用外部数据的7种方法】

    文章目录 方法1 通过Files explorer上传 方法2 使用Colab files上传 方法3 读取Github链接 方法4 克隆Github项目 方法5 使用wget axel下载文件 方法6 读取谷歌硬盘数据 方法7 Kaggl
  • 天干年月算法java

    上班空闲时间 看见朋友圈发了张毛笔画 上面写了丙申 好奇查了查 下面说说java实现 很简单 简单到爆 哈啊哈 String tianGanTZ 庚 辛 壬 癸 甲 乙 丙 丁 戊 己 申 酉 戌 亥 子 丑 寅 卯 辰 巳 午 未 int
  • Java+SSM+Vue 毕业设计 电影院在线售票管理系统系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 开发环境 3 3 系统流程 3 3 1 系统开发流程 3 3 2 用户登录流程 3 3 3 系统操作流程 3 4 系统结构设计 4 项目获取 1 项
  • JVM中的对象和引用详解

    1 对象的创建过程 其中的步骤是 当虚拟机碰到一条new指令时 先检查对象是否被加载 如果未被加载 就先将class加载到运行时数据区 然后虚拟机为对象分配内存 分配内存有两种方式 内存空间如果不是碎片化的 内存中已经使用的和未使用的内存空
  • 2023·基于Node.js的快递查询项目

    随着电商的发展 如今网上购物的人越来越多 频率越来越高 不用出门就能买到自己想要的东西 商品下了单之后商品怎么到自己的手上呢 这就离不开快递和物流了 商家把商品给到快递和物流服务商 快递和物流服务商则把商品运输并配送到我们的手上 除了电商行
  • Sublime Text 3 插件安装及Vim 模式设置

    Sublime Text 3 1 安装Sublime Text 3 下载安装 http www sublimetext com 3 Package Control安装 https sublime wbond net installation
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java数组细节

    注意细节 1 数组的元素可以是任意类型 包括基本类型和引用类型 但是不能混用 2 数组中的元素满足自动转型原则 比如double类型的数组中可以存储int整数 这是因为整数已经自动转成double 但是int类型的数组中不能存放string
  • 第二十四节:动态加载JS和动态加载CSS

    1 动态加载JS 一般需要用到js 需要将js放到
  • R基础(一)- R版本升级、现有版本查看

    R版本升级 系统 WINDOWS 方式 推荐打开RGui界面进行升级 而不要再RStudio中直接输入命令 包 installr 代码 安装包 如果已经有此包可跳过此步骤 install packages installr 加载包 升级 l
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • 0227:zotero文献管理/小绿鲸英文/CSDN做笔记

    搜索 下载 白嫖 翻译 文章 如何精准找到和方向相关的文献 谷歌学术 国内无法正常进入 两个镜像网站 https xueshu dailyheadlines cc https scholar lanfanshu cn 搜索技巧 关键词套双引
  • OS——文件管理系统磁盘的结构之搞清盘面和柱面

    如上图 每个柱面有三个盘面 即就是3个磁道 柱面可以抽象的理解成是一个套一个的立体的同心圆柱体 例 2019年408真题 磁盘有300个柱面 每个柱面有10个磁道 每个磁道有200个扇区 扇区大小为512B 则磁盘容量 分析 每个柱面有10
  • 【排错】error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14:的解决方式

    在部署k8s的时候 编写k8s的dashboard文件 遇到以下错误 error error parsing recommended yaml error converting YAML to JSON yaml line 14 could
  • PLINQ并行查询效率的简单分析

    PLINQ并行查询效率的简单分析 假设执行一次查询需要花费的时间比较大 那我们可以采用PLINQ并行查询来进行提速 并行查询 就是利用多核计算机并行执行查询语句来进行提速 这很好理解 一个工人工作慢 那就多叫几个工人同时进行工作 这样工作的
  • php 实现微信消息时间,在微信小程序中如何实现时间功能

    这篇文章主要介绍了微信小程序使用picker实现时间和日期选择框功能 结合实例形式分析了微信小程序picker组件进行日期与时间选择的相关操作技巧 并附带源码供读者下载参考 需要的朋友可以参考下 本文实例讲述了微信小程序使用picker实现
  • 选择结构程序设计和循环控制(if语句,switch语句,条件运算符,for循环,while及do while语句,break,continue,goto语句)折半查找法及猜数字游戏带你巩固理解

    本章我们来迅速学习一下选择语句和循环语句 首先我们来了解何为语句 C语言中语句可以分为以下五类 1 表达式语句 2 函数调用语句 3 控制语句 4 复合语句 5 空语句 这篇文章我们主要讲的是控制语句 控制语句 控制语句主要用于控制程序的运
  • IDEA 三种注释生成方式

    三种注释方式 行注释 块注释 方法或类说明注释 一 快捷键 Ctrl 使用Ctrl 添加行注释 再次使用 去掉行注释 二 演示代码 if hallSites null hallSites size gt 0 行注释 最大行号 int max
  • 【Python】基于Python利用熵权法计算数据权重——一个简单的图形用户界面编程

    目录 1 简介 2 技术流程 3 数据 4 代码 4 1 代码 极差标准化 4 2 代码 熵权法赋权 5 实验操作与流程 6 关于数据获取 1 简介 师弟又催我给他公众号写文了 这次还点名要这个题目 所以我就先到自己的博客里写写练练手 下面