一区二区日本_久久久久久久国产精品_无码国模国产在线观看_久久99深爱久久99精品_亚洲一区二区三区四区五区午夜_日本在线观看一区二区

pythondf遍歷得N種方式(小結(jié))

目錄

for…in 迭代循環(huán)

首先介紹Python中最常用得for…in循環(huán)遍歷得方式。for…in循環(huán)結(jié)構(gòu)用于遍歷列表、元組、字典、字符串、集合、文件等。其實(shí)for和in是兩個(gè)獨(dú)立得語(yǔ)法,for語(yǔ)句是Python內(nèi)置得迭代器工具,用于從可迭代容器對(duì)象(如列表、元組、字典、字符串、集合、文件等)中逐個(gè)讀取元素,直到容器中沒(méi)有更多元素為止,工具和對(duì)象之間只要遵循可迭代協(xié)議即可進(jìn)行迭代操作。in得存在使得python在操作可迭代對(duì)象時(shí)變得簡(jiǎn)單得多,用于配合for使用逐個(gè)取可迭代對(duì)象得元素。

for語(yǔ)句參與得具體迭代得過(guò)程為:可迭代對(duì)象通過(guò)iter方法返回迭代器,迭代器具有next方法,for循環(huán)不斷地調(diào)用next方法,每次按序返回迭代器中得一個(gè)值,直到迭代到最后,沒(méi)有更多元素時(shí)拋出異常StopIteration(Python會(huì)自動(dòng)處理異常)。模擬迭代得過(guò)程如下所示:

# 迭代得過(guò)程x = [1,2,3]its = x.__iter__() #列表是可迭代對(duì)象,否則會(huì)提示不是迭代對(duì)象print(its)# 打印結(jié)果:<list_iterator object at 0x100f32198>print(next(its)) # its包含此方法,說(shuō)明its是迭代器# 打印結(jié)果:1print(next(its)) # 打印結(jié)果:2print(next(its)) # 打印結(jié)果:3print(next(its)) # 打印結(jié)果:Traceback (most recent call last):     File "<stdin>", line 1, in <module>StopIteration

迭代得優(yōu)點(diǎn)是無(wú)需把所有元素一次加載到內(nèi)存中,可以在調(diào)用next方法時(shí)逐個(gè)返回元素,避免出現(xiàn)內(nèi)存空間不夠得情況。

使用for…in循環(huán)方式實(shí)現(xiàn)單均線突破策略。遍歷全部交易日得收盤價(jià)數(shù)值和Ma20數(shù)值,將收盤價(jià)數(shù)值減去Ma20數(shù)值,并使用np.sign()取差值符號(hào),當(dāng)收盤價(jià)在Ma20上方時(shí)差值為正,收盤價(jià)在Ma20上下方時(shí)差值為負(fù),由負(fù)轉(zhuǎn)正對(duì)應(yīng)為買點(diǎn),由正轉(zhuǎn)負(fù)對(duì)應(yīng)為賣點(diǎn)。如下所示

def forin_looping(df):    df['signal'] = 0 #df = df.assign(signal = 0)  #可采用assign新增一列    for i in np.arange(0,df.shape[0]):        df.iloc[i,df.columns.get_loc('signal')] = np.sign(df.iloc[i]['Close'] - df.iloc[i]['Ma20'])    return dfprint(forin_looping(df_stockload)[0:5])"""              High     Low    Open   Close  Volume  Adj Close    Ma20  signalDate                                                                         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.02018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.02018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.02018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0"""

iterrows()生成器方式

另一種Python中常用得遍歷方式為iterrows()生成器方式。所謂生成器其實(shí)是一種特殊得迭代器,內(nèi)部支持了迭代器協(xié)議。Python中提供生成器函數(shù)和生成器表達(dá)式兩種方式實(shí)現(xiàn)生成器,每次請(qǐng)求返回一個(gè)結(jié)果,不需要一次性構(gòu)建一個(gè)結(jié)果列表,節(jié)省了內(nèi)存空間。

在Python 3中可使用range返回一個(gè)迭代器,用來(lái)一次一個(gè)值地遍歷一個(gè)范圍.

# 生成器函數(shù)方式實(shí)現(xiàn)生成器def gensquares(N):?? ?for i in range(N):?? ??? ?yield i**2?? ? ? ??print(gensquares(5))#打印結(jié)果:<generator object gensquares at 0x11a35cf48>for i in gensquares(5):?? ?print(i)?# 打印結(jié)果:014916

