《python数据分析与应用》 课件 第13章 商业银行数据迁移案例_第1页
《python数据分析与应用》 课件 第13章 商业银行数据迁移案例_第2页
《python数据分析与应用》 课件 第13章 商业银行数据迁移案例_第3页
《python数据分析与应用》 课件 第13章 商业银行数据迁移案例_第4页
《python数据分析与应用》 课件 第13章 商业银行数据迁移案例_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第13章商业银行数据迁移案例Python数据分析与应用1CONTENTS13.1知识准备13.2任务介绍13.3代码演示13.4代码补全和知识拓展目录13.5实训任务2知识准备13广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。13.1.2广度优先遍历算法使用普通的字典时,用法一般是dict={},添加元素的只需要:dict[element]=value即可,调用的时候也是如此:dict[element]=xxx,但前提是element字典里存在这个element,如果字典里没有这个键element就会报错keyError。这时就可以使用加强版的字典defaultdict。defaultdict的作用在于当字典里的key不存在但被查找时,返回的不是报错keyError而是能返回一个默认值,从而能让程序平滑运行。fromcollectionsimportdefaultdict#引入collections中定义的defaultdictdict=defaultdict(parameter)其中的参数parameter可以是list、str、set、int等等13.1.1defaultdict知识准备图中每个节点的值即为它们的遍历顺序。所以广度优先遍历也叫层序遍历,先遍历第一层(节点1),再遍历第二层(节点2,3,4),第三层(5,6,7,8),第四层(9,10)。深度优先遍历一般用栈来实现,而广度优先遍历要用队列来实现任务介绍25某商业银行需要将4W+个任务按层级(只有先完成父任务,子任务才可以运行)从旧平台迁入新平台中。由于任务之间的关联非常复杂,比如有任务A和B,它们之间的关系是只有A执行了,才能执行B,也就是可以认为A任务是B任务的前提条件,也称A是B的父任务。因此要按照执行顺序整理好这些任务,使得所有的任务在执行之前,它们的父任务均已获得执行。也就是说我们的所有任务事实上可以看做是一颗树形结构。每个树节点都是一个单独的任务有它的父节点(根节点除外)。13.2.1任务背景比如root任务是完成任务A1、A2、A3的前提条件,然后A1这个任务又是完成B1、B2、B3任务的前提条件,我们可以将这样的关系表示为树结构。输入:一组json格式的任务文件(作为子节点其内容中含有各自的父节点)输出:建立2、3、4…等以数字命名的目录。把这组输入的json文件按照所属层级分别放入这些目录中。比如A1、A2、A3这些文件就放到2这个目录下,因为他们在数结构中处于第2层级。B1、B2、B3这些文件就放到3这个目录下,因为他们在数结构中处于第3层级,以此类推。只要采用广度优先遍历算法BFS就可以顺利完成这项工作,将所有的任务按需要被完成的先后次序进行分层即可。图13-6任务的关键:任务文件按所在层级进行分类代码演示372312代码演示13.3.1BFS算法演示1importcollections23s={'root':['A1','A2','A3'],4'A1':['B1','B2','B3'],5'A3':['B4','B5'],6'B4':['C1'],7'A2':['D1'],8'C1':['D1']}9dict_a=collections.defaultdict(list)10fork,vins.items():11forwinv:12dict_a[k].append(w)13print(dict_a)14queue=['root']15whilequeue:16name=queue.pop(0)17nodes=dict_a[name]18print(name,'的子节点:',nodes)19forjinnodes:20queue.append(j)图13-9BFS遍历算法实现第1步:先写出若干节点的代码图13-10BFS遍历算法实现第2步:再提取公共部分的代码形成循环2312代码演示1importcollections23s={'root':['A1','A2','A3'],4'A1':['B1','B2','B3'],5'A3':['B4','B5'],6'B4':['C1'],7'A2':['D1'],8'C1':['D1']}9dict_a=collections.defaultdict(list)10fork,vins.items():11forwinv:12dict_a[k].append(w)13print(dict_a)14#=========================15queue=['root']16cj=[1]#root层级=117print('-'*20)18whilequeue:19name=queue.pop(0)20nodes=dict_a[name]21result=cj.pop(0)22print(name,'的子节点:',nodes)23print(name,'的层级:',result)24print('-'*20)25forjinnodes:26queue.append(j)27cj.append(result+1)13.3.2打印树上子节点的层级(root=1)下面我们对上述代码进行修改,使得程序能获得每个子节点的所在层级。假定root根节点的层级为1。2312代码演示13.3.3调整任务图的结构(1)即便是我们调整了任务图(图13-11)依然可以用相同的代码得到正确的结果。代码和结果在下页:图13-11调整任务图结构,但仍然保持D1的父节点是C1,不会改变程序结果2312代码演示1importcollections23s={'root':['A1','A2','A3'],4'A1':['B1','B2','B3'],5'A2':['B4','B5'],#注意数据根据任务图的不同而调整了6'B4':['C1'],7'A3':['D1'],#注意数据根据任务图的不同而调整了8'C1':['D1']}#不变的是始终保持着这对父子节点关系9dict_a=collections.defaultdict(list)10fork,vins.items():11forwinv:12dict_a[k].append(w)13print(dict_a)14#=========================15result_dict={}#加入一个搜集结果的普通字典16queue=['root']17cj=[1]#root层级=118print('-'*20)13.3.3调整任务图的结构(2)19whilequeue:20name=queue.pop(0)21nodes=dict_a[name]22result=cj.pop(0)23print(name,'的子节点:',nodes)24print(name,'的层级:',result)25print('-'*20)26forjinnodes:27queue.append(j)28cj.append(result+1)2930result_dict[j]=result+1313233print(result_dict)可以看到D1的层级最终依然为5。唯一的问题就是对于D1这个节点我们遍历了两次(使用下面的代码来更直观地演示D1被遍历2次)。2312代码演示1#完整的BFS算法演示2graph={3'5':['3','7'],4'3':['2','4'],5'7':['8'],6'2':[],7'4':['8'],8'8':[]9}1011visited=[]#Listforvisitednodes.用来保存已访问过节点的列表12queue=[]#Initializeaqueue.初始化一个队列1314#完整的BFS算法15defbfs(visited,graph,node):#functionforBFS16visited.append(node)17queue.append(node)1819whilequeue:#Creatinglooptovisiteachnode创建循环访问每个节点20m=queue.pop(0)21print(m,end="")2223forneighbouringraph[m]:24ifneighbournotinvisited:25visited.append(neighbour)26queue.append(neighbour)272829#调用BFS算法30print("FollowingistheBreadth-FirstSearch")31bfs(visited,graph,'5')#functioncalling调用函数bfs3213.3.4完整的BFS算法假设我们有一个图要进行广度优先遍历。图13-12进行BFS遍历,输出:537248上述代码中可以尝试去掉第24、25行,看看会发生什么?2312代码演示23forneighbouringraph[m]:24#ifneighbournotinvisited:25#visited.append(neighbour)26queue.append(neighbour)

