关于字典的遍历操作以下描述正确的是,

  关于字典的遍历操作以下描述正确的是,

  for…in迭代循环首先介绍Python中最常用的for…in循环遍历。for…in循环结构用于遍历列表、元组、字典、字符串、集合、文件等。事实上,for和In是两个独立的语法。for语句是Python内置的迭代器工具,用于从可迭代的容器对象(如列表、元组、字典、字符串、集合、文件等)中读取元素。)一个接一个,直到容器里没有更多的元素。只要遵循iterable协议,就可以在工具和对象之间执行迭代操作。in的存在让python对iterable对象的操作变得简单很多,用for来逐个取iterable对象的元素。

  for语句涉及的具体迭代过程是:被迭代的对象通过迭代器方法返回迭代器,迭代器有下一个方法。for循环不断调用下一个方法,每次在迭代器中按顺序返回值,直到迭代结束,抛出异常StopIteration(Python没有更多的元素了(Python会自动处理异常)。迭代过程如下:

  #迭代过程x=[1,2,3]ITS=x . _ _ ITER _ _()# list是迭代对象,否则会提示不是迭代对象print(its)#打印结果:list _ iterator对象在0x 100 f 32198 Print(next(ITS))# ITS包含此方法,说明其是迭代器#打印结果:1print(next(its)) #打印结果:2print(next(its)) #打印结果:3print(next(its)) #打印结果:traceback (most inmodulestiteration迭代的优点是不需要将所有元素一次性加载到内存中,在调用下一个方法时可以逐个返回元素,避免了内存空间不足的情况。

  用于…在流通中实现单均线突破策略。遍历所有交易日的收盘价值和Ma20值,用Ma20值减去收盘价值,用np.sign()取差号。收盘价在Ma20以上时,差值为正;当收盘价高于和低于Ma20时,差值为负。由负转正对应买点,由正转负对应卖点。如下

  def in _ looping(df):df[ signal ]=0 # df=df . assign(signal=0)# assign可用于在np.arange (0,df.shape [0])中为I添加新列:df.iloc [i, df . columns . get _ loc( signal )]=NP . sign(df . iloc[I][ Close ]-df . iloc[I][ Ma20 ])return df print(for in _ looping(df _ stock load)[0:5] 高低开收盘成交量调整收盘Ma20信号日期2018-01-29 3587.0 3510.3 3563.6 3523.0 236000 3523.0 3523.0 所谓生成器,其实就是一个特殊的迭代器,内部支持迭代器协议。Python提供了生成器函数和生成器表达式来实现生成器。每个请求都返回一个结果,所以不需要一次建立一个结果列表,这样可以节省内存空间。

  在Python 3中,可以使用range返回迭代器,一次遍历一个范围的一个值。

  # generator def gen squares(n):for I in range(n):yield I * * 2 Print(gen squares(5))由Generator函数实现# Print result:Generator Object gen squares at0x 11 a 35 cf 48 for I in gen squares(5):Print(I)# Print result:014916实际上yield相当于一个return,只不过return返回一个值,而yield返回一个生成器。其他的都一样,所以return或者yield只能用在函数中。

  生成器是一个类似于列表解析的对象,根据需要生成结果。例程代码如下:

  #生成器表达式实现生成器打印的方式(x**2 for x in range(5))#打印结果:生成器对象gen expr at0x B3 d 31 fa 4 print(list(x * * 2 for x in range(5))#打印结果:[0,1,4,9,16]通过iterrows()迭代计算股票每个交易日收盘价与Ma20的差值。这里,iterrows是一个以dataframe格式迭代数据行的生成器,它返回每一行的索引和包含行本身的对象。代码如下:

  #iterrows()遍历模式def ITER rows _ looper(df):df[ signal ]=0 # df=df . assign(signal=0)# assign可用于为index添加新列,df.iterrows()中的row:df . loc[index, signal ]=NP . sign(row[ Close ]-row[ Ma20 ])return df print(ITER rows _ Loop ITER(df _ stock load)[0:5]) 高低开盘收盘成交量调整收盘Ma20信号日期2018-01-29 3587.0 3510.3 3563.6 3523.0 236000 3523.0 3454.3 1.02018-01-30 30 函数以lambda模式嵌入代码,lambda是匿名函数,可以省去定义函数的过程,让代码更加简洁。lambda函数的结尾包含轴参数,该参数用于告诉Pandas将函数应用于行(轴=1)或列(轴=0)。apply()方法循环实现代码如下:

  df _ stock load[ signal ]=df _ stock load . apply(lambda row:(NP . sign(row[ Close ]-row[ Ma20 ]),axis=1)print(df_stockload.head()) 高低开收盘量调整收盘Ma20信号日期2018-01-29 3587.0 3510.3 3563.6 3523.0 236000 3523.0 3454 . 3 1.020

  我们来看看熊猫系列的矢量化。

  Pandas的DataFrame和series基本单元数据结构是基于链表的,所以函数可以在整个链表上矢量化,而不需要依次执行每个值。

  Pandas包含了非常丰富的矢量化函数库,我们可以将整个系列(列)作为参数传递来计算整个链表。熊猫系列的矢量化代码如下:

  # panda系列df _ stock load[ signal ]=NP . sign(df _ stock load[ close ]-df _ stock load[ ma20 ])print(df _ stock load . head())的矢量化模式高开低走收盘成交量调整收盘Ma20信号日期2018-01-29 3587.0 3510.3 3563.6 3523.0 236000 3523.0 3454.3 1.02018-01-30 3523.1 3484.7 3511.5 3488.0 186400 3488.0 3461.3 1 . 1.02018

  我们可以使用values方法将链表从Pandas系列转换为numpy数组,并将NumPy数组作为参数传递来计算整个链表。numarrays的矢量化代码如下:

  #数字数组的矢量化方式df _ stock load[ signal ]=NP。符号(df _ stock load[ Close ]).值-df_stockload[Ma20].values)print(df_stockload.head()) 高开低走收盘成交量调整收盘Ma20信号日期2018-01-29 3587.0 3510.3 3563.6 3523.0 236000 3523.0 3454.3 1.02018-01-30 3523.1 3484.7 3511.5 3488.0 186400 3488.0执行效率对比#使用时间方法对比方法参考例程如下,需要导入时间模块:从导入时间开始timeitdef test1():for in _ loop(df _ stock load)def test2():ITER行_ loop ITER(df _ stock load)def test3():df _ stock load[ signal ]=df _ stock load。应用(lambda行:(NP。sign(row[ Close ]-row[ Ma20 ]),axis=1)def test 4():df _ stock load[ sign ]=NP。符号(df _ stock load[ Close ]-df _ stock load[值- df_stockload[Ma20].值)#for.在循环迭代方式t1=timeit(test1(), from __main__ import test1 ,number=100)#iterrows()遍历方式t2=timeit(test2(), from __main__ import test2 ,number=100)#apply()方法循环方式t3=timeit(test3(), from __main__ import test3 ,number=100)#Pandas系列的矢量化方式t4=timeit(test4(), from __main__ import test4 ,number=100)#Numpy数组的矢量化方式:t5=timeit(test5(), from __main__ import test5 ,number=100)print(t1,t2,t3,t4,t5)# 14 . 59684 . 68686868661总结

  可以看出循环执行的速度是最慢的,iterrows()针对熊猫的数据帧进行了优化,相比直接循环有显著提升应用()方法也是在行之间进行循环,但由于利用了类似Cython的迭代器的一系列全局优化,其效率要比iterrows高很多。

  NumPy数组的矢量化运行速度最快,其次是熊猫系列矢量化。

  由于矢量化是同时作用于整个序列的,可以节省更多的时间,相比使用标量操作更好,NumPy使用预编译的C代码在底层进行优化,同时也避免了熊猫系列操作过程中的很多开销,例如索引、数据类型等等,因此,NumPy数组的操作要比熊猫系列快得多。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: