注:
df是所有数据组成的矩阵
z是用于记录数据是正向数据还是逆向数据的一维矩阵,1表示正向,0表示逆向
#熵权法
def sqf(df,z,n,m): #pf是矩阵,z是一维数组,n列开始,前m行为索引
pf = df.iloc[:,n:]
pff=df.iloc[:,:m]
MAX=pf.max(axis=0)
MIN=pf.min(axis=0)
for i in range(len(z)):
#正向
if z[i]==1:
k=(pf.iloc[:,i]-MIN[i])/(MAX[i]-MIN[i])
#逆向
else:
k=(MAX[i]-pf.iloc[:,i])/(MAX[i]-MIN[i])
#求熵
p=pd.DataFrame((k/sum(k)).astype('float'))
p=p*pd.DataFrame(p.apply(np.log))
p=p.fillna(value=0) #分母为0时取0
p=(1-(-1)*(p.sum())/math.log(len(pf.iloc[0]))).values
if i==0:
kk=pd.DataFrame(k,columns=[pf.columns[i]])
pp=[p]
else:
kk[pf.columns[i]]=k
pp.append(p)
q=[]
for i in range(len(z)): #求权重
q.append(pp[i]/sum(pp))
for i in range(len(q)): #计算得分
if i==0:
s=kk.iloc[:,i]*q[i]*100
else:
s=s+kk.iloc[:,i]*q[i]*100
pff['得分'] = s #添加到原数据后面
pff.sort_values(by=['得分'],ascending=False,inplace=True) #降序排列
pff['排名'] = np.arange(1,len(df)+1)
return pff
版权声明:本文为weixin_55820906原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。