自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析哪種更快?

新聞 大數(shù)據(jù)
用Python和Pandas進(jìn)行數(shù)據(jù)分析,很快就會(huì)用到循環(huán)。但在這其中,就算是較小的DataFrame,使用標(biāo)準(zhǔn)循環(huán)也比較耗時(shí)。

本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。

用Python和Pandas進(jìn)行數(shù)據(jù)分析,很快就會(huì)用到循環(huán)。

但在這其中,就算是較小的DataFrame,使用標(biāo)準(zhǔn)循環(huán)也比較耗時(shí)。

遇到較大的DataFrame時(shí),需要的時(shí)間會(huì)更長(zhǎng),會(huì)讓人更加頭疼。

現(xiàn)在,有人忍不了了。他是一位來(lái)自德國(guó)的數(shù)據(jù)分析師,名叫Benedikt Droste。

他說(shuō),當(dāng)自己花了大半個(gè)小時(shí)等待代碼執(zhí)行的時(shí)候,決定尋找速度更快的替代方案。

在給出的替代方案中,使用Numpy向量化,與使用標(biāo)準(zhǔn)循環(huán)相比,速度提升了71803倍。

Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

他是怎么實(shí)現(xiàn)的?我們一起來(lái)看看~

標(biāo)準(zhǔn)循環(huán)處理3年足球賽數(shù)據(jù):20.7秒

DataFrame是具有行和列的Pandas對(duì)象。如果使用循環(huán),需要遍歷整個(gè)對(duì)象。

Python不能利用任何內(nèi)置函數(shù),而且速度很慢。在Benedikt Droste的提供的示例中,是一個(gè)包含65列和1140行的Dataframe,包含了2016-2019賽季的足球賽結(jié)果。

需要解決的問(wèn)題是:創(chuàng)建一個(gè)新的列,用于指示某個(gè)特定的隊(duì)是否打了平局??梢赃@樣開(kāi)始:

  1. def soc_loop(leaguedf,TEAM,): 
  2.  leaguedf['Draws'] = 99999 
  3.  for row in range(0, len(leaguedf)): 
  4.  if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \ 
  5.  ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')): 
  6.  leaguedf['Draws'].iloc[row] = 'Draw' 
  7.  elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \ 
  8.  ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')): 
  9.  leaguedf['Draws'].iloc[row] = 'No_Draw' 
  10.  else
  11.  leaguedf['Draws'].iloc[row] = 'No_Game' 
Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

在這個(gè)案例中是阿森納,在實(shí)現(xiàn)目標(biāo)之前要確認(rèn)阿森納參加了哪些場(chǎng)比賽,是主隊(duì)還是客隊(duì)。但使用標(biāo)準(zhǔn)循環(huán)非常慢,執(zhí)行時(shí)間為20.7秒。

那么,怎么才能更有效率?

Pandas 內(nèi)置函數(shù): iterrows ()ー快321倍

