<label id="qqrfm"><meter id="qqrfm"></meter></label>
      <span id="qqrfm"></span><label id="qqrfm"><meter id="qqrfm"></meter></label>

        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        如果你使用 python 和 pandas 進行數(shù)據(jù)分析,那么不久你就會第一次使用循環(huán)了。然而,即使是對小型數(shù)據(jù)集,使用標準循環(huán)也很費時,你很快就會意識到大型數(shù)據(jù)幀可能需要很長的時間。當我第一次等了半個多小時來執(zhí)行代碼時,我找到了接下來想與你共享的替代方案。

        標準循環(huán)

        數(shù)據(jù)幀是具有行和列的 pandas 對象。如果使用循環(huán),則將遍歷整個對象。python 不能用任何內(nèi)置函數(shù),而且速度非常慢。在我們的示例中,我們得到了一個具有 65 列和 1140 行的數(shù)據(jù)幀,它包含 2016-2019 賽季的足球比賽結(jié)果。我們要創(chuàng)建一個新的列來指示某個特定的隊是否打過平局。我們可以這樣開始:
        leaguedf['Draws'] = 99999    


        for row in range(0, len(leaguedf)):    


        if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \    


        ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')):    


        leaguedf['Draws'].iloc[row] = 'Draw'    


        elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \    


        ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')):    


        leaguedf['Draws'].iloc[row] = 'No_Draw'    


        else:    


        leaguedf['Draws'].iloc[row] = 'No_Game'
        def soc_loop(leaguedf,TEAM,):    
         
        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        因為我們的數(shù)據(jù)框架中包含了英超的每一場比賽,所以我們必須檢查我們感興趣的球隊(阿森納)是否參加過比賽,是否適用,他們是主隊還是客隊。如你所見,這個循環(huán)非常慢,需要 207 秒才能執(zhí)行。讓我們看看如何提高效率。

        pandas 內(nèi)置函數(shù):iterrow()——快 321 倍

        在第一個示例中,我們循環(huán)訪問了整個數(shù)據(jù)幀。iterrows()為每行返回一個序列,因此它以一對索引的形式在數(shù)據(jù)幀上迭代,而感興趣的列以序列的形式迭代。這使得它比標準循環(huán)更快:
        def soc_iter(TEAM,home,away,ftr):

                #team, row['HomeTeam'], row['AwayTeam'], row['FTR']    

                if [((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D'))]:    

                        result = 'Draw'    

               elif [((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D'))]:    

                      result = 'No_Draw'    

               else:    

                      result = 'No_Game'    

               return result
        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        代碼運行需要 68 毫秒,比標準循環(huán)快 321 倍。但是,許多人建議不要使用它,因為仍然有更快的方法,并且 iterrows() 不保留跨行的數(shù)據(jù)類型。這意味著,如果在數(shù)據(jù)幀上使用 iterrow(),則可以更改數(shù)據(jù)類型,這會導(dǎo)致很多問題。要保留數(shù)據(jù)類型,還可以使用 itertuples()。我們不會在這里詳細討論,因為我們要關(guān)注效率。你可以在這里找到官方文件:

        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html?source=post_page-----805030df4f06----------------------

        apply()方法——快 811 倍

        apply 本身并不快,但與數(shù)據(jù)幀結(jié)合使用時具有優(yōu)勢。這取決于應(yīng)用表達式的內(nèi)容。如果可以在 Cython 空間中執(zhí)行,則速度會更快(在這里就是這種情況)。

        我們可以將 apply 與 Lambda 函數(shù)一起使用。我們要做的就是指定軸。在這種情況下,我們必須使用 axis=1,因為我們要執(zhí)行一個列操作:

        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        此代碼甚至比以前的方法更快,只需要 27 毫秒就能完成。

        pandas 矢量化——快 9280 倍

        現(xiàn)在我們可以討論一個新話題了。我們利用矢量化的優(yōu)點來創(chuàng)建真正快速的代碼。重點是避免像前面的例子 [1] 中那樣的 Python 級循環(huán),并使用優(yōu)化的 C 代碼,這個代碼使用內(nèi)存的效率更高。我們只需要稍微修改函數(shù): 

        df['Draws'] = 'No_Game'    

                df.loc[((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D')), 'Draws'] = 'Draw'    

               df.loc[((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D')), 'Draws'] = 'No_Draw'
               def soc_iter(TEAM,home,away,ftr):    
         
        現(xiàn)在我們可以用 pandas series 作為輸入創(chuàng)建新列: 

        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        在這種情況下,我們甚至不需要循環(huán)。我們要做的就是調(diào)整函數(shù)的內(nèi)容。現(xiàn)在我們可以直接將 pandas series 傳遞給我們的函數(shù),這會導(dǎo)致巨大的速度增益。

        Numpy 矢量化——速度快 71.803 倍

        在前面的示例中,我們將 pandas series 傳遞給了函數(shù)。通過添加.values,我們收到一個 Numpy 數(shù)組:

        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        Numpy 數(shù)組非常快,我們的代碼運行時間為 0305 毫秒,比開始使用的標準循環(huán)快 71803 倍。

        結(jié)論

        如果您使用 python、pandas 和 Numpy 進行數(shù)據(jù)分析,那么代碼總會有一些改進空間。我們比較了五種不同的方法,在計算的基礎(chǔ)上增加了一個新的列到我們的數(shù)據(jù)框架中。我們注意到在速度方面存在巨大差異:

        數(shù)據(jù)處理必看:如何讓你的 pandas 循環(huán)加快 71803 倍

        如果你從這篇文章中選擇兩條規(guī)則,我會很高興:
        • 如果確定需要使用循環(huán),則應(yīng)始終選擇 apply 方法
        • 否則,矢量化總是更好的,因為它更快
           
        via:https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06

        來源 | 雷鋒網(wǎng)雷鋒網(wǎng)
        作者 | skura

        上一篇:科技部發(fā)布新一批國家新一代人工智能開放創(chuàng)新平臺
        下一篇:AI ProCon 2019 AI開發(fā)者大會

        主站蜘蛛池模板: 亚洲国产精品无码AAA片| 亚洲国产精品尤物yw在线| 亚洲国产日韩一区高清在线| j8又粗又长又硬又爽免费视频| 国产国产人免费视频成69大陆| 亚洲成av人在线观看网站| 成人爽A毛片免费看| 亚洲精品无码少妇30P| 最近中文字幕免费mv视频8| 日韩亚洲国产综合高清| 国产亚洲av人片在线观看| 视频一区在线免费观看| 亚洲精品乱码久久久久久蜜桃| 亚洲阿v天堂在线2017免费| 亚洲精品无码不卡在线播放HE | 亚洲av日韩综合一区二区三区| 成人免费午夜视频| 美女羞羞视频免费网站| 亚洲中文字幕在线第六区| 久久久久久国产精品免费免费男同| 久久久亚洲裙底偷窥综合| 免费一本色道久久一区| 国产亚洲福利一区二区免费看| 国产综合亚洲专区在线| 久久午夜羞羞影院免费观看| 亚洲啪啪免费视频| 免费国产小视频在线观看| 国产一级高青免费| 亚洲第一区视频在线观看| AV片在线观看免费| jizz免费一区二区三区| 911精品国产亚洲日本美国韩国| 最近最好的中文字幕2019免费 | 亚洲一级片在线播放| 国产精品四虎在线观看免费| 日本高清不卡中文字幕免费| 亚洲一区二区三区电影| 曰皮全部过程视频免费国产30分钟| 久久av免费天堂小草播放| 亚洲国产精品成人精品小说| 亚洲国产成人精品女人久久久|