亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python df遍歷的N種方式(小結(jié))

 更新時間:2022年07月25日 09:11:11   作者:多凡  
本文主要介紹了python df遍歷的N種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

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

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

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

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 df
print(forin_looping(df_stockload)[0:5])
"""
              High     Low    Open   Close  Volume  Adj Close    Ma20  signal
Date                                                                         
2018-01-29  3587.0  3510.3  3563.6  3523.0  236000     3523.0  3454.3     1.0
2018-01-30  3523.1  3484.7  3511.5  3488.0  186400     3488.0  3461.3     1.0
2018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.0
2018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.0
2018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0
"""

iterrows()生成器方式

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

在Python 3中可使用range返回一個迭代器,用來一次一個值地遍歷一個范圍.

# 生成器函數(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é)果:
0
1
4
9
16

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

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

# 生成器表達式方式實現(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]

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

#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 df
print(iterrows_loopiter(df_stockload)[0:5])

"""
? ? ? ? ? ? ? High ? ? Low ? ?Open ? Close ?Volume ?Adj Close ? ?Ma20 ?signal
Date ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
2018-01-29 ?3587.0 ?3510.3 ?3563.6 ?3523.0 ?236000 ? ? 3523.0 ?3454.3 ? ? 1.0
2018-01-30 ?3523.1 ?3484.7 ?3511.5 ?3488.0 ?186400 ? ? 3488.0 ?3461.3 ? ? 1.0
2018-01-31 ?3495.5 ?3454.7 ?3470.5 ?3480.8 ?207300 ? ? 3480.8 ?3466.8 ? ? 1.0
2018-02-01 ?3495.1 ?3424.4 ?3478.7 ?3447.0 ?260500 ? ? 3447.0 ?3469.9 ? ?-1.0
2018-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)嵌實現(xiàn),lambda 為匿名函數(shù),可以省去定義函數(shù)的過程,讓代碼更加精簡。lambda函數(shù)的末尾包含axis參數(shù),用來告知Pandas將函數(shù)運用于行(axis = 1)或者列(axis = 0)。apply()方法循環(huán)方式實現(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  signal
Date                                                                         
2018-01-29  3587.0  3510.3  3563.6  3523.0  236000     3523.0  3454.3     1.0
2018-01-30  3523.1  3484.7  3511.5  3488.0  186400     3488.0  3461.3     1.0
2018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.0
2018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.0
2018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0

矢量化遍歷方式

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

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

Pandas包括了非常豐富的矢量化函數(shù)庫,我們可把整個series(列)作為參數(shù)傳遞,對整個鏈表進行計算。Pandas series 的矢量化方式實現(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  signal
Date                                                                         
2018-01-29  3587.0  3510.3  3563.6  3523.0  236000     3523.0  3454.3     1.0
2018-01-30  3523.1  3484.7  3511.5  3488.0  186400     3488.0  3461.3     1.0
2018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.0
2018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.0
2018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0
"""

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

我們可使用values 方法將鏈表從Pandas series轉(zhuǎn)換為NumPy arrays,把NumPy array作為參數(shù)傳遞,對整個鏈表進行計算。Numpy arrays的矢量化方式實現(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  signal
Date                                                                         
2018-01-29  3587.0  3510.3  3563.6  3523.0  236000     3523.0  3454.3     1.0
2018-01-30  3523.1  3484.7  3511.5  3488.0  186400     3488.0  3461.3     1.0
2018-01-31  3495.5  3454.7  3470.5  3480.8  207300     3480.8  3466.8     1.0
2018-02-01  3495.1  3424.4  3478.7  3447.0  260500     3447.0  3469.9    -1.0
2018-02-02  3463.2  3388.9  3419.2  3462.1  208100     3462.1  3473.4    -1.0
"""

執(zhí)行效率對比

#使用timeit方法對比方法參考例程如下,需要import timeit模塊:
from timeit import timeit
def 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()針對Pandas的dataframe進行了優(yōu)化,相比直接循環(huán)有顯著提升。apply()方法也是在行之間進行循環(huán),但由于利用了類似Cython的迭代器的一系列全局優(yōu)化,其效率要比iterrows高很多。
NumPy arrays的矢量化運行速度最快,其次是Pandas series矢量化。

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

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

您可能感興趣的文章:

相關(guān)文章

  • Jmeter通過OS進程取樣器調(diào)用Python腳本實現(xiàn)參數(shù)互傳

    Jmeter通過OS進程取樣器調(diào)用Python腳本實現(xiàn)參數(shù)互傳

    這篇文章主要介紹了Jmeter通過OS進程取樣器調(diào)用Python腳本實現(xiàn)參數(shù)互傳,描述在cmd中調(diào)用上面的Python腳本并傳入兩個參數(shù)展開主題,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • 40行Python代碼實現(xiàn)天氣預(yù)報和每日雞湯推送功能

    40行Python代碼實現(xiàn)天氣預(yù)報和每日雞湯推送功能

    這篇文章主要介紹了通過40行Python代碼實現(xiàn)天氣預(yù)報和每日雞湯推送功能,代碼簡單易懂,非常不錯具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2020-02-02
  • Pandas常用的讀取和保存數(shù)據(jù)的函數(shù)使用(csv,mysql,json,excel)

    Pandas常用的讀取和保存數(shù)據(jù)的函數(shù)使用(csv,mysql,json,excel)

    本文主要介紹了Pandas常用的讀取和保存數(shù)據(jù)的函數(shù)使用,主要包括csv,mysql,json,excel這幾種方式,具有一定的參考價值,感興趣的可以了解一下
    2022-01-01
  • python3.5 tkinter實現(xiàn)頁面跳轉(zhuǎn)

    python3.5 tkinter實現(xiàn)頁面跳轉(zhuǎn)

    這篇文章主要為大家詳細介紹了python3.5 tkinter實現(xiàn)頁面跳轉(zhuǎn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • python中元組的用法整理

    python中元組的用法整理

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python中元組的用法及相關(guān)實例,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • python實用的快捷語法技巧大全

    python實用的快捷語法技巧大全

    初識Python語言,覺得python滿足了我上學(xué)時候?qū)幊陶Z言的所有要求,下面這篇文章主要給大家介紹了關(guān)于python實用的快捷語法技巧的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Python中標準模塊importlib詳解

    Python中標準模塊importlib詳解

    這篇文章主要給大家詳細介紹了Python中標準模塊importlib的使用方法和示例,非常簡單,有需要的小伙伴可以參考下
    2017-04-04
  • Python模塊搜索路徑代碼詳解

    Python模塊搜索路徑代碼詳解

    這篇文章主要介紹了Python模塊搜索路徑代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Django跨域請求問題的解決方法示例

    Django跨域請求問題的解決方法示例

    這篇文章主要給大家介紹了關(guān)于Django跨域請求問題解決的相關(guān)資料,文中介紹的實現(xiàn)方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里設(shè)置響應(yīng)頭,只能控制單個接口,需要的朋友可以參考下
    2018-06-06
  • Python+Pytorch實戰(zhàn)之彩色圖片識別

    Python+Pytorch實戰(zhàn)之彩色圖片識別

    這篇文章主要為大家詳細介紹了如何利用Python+Pytorch實現(xiàn)彩色圖片識別功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-09-09

最新評論