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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值