1.库的引用
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
import os
os.chdir(r"E:\BaiduNetdiskDownload\数据") #指定工作路径
2.定义计算权重函数
#计算权重,并将标准化后数据保存下来
def get_entropy_weight(data):
"""
:param data: 评价指标数据框
:return: 各指标权重列表
"""
# 数据标准化
data = (data - data.min())/(data.max() - data.min())
# 保存标准化后的数据
data.to_excel("标准化后数据.xlsx", sheet_name="sheet1", index= False,encoding="utf-8")
print(data) #直接在运行时打印出标准化后的数据
#计算k
m,n=data.shape #m是行,n是列
#将dataframe格式转化为matrix格式
data=data.as_matrix(columns=None)
k=1/np.log(m)
yij=data.sum(axis=0)
#计算pij
pij=data/yij
test=pij*np.log(pij)
test=np.nan_to_num(test)
#计算每种指标的信息熵
ej=-k*(test.sum(axis=0))
#计算每种指标的权重
wi=(1-ej)/np.sum(1-ej)
wi_list=list(wi)
return wi_list
3.定义计算得分函数
def get_score(wi_list,data):
"""
:param wi_list: 权重系数列表
:param data:评价指标数据框
:return:返回得分
"""
# 将权重转换为矩阵
cof_var = np.mat(wi_list)
# 将数据框转换为矩阵
context_train_data = np.mat(data)
# 权重跟自变量相乘
last_hot_matrix = context_train_data * cof_var.T
last_hot_matrix = pd.DataFrame(last_hot_matrix)
# 累加求和得到总分,这是直接用原数据计算的
last_hot_score = list(last_hot_matrix.apply(sum))
return last_hot_score
4.导入数据运行
if __name__ == '__main__':
data = pd.read_excel("指标.xlsx", encoding='utf8')
data= data.iloc[:, 1:] #数据选择第二列开始是所有行
mm = data
wi_list=get_entropy_weight(data)
score_list=get_score(mm,wi_list)
print(wi_list) # 权重
print(score_list) #得分,这个得分是原数据*权重 计算的,可以改成标准化的数据计算,也可以将得分映射成百分制。
5. 可能出现的问题
5.1 打印显示不全问题,数据太多时显示不全的解决办法
#打印时显示所有列
pd.set_option('display.max_columns', None)
#打印显示所有行
pd.set_option('display.max_rows', None)
5.2 pandas.read_csv() 报错 OSError: Initializing from file failed
一般由两种情况引起:一种是路径有问题,另一种是函数参数带有中文。
对于第一种情况很简单,有的是因为没有把文件名称放到路径的后面,把文件名称添加到路径后面就可以了;还有的是文件名称有误,比如多个空格少个空格,大小写,最好是直接复制文件的名称粘贴。
第二种情况,路径、文件名都正确,还是报错的原因是这个参数中有中文,调用pandas的read_csv()方法时,默认使用C engine作为parser engine,而当文件名中含有中文的时候,用C engine在部分情况下就会出错。所以在read里面加上engine="python"即可解决。