第一次
''' @Time : 2020/11/21 20:42 @Author : laolao @FileName: 7.py ''' import json import numpy as np class NewProjectInfo: ''' 新建工程信息表 ''' U01 = "A101" #工程编号 U02 = "石家庄运河桥顶管隧道施工工程" #工程名称 U03 = "石家庄" #工程所在地 U04 = "铁道建设" #设计方 U31 = "甲级" #设计方资质等级 U05 = "铁道建设" #施工方 U32 = "特技总承包" #施工方资质等级 U06 = "铁道建设" #检测方 U33 = "甲级" #检测方资质等级 U07 = "铁道建设" #监理方 U34 = "甲级" #监理方资质等级 U08 = "2300" #隧道长度 U11 = "5.6"#新建顶管埋深 U09 = 0#开挖顶管断面形式 U12 = "{'r':1.8}"#新建顶管尺寸 U13 ="软粘土"#新建工程土层性质 U4 = "{}"#既有邻近地下柔性管线情况11 U5 = "{'U511':0,'U512':2.9,'U52':6,'U53':1,'U54':2.0}"#既有邻近地下刚性管线情况12 U6 = "{'U511':0,'U512':2.9,'U52':6,'U53':1,'U54':2.0}"#既有邻近邻近基础情况13 U7 = "{'U61':1,'U62':3.7,'U63':6}"#特殊工程情况说明 def __init__(self): ''' 前端控件读取的输入输入这里进行修改 ''' # self.U01= # self.U02= # self.U03= # self.U04= # self.U05= # self.U06= # self.U07= # self.U08= # self.U09= # self.U11= # self.U12= # self.U13= # self.U31= # self.U32= # self.U33= # self.U34= # self.U4= # self.U5= # self.U6= # self.U7= pass def calculate_matrix_A(self,matrix): ''' 计算该矩阵M的特征值λ_max和特征向量A 最大特征值对应的特征向量A,并进行归一化 Example: lao = NewProjectInfo() a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] b = lao.CalculateMatrix(a) print(b) :param matrix:第一行代表列 :return:C.R<0.1 调用返回答案,C.R>=0.1调用返回false ''' RI = {1:0,2:0,3:0.52,4:0.89,5:1.12,6:1.24,7:1.36,8:1.41,9:1.46} m= np.array(matrix) eigenvalue,featurevector = np.linalg.eig(m) r_max=0 A_id=0 for i in range(len(eigenvalue)): if r_max < eigenvalue[i]: r_max = eigenvalue[i] A_id = i n = len(matrix) A = [] # print(r_max) # print(eigenvalue) for i in featurevector: A.append(i[A_id]) # print(A) CR = (r_max - n)*RI[n] / (n-1) if CR < 0.1: # 归一化 x=0 for i in A: x+=i A_uniformization = [ ] for i in A: A_uniformization.append(i/x) return A_uniformization else: return False def calculate_matrix_B(self, matrix_group_B,A_uniformization): ''' Example: lao = NewProjectInfo() matrix_group_B = [ [0.33,0.33,0.33], [0.33,0.33,0.33], [0.25,0.25,0.25,0.25], [0.25, 0.25, 0.25, 0.25], [0.33,0.33,0.33] ] a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] A = lao.calculate_matrix_A(a) B = lao.calculate_matrix_B(matrix_group_B,A) for i in B: print(i) :param matrix_group_B: 5组特征向量 :param A_uniformization: calculate_matrix_A计算出来的权重 :return:风险权重 ''' Risk_B=[] index_a = 0 for Bi in matrix_group_B: t=[] for i in Bi: t.append(i*A_uniformization[index_a]) index_a+=1 Risk_B.append(t) return Risk_B def build_risk_type_table(self): with open("风险类型.csv","w") as f: pass if __name__ == '__main__': pass
第二次
''' @Time : 2020/11/21 20:42 @Author : laolao @FileName: 7.py ''' #-*- coding:utf-8 -*- import csv import json import numpy as np class NewProjectInfo: ''' 新建工程信息表 ''' U01 = "A101" #工程编号 U02 = "石家庄运河桥顶管隧道施工工程" #工程名称 U03 = "石家庄" #工程所在地 U04 = "铁道建设" #设计方 U31 = "甲级" #设计方资质等级 U05 = "铁道建设" #施工方 U32 = "特技总承包" #施工方资质等级 U06 = "铁道建设" #检测方 U33 = "甲级" #检测方资质等级 U07 = "铁道建设" #监理方 U34 = "甲级" #监理方资质等级 U08 = "2300" #隧道长度 U11 = "5.6"#新建顶管埋深 U09 = 0#开挖顶管断面形式 U12 = "{'r':1.8}"#新建顶管尺寸 U13 ="软粘土"#新建工程土层性质 U4 = "{}"#既有邻近地下柔性管线情况11 U5 = "{'U511':0,'U512':2.9,'U52':6,'U53':1,'U54':2.0}"#既有邻近地下刚性管线情况12 U6 = "{'U511':0,'U512':2.9,'U52':6,'U53':1,'U54':2.0}"#既有邻近邻近基础情况13 U7 = "{'U61':1,'U62':3.7,'U63':6}"#特殊工程情况说明 def __init__(self): ''' 前端控件读取的输入输入这里进行修改 ''' # self.U01= # self.U02= # self.U03= # self.U04= # self.U05= # self.U06= # self.U07= # self.U08= # self.U09= # self.U11= # self.U12= # self.U13= # self.U31= # self.U32= # self.U33= # self.U34= # self.U4= # self.U5= # self.U6= # self.U7= pass def calculate_matrix_A(self,matrix): ''' 计算该矩阵M的特征值λ_max和特征向量A 最大特征值对应的特征向量A,并进行归一化 Example: lao = NewProjectInfo() a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] b = lao.CalculateMatrix(a) print(b) :param matrix:第一行代表列 :return:C.R<0.1 调用返回答案,C.R>=0.1调用返回false ''' RI = {1:0,2:0,3:0.52,4:0.89,5:1.12,6:1.24,7:1.36,8:1.41,9:1.46} m= np.array(matrix) eigenvalue,featurevector = np.linalg.eig(m) r_max=0 A_id=0 for i in range(len(eigenvalue)): if r_max < eigenvalue[i]: r_max = eigenvalue[i] A_id = i n = len(matrix) A = [] # print(r_max) # print(eigenvalue) for i in featurevector: A.append(i[A_id]) # print(A) CR = (r_max - n)*RI[n] / (n-1) if CR < 0.1: # 归一化 x=0 for i in A: x+=i A_uniformization = [ ] for i in A: A_uniformization.append(i/x) return A_uniformization else: return False def calculate_matrix_B(self, matrix_group_B,A_uniformization): ''' Example: lao = NewProjectInfo() matrix_group_B = [ [0.33,0.33,0.33], [0.33,0.33,0.33], [0.25,0.25,0.25,0.25], [0.25, 0.25, 0.25, 0.25], [0.33,0.33,0.33] ] a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] A = lao.calculate_matrix_A(a) B = lao.calculate_matrix_B(matrix_group_B,A) for i in B: print(i) :param matrix_group_B: 5组特征向量 :param A_uniformization: calculate_matrix_A计算出来的权重 :return:风险权重 ''' Risk_B=[] index_a = 0 for Bi in matrix_group_B: t=[] for i in Bi: t.append(i*A_uniformization[index_a]) index_a+=1 Risk_B.append(t) return Risk_B def calculate_waverage_of_risk(self,pointer_table,target_index): ''' 计算各个风险指标的加权平均值 输出概率值和风险类型 Example: lao = NewProjectInfo() pointer_table = [ [ 0, 0.2, 0.1, "低风险"], [ 0.2, 0.4, 0.3, "较低风险"], [ 0.4, 0.6, 0.5, "中等风险"], [ 0.6, 0.8, 0.7, "较高风险"], [ 0.8, 1, 0.9, "高风险"] ] target_index = [ ['低风险','较低风险','中等风险','较高风险','高风险'], [ 6, 2, 1, 1, 0] ] risk_value, risk_classification = lao.calculate_waverage_of_risk(pointer_table, target_index) print("风险分类={}".format(risk_classification)) print("风险值={}".format(risk_value)) :param pointer_table: 对照表 :param target_index: 要计算的一行风险指标 :return: 概率值和风险类型 ''' #归一化 sum=0 for i in target_index[1]: sum+=i for i in range(len(target_index[1])): target_index[1][i]=target_index[1][i]/sum #查表计算 # print(target_index[0]) # print(target_index[1]) # print(pointer_table) sum=0 for i in range(len(target_index[0])): for j in pointer_table: if target_index[0][i] ==j[3]: sum+=target_index[1][i]*j[2] break for i in pointer_table: if i[0]<=sum and sum < i[1]: return sum,i[3] class File_Processing: def read_file(self,file): ''' 读文件,文件空返回0 :param file: txt or csv文件 :return: 文件内容 ''' # print(file.split(".")) l = file.split(".") index = l[-1] file_name="" for i in range(len(l)-1): file_name+=l[i] # print(file_name,index) re = [] if index == "txt": with open(file, 'r') as f: while True: t = f.readline() if t == "": break re.append(t[:-2]) if index.upper() == 'CSV': # print(file) with open(file, "r", encoding='gb18030') as f: t = csv.reader(f) # print(t) # 建立空字典 for item in t: # 忽略第一行 if t.line_num == 1: continue re.append(item) if len(re)==0: return False,False else: return file_name,re def is_number(self,s): try: # 如果能运行float(s)语句,返回True(字符串s是浮点数) float(s) return True except ValueError: # ValueError为Python的一种标准异常,表示"传入无效的参数" pass # 如果引发了ValueError这种异常,不做任何事情(pass:不做任何事情,一般用做占位语句) try: import unicodedata # 处理ASCii码的包 unicodedata.numeric(s) # 把一个表示数字的字符串转换为浮点数返回的函数 return True except (TypeError, ValueError): pass return False def read_various_type_table(self, file): ''' 读取csv文件 # Example: lao = File_Processing() # re = lao.read_various_type_table("xor_rce.txt") # re = lao.read_various_type_table(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件风险等级指标判别表RLV.csv") re = lao.read_various_type_table(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件二级风险因子两两判别表R2_U1.CSV") print(re) :param file: 文件名 :return: 列表 ''' file_name, re = self.read_file(file) # print(file_name,re) if file_name == False: return False first_risk = [] for i in re: # print(i) k=[] for j in i[1:]: if self.is_number(j): k.append(eval(j)) else: k.append(j) first_risk.append(k) return first_risk if __name__ == '__main__': # lao = NewProjectInfo() # pointer_table = [ # [0, 0.2, 0.1, "低风险"], # [0.2, 0.4, 0.3, "较低风险"], # [0.4, 0.6, 0.5, "中等风险"], # [0.6, 0.8, 0.7, "较高风险"], # [0.8, 1, 0.9, "高风险"] # ] # target_index = [ # ['低风险', '较低风险', '中等风险', '较高风险', '高风险'], # [6, 2, 1, 1, 0] # ] # risk_value, risk_classification = lao.calculate_waverage_of_risk(pointer_table, target_index) # print("风险分类={}".format(risk_classification)) # print("风险值={}".format(risk_value)) # lao = File_Processing() # # re = lao.read_various_type_table("xor_rce.txt") # t1 = lao.read_various_type_table(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件风险等级指标判别表RLV.csv") # # r2 = lao.read_various_type_table(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件二级风险因子两两判别表R2_U1.CSV") # print(t1)
第三次
''' @Time : 2020/11/21 20:42 @Author : laolao @FileName: 7.py ''' #-*- coding:utf-8 -*- import csv import json import math from math import sqrt import numpy as np U01 = "A101" #工程编号 U02 = "石家庄运河桥顶管隧道施工工程" #工程名称 U03 = "石家庄" #工程所在地 U04 = "铁道建设" #设计方 U05 = "铁道建设" #施工方 U06 = "铁道建设" #检测方 U07 = "铁道建设" #监理方 U08 = "2300" #隧道长度 U09 = 1#开挖顶管断面形式 U31 = "丙级" #设计方资质等级 U32 = "特级" #施工方资质等级 U33 = "甲级" #检测方资质等级 U34 = "甲级" #监理方资质等级 U11 = "5.6"#新建顶管埋深 U12 = '{"r":4.8}'#新建顶管尺寸 '{"a":3.0,"b":2.4}' U13 ="软黏土"#新建工程土层性质 U4 = '{"U41":2,"U42":3,"U43":5}'#既有邻近地下柔性管线情况11 U5 = '{"U511":0,"U512":2.9,"U52":6,"U53":1,"U54":2.0}'#既有邻近地下刚性管线情况12 U6 = '{"U61":1,"U62":3.7,"U63":6}'#既有邻近邻近基础情况13 U7 = ""#特殊工程情况说明 # 以下为没有提供的参数 U21 =21 #土舱压力 U22 = 2 U23 = 2 class File_Processing: ''' lao = File_Processing() # re = lao.read_table_full(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件风险等级指标判别表RLV.csv") re = lao.read_table_nofirst_line_nofirst_column(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件二级风险因子两两判别表R2_U1.CSV") print(re) ''' def read_file(self,file): ''' 读文件,文件空返回0 :param file: txt or csv文件 :return: 文件内容 ''' # print(file.split(".")) l = file.split(".") index = l[-1] file_name="" for i in range(len(l)-1): file_name+=l[i] # print(file_name,index) re = [] if index == "txt": with open(file, 'r') as f: while True: t = f.readline() if t == "": break re.append(t[:-2]) if index.upper() == 'CSV': # print(file) with open(file, "r", encoding='gb18030') as f: t = csv.reader(f) # print(t) # 建立空字典 for item in t: # 忽略第一行 # if t.line_num == 1: # continue re.append(item) if len(re)==0: return False,False else: return file_name,re def is_number(self,s): try: # 如果能运行float(s)语句,返回True(字符串s是浮点数) float(s) return True except ValueError: # ValueError为Python的一种标准异常,表示"传入无效的参数" pass # 如果引发了ValueError这种异常,不做任何事情(pass:不做任何事情,一般用做占位语句) try: import unicodedata # 处理ASCii码的包 unicodedata.numeric(s) # 把一个表示数字的字符串转换为浮点数返回的函数 return True except (TypeError, ValueError): pass return False def read_table_full(self, file): ''' 读取csv文件全部 :param file: 文件名 :return: 列表 ''' file_name, re = self.read_file(file) # print(file_name,re) if file_name == False: return False first_risk = [] for i in re: # print(i) k=[] for j in i: if self.is_number(j): k.append(eval(j)) else: k.append(j) first_risk.append(k) return first_risk def read_table_nofirst_line_nofirst_column(self, file): ''' 读取csv文件 # Example: :param file: 文件名 :return: 列表 ''' file_name, re = self.read_file(file) # print(file_name,re) if file_name == False: return False first_risk = [] for i in re[1:]: # print(i) k=[] for j in i[1:]: if self.is_number(j): k.append(eval(j)) else: k.append(j) first_risk.append(k) return first_risk class NewProjectInfo: ''' 新建工程信息表 ''' def __init__(self): ''' 前端控件读取的输入输入这里进行修改 ''' # self.U01= # self.U02= # self.U03= # self.U04= # self.U05= # self.U06= # self.U07= # self.U08= # self.U09= # self.U11= # self.U12= # self.U13= # self.U31= # self.U32= # self.U33= # self.U34= # self.U4= # self.U5= # self.U6= # self.U7= pass def calculate_matrix_A(self,matrix): ''' 计算该矩阵M的特征值λ_max和特征向量A 最大特征值对应的特征向量A,并进行归一化 Example: lao = NewProjectInfo() a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] b = lao.CalculateMatrix(a) print(b) :param matrix:第一行代表列 :return:C.R<0.1 调用返回答案,C.R>=0.1调用返回false ''' RI = {1:0,2:0,3:0.52,4:0.89,5:1.12,6:1.24,7:1.36,8:1.41,9:1.46} m= np.array(matrix) eigenvalue,featurevector = np.linalg.eig(m) r_max=0 A_id=0 for i in range(len(eigenvalue)): if r_max < eigenvalue[i]: r_max = eigenvalue[i] A_id = i n = len(matrix) A = [] # print(r_max) # print(eigenvalue) for i in featurevector: A.append(i[A_id]) # print(A) CR = (r_max - n)*RI[n] / (n-1) if CR < 0.1: # 归一化 x=0 for i in A: x+=i A_uniformization = [ ] for i in A: A_uniformization.append(i/x) return A_uniformization else: return False def calculate_matrix_B(self, matrix_group_B,A_uniformization): ''' Example: lao = NewProjectInfo() matrix_group_B = [ [0.33,0.33,0.33], [0.33,0.33,0.33], [0.25,0.25,0.25,0.25], [0.25, 0.25, 0.25, 0.25], [0.33,0.33,0.33] ] a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] A = lao.calculate_matrix_A(a) B = lao.calculate_matrix_B(matrix_group_B,A) for i in B: print(i) :param matrix_group_B: 5组特征向量 :param A_uniformization: calculate_matrix_A计算出来的权重 :return:风险权重 ''' Risk_B=[] index_a = 0 for Bi in matrix_group_B: t=[] for i in Bi: t.append(i*A_uniformization[index_a]) index_a+=1 Risk_B.append(t) return Risk_B def calculate_waverage_of_risk(self,pointer_table,target_index): ''' 计算各个风险指标的加权平均值 输出概率值和风险类型 Example: lao = NewProjectInfo() pointer_table = [ [ 0, 0.2, 0.1, "低风险"], [ 0.2, 0.4, 0.3, "较低风险"], [ 0.4, 0.6, 0.5, "中等风险"], [ 0.6, 0.8, 0.7, "较高风险"], [ 0.8, 1, 0.9, "高风险"] ] target_index = [ ['低风险','较低风险','中等风险','较高风险','高风险'], [ 6, 2, 1, 1, 0] ] risk_value, risk_classification = lao.calculate_waverage_of_risk(pointer_table, target_index) print("风险分类={}".format(risk_classification)) print("风险值={}".format(risk_value)) :param pointer_table: 对照表 :param target_index: 要计算的一行风险指标 :return: 概率值和风险类型 ''' #归一化 sum=0 for i in target_index[1]: sum+=i for i in range(len(target_index[1])): target_index[1][i]=target_index[1][i]/sum #查表计算 # print(target_index[0]) # print(target_index[1]) # print(pointer_table) sum=0 for i in range(len(target_index[0])): for j in pointer_table: if target_index[0][i] ==j[3]: sum+=target_index[1][i]*j[2] break for i in pointer_table: if i[0]<=sum and sum < i[1]: return sum,i[3] class Read_Secondary_Risk_Factor_Table: ''' 读"二级风险因子发生概率隶属表"目录下的各种表 ''' dir_path = "C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件二级风险因子发生概率隶属度表" lao = File_Processing() def get_target_index_u11(self, file_name='RP2_U11.CSV'): global U11 target_index_u11 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u11) for i in range(1,lens): # print( target_index_u11[i][0]) if target_index_u11[i][0]<= float(U11) and float(U11) <target_index_u11[i][1]: return [target_index_u11[0][2:],target_index_u11[i][2:]] return False def get_target_index_u12(self,file_name='RP2_U12.CSV'): global U12,U09 target_index_u12 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u12) if U09 == 0: area = json.loads(U12)['r']**2*math.pi for i in range(1, lens//2): if target_index_u12[i][0] <= area and area < target_index_u12[i][1]: return [target_index_u12[0][3:], target_index_u12[i][3:]] elif U09 ==1: area = json.loads(U12)['a'] *json.loads(U12)['b'] for i in range(lens//2, lens): if target_index_u12[i][0] <= area and area < target_index_u12[i][1]: return [target_index_u12[0][3:], target_index_u12[i][3:]] else: return False def get_target_index_u13(self,file_name='RP2_U13.CSV'): global U13 target_index_u13 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u13[0][2:],target_index_u13[1][2:]] def get_target_index_u21(self, file_name='RP2_U21.CSV'): global U21 target_index_u21 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u21[0][2:],target_index_u21[1][2:]] def get_target_index_u22(self, file_name='RP2_U22.CSV'): global U22 target_index_u22 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u22[0][2:], target_index_u22[1][2:]] def get_target_index_u23(self,file_name='RP2_U23.CSV'): target_index_u23 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u23[0][2:], target_index_u23[1][2:]] def get_target_index_u31(self,file_name="RP2_U31.CSV"): global U31 target_index_u31 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u31) for l in range(lens): if U31==target_index_u31[l][0]: return [target_index_u31[0][1:],target_index_u31[l][1:]] return False def get_target_index_u32(self,file_name="RP2_U32.CSV"): global U32 target_index_u32 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u32) for l in range(lens): if U32 == target_index_u32[l][0]: return [target_index_u32[0][1:],target_index_u32[l][1:]] return False def get_target_index_u33(self, file_name="RP2_U33.CSV"): global U33 target_index_u33 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u33) for l in range(lens): if U33 == target_index_u33[l][0]: return [target_index_u33[0][1:], target_index_u33[l][1:]] return False def get_target_index_u34(self,file_name="RP2_U34.CSV"): global U34 target_index_u34 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u34) for l in range(lens): if U34 == target_index_u34[l][0]: return [target_index_u34[0][1:],target_index_u34[l][1:]] return False def get_target_index_u41(self,file_name="RP2_U41.CSV"): global U4 pass def get_target_index_u42(self,file_name="RP2_U41.CSV"): global U4 pass def get_target_index_u43(self,file_name="RP2_U41.CSV"): global U4 pass def get_target_index_u51(self, file_name="RP2_U51.CSV"): global U5 target_index_u51 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u51) # print(json.loads(U5)) U51 = sqrt(json.loads(U5)['U511']**2+json.loads(U5)['U512']**2) # print(U51) for i in range(1, lens ): if target_index_u51[i][0] <= U51 and U51 < target_index_u51[i][1]: return [target_index_u51[0][2:], target_index_u51[i][2:]] return False def get_target_index_u52(self, file_name="RP2_U52.CSV"): global U5 target_index_u52 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u52) # print(json.loads(U5)['U52']) for i in range(1, lens): if target_index_u52[i][0] == json.loads(U5)['U52']: return [target_index_u52[0][2:], target_index_u52[i][2:]] return False def get_target_index_u53(self, file_name="RP2_U53.CSV"): global U5 target_index_u53 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u53) # print(json.loads(U5)['U53']) for i in range(1, lens): if target_index_u53[i][0] == json.loads(U5)['U53']: return [target_index_u53[0][2:], target_index_u53[i][2:]] return False def get_target_index_u54(self, file_name="RP2_U54.CSV"): global U5 target_index_u54 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u54) # print(json.loads(U5)['U54']) for i in range(1, lens): if target_index_u54[i][0] == json.loads(U5)['U54']: return [target_index_u54[0][2:], target_index_u54[i][2:]] return False def get_target_index_u61(self, file_name="RP2_U61.CSV"): global U6 target_index_u61 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u61) for i in range(1, lens ): if target_index_u61[i][0] == json.loads(U6)['U61']: return [target_index_u61[0][2:], target_index_u61[i][2:]] return False def get_target_index_u62(self, file_name="RP2_U62.CSV"): global U6 target_index_u62 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u62) for i in range(1, lens ): if target_index_u62[i][0]<= json.loads(U6)['U62'] and json.loads(U6)['U62'] < target_index_u62[i][1]: return [target_index_u62[0][2:], target_index_u62[i][2:]] return False def get_target_index_u63(self, file_name="RP2_U62.CSV"): pass if __name__ == '__main__': laolao = Read_Secondary_Risk_Factor_Table() # print(U11, laolao.get_target_index_u11()) # print(U12, laolao.get_target_index_u12()) # print(U13, laolao.get_target_index_u13()) # print(U34, laolao.get_target_index_u34()) # print(U31, laolao.get_target_index_u31()) # print(U32, laolao.get_target_index_u32()) # print(U5, laolao.get_target_index_u51()) # print(U5, laolao.get_target_index_u52()) # print(U5, laolao.get_target_index_u53()) # print(U5, laolao.get_target_index_u54()) # print(U6, laolao.get_target_index_u61()) # print(U6, laolao.get_target_index_u62()) # print(U21, laolao.get_target_index_u21()) print(U22, laolao.get_target_index_u22()) print(U23, laolao.get_target_index_u23())
第四次
''' @Time : 2020/11/21 20:42 @Author : laolao @FileName: 7.py ''' #-*- coding:utf-8 -*- import csv import json import math from math import sqrt import numpy as np U01 = "A101" #工程编号 U02 = "石家庄运河桥顶管隧道施工工程" #工程名称 U03 = "石家庄" #工程所在地 U04 = "铁道建设" #设计方 U05 = "铁道建设" #施工方 U06 = "铁道建设" #检测方 U07 = "铁道建设" #监理方 U08 = "2300" #隧道长度 U09 = 0#开挖顶管断面形式 U31 = "丙级" #设计方资质等级 U32 = "特级" #施工方资质等级 U33 = "甲级" #检测方资质等级 U34 = "甲级" #监理方资质等级 U11 = "5.6"#新建顶管埋深 U12 = '{"a":3.0,"b":2.4}'#新建顶管尺寸 '{"r":4.8}' U13 ="软黏土"#新建工程土层性质 U4 = '{"U41":2,"U42":3,"U43":5}'#既有邻近地下柔性管线情况11 U5 = '{"U511":0,"U512":2.9,"U52":6,"U53":1,"U54":2.0}'#既有邻近地下刚性管线情况12 U6 = '{"U61":1,"U62":3.7,"U63":6}'#既有邻近邻近基础情况13 U7 = ""#特殊工程情况说明 # 以下为没有提供的参数 U21 =21 #土舱压力 U22 = 2 U23 = 2 class File_Processing: ''' lao = File_Processing() # re = lao.read_table_full(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件风险等级指标判别表RLV.csv") re = lao.read_table_nofirst_line_nofirst_column(r"C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件二级风险因子两两判别表R2_U1.CSV") print(re) ''' def read_file(self,file): ''' 读文件,文件空返回0 :param file: txt or csv文件 :return: 文件内容 ''' # print(file.split(".")) l = file.split(".") index = l[-1] file_name="" for i in range(len(l)-1): file_name+=l[i] # print(file_name,index) re = [] if index == "txt": with open(file, 'r') as f: while True: t = f.readline() if t == "": break re.append(t[:-2]) if index.upper() == 'CSV': # print(file) with open(file, "r", encoding='gb18030') as f: t = csv.reader(f) # print(t) # 建立空字典 for item in t: # 忽略第一行 # if t.line_num == 1: # continue re.append(item) if len(re)==0: return False,False else: return file_name,re def is_number(self,s): try: # 如果能运行float(s)语句,返回True(字符串s是浮点数) float(s) return True except ValueError: # ValueError为Python的一种标准异常,表示"传入无效的参数" pass # 如果引发了ValueError这种异常,不做任何事情(pass:不做任何事情,一般用做占位语句) try: import unicodedata # 处理ASCii码的包 unicodedata.numeric(s) # 把一个表示数字的字符串转换为浮点数返回的函数 return True except (TypeError, ValueError): pass return False def read_table_full(self, file): ''' 读取csv文件全部 :param file: 文件名 :return: 列表 ''' file_name, re = self.read_file(file) # print(file_name,re) if file_name == False: return False first_risk = [] for i in re: # print(i) k=[] for j in i: if self.is_number(j): k.append(eval(j)) else: k.append(j) first_risk.append(k) return first_risk def read_table_nofirst_line_nofirst_column(self, file): ''' 读取csv文件 # Example: :param file: 文件名 :return: 列表 ''' file_name, re = self.read_file(file) # print(file_name,re) if file_name == False: return False first_risk = [] for i in re[1:]: # print(i) k=[] for j in i[1:]: if self.is_number(j): k.append(eval(j)) else: k.append(j) first_risk.append(k) return first_risk class NewProjectInfo: ''' 新建工程信息表 ''' def __init__(self): ''' 前端控件读取的输入输入这里进行修改 ''' # self.U01= # self.U02= # self.U03= # self.U04= # self.U05= # self.U06= # self.U07= # self.U08= # self.U09= # self.U11= # self.U12= # self.U13= # self.U31= # self.U32= # self.U33= # self.U34= # self.U4= # self.U5= # self.U6= # self.U7= pass def calculate_matrix_A(self,matrix): ''' 计算该矩阵M的特征值λ_max和特征向量A 最大特征值对应的特征向量A,并进行归一化 Example: lao = NewProjectInfo() a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] b = lao.CalculateMatrix(a) print(b) :param matrix:第一行代表列 :return:C.R<0.1 调用返回答案,C.R>=0.1调用返回false ''' RI = {1:0,2:0,3:0.52,4:0.89,5:1.12,6:1.24,7:1.36,8:1.41,9:1.46} m= np.array(matrix) eigenvalue,featurevector = np.linalg.eig(m) r_max=0 A_id=0 for i in range(len(eigenvalue)): if r_max < eigenvalue[i]: r_max = eigenvalue[i] A_id = i n = len(matrix) A = [] # print(r_max) # print(eigenvalue) for i in featurevector: A.append(i[A_id]) # print(A) CR = (r_max - n)*RI[n] / (n-1) if CR < 0.1: # 归一化 x=0 for i in A: x+=i A_uniformization = [ ] for i in A: A_uniformization.append(i/x) return A_uniformization else: return False def calculate_matrix_B(self, matrix_group_B,A_uniformization): ''' Example: lao = NewProjectInfo() matrix_group_B = [ [0.33,0.33,0.33], [0.33,0.33,0.33], [0.25,0.25,0.25,0.25], [0.25, 0.25, 0.25, 0.25], [0.33,0.33,0.33] ] a = [ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ] A = lao.calculate_matrix_A(a) B = lao.calculate_matrix_B(matrix_group_B,A) for i in B: print(i) :param matrix_group_B: 5组特征向量 :param A_uniformization: calculate_matrix_A计算出来的权重 :return:风险权重 ''' Risk_B=[] index_a = 0 for Bi in matrix_group_B: t=[] for i in Bi: t.append(i*A_uniformization[index_a]) index_a+=1 Risk_B.append(t) return Risk_B def calculate_waverage_of_risk(self,pointer_table,target_index): ''' 计算各个风险指标的加权平均值 输出概率值和风险类型 Example: lao = NewProjectInfo() pointer_table = [ [ 0, 0.2, 0.1, "低风险"], [ 0.2, 0.4, 0.3, "较低风险"], [ 0.4, 0.6, 0.5, "中等风险"], [ 0.6, 0.8, 0.7, "较高风险"], [ 0.8, 1, 0.9, "高风险"] ] target_index = [ ['低风险','较低风险','中等风险','较高风险','高风险'], [ 6, 2, 1, 1, 0] ] risk_value, risk_classification = lao.calculate_waverage_of_risk(pointer_table, target_index) print("风险分类={}".format(risk_classification)) print("风险值={}".format(risk_value)) :param pointer_table: 对照表 :param target_index: 要计算的一行风险指标 :return: 概率值和风险类型 ''' #归一化 sum=0 for i in target_index[1]: sum+=i for i in range(len(target_index[1])): target_index[1][i]=target_index[1][i]/sum #查表计算 # print(target_index[0]) # print(target_index[1]) # print(pointer_table) sum=0 for i in range(len(target_index[0])): for j in pointer_table: if target_index[0][i] ==j[3]: sum+=target_index[1][i]*j[2] break for i in pointer_table: if i[0]<=sum and sum < i[1]: return sum,i[3] class Read_Secondary_Risk_Factor_Table: ''' 读"二级风险因子发生概率隶属表"目录下的各种表 ''' dir_path = "C:\Users坂田银时Desktop风险评估软件需求分析与数据库设计相关文档V2.0V2.0CSV配置文件二级风险因子发生概率隶属度表" lao = File_Processing() def get_target_index_u11(self, file_name='RP2_U11.CSV'): global U11 target_index_u11 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u11) for i in range(1,lens): # print( target_index_u11[i][0]) if target_index_u11[i][0]<= float(U11) and float(U11) <target_index_u11[i][1]: return [target_index_u11[0][2:],target_index_u11[i][2:]] return False def get_target_index_u12(self,file_name='RP2_U12.CSV'): global U12,U09 target_index_u12 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u12) if U09 == 1: for i in range(1, lens//2): if target_index_u12[i][0] <= json.loads(U12)['r'] and json.loads(U12)['r'] < target_index_u12[i][1]: return [target_index_u12[0][3:], target_index_u12[i][3:]] elif U09 ==0: for i in range(lens//2, lens): if target_index_u12[i][0] <= json.loads(U12)['b'] and json.loads(U12)['b'] < target_index_u12[i][1]: return [target_index_u12[0][3:], target_index_u12[i][3:]] else: return False def get_target_index_u13(self,file_name='RP2_U13.CSV'): global U13 target_index_u13 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u13[0][2:],target_index_u13[1][2:]] def get_target_index_u21(self, file_name='RP2_U21.CSV'): global U21 target_index_u21 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u21[0][2:],target_index_u21[1][2:]] def get_target_index_u22(self, file_name='RP2_U22.CSV'): global U22 target_index_u22 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u22[0][2:], target_index_u22[1][2:]] def get_target_index_u23(self,file_name='RP2_U23.CSV'): target_index_u23 = self.lao.read_table_full(self.dir_path + "\" + file_name) return [target_index_u23[0][2:], target_index_u23[1][2:]] def get_target_index_u31(self,file_name="RP2_U31.CSV"): global U31 target_index_u31 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u31) for l in range(lens): if U31==target_index_u31[l][0]: return [target_index_u31[0][1:],target_index_u31[l][1:]] return False def get_target_index_u32(self,file_name="RP2_U32.CSV"): global U32 target_index_u32 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u32) for l in range(lens): if U32 == target_index_u32[l][0]: return [target_index_u32[0][1:],target_index_u32[l][1:]] return False def get_target_index_u33(self, file_name="RP2_U33.CSV"): global U33 target_index_u33 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u33) for l in range(lens): if U33 == target_index_u33[l][0]: return [target_index_u33[0][1:], target_index_u33[l][1:]] return False def get_target_index_u34(self,file_name="RP2_U34.CSV"): global U34 target_index_u34 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u34) for l in range(lens): if U34 == target_index_u34[l][0]: return [target_index_u34[0][1:],target_index_u34[l][1:]] return False def get_target_index_u41(self,file_name="RP2_U41.CSV"): global U4 pass def get_target_index_u42(self,file_name="RP2_U41.CSV"): global U4 pass def get_target_index_u43(self,file_name="RP2_U41.CSV"): global U4 pass def get_target_index_u51(self, file_name="RP2_U51.CSV"): global U5 target_index_u51 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u51) # print(json.loads(U5)) U51 = sqrt(json.loads(U5)['U511']**2+json.loads(U5)['U512']**2) # print(U51) for i in range(1, lens ): if target_index_u51[i][0] <= U51 and U51 < target_index_u51[i][1]: return [target_index_u51[0][2:], target_index_u51[i][2:]] return False def get_target_index_u52(self, file_name="RP2_U52.CSV"): global U5 target_index_u52 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u52) # print(json.loads(U5)['U52']) for i in range(1, lens): if target_index_u52[i][0] == json.loads(U5)['U52']: return [target_index_u52[0][2:], target_index_u52[i][2:]] return False def get_target_index_u53(self, file_name="RP2_U53.CSV"): global U5 target_index_u53 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u53) # print(json.loads(U5)['U53']) for i in range(1, lens): if target_index_u53[i][0] == json.loads(U5)['U53']: return [target_index_u53[0][2:], target_index_u53[i][2:]] return False def get_target_index_u54(self, file_name="RP2_U54.CSV"): global U5 target_index_u54 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u54) # print(json.loads(U5)['U54']) for i in range(1, lens): if target_index_u54[i][0] == json.loads(U5)['U54']: return [target_index_u54[0][2:], target_index_u54[i][2:]] return False def get_target_index_u61(self, file_name="RP2_U61.CSV"): global U6 target_index_u61 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u61) for i in range(1, lens ): if target_index_u61[i][0] == json.loads(U6)['U61']: return [target_index_u61[0][2:], target_index_u61[i][2:]] return False def get_target_index_u62(self, file_name="RP2_U62.CSV"): global U6 target_index_u62 = self.lao.read_table_full(self.dir_path + "\" + file_name) lens = len(target_index_u62) for i in range(1, lens ): if target_index_u62[i][0]<= json.loads(U6)['U62'] and json.loads(U6)['U62'] < target_index_u62[i][1]: return [target_index_u62[0][2:], target_index_u62[i][2:]] return False def get_target_index_u63(self, file_name="RP2_U62.CSV"): pass if __name__ == '__main__': laolao = Read_Secondary_Risk_Factor_Table() # print(U11, laolao.get_target_index_u11()) print(U12, laolao.get_target_index_u12()) # print(U13, laolao.get_target_index_u13()) # print(U34, laolao.get_target_index_u34()) # print(U31, laolao.get_target_index_u31()) # print(U32, laolao.get_target_index_u32()) # print(U5, laolao.get_target_index_u51()) # print(U5, laolao.get_target_index_u52()) # print(U5, laolao.get_target_index_u53()) # print(U5, laolao.get_target_index_u54()) # print(U6, laolao.get_target_index_u61()) # print(U6, laolao.get_target_index_u62()) # print(U21, laolao.get_target_index_u21()) # print(U22, laolao.get_target_index_u22()) # print(U23, laolao.get_target_index_u23())