0%

确权方法

确权方法

变异系数求权重

主要代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import pandas as pd
from sklearn import preprocessing

#数据为data

# 计算原始数据每行和每列的均值和方差,data是多维数据
scaler = preprocessing.StandardScaler().fit(data)
#得到每列的平均值,是一维数组
mean = scaler.mean_
#得到每列的标准差,是一维数组
std = scaler.var_

#计算变异系数
v = [std[i]/mean[i] for i in range(len(data.columns))]

#利用变异系数确权
total = sum(v)
weight = [i/total for i in v]

熵权法求权重

主要代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import pandas as pd
import numpy as np

#data为数据

#min-max标准化
#正指标 (x-min)/(max-min)
#负指标 (max-x)/(max-min)
for i in list(data.columns):
# 获取各个指标的最大值和最小值
Max = np.max(data[i])
Min = np.min(data[i]) #正向指标确定
if (i == '船舶运价' or '电厂库存' or '煤炭库存' or '液化天然气产量' or '原煤产量'):
data[i] = (Max - data[i])/(Max - Min)
else:
# 标准化
data[i] = (data[i] - Min)/(Max - Min)


#求指标比重
data_p = data.copy()
for i in range(len(data_p.columns)):
sum_col = sum(data_p.iloc[:,i])
data_p.iloc[:,i] = data_p.iloc[:,i].apply(lambda x: x/sum_col if x / sum_col != 0 else 1e-6)

data_h =[]
m = len(data.iloc[:,0]) #数据量
k = 1 / np.log(m)
for i in range(len(data.columns)): #列的遍历
temp = 0
for j in range(m):
temp += data_p.iloc[j,i]*np.log(data_p.iloc[j,i])
data_h.append(-1 * temp * k)

#差异系数
data_c = pd.DataFrame(1 - np.array(data_h))

#计算指标权重(利用差异系数)
data_w = data_c.copy()
total = sum(data_c['各特征差异系数'])
for i in range(len(data_c["各特征差异系数"])):
data_w["各特征差异系数"][i] = data_c["各特征差异系数"][i] / total

data_w