《python數(shù)據(jù)分析與應(yīng)用》 課件 第13章 商業(yè)銀行數(shù)據(jù)遷移案例_第1頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 第13章 商業(yè)銀行數(shù)據(jù)遷移案例_第2頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 第13章 商業(yè)銀行數(shù)據(jù)遷移案例_第3頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 第13章 商業(yè)銀行數(shù)據(jù)遷移案例_第4頁
《python數(shù)據(jù)分析與應(yīng)用》 課件 第13章 商業(yè)銀行數(shù)據(jù)遷移案例_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第13章商業(yè)銀行數(shù)據(jù)遷移案例Python數(shù)據(jù)分析與應(yīng)用1CONTENTS13.1知識準(zhǔn)備13.2任務(wù)介紹13.3代碼演示13.4代碼補全和知識拓展目錄13.5實訓(xùn)任務(wù)2知識準(zhǔn)備13廣度優(yōu)先遍歷,指的是從圖的一個未遍歷的節(jié)點出發(fā),先遍歷這個節(jié)點的相鄰節(jié)點,再依次遍歷每個相鄰節(jié)點的相鄰節(jié)點。13.1.2廣度優(yōu)先遍歷算法使用普通的字典時,用法一般是dict={},添加元素的只需要:dict[element]=value即可,調(diào)用的時候也是如此:dict[element]=xxx,但前提是element字典里存在這個element,如果字典里沒有這個鍵element就會報錯keyError。這時就可以使用加強版的字典defaultdict。defaultdict的作用在于當(dāng)字典里的key不存在但被查找時,返回的不是報錯keyError而是能返回一個默認(rèn)值,從而能讓程序平滑運行。fromcollectionsimportdefaultdict#引入collections中定義的defaultdictdict=defaultdict(parameter)其中的參數(shù)parameter可以是list、str、set、int等等13.1.1defaultdict知識準(zhǔn)備圖中每個節(jié)點的值即為它們的遍歷順序。所以廣度優(yōu)先遍歷也叫層序遍歷,先遍歷第一層(節(jié)點1),再遍歷第二層(節(jié)點2,3,4),第三層(5,6,7,8),第四層(9,10)。深度優(yōu)先遍歷一般用棧來實現(xiàn),而廣度優(yōu)先遍歷要用隊列來實現(xiàn)任務(wù)介紹25某商業(yè)銀行需要將4W+個任務(wù)按層級(只有先完成父任務(wù),子任務(wù)才可以運行)從舊平臺遷入新平臺中。由于任務(wù)之間的關(guān)聯(lián)非常復(fù)雜,比如有任務(wù)A和B,它們之間的關(guān)系是只有A執(zhí)行了,才能執(zhí)行B,也就是可以認(rèn)為A任務(wù)是B任務(wù)的前提條件,也稱A是B的父任務(wù)。因此要按照執(zhí)行順序整理好這些任務(wù),使得所有的任務(wù)在執(zhí)行之前,它們的父任務(wù)均已獲得執(zhí)行。也就是說我們的所有任務(wù)事實上可以看做是一顆樹形結(jié)構(gòu)。每個樹節(jié)點都是一個單獨的任務(wù)有它的父節(jié)點(根節(jié)點除外)。13.2.1任務(wù)背景比如root任務(wù)是完成任務(wù)A1、A2、A3的前提條件,然后A1這個任務(wù)又是完成B1、B2、B3任務(wù)的前提條件,我們可以將這樣的關(guān)系表示為樹結(jié)構(gòu)。輸入:一組json格式的任務(wù)文件(作為子節(jié)點其內(nèi)容中含有各自的父節(jié)點)輸出:建立2、3、4…等以數(shù)字命名的目錄。把這組輸入的json文件按照所屬層級分別放入這些目錄中。比如A1、A2、A3這些文件就放到2這個目錄下,因為他們在數(shù)結(jié)構(gòu)中處于第2層級。B1、B2、B3這些文件就放到3這個目錄下,因為他們在數(shù)結(jié)構(gòu)中處于第3層級,以此類推。只要采用廣度優(yōu)先遍歷算法BFS就可以順利完成這項工作,將所有的任務(wù)按需要被完成的先后次序進行分層即可。圖13-6任務(wù)的關(guān)鍵:任務(wù)文件按所在層級進行分類代碼演示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,'的子節(jié)點:',nodes)19forjinnodes:20queue.append(j)圖13-9BFS遍歷算法實現(xiàn)第1步:先寫出若干節(jié)點的代碼圖13-10BFS遍歷算法實現(xiàn)第2步:再提取公共部分的代碼形成循環(huán)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,'的子節(jié)點:',nodes)23print(name,'的層級:',result)24print('-'*20)25forjinnodes:26queue.append(j)27cj.append(result+1)13.3.2打印樹上子節(jié)點的層級(root=1)下面我們對上述代碼進行修改,使得程序能獲得每個子節(jié)點的所在層級。假定root根節(jié)點的層級為1。2312代碼演示13.3.3調(diào)整任務(wù)圖的結(jié)構(gòu)(1)即便是我們調(diào)整了任務(wù)圖(圖13-11)依然可以用相同的代碼得到正確的結(jié)果。代碼和結(jié)果在下頁:圖13-11調(diào)整任務(wù)圖結(jié)構(gòu),但仍然保持D1的父節(jié)點是C1,不會改變程序結(jié)果2312代碼演示1importcollections23s={'root':['A1','A2','A3'],4'A1':['B1','B2','B3'],5'A2':['B4','B5'],#注意數(shù)據(jù)根據(jù)任務(wù)圖的不同而調(diào)整了6'B4':['C1'],7'A3':['D1'],#注意數(shù)據(jù)根據(jù)任務(wù)圖的不同而調(diào)整了8'C1':['D1']}#不變的是始終保持著這對父子節(jié)點關(guān)系9dict_a=collections.defaultdict(list)10fork,vins.items():11forwinv:12dict_a[k].append(w)13print(dict_a)14#=========================15result_dict={}#加入一個搜集結(jié)果的普通字典16queue=['root']17cj=[1]#root層級=118print('-'*20)13.3.3調(diào)整任務(wù)圖的結(jié)構(gòu)(2)19whilequeue:20name=queue.pop(0)21nodes=dict_a[name]22result=cj.pop(0)23print(name,'的子節(jié)點:',nodes)24print(name,'的層級:',result)25print('-'*20)26forjinnodes:27queue.append(j)28cj.append(result+1)2930result_dict[j]=result+1313233print(result_dict)可以看到D1的層級最終依然為5。唯一的問題就是對于D1這個節(jié)點我們遍歷了兩次(使用下面的代碼來更直觀地演示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.用來保存已訪問過節(jié)點的列表12queue=[]#Initializeaqueue.初始化一個隊列1314#完整的BFS算法15defbfs(visited,graph,node):#functionforBFS16visited.append(node)17queue.append(node)1819whilequeue:#Creatinglooptovisiteachnode創(chuàng)建循環(huán)訪問每個節(jié)點20m=queue.pop(0)21print(m,end="")2223forneighbouringraph[m]:24ifneighbournotinvisited:25visited.append(neighbour)26queue.append(neighbour)272829#調(diào)用BFS算法30print("FollowingistheBreadth-FirstSearch")31bfs(visited,graph,'5')#functioncalling調(diào)用函數(shù)bfs3213.3.4完整的BFS算法假設(shè)我們有一個圖要進行廣度優(yōu)先遍歷。圖13-12進行BFS遍歷,輸出:537248上述代碼中可以嘗試去掉第24、25行,看看會發(fā)生什么?2312代碼演示23forneighbouringraph[m]:24#ifneighbournotinvisited:25#visited.append(neighbour)26queue.append(neighbour)

