Excel读取数据、写数据+信息熵权法+TOPSIS法 分析案例的优劣

2021年C题

第一问题目:

根据附件 1,对 402 家供应商的供货特征进行量化分析,建立反映保障企业生产 重要性的数学模型,在此基础上确定 50 家最重要的供应商,并在论文中列表给出结果。

基于题目的数据选择:

①材料规模:规模,每一个公司的所有数据加到一起,取平均值(/240)
②供应率:(反映供应的水平高低,也就是完成供应的次数除以总共订购的次数):当供应量是订购量的 90%到110% 认为是合适的供应,完成了供应。
   供应率=(合适的供应次数)/订购量不等于0的总次数。
③供应的次数:在订购的情况下,合适供应的总次数。
④最大供货量:
⑤供货的稳定性:供货量/订购量 为供货比例   1-供货比例 求和除以供货次数。

⑥供应比例的方差,(供应比例为:供应量/订购量)

数据处理:

one首先是确定使用最大or 最小

也有中间型,一般不用。

方差使用的是使用最大值减去最小值的方法:(使用该方法这个数据的权数很小~~)

data_var=np.max(data_var)-data_var

two读取数据:

直接看代码吧:(对应书中232页 13.3.5)

import openpyxl

def hanshu(c,a,b):#参数: ①表格,②左上角索引,多加一行,往左。,③右下角   最后返回一个列表。
    re_list=[]
    for row_of_cell_objects in c[a:b]:
        tem_list = []
        tem_rate=0.0
        for cell_obj in row_of_cell_objects:
            if cell_obj.value=='A':
                tem_rate=rate[0]
                continue
            if cell_obj.value == 'B':
                tem_rate = rate[1]
                continue
            if cell_obj.value == 'C':
                tem_rate = rate[2]
                continue
            tem_list.append(cell_obj.value*tem_rate)
        re_list.append(tem_list)
    return re_list

three模一化,归一化,标准化:

模一化:

模一化之后还要归一化,不晓得为啥,否则权算不出来。

如果最后使用TOPSIS法,最好用模一化。

def modularization(D):#传入一个np矩阵,列是一个性质要模一化
    r=D
    D_T = np.transpose(D)
    temp = pow(np.dot(D_T, D), 1 / 2)  # 相加开根号
    for i in range(D.shape[1]):
        r[:, i] = D[:, i] / temp[i, i]
    return r
data=modularization(data)
print('模一化:',data.shape)
data = data / np.sum(data, axis=0)
print('归一化:',data.shape)

标准化:

也就是     \frac{x-\mu }{\sigma }

#标准化:
data -= np.mean(data, axis=0)
data /= np.std(data, axis=0)
print(data)

信息熵法:

看代码:

说明其中对于是0的数字进行1e-7处理:

def data_shang(D):
    tem=D
    for _ in range(D.shape[0]):
        for __ in range(D.shape[1]):
            if D[_][__]==0:
                tem[_][__]=1e-7
    D=tem
    for _ in range(D.shape[0]):
        for __ in range(D.shape[1]):
            if D[_][__]<0:
                print('dbguiaw')
    e=-1.0/np.log(D.shape[0])*sum(D*np.log(D))#计算信息熵
    print('e',e)
    f=1-e
    w=f/sum(f)#计算权重
    return w

TOPSIS法:

代码如下:

有一个计算范数的函数,和一个计算距离的方程:

v=data*w_ans
print('topsis的v',v.shape)

max_tem=np.max(v,axis=0)
min_tem=np.min(v,axis=0)
print('max:',max_tem)
print('min:,',min_tem)

def dist(a, b):#计算范数的函数
    return np.linalg.norm(a - b, ord=2)

re_ans=[]

for __ in range(data.shape[0]):#共402个结果,数字越大,结果越好。
    tem_num=0.0
    tem_num=dist(data[__],min_tem)/(dist(data[__],min_tem)+dist(data[__],max_tem))
    re_ans.append(tem_num)

结果的使用Excel输出:

代码:

list_1=list(range(1,403))
list=[]
list.append(list_1)
list.append(re_ans)
re_ans=np.asarray(list)
re_ans=re_ans.transpose()
#得到一个矩阵,两列,第一列为序号,第二列为数字

your_array=re_ans
filename =xlwt.Workbook() #创建工作簿
sheet1 = filename.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheet
[h,l]=re_ans.shape
 #h为行数,l为列数
for i in range (h):
    sheet1.write(i,0,'S'+str(i+1))#序号前+'S'
    for j in range (1,l):
        sheet1.write(i,j,your_array[i,j])
filename.save('最终结果.xls')

OK。万事大吉~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Python中实现TOPSIS和熵权法,你可以按照以下步骤进行操作: 1. 导入所需的库: ```python import numpy as np from sklearn.preprocessing import minmax_scale ``` 2. 定义数据处理函数: ```python def data_process(X, normalization_range): # 归一化处理 X_normalized = minmax_scale(X, feature_range=normalization_range) return X_normalized ``` 3. 定义熵权法计算函数: ```python def entropy_weight(X_normalized): # 计算每个指标的熵值 entropy = -np.sum(X_normalized * np.log(X_normalized), axis=0) # 计算每个指标的权重 weight = (1 - entropy) / np.sum(1 - entropy) return weight ``` 4. 定义TOPSIS计算函数: ```python def topsis(X_normalized, weight): # 计算最优方案和最劣方案 ideal_best = np.max(X_normalized, axis=0) ideal_worst = np.min(X_normalized, axis=0) # 计算各评价对象与最优方案和最劣方案的距离 distance_best = np.sqrt(np.sum((X_normalized - ideal_best) ** 2, axis=1)) distance_worst = np.sqrt(np.sum((X_normalized - ideal_worst) ** 2, axis=1)) # 计算各评价对象与最优方案的相对接近程度 relative_closeness = distance_worst / (distance_best + distance_worst) # 根据相对接近程度排序 sorted_index = np.argsort(relative_closeness) sorted_S = relative_closeness\[sorted_index\] return sorted_S, sorted_index ``` 5. 调用函数进行计算: ```python # 第一步:导入数据 X = np.load('data_water_quality.npy') # 第二步:数据处理 X_normalized = data_process(X, (0, 1)) # 第三步:熵权法计算 weight = entropy_weight(X_normalized) # 第四步:TOPSIS计算 sorted_S, sorted_index = topsis(X_normalized, weight) ``` 这样,你就可以在Python中实现TOPSIS和熵权法了。请注意,这只是一个简单的实现示例,你可能需要根据你的具体需求进行适当的修改和调整。 #### 引用[.reference_title] - *1* *2* *3* [TOPSIS和熵权法的应用(Matlab实现,包括数据预处理)](https://blog.csdn.net/qq_43650421/article/details/121024826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值