其實(shí)yield就相當(dāng)于一個(gè)return,只是return返回得是值,但是yield返回得是生成器,除了這點(diǎn)其他都一樣,所以return也好yield也好都只能用在函數(shù)中。

生成器表達(dá)式方式實(shí)現(xiàn)生成器就是類似列表解析,按需產(chǎn)生結(jié)果得一個(gè)對(duì)象,例程代碼如下所示:

# 生成器表達(dá)式方式實(shí)現(xiàn)生成器print(x**2 for x in range(5))# 打印結(jié)果:<generator object <genexpr> at 0xb3d31fa4>print(list(x**2 for x in range(5)))# 打印結(jié)果:[0, 1, 4, 9, 16]

通過(guò)iterrows()遍歷方式計(jì)算股票每個(gè)交易日收盤價(jià)與Ma20差值,此處iterrows是對(duì)dataframe格式數(shù)據(jù)行進(jìn)行迭代得一個(gè)生成器,它返回每行得索引及包含行本身得對(duì)象,代碼如下所示:

#iterrows()遍歷方式def iterrows_loopiter(df):? ? df['signal'] = 0 #df = df.assign(signal = 0) ?#可采用assign新增一列? ? for index,row in df.iterrows():? ? ? ? df.loc[index, 'signal'] = np.sign(row['Close']-row['Ma20'])? ? return dfprint(iterrows_loopiter(df_stockload)[0:5])"""? ? ? ? ? ? ? High ? ? Low ? ?Open ? Close ?Volume ?Adj Close ? ?Ma20 ?signalDate ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??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.02018-01-31 ?3495.5 ?3454.7 ?3470.5 ?3480.8 ?207300 ? ? 3480.8 ?3466.8 ? ? 1.02018-02-01 ?3495.1 ?3424.4 ?3478.7 ?3447.0 ?260500 ? ? 3447.0 ?3469.9 ? ?-1.02018-02-02 ?3463.2 ?3388.9 ?3419.2 ?3462.1 ?208100 ? ? 3462.1 ?3473.4 ? ?-1.0"""

apply()循環(huán)方式

apply()方法可將函數(shù)應(yīng)用于dataframe特定行或列。函數(shù)由lambda方式在代碼中內(nèi)嵌實(shí)現(xiàn),lambda 為匿名函數(shù),可以省去定義函數(shù)得過(guò)程,讓代碼更加精簡(jiǎn)。lambda函數(shù)得末尾包含axis參數(shù),用來(lái)告知Pandas將函數(shù)運(yùn)用于行(axis = 1)或者列(axis = 0)。apply()方法循環(huán)方式實(shí)現(xiàn)得代碼如下所示:

