import numpy as np
import pandas as pd
pd.set_option('display.max_columns',1000)
pd.set_option('display.width',1000)
def datadirection_min(datas): #小变大
def normalization(data):
return 1/data
return list(map(normalization,datas))
data=pd.DataFrame({"GDP-growing":[0.1,0.2,0.4,0.9,1.2],
"city-people":[1,1,0.833333,0.333333,0],
"high-edu":[5000,6000,7000,10000,400],
"enger-num":[0.4,0.6,0.7,1.4,2.4],
"gang-dev":[29.3,52.9,20.4,39.5,29.4]},
columns=['GDP-growing','city-people','high-edu','enger-num','gang-dev'])
#归一化
data = data / np.sqrt((data ** 2).sum())
#li=归一化的data阵
li=np.array(data)
def topsis(data,weight=None):
# 归一化
data = data / np.sqrt((data ** 2).sum())
#最优最劣方案
Z = pd.DataFrame([data.max(), data.min()], index=['D+', 'D-'])
Res=data.copy()
Res['D+'] = np.sqrt(((data - Z.loc['D+']) ** 2 * weight).sum(axis=1))
Res['D-'] = np.sqrt(((data - Z.loc['D-']) ** 2 * weight).sum(axis=1))
Res['C'] = Res['D-'] / (Res['D-'] + Res['D+'])
Res['Rank'] = Res.rank(ascending=False)['C']
print(Res.head())
def get_weight(li):
li = (li - li.min()) / (li.max() - li.min()) + 0.000000000001
m, n = li.shape
# m,n为矩阵行和列数
k = 1 / np.log(m)
yij = li.sum(axis=0)
pij = li / 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)
print(wi)
return wi
topsis(data,weight=get_weight(li))
这是博主竞赛的代码,大家理性参考,可能有差错)