# -*- coding: utf-8 -*-
"""
Created on Thu Oct 21 13:10:22 2021
@author: Domo
"""
import pandas as pd
import numpy as np
data=pd.read_excel("C:/Users/Domo/Desktop/湖南管理科学学会征文/代码/data_py .xlsx", sheet_name=0,header=0,index_col=0)
m,n=data.shape #获取行数m和列数n
#熵权法计算
def Y_ij(data1): #矩阵标准化(min-max标准化)
for i in data1.columns:
for j in range(n+1):
if i == str(f'X{j}负'): #负向指标
data1[i]=(np.max(data1[i])-data1[i])/(np.max(data1[i])-np.min(data1[i]))
else: #正向指标
data1[i]=(data1[i]-np.min(data1[i]))/(np.max(data1[i])-np.min(data1[i]))
return data1
Y_ij=Y_ij(data) #标准化矩阵
None_ij = [[None] * n for i in range(m)] #新建空矩阵
def E_j(data2): #计算熵值
data2 = np.array(data2)
E = np.array(None_ij)
for i in range(m):
for j in range(n):
if data2[i][j] == 0:
e_ij = 0.0
else:
P_ij = data2[i][j] / data2.sum(axis=0)[j] #计算比重
e_ij = (-1 / np.log(m)) * P_ij * np.log(P_ij)
E[i][j] = e_ij
E_j=E.sum(axis=0)
return E_j
E_j = E_j(Y_ij) #熵值
G_j = 1 - E_j #计算差异系数
W_j = G_j / sum(G_j) #计算权重
WW= pd.Series(W_j, index=data.columns, name='指标权重')
#print(WW)
Y_ij.to_excel("Y_ij.xls",sheet_name='Y_ij') #标准化矩阵导出至Excel
WW.to_excel("WW.xls",sheet_name='WW') #指标权重导出至Excel
#TOPSIS计算
Y_ij = np.array(Y_ij) #Y_ij为标准化矩阵
Z_ij = np.array(None_ij) #空矩阵
for i in range(m):
for j in range(n):
Z_ij[i][j]=Y_ij[i][j]*W_j[j] #计算加权标准化矩阵Z_ij
Imax_j=Z_ij.max(axis=0) #最优解
Imin_j=Z_ij.min(axis=0) #最劣解
Dmax_ij = np.array(None_ij) #空矩阵
Dmin_ij = np.array(None_ij) #空矩阵
for i in range(m):
for j in range(n):
Dmax_ij[i][j] = (Imax_j[j] - Z_ij[i][j]) ** 2
Dmin_ij[i][j] = (Imin_j[j] - Z_ij[i][j]) ** 2
Dmax_i=Dmax_ij.sum(axis=1)**0.5 #最优解欧氏距离
Dmin_i=Dmin_ij.sum(axis=1)**0.5 #最劣解欧氏距离
C_i=Dmin_i/(Dmax_i+Dmin_i) #综合评价值
Dmax_i= pd.Series(Dmax_i, index=data.index, name='最优解')
Dmin_i= pd.Series(Dmin_i, index=data.index, name='最劣解')
C_i= pd.Series(C_i, index=data.index, name='综合评价值')
print(C_i)
pd.concat([Dmax_i, Dmin_i, C_i]).to_excel("C_i.xls") #最优解、最劣解、综合评价值导出至Excel