《python数据分析与应用》 课件 史浩 第12、13章 实现量化交易策略、商业银行数据迁移案例_第1页
《python数据分析与应用》 课件 史浩 第12、13章 实现量化交易策略、商业银行数据迁移案例_第2页
《python数据分析与应用》 课件 史浩 第12、13章 实现量化交易策略、商业银行数据迁移案例_第3页
《python数据分析与应用》 课件 史浩 第12、13章 实现量化交易策略、商业银行数据迁移案例_第4页
《python数据分析与应用》 课件 史浩 第12、13章 实现量化交易策略、商业银行数据迁移案例_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第12章实现量化交易策略Python数据分析与应用1CONTENTS12.1知识准备12.2任务介绍12.3代码演示12.4代码补全和知识拓展目录12.5实训任务2知识准备13在股票技术分析中经常会考虑复权的情形,以便于对股票价格走势进行更准确的分析判断。因为上市公司在经营过程中其价值会发生变化,同时会伴随进行股本价值的变化,比如由于送股、配股或转增资本等因素,会让公司的总股本增加,从而每股股价所代表的企业实际价值减少。比如除权当日,K线图形好像大跌一样,有明显的缺口位,但是投资者账户的资金是没有减少的。而进行复权就是消除这些指标的畸变。再比如一只股票在经过分红之后,因为每股的价值出现减少,所以在股价上也要做相应的减值。复权可以分为前复权和后复权。前复权、后复权量化交易起源于上世纪七十年代的股票市场,是指借助现代统计学和数学的方法,利用计算机技术来进行交易的证券投资方式。量化交易用数量模型验证及固化这些规律和策略,然后严格执行策略来指导投资,以求获得可以持续的、稳定且高于平均收益的超额回报。量化交易并没有一个精确的定义,广义上可以认为,凡是借助于数学模型和计算机实现的交易方法都可以称为量化交易。12.1.1量化交易简介股票的交易需要策略,而交易策略主要基于三个方面的信息:基本面、技术面和消息面,三个方面各有优缺点。市面上常见的交易策略类型可以分为趋势策略、量化对冲策略、套利策略和高频策略等。12.1.2量化交易策略知识准备任务介绍25本章任务要求选定一只股票用5日均线、20日均线实现均线交易策略,并且计算其在选定时间区间的收益率。任务介绍5日均线、20日均线交易策略:1)当5日均线上穿20日均线,买入。2)当5日均线下穿20日均线,卖出。比如选择上海证交所的浦发银行600000.SH,我们选取start_date='20180702',end_date='20190930'之间的数据,按照该均线交易策略进行交易,然后计算其收益率。代码演示372312代码演示从证券宝()网站下载数据,导入到pandas的DataFrame中备用。12.3.1读取数据1importbaostockasbs2importpandasaspd34####登陆系统####5lg=bs.login()6#显示登陆返回信息7print('loginresponderror_code:'+lg.error_code)8print('loginresponderror_msg:'+lg.error_msg)910####获取沪深A股历史K线数据####11#“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。12#分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag13#周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg14rs=bs.query_history_k_data_plus("sh.600000",15"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",16start_date='2017-07-01',end_date='2017-12-31',17frequency="d",adjustflag="3")#frequency="d"取日k线,adjustflag="3"默认不复权18print('query_history_k_data_plusresponderror_code:'+rs.error_code)19print('query_history_k_data_plusresponderror_msg:'+rs.error_msg)2021####打印结果集####22data_list=[]23while(rs.error_code=='0')&rs.next():24#获取一条记录,将记录合并在一起25data_list.append(rs.get_row_data())26result=pd.DataFrame(data_list,columns=rs.fields)2728####结果集输出到csv文件####29result.to_csv("history_A_stock_k_data.csv",index=False)30print(result)3132####登出系统####33bs.logout()342312代码演示1#--------------------------------------------------------2#MyBaoStock类:用来获取前复权股票数据3#--------------------------------------------------------4importbaostockasbs5importpandasaspd678classMyBaoStock(object):910def__init__(self):11super().__init__()1213defget_stock_daily(self,ts_code,start_date,end_date):1415#如果股票代码格式和时间格式是tushare的,将其转换为baostock格式16#'600000.SH'->'sh.600000'17#'20180702'->'2018-07-02'18ifts_code[0].isdigit():19ts_code=ts_code[-2:].lower()+'.'+ts_code[0:6]20ifnot('-'instart_date):21start_date=start_date[0:4]+'-'+start_date[4:6]+'-'+start_date[6:]22ifnot('-'inend_date):23end_date=end_date[0:4]+'-'+end_date[4:6]+'-'+end_date[6:]2425####登陆系统####26lg=bs.login()27#显示登陆返回信息28print('loginresponderror_code:'+lg.error_code)29print('loginresponderror_msg:'+lg.error_msg)3012.3.2编写证券宝数据接口类Tushare是一个免费、开源的Python财经数据接口包,我们可以采用Tushare作为股票交易数据源,也可以采用证券宝作为数据源。接下来我们将证券宝提取股市数据的功能写成一个类的形式,方便今后随时调用。未完下页继续2312代码演示31####获取沪深A股历史K线数据####32#详细指标参数,参见“股票数据分析可视化”章节11.3.1;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。33#分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag34#周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg35rs=bs.query_history_k_data_plus(ts_code,36"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",37start_date=start_date,end_date=end_date,38frequency="d",adjustflag="2")#frequency="d"取日k线,adjustflag="3"默认不复权39#默认不复权:3;1:后复权;2:前复权。40print('query_history_k_data_plusresponderror_code:'+rs.error_code)41print('query_history_k_data_plusresponderror_msg:'+rs.error_msg)4243####打印结果集####44data_list=[]45while(rs.error_code=='0')&rs.next():46#获取一条记录,将记录合并在一起47data_list.append(rs.get_row_data())48df=pd.DataFrame(data_list,columns=rs.fields)4950#为保持和tushare数据兼容,修改数据列名称51df.rename(52columns={'date':'trade_date','code':'ts_code','volume':'vol'},53inplace=True)54#为保持和tushare数据兼容,修改数据列数据类型从str到float55df['close']=df['close'].astype('float')56df['open']=df['open'].astype('float')57df['high']=df['high'].astype('float')58df['low']=df['low'].astype('float')59####结果集输出到csv文件####60#df.to_csv("history_A_stock_k_data.csv",index=False)61#print(df)6263####登出系统####64bs.logout()6566returndf6712.3.2编写证券宝数据接口类(续)2312代码演示12.3.3移动平均线交易策略(1)stock['ma5-20']=stock['ma5']-stock['ma20']#求差值stock['diff']=np.sign(stock['ma5-20’]) #取得差值的符号#绘制在图形上,图形上下边界为ylime从-2到2,#直线颜色color是黑色,线宽linewidth=2(图12-4)stock['diff'].plot(ylim=(-2,2)).axhline(y=0,color='black',lw=2)我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见20日移动平均线具有抹平短期波动的作用,更能反映中长期的走势。比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略中最简单的方式就是:当5日均线从下方超越20日均线时,买入股票,当5日均线从上方跌落到20日均线之下时,卖出股票。为了找出交易的时机,我们计算5日均价和20日均价的差值,并取其正负号,作于下图。当图中水平线出现跳跃的时候就是交易时机。图12-4差值的符号(5日均线与20日均线求差)示意图2312代码演示12.3.3移动平均线交易策略(2)#当日与前一日相减,再取其符号作为交易信号(图12-5)stock['signal']=np.sign(stock['diff']-stock['diff'].shift(1))stock['signal'].plot(ylim=(-2,2))为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。图12-5继续计算得到交易信号代码补全和知识拓展413231212.4.1代码补全(可以采用两种不同的写法来补全)我们尝试用刚才编写完成的证券宝类MyBaoStock来尝试提取数据,首先为了方便识别,我们将包含该类的文件名更名为mybaostock.py,然后在文件中可以通过importmybaostock来提取数据。1#代码补全2#--------------------------------------------------------3importpandasaspd4(__________)5(__________)6stock_code='600000.SH'7#读取数据8df=(__________).get_stock_daily(ts_code=stock_code,start_date='20180702',end_date='20190930')9df=df.loc[:,['trade_date','open','high','low','close','vol']]#选取需要的列10df.rename(11columns={'trade_date':'Date','open':'Open','high':'High',12'low':'Low','close':'Close','vol':'Volume'},13inplace=True)#把小写改首字母大写14#改变时间次序15df['Date']=pd.to_datetime(df['Date'])#转换日期列的格式,便于作图16df.set_index(['Date'],inplace=True)#将日期列作为行索引17df=df.sort_index()#倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。18print(df.head())19print(())231212.4.2知识拓展:通过alphavantage获取股票交易数据假设我们想要获得万科(000002.SHZ)股票的交易数据,可以参考下面的代码进行获取。其中key.txt保存有我们通过注册免费获取的APIKey。有兴趣的用户可以通过其官方网站索取AlphaVantageStockAPI©的免费密钥,终身使用。申请时建议使用合法的电子邮件地址,一旦丢失了API密钥,可以通过邮件找回。1fromalpha_vantage.timeseriesimportTimeSeries2importmatplotlib.pyplotasplt3importseabornassns45symbol='000002.SHZ'6api_key=open('key.txt').read()#os.environ['AV-Key']7ts=TimeSeries(key=api_key,output_format='pandas')8#outputsize='full'ornot,ifnotthenoneyearbackdata9data,metadata=ts.get_daily_adjusted(symbol,outputsize='full')10#print(metadata)11print()12sns.set_style('darkgrid')13sns.set_context('notebook')14data.describe()15data['4.close'].plot(figsize=(10,8))16plt.show()实训任务:Tushare数据演示移动平均线交易策略51612.5.1实训任务一获得均线量化交易策略的交易信号1#任务一:生成交易信号2#--------------------------------------------------------3importnumpyasnp4importpandasaspd5importmatplotlib.pyplotasplt6importmybaostockasmbs78stock_code='600000.SH'910#读取数据11df=mbs.MyBaoStock().get_stock_daily(ts_code=stock_code,start_date='20180702',end_date='20190930')12df=df.loc[:,['trade_date','open','high','low','close','vol']]#选取需要的列13df.rename(14columns={'trade_date':'Date','open':'Open','high':'High',15'low':'Low','close':'Close','vol':'Volume'},16inplace=True)#把小写改首字母大写17#改变时间次序18df['Date']=pd.to_datetime(df['Date'])#转换日期列的格式,便于作图19df.set_index(['Date'],inplace=True)#将日期列作为行索引20df=df.sort_index()#倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。2122#计算23stock=df24stock["ma5"]=np.round(stock['Close'].rolling(window=5,center=False).mean(),2)25stock["ma20"]=np.round(stock['Close'].rolling(window=20,center=False).mean(),2)2627importmatplotlibasmpl28通过下述代码可以获得交易信号12.5.1实训任务一获得均线量化交易策略的交易信号29mpl.use('TkAgg')30#我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见移动平均线具有抹平短期波动的作用,更能反映长期的走势。31#比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略,最简单的方式就是:32#当5日均线从下方超越20日均线时,买入股票,当5日均线从上方越到20日均线之下时,卖出股票。33(__________)34plt.show()35#为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。36#当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。37(__________)38plt.show()39#计算在该时间区间内,经过该交易策略的收益率40trade=pd.concat([41pd.DataFrame({"price":stock.loc[stock["signal"]==1,"Close"],42"operation":"Buy"}),43pd.DataFrame({"price":stock.loc[stock["signal"]==-1,"Close"],44"operation":"Sell"})45])4647trade.sort_index(inplace=True)48print(trade)49通过下述代码可以获得交易信号12.5.2实训任务二模拟回测交易计算量化策略的收益率(1)1#任务二:根据交易信号,进行交易并计算该策略的收益。2#--------------------------------------------------------3importnumpyasnp4importpandasaspd5importmatplotlib.pyplotasplt6importmybaostockasmbs78stock_code='600000.SH'910#读取数据11df=mbs.MyBaoStock().get_stock_daily(ts_code=stock_code,start_date='20180702',end_date='20190930')12df=df.loc[:,['trade_date','open','high','low','close','vol']]#选取需要的列13df.rename(14columns={'trade_date':'Date','open':'Open','high':'High',15'low':'Low','close':'Close','vol':'Volume'},16inplace=True)#把小写改首字母大写17#改变时间次序18df['Date']=pd.to_datetime(df['Date'])#转换日期列的格式,便于作图19df.set_index(['Date'],inplace=True)#将日期列作为行索引20df=df.sort_index()#倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。2122#计算23stock=df24stock["ma5"]=np.round(stock['Close'].rolling(window=5,center=False).mean(),2)25stock["ma20"]=np.round(stock['Close'].rolling(window=20,center=False).mean(),2)26通过下述代码可以模拟回测交易,并计算打印量化策略的收益率。27importmatplotlibasmpl2829mpl.use('TkAgg')30#我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见移动平均线具有抹平短期波动的作用,更能反映长期的走势。31#比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略,最简单的方式就是:32#当5日均线从下方超越20日均线时,买入股票,当5日均线从上方越到20日均线之下时,卖出股票。33stock['ma5-20']=stock['ma5']-stock['ma20']34stock['diff']=np.sign(stock['ma5-20'])#取得符号35stock['diff'].plot(ylim=(-2,2)).axhline(y=0,color='black',lw=2)#lw:linewidth36plt.show()37#为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。38#当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。39stock['signal']=np.sign(stock['diff']-stock['diff'].shift(1))40stock['signal'].plot(ylim=(-2,2))41plt.show()42#计算在该时间区间内,经过该交易策略的收益率43trade=pd.concat([44pd.DataFrame({"price":stock.loc[stock["signal"]==1,"Close"],45"operation":"Buy"}),46pd.DataFrame({"price":stock.loc[stock["signal"]==-1,"Close"],47"operation":"Sell"})48])4950trade.sort_index(inplace=True)51print(trade)通过下述代码可以模拟回测交易,并计算打印量化策略的收益率。12.5.2实训任务二模拟回测交易计算量化策略的收益率(2)52#buys=pd.DataFrame(trade.loc[trade['operation']=='Buy','price'])53#print(buys.index.min())54#price1=buys.loc[buys.index.min(),'price']55tradevol=100#每次交易一手56iftrade.loc[trade.index.min(),'operation']=='Buy':57account_cash=begin_cash=10000.058account_stock=begin_stock=0.059else:#Sell60account_cash=begin_cash=10000.061account_stock=begin_stock=10*tradevol62initvalue=account_cash+account_stock*trade.loc[trade.index.min(),'price']63print(f'initvalue={initvalue}')64i=065forkey,rowintrade.iterrows():66ifrow['operation']=='Buy'andaccount_cash>=row['price']*tradevol:67account_cash-=row['price']*tradevol68account_stock+=tradevol69elifrow['operation']=='Sell'andaccount_stock>=tradevol:70account_cash+=row['price']*tradevol71account_stock-=tradevol72else:73print('dataerror')74break75print(f'{i}:account_cash={account_cash}account_stock={account_stock}')76i+=17778finalvalue=account_cash+account_stock*trade.loc[trade.index.max(),'price']79print(f'finalvalue={finalvalue}')80print(f'收益率=(__________)')81通过下述代码可以模拟回测交易,并计算打印量化策略的收益率。12.5.2实训任务二模拟回测交易计算量化策略的收益率(3)课后习题622课后习题习题11.假定我们从https://www.alphavantage.co下载到的数据是json格式的,请编写程序将所有的交易日信息转换为numpy二维数组格式,数组的每行元素就是一个交易日,每一列就代表交易日中的开盘价、收盘价等交易信息。习题22.采用正态分布来模拟每年的252个交易日的收益情况。假设每天股价的收益为随机变量,其均值为0.001,收益波动为0.02,如果假定收益符合正态分布,则可以模拟一年之中252个交易日的日收益率分布情况。习题33.计算某支股票的累计收益率。比如请计算600000这只股票从20180702到20190930期间的累计收益率并绘图表示。课后习题23谢谢观赏24第13章商业银行数据迁移案例Python数据分析与应用25CONTENTS13.1知识准备13.2任务介绍13.3代码演示13.4代码补全和知识拓展目录13.5实训任务26知识准备127广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。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)。深度优先遍历一般用栈来实现,而广度优先遍历要用队列来实现任务介绍229某商业银行需要将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任务的关键:任务文件按所在层级进行分类代码演示3312312代码演示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列表是很有必要的。代码补全和知识拓展438231213.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目录下所有文件和其文件中的父节点名称全部打印出来,请编写程序完成。实训任务:某商业银行数据迁移案例5411#任务一:数据迁移工作的文件按层级分类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

温馨提示

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

最新文档

评论

0/150

提交评论