在第一個(gè)示例中,循環(huán)遍歷了整個(gè)DataFrame。iterrows()為每一行返回一個(gè)Series,它以索引對(duì)的形式遍歷DataFrame,以Series的形式遍歷感興趣的列。這使得它比標(biāo)準(zhǔn)循環(huán)更快:

  1. def soc_iter(TEAM,home,away,ftr): 
  2.  #team, row['HomeTeam'], row['AwayTeam'], row['FTR'
  3.  if [((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D'))]: 
  4.  result = 'Draw' 
  5.  elif [((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D'))]: 
  6.  result = 'No_Draw' 
  7.  else
  8.  result = 'No_Game' 
  9.  return result 
Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

代碼運(yùn)行時(shí)間為68毫秒,比標(biāo)準(zhǔn)循環(huán)快321倍。但是,許多人建議不要使用它,因?yàn)槿匀挥懈斓倪x項(xiàng),而且iterrows()不能跨行保存dtype。

這意味著,如果你在DataFrame dtypes上使用iterrows(),可以更改它,但這會(huì)導(dǎo)致很多問(wèn)題。

一定要保存dtypes的話,你還可以使用itertuples()。這里我們不詳細(xì)討論 ,你可以在這里找到官方文件:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html

apply ()方法ー快811倍

apply 本身并不快,但與DataFrame結(jié)合使用時(shí),它具有優(yōu)勢(shì)。這取決于 apply 表達(dá)式的內(nèi)容。如果可以在 Cython 空間中執(zhí)行,那么apply要快得多,這里的示例就是這種情況。

大家可以在Lambda函數(shù)中使用apply。所要做的就是指定這個(gè)軸。在本文的示例中,想要執(zhí)行按列操作,要使用 axis 1:

Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

這段代碼甚至比之前的方法更快,完成時(shí)間為27毫秒。

Pandas向量化—快9280倍

此外,也可以利用向量化的優(yōu)點(diǎn)來(lái)創(chuàng)建非??斓拇a。

重點(diǎn)是避免像之前的示例中的Python級(jí)循環(huán),并使用優(yōu)化后的C語(yǔ)言代碼,這將更有效地使用內(nèi)存。只需要稍微修改一下函數(shù):

  1. def soc_iter(TEAM,home,away,ftr): 
  2.  df['Draws'] = 'No_Game' 
  3.  df.loc[((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D')), 'Draws'] = 'Draw' 
  4.  df.loc[((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D')), 'Draws'] = 'No_Draw' 

現(xiàn)在,可以用 Pandas 列作為輸入創(chuàng)建新列:

Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

在這種情況下,甚至不需要循環(huán)。所要做的就是調(diào)整函數(shù)的內(nèi)容。現(xiàn)可以直接將Pandas 列傳遞給函數(shù),從而獲得巨大的速度增益。

Numpy向量化—快71803倍

在上面的示例中,將將Pandas 列傳遞給函數(shù)。通過(guò)添加.values,可以得到一個(gè)Numpy數(shù)組:

Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

因?yàn)橐昧司植啃缘暮锰?,Numpy數(shù)組的速度非常快,代碼運(yùn)行時(shí)間僅為0.305毫秒,比一開(kāi)始使用的標(biāo)準(zhǔn)循環(huán)快71803倍。

誰(shuí)更強(qiáng)一目了然

最后,Benedikt Droste對(duì)上述方案進(jìn)行了總結(jié)。

他說(shuō),如果你使用Python、Pandas和Numpy進(jìn)行數(shù)據(jù)分析,總會(huì)有改進(jìn)代碼的空間。

在對(duì)上述五種方法進(jìn)行比較之后,哪個(gè)更快一目了然:

Pandas循環(huán)提速7萬(wàn)多倍!Python數(shù)據(jù)分析攻略

從這個(gè)圖中,可以得出兩個(gè)結(jié)論:

1、如果要使用循環(huán),則應(yīng)始終選擇apply方法。

2、否則,使用向量化是最好的,因?yàn)樗欤?/p>

 

責(zé)任編輯:張燕妮 來(lái)源: 量子位
相關(guān)推薦

2023-12-10 14:06:04

數(shù)據(jù)庫(kù)pythonduckdb

2021-02-17 13:20:51

forpandas語(yǔ)言

2020-06-05 14:29:07

PythonPandas數(shù)據(jù)分析

2024-01-09 13:58:22

PandasPython數(shù)據(jù)分析

2017-09-01 09:52:20

PythonPandas數(shù)據(jù)分析

2023-11-21 09:11:31

2023-01-28 10:09:00

Pandas數(shù)據(jù)分析Python

2022-11-11 11:35:14

2020-04-21 10:11:03

Python數(shù)據(jù)分析Pandas

2024-04-09 08:47:34

PandasRollingPython

2022-06-21 15:00:01

Python語(yǔ)言循環(huán)方式

2022-08-16 16:00:05

Python

2022-07-08 06:01:37

D-Tale輔助工具

2021-12-24 10:45:19

PandasLambda數(shù)據(jù)分析

2019-11-04 15:00:01

DatatableR語(yǔ)言數(shù)據(jù)科學(xué)

2020-07-07 14:35:41

Python數(shù)據(jù)分析命令

2022-03-24 09:36:28

Pandas數(shù)據(jù)分析代碼

2025-04-02 09:33:01

2023-05-05 18:45:21

Python人工智能機(jī)器學(xué)習(xí)

2023-11-15 18:03:11

Python數(shù)據(jù)分析基本工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)