13.3.4完整的BFS算法假設(shè)我們有一個圖要進行廣度優(yōu)先遍歷。圖13-12進行BFS遍歷,輸出:537248上述代碼中可以嘗試去掉第24、25行,看看會發(fā)生什么?也就是說為了防止節(jié)點被遍歷多次,代碼中維持一個visited列表是很有必要的。代碼補全和知識拓展414231213.4.1代碼補全在商業(yè)銀行數(shù)據(jù)遷移的真實任務(wù)中要求讀取所有的json格式的任務(wù)文件。1#代碼補全2#請在()填寫代碼3#-----------------------------------------------------4importos56file_path=(_____________)7fileList=[]8ifnotos.path.exists(file_path):9print('file_pathisnotexist!')10forroot,dirs,filesinos.walk(file_path):11forfileinfiles:12#只讀取.json后綴名的文件,防止其他文件導(dǎo)致代碼報錯13(_____________)14print(fileList)231213.4.2知識拓展讀取json文件夾下的json文件,該文件是以自己的節(jié)點名稱命名的,比如A1.json,就是表示該任務(wù)名稱為A1,文件內(nèi)容包含有父任務(wù)名稱。請編寫程序獲取其中的父任務(wù)名稱,打印輸出該文件名和其父節(jié)點名稱。1#讀取json文件2importjson3importcollections4dict_a=collections.defaultdict(list)5filename='A1.json'6originalPath='./json/'+filename78withopen(originalPath,'rb')asjson_file:910originalfileJson=json.load(json_file)11#獲取依賴關(guān)系信息12parentActivities=originalfileJson['cdfTaskInfo']['parentActivities']13#print('所有的父節(jié)點:',parentActivities)1415foriinrange(len(parentActivities)):1617parent=parentActivities[i]['name']1819key=(_____________)20value=(_____________)21print(value,'--->',parent)22dict_a[key].append(value)23如果進一步拓展程序的功能,是否能把json目錄下所有文件和其文件中的父節(jié)點名稱全部打印出來,請編寫程序完成。實訓(xùn)任務(wù):某商業(yè)銀行數(shù)據(jù)遷移案例5171#任務(wù)一:數(shù)據(jù)遷移工作的文件按層級分類2#--------------------------------------------------------3#該程序的作用是讀入json目錄下的所有文件,4#然后按照它在樹上的節(jié)點層級進行分類。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后綴名的文件,防止其他文件導(dǎo)致代碼報錯21ifos.path.splitext(file)[1]=='.json':22#print(file)23fileList.append(file)24returnfileList252627#獲取所有的一對一關(guān)系后匯總成圖28defget_relation(path,name,dict_a):29#讀取json文件30originalPath=path+name31file=open(originalPath,'rb')32originalfileJson=json.load(file)33#獲取依賴關(guān)系信息34parentActivities=originalfileJson['cdfTaskInfo']['parentActivities']35#print('所有的父節(jié)點:',parentActivities)13.5實訓(xùn)任務(wù)(1)提取文件內(nèi)容并構(gòu)建出關(guān)系樹,然后根據(jù)樹的節(jié)點從根至葉節(jié)點計算出任務(wù)的層級(優(yōu)先級),然后按照優(yōu)先級建立文件夾并對任務(wù)文件分類進行存放。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#廣度優(yōu)先遍歷后記錄層數(shù),并對文件進行復(fù)制49defBFS(dict_a,q):50queue=[q]51cj=[1]#層級5253whilequeue:54name=queue.pop(0)55nodes=dict_a[name]56#print(name,'的子節(jié)點:',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實訓(xùn)任務(wù)(2)提取文件內(nèi)容并構(gòu)建出關(guān)系樹,然后根據(jù)樹的節(jié)點從根至葉節(jié)點計算出任務(wù)的層級(優(yōu)先級),然后按照優(yōu)先級建立文件夾并對任務(wù)文件分類進行存放。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論