13.3.4完整的BFS算法假设我们有一个图要进行广度优先遍历。图13-12进行BFS遍历,输出:537248上述代码中可以尝试去掉第24、25行,看看会发生什么?也就是说为了防止节点被遍历多次,代码中维持一个visited列表是很有必要的。代码补全和知识拓展414231213.4.1代码补全在商业银行数据迁移的真实任务中要求读取所有的json格式的任务文件。1#代码补全2#请在()填写代码3#-----------------------------------------------------4importos56file_path=(_____________)7fileList=[]8ifnotos.path.exists(file_path):9print('file_pathisnotexist!')10forroot,dirs,filesinos.walk(file_path):11forfileinfiles:12#只读取.json后缀名的文件,防止其他文件导致代码报错13(_____________)14print(fileList)231213.4.2知识拓展读取json文件夹下的json文件,该文件是以自己的节点名称命名的,比如A1.json,就是表示该任务名称为A1,文件内容包含有父任务名称。请编写程序获取其中的父任务名称,打印输出该文件名和其父节点名称。1#读取json文件2importjson3importcollections4dict_a=collections.defaultdict(list)5filename='A1.json'6originalPath='./json/'+filename78withopen(originalPath,'rb')asjson_file:910originalfileJson=json.load(json_file)11#获取依赖关系信息12parentActivities=originalfileJson['cdfTaskInfo']['parentActivities']13#print('所有的父节点:',parentActivities)1415foriinrange(len(parentActivities)):1617parent=parentActivities[i]['name']1819key=(_____________)20value=(_____________)21print(value,'--->',parent)22dict_a[key].append(value)23如果进一步拓展程序的功能,是否能把json目录下所有文件和其文件中的父节点名称全部打印出来,请编写程序完成。实训任务:某商业银行数据迁移案例5171#任务一:数据迁移工作的文件按层级分类2#--------------------------------------------------------3#该程序的作用是读入json目录下的所有文件,4#然后按照它在树上的节点层级进行分类。5#分类之后,按照不同的层级保存到result目录下的不同的子目录下。6#层级2的文件保存到result\2目录,层级3的保存到result\3目录等等。7importjson8importos9importshutil10importtime11fromcollectionsimportdefaultdict121314defgetFileName(file_path):15fileList=[]16ifnotos.path.exists(file_path):17print('file_pathisnotexist!')18forroot,dirs,filesinos.walk(file_path):19forfileinfiles:20#只读取.json后缀名的文件,防止其他文件导致代码报错21ifos.path.splitext(file)[1]=='.json':22#print(file)23fileList.append(file)24returnfileList252627#获取所有的一对一关系后汇总成图28defget_relation(path,name,dict_a):29#读取json文件30originalPath=path+name31file=open(originalPath,'rb')32originalfileJson=json.load(file)33#获取依赖关系信息34parentActivities=originalfileJson['cdfTaskInfo']['parentActivities']35#print('所有的父节点:',parentActivities)13.5实训任务(1)提取文件内容并构建出关系树,然后根据树的节点从根至叶节点计算出任务的层级(优先级),然后按照优先级建立文件夹并对任务文件分类进行存放。3637foriinrange(len(parentActivities)):38relation=parentActivities[i]39parent=relation['name']4041key=parent42value=name.split('.json')[0]43#print(name.split('.json')[0],'--->',parent)44dict_a[key].append(value)45file.close()464748#广度优先遍历后记录层数,并对文件进行复制49defBFS(dict_a,q):50queue=[q]51cj=[1]#层级5253whilequeue:54name=queue.pop(0)55nodes=dict_a[name]56#print(name,'的子节点:',nodes)57result=cj.pop(0)58forjinnodes:5960(___________________________)616263defmove_file():64foriteminresult_dict.items():65file=item[0]66cj=item[1]6768#print('%s:%s'%(file,cj))13.5实训任务(2)提取文件内容并构建出关系树,然后根据树的节点从根至叶节点计算出任务的层级(优先级),然后按照优先级建立文件夹并对任务文件分类进行存放。6970ifnotos.path.exists('./result/'+'/'+str(cj)):71os.makedirs('./result/'+'/'+str(cj))72shutil.copy('./json/'+file+'.json','./result/'+'/'+str(cj)+'/')73

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论