【Python】熵值法计算权重
将分步骤基于python实现熵值法计算权重,代码在pycharm中执行。
1.引入库
将需要的库导入pycharm
import pandas as pd
import numpy as np
import math
from numpy import array
2.读取数据
filename为文件的路径
# 读取数据
df = pd.read_csv('filename.csv')
# 数据预处理 ,去除空值的记录
df.dropna()
3.熵值法主体
定义熵值法函数
def cal_weight(x):
进行标准化,这里用的是临界值法
# 标准化
x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))))
求熵值中的常数k
# 求熵值中的常数k
rows = x.index.size # 行
cols = x.columns.size # 列
k = 1.0 / math.log(rows)
lnf = [[None] * cols for i in range(rows)]
进行矩阵计算,求熵
# 矩阵计算--
# 信息熵
x = array(x)
lnf = [[None] * cols for i in range(rows)]
lnf = array(lnf)
for i in range(0, rows):
for j in range(0, cols):
if x[i][j] == 0:
lnfij = 0.0
else:
p = x[i][j] / x.sum(axis=0)[j]
lnfij = math.log(p) * p * (-k)
lnf[i][j] = lnfij
lnf = pd.DataFrame(lnf)
E = lnf
计算冗余度
# 计算冗余度
d = 1 - E.sum(axis=0)
计算权重
# 计算各指标的权重
w = [[None] * 1 for i in range(cols)]
for j in range(0, cols):
wj = d[j] / sum(d)
w[j] = wj
w = pd.DataFrame(w)
return w
4.打印出各指标的权重
weights = []
if __name__ == '__main__':
# 计算df各字段的权重
w = cal_weight(df) # 调用cal_weight
weights1 = np.array(w)
weights = weights1.tolist()
w.index = df.columns
w.columns = ['weight']
print(w)
5.将结果存储至csv文件中
#mode=‘a’:即向csv文件追加数据,按行追加
#header=True:写入dataframe的列名(表头)
#index=None:不添加索引列
w.to_csv('grades.csv', mode='w', header=True, index=None)
总结
本文利用python实现了熵值法的计算,可求出各指标的所占的权重,最后结果可再进行一次归一化。