df_stockload['signal'] = df_stockload.apply(lambda row: (np.sign(row['Close']-row['Ma20'])), axis = 1)print(df_stockload.head())"""              High     Low    Open   Close  Volume  Adj Close    Ma20  signalDate                                                                         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.02018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.02018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.02018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0

矢量化遍歷方式

此處我們主要處理一維數(shù)組之間得計(jì)算,那么矢量化方式可使用Pandas series 得矢量化方式和Numpy arrays得矢量化方式兩種。
先來(lái)看下Pandas series 得矢量化方式。

Pandas得DataFrame、series基礎(chǔ)單元數(shù)據(jù)結(jié)構(gòu)基于鏈表,因此可將函數(shù)在整個(gè)鏈表上進(jìn)行矢量化操作,而不用按順序執(zhí)行每個(gè)值。

Pandas包括了非常豐富得矢量化函數(shù)庫(kù),我們可把整個(gè)series(列)作為參數(shù)傳遞,對(duì)整個(gè)鏈表進(jìn)行計(jì)算。Pandas series 得矢量化方式實(shí)現(xiàn)代碼如下:

#Pandas series 得矢量化方式df_stockload['signal'] = np.sign(df_stockload['Close']-df_stockload['Ma20'])print(df_stockload.head())"""              High     Low    Open   Close  Volume  Adj Close    Ma20  signalDate                                                                         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.02018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.02018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.02018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0"""

對(duì)于Numpy arrays得矢量化方式,由于本例得矢量化運(yùn)算中只使用了series得數(shù)值,無(wú)需使用索引等信息,因此可將series轉(zhuǎn)換為array類型,節(jié)省操作過(guò)程中得很多開銷。

我們可使用values 方法將鏈表從Pandas series轉(zhuǎn)換為NumPy arrays,把NumPy array作為參數(shù)傳遞,對(duì)整個(gè)鏈表進(jìn)行計(jì)算。Numpy arrays得矢量化方式實(shí)現(xiàn)代碼如下:

#Numpy arrays得矢量化方式df_stockload['signal'] = np.sign(df_stockload['Close'].values-df_stockload['Ma20'].values)print(df_stockload.head())"""              High     Low    Open   Close  Volume  Adj Close    Ma20  signalDate                                                                         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.02018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.02018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.02018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0"""

執(zhí)行效率對(duì)比

#使用timeit方法對(duì)比方法參考例程如下,需要import timeit模塊:from timeit import timeitdef test1():? ? forin_looping(df_stockload)def test2():? ? iterrows_loopiter(df_stockload)def test3():? ? df_stockload['signal'] = df_stockload.apply(lambda row: (np.sign(row['Close'] - row['Ma20'])), axis=1)def test4():? ? df_stockload['signal'] = np.sign(df_stockload['Close']-df_stockload['Ma20'])def test5():? ? df_stockload['signal'] = np.sign(df_stockload['Close'].values - df_stockload['Ma20'].values)#for..in循環(huán)迭代方式t1 = timeit('test1()', 'from __main__ import test1', number=100)#iterrows()遍歷方式t2 = timeit('test2()', 'from __main__ import test2', number=100)#apply()方法循環(huán)方式t3 = timeit('test3()', 'from __main__ import test3', number=100)#Pandas series 得矢量化方式t4 = timeit('test4()', 'from __main__ import test4', number=100)#Numpy arrays得矢量化方式:t5 = timeit('test5()', 'from __main__ import test5', number=100)print(t1,t2,t3,t4,t5)#14.943237108999998 8.827773373 0.5511996379999999 0.02215727200000117 0.012933490000001768

總結(jié)

可以看出循環(huán)執(zhí)行得速度是最慢得,iterrows()針對(duì)Pandas得dataframe進(jìn)行了優(yōu)化,相比直接循環(huán)有顯著提升。apply()方法也是在行之間進(jìn)行循環(huán),但由于利用了類似Cython得迭代器得一系列全局優(yōu)化,其效率要比iterrows高很多。
NumPy arrays得矢量化運(yùn)行速度最快,其次是Pandas series矢量化。

由于矢量化是同時(shí)作用于整個(gè)序列得,可以節(jié)省更多得時(shí)間,相比使用標(biāo)量操作更好,NumPy使用預(yù)編譯得C代碼在底層進(jìn)行優(yōu)化,同時(shí)也避免了Pandas series操作過(guò)程中得很多開銷,例如索引、數(shù)據(jù)類型等等,因此,NumPy arrays得操作要比Pandas series快得多。

到此這篇關(guān)于python df遍歷得N種方式(小結(jié))得內(nèi)容就介紹到這了,更多相關(guān)python df遍歷內(nèi)容請(qǐng)搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!

聲明:所有內(nèi)容來(lái)自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
發(fā)表評(píng)論
更多 網(wǎng)友評(píng)論1 條評(píng)論)
暫無(wú)評(píng)論

返回頂部

主站蜘蛛池模板: 日韩一区在线视频 | 日韩在线免费视频 | 日韩精品免费一区二区在线观看 | 美女天天干 | 亚洲视频在线免费观看 | 国产中文| 韩日一区二区三区 | 亚洲视频免费在线 | 国产亚洲一区二区三区在线 | 国产精品久久免费观看 | 久久久久久国产精品免费免费狐狸 | 久久国产精品一区二区 | 成年人免费看 | 欧美精品成人一区二区三区四区 | 欧美xxxx做受欧美 | 国产一区二区三区免费观看在线 | 国产一区二区三区四区 | 91在线精品秘密一区二区 | 亚洲成人一区 | 精品国产亚洲一区二区三区大结局 | 欧美日韩在线成人 | 一级片av | 亚洲精品美女在线观看 | 久久国产精品一区二区三区 | 日韩国产一区二区三区 | 在线观看免费福利 | 国产精品久久久久久久久久妞妞 | 欧美成人精品激情在线观看 | av男人的天堂在线 | 涩涩视频在线看 | 91视频免费观看 | 久草在线中文888 | 爱爱免费视频网站 | 日韩在线播放av | 一区二区三区欧美 | 国产欧美在线播放 | 国产精品一区二区三区四区 | 亚洲性在线 | 免费成人午夜 | 国产精品一区二区久久久久 | 亚洲国产精品人人爽夜夜爽 |