C085原文链接(dxs.moe.gov.cn 教育部中国大学生在线)
论文的附录3-weekcmp.py
代码优化思路如下:
1、添加变量的类型注解
2、将不必要的循环结构,转化为函数或列表解析式/列表推导式
3、添加了一些注释,以便于理解代码
修改后的代码如下:
# 附录3-weekcmp.py
# 介绍:比较每周期内同一周供货情况,输入:附件1"近5年402家供应商的相关数据.xls";获得"期望供货量.xlsx"
# python解释器版本:3.10
import xlrd # 版本:2.0.1
import xlsxwriter # 版本:3.1.2
import numpy as np # 版本:1.25.0
excel = xlrd.open_workbook('附件1 近5年402家供应商的相关数据.xls', 'tb')
sheet = excel.sheet_by_name('供应商的供货量(m³)')
ID: list[402: str] = sheet.col_values(0)[1:] # 获取第一列的内容-供应商ID,并删除第一个元素
FL: list[402: str] = sheet.col_values(1)[1:] # 获取第二列的内容-材料分类,并删除第一个元素
# 获取W001列至W240列,S001行至S402行中的所有数据,组成一个二维列表
GH: list[402: list[240: float]] = [sheet.row_values(r)[2:] for r in range(1, sheet.nrows)]
sheet = excel.sheet_by_name('企业的订货量(m³)')
DH: list[402: list[240: float]] = [sheet.row_values(r)[2:] for r in range(1, sheet.nrows)]
GH_T: list[402: list[24: float]] = []
for r in range(sheet.nrows-1): # 402个循环
val: list[24: float] = []
for j in range(24):
CMP1: list[10: float] = [DH[r][i * 24+j] for i in range(10)]
CMP2: list[10: float] = [GH[r][i * 24+j] for i in range(10)]
AVE: np.array = np.mean(CMP2)
GH_max: float = 0
for i in range(10):
if CMP1[i]==0:
continue
if CMP2[i] / CMP1[i]>0.9 and AVE * 3>=CMP2[i]>GH_max: # 此处的分支语句规则,详见论文第13页第8~10行的两个规则
GH_max = CMP2[i]
val.append(GH_max) # 这一行添加的是一个数值
GH_T.append(val) # 这一行添加的是一个包含了24个数值的列表
# 所以GH_T最后构造成为了一个402行,24列的二维列表
workbook = xlsxwriter.Workbook('期望供货量.xlsx') # 建立文件
worksheet = workbook.add_worksheet()
for r in range(sheet.nrows-1):
worksheet.write_row(r, 0, [ID[r], FL[r]])
worksheet.write_row(r, 2, GH_T[r])
workbook.close()
附录3对应的论文内容指路
如图所示,这是C085论文第13页第4至12行,实现这段内容的代码即为该论文的附录3-weekcmp.py。
参考链接
python读取excel报错Excel xlsx file
Excel操作模块XlsxWriter之写入行worksheet.write_row()
如有侵权,请联系我删除。