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"即可解决。