<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          獨家 | 淺談Python/Pandas中管道的用法

          共 6036字,需瀏覽 13分鐘

           ·

          2021-04-07 17:09

          作者:Gregor Scheithauer博士

          翻譯:王闖(Chuck)

          校對:歐陽錦


          本文約2000字,建議閱讀5分鐘

          本文介紹了如何在Python/Pandas中運用管道的概念,以使代碼更高效易讀。

           

          圖片來自Unsplash,JJ Ying上傳
           

          簡介

           
          我是R語言的忠實粉絲,并且靠它吃飯。特別提一下Tidyverse,它是一個功能強(qiáng)大、簡潔易懂且文檔齊全的數(shù)據(jù)科學(xué)平臺。我在此向每一位初學(xué)者強(qiáng)烈推薦免費的在線電子書R for Data Science。
           
          然而,我所在團(tuán)隊使用的編程語言卻是Python/Pandas,它也是一個出色的數(shù)據(jù)科學(xué)平臺。最大的區(qū)別之一(至少對我來說)是如何編寫Python代碼,這與R代碼非常不同——這跟語法沒什么直接關(guān)系。
           
          R語言的眾多優(yōu)點之一是它在編程中引入了管道(pipe)的概念。這會讓你的代碼更具有效性和可讀性。一個范例詳見 Soner Y?ld?r?m發(fā)表的帖子The Flawless Pipes of Tidyverse。
           
          我在這里對照他的帖子,向您展示如何在Pandas中使用管道(也稱方法鏈,method chaining)。
           

          什么是管道?

           
          根據(jù)R magrittr包文檔[1]所述,代碼中使用管道的優(yōu)點如下:

          • 使數(shù)據(jù)處理的順序結(jié)構(gòu)化為從左到右(而不是從內(nèi)到外);

          • 避免嵌套函數(shù)的調(diào)用;

          • 最大限度地減少對局部變量和函數(shù)定義的需求;

          • 可以輕松地在數(shù)據(jù)處理序列中的任何位置添加步驟。


          不使用管道的R語言示例(請參閱[2])
           
          下面的代碼是一個典型示例。我們將函數(shù)調(diào)用的結(jié)果保存在變量中,如foo_foo_1,這樣做的唯一目的就是將其傳遞到下一個函數(shù)調(diào)用中,如scoop()。
           
          這導(dǎo)致許多變量的命名可能沒那么有意義,結(jié)果增加了代碼的復(fù)雜性。

           foo_foo_1 <- hop(foo_foo, through = forest)foo_foo_2 <- scoop(foo_foo_1, up = field_mice)foo_foo_3 <- bop(foo_foo_2, on = head)

          使用管道的R語言示例(請參閱[2])
           
          在R語言中使用管道的語法為%>%。它可以使多個函數(shù)鏈接起來使用。在下面的示例中,請嘗試以如下方式閱讀代碼:
           
          1. 我要評估/處理變量foo_foo
          2. 我要foo_foo跳過森林,然后,
          3. 我要foo_foo挖起田鼠,最后,
          4. 我要foo_foo敲在頭上

          foo_foo %>%  hop(through = forest) %>%  scoop(up = field_mice) %>%  bop(on = head)

          請注意,數(shù)據(jù)集是一個名詞,而函數(shù)是動詞。你現(xiàn)在可能理解了為什么說管道增加了代碼的可讀性。
           
          為了更好地理解管道的工作方式,下面給出了解釋前的代碼版本:
           
          bop( scoop(    hop(foo_foo, through = forest),    up = field_mice  ),   on = head)
           
          Python/Pandas中的管道(或方法鏈)
           
          由于Python中沒有magrittr包,因此必須另尋他法。在Pandas中,大多數(shù)數(shù)據(jù)框函數(shù)都會返回數(shù)據(jù)集本身,我們將利用這一事實。這被稱之為方法鏈。讓我們繼續(xù)以foo_foo為例。
           
          假設(shè)我們有一段Python代碼如下:
           
          foo_foo_1 = hop(foo_foo, through = forest)foo_foo_2 = scoop(foo_foo_1, up = field_mice)foo_foo_3 = bop(foo_foo_2, on = head)

          把它鏈接起來之后變成如下樣子:
           
          foo_foo.hop(through = forest).scoop(up = field_mice).bop(on = head)

          已經(jīng)很接近目標(biāo)了,但還沒到。需要做一個小調(diào)整,即用小括號()將代碼括起來,使其變成我們想要得到的樣子。具體樣例請查看如下代碼:
           
          (    foo_foo    .hop(through = forest)    .scoop(up = field_mice)    .bop(on = head))

          管道概念的優(yōu)點
           
          我喜歡這種編程風(fēng)格。在我看來,引入管道概念可以帶來如下優(yōu)點
           
          1. 使你的代碼對于團(tuán)隊中的其他數(shù)據(jù)科學(xué)家(以及你自己以后閱讀)而言更具可讀性;
          2. 或多或少避免了無意義的局部變量;
          3. 可以在數(shù)據(jù)評估過程中快速添加或刪除函數(shù)功能;
          4. 讓代碼遵循你在數(shù)據(jù)評估和分析過程中的思路(遵循名詞-動詞范式)。
           
          引用:R管道
           
          [1] magrittr包:
          https://magrittr.tidyverse.org/
          [2] R for Data Science書中的Pipes章:

          https://r4ds.had.co.nz/pipes.html?q=pipe#pipes

           

          Python中的無縫管道(即方法鏈)

           
          我將對照SonerY?ld?r?m的文章,讓您對比學(xué)習(xí)如何在R和Python中使用管道/方法鏈。Soner使用的是Kaggle上的Melbourne housing(墨爾本住房)數(shù)據(jù)集。你可以下載數(shù)據(jù)集,并和我一起演練一下。
           

          讀取數(shù)據(jù)集并導(dǎo)入相關(guān)包


           # import libsimport pandas as pd

          # read datamelb = pd.read_csv("../01-data/melb_data.csv")# Have a quick look at the data( melb .head())
           

          圖片來自作者

           

          篩選,分組并生成新變量

           
          接下來的示例對住房按距離小于2來進(jìn)行篩選,按照類型進(jìn)行分組,然后計算每個類型分組的平均價格。然后進(jìn)行一些格式化。
           
          (  melb  .query("Distance < 2") # query equals filter in Pandas   .filter(["Type", "Price"]) # select the columns Type and Price    .groupby("Type")    .agg("mean")   .reset_index()     .set_axis(["Type", "averagePrice"], axis = 1, inplace = False)
           

          圖片來自作者

           
          接下來的示例,我們將使用多個條件進(jìn)行篩選并計算其他特征。請注意,可以使用內(nèi)置函數(shù)agg(用于數(shù)據(jù)聚合)。就我個人而言,我通常會將assign與lambda結(jié)合使用。代碼和運行結(jié)果如下。
           
          (    melb    .query("Distance < 2 & Rooms > 2")     .filter(["Type", "Price"])     .groupby("Type")    .agg(["mean", "count"])    .reset_index()     .set_axis(["Type", "averagePrice", "numberOfHouses"], axis = 1, inplace = False)    .assign(averagePriceRounded = lambda x: x["averagePrice"].round(1)))
           

          圖片來自作者

           

          排序

           
          下一個示例展示了如何對不同區(qū)域(僅指以字符串South開頭的區(qū)域)的住房按照平均距離來進(jìn)行排序。
           
          (    melb    .query('Regionname.str.startswith("South")', engine = 'python')     .filter(["Type", "Regionname", "Distance"])    .groupby(["Regionname", "Type"])    .agg(["mean"])    .reset_index()    .set_axis(["Regionname", "Type", "averageDistance"], axis = 1, inplace = False)    .sort_values(by = ['averageDistance'], ascending = False))

          圖片來自作者

           

          為不同區(qū)域的平均距離繪制條形圖

           
          管道概念的妙處是,它不僅可以用于評估或處理數(shù)據(jù),也可以與繪圖一起使用。我個人強(qiáng)烈推薦繪圖庫plotnine - 它是Python圖形語法的一個很好的實現(xiàn),某種程度上說是R語言中g(shù)gplot2 包的翻版。你可以在Medium上找到更多有關(guān)plotenine的文章。
           
          不過,如果只是想先粗略地看一下數(shù)據(jù),Pandas plot功能則非常值得一試。
           
          (    melb    #.query('Regionname.str.startswith("South")', engine = 'python')     .filter(["Regionname", "Distance"])    .groupby(["Regionname"])    .agg(["mean"])    .reset_index()    .set_axis(["Regionname", "averageDistance"],axis = 1, inplace = False)    .set_index("Regionname")    .sort_values(by = ['averageDistance'], ascending = False)    .plot(kind = "bar"))

          圖片來自作者

           

          使用直方圖繪制價格分布


          (    melb    .Price # getting one specific variable     .hist())

          圖片來自作者

           

          結(jié)語

           
          在本文中,我鼓勵大家在Python代碼中使用類似R語言中的管道和方法鏈,以提高代碼可讀性和效率。我重點介紹了管道的一些優(yōu)點,然后我們將這一概念應(yīng)用于住房數(shù)據(jù)。我特別展示了如何進(jìn)行數(shù)據(jù)讀取,數(shù)據(jù)篩選和分組,計算新變量以及如何繪圖。我再次安利下plotnine包,它能幫你得到更好的可視化效果。

          原文標(biāo)題:
          The Flawless Pipes of Python/Pandas
          原文鏈接:
          https://towardsdatascience.com/the-flawless-pipes-of-python-pandas-30f3ee4dffc2
           

          參考資料 


          • Melbourne Housing Snapshot | Kaggle:https://www.kaggle.com/dansbecker/melbourne-housing-snapshot

          • Tidyverse:https://www.tidyverse.org/

          • The Flawless Pipes of Tidyverse. Exploratory data analysis made easy | by Soner Y?ld?r?m | Mar, 2021 | Towards Data Science:ttps://towardsdatascience.com/the-flawless-pipes-of-tidyverse-bb2ab3c5399f

          • Welcome | R for Data Science (had.co.nz):https://r4ds.had.co.nz/

          • 18 Pipes | R for Data Science (had.co.nz):https://r4ds.had.co.nz/pipes.html?q=pipe#pipes

          • Data visualization in Python like in R’s ggplot2 | by Dr. Gregor Scheithauer | Medium:https://gscheithauer.medium.com/data-visualization-in-python-like-in-rs-ggplot2-bc62f8debbf5

           
          編輯:于騰凱
          校對:楊學(xué)俊




          譯者簡介






          王闖(Chuck),臺灣清華大學(xué)資訊工程碩士。曾任奧浦諾管理咨詢公司數(shù)據(jù)分析主管,現(xiàn)任尼爾森市場研究公司數(shù)據(jù)科學(xué)經(jīng)理。很榮幸有機(jī)會通過數(shù)據(jù)派THU微信公眾平臺和各位老師、同學(xué)以及同行前輩們交流學(xué)習(xí)。

          翻譯組招募信息

          工作內(nèi)容:需要一顆細(xì)致的心,將選取好的外文文章翻譯成流暢的中文。如果你是數(shù)據(jù)科學(xué)/統(tǒng)計學(xué)/計算機(jī)類的留學(xué)生,或在海外從事相關(guān)工作,或?qū)ψ约和庹Z水平有信心的朋友歡迎加入翻譯小組。

          你能得到:定期的翻譯培訓(xùn)提高志愿者的翻譯水平,提高對于數(shù)據(jù)科學(xué)前沿的認(rèn)知,海外的朋友可以和國內(nèi)技術(shù)應(yīng)用發(fā)展保持聯(lián)系,THU數(shù)據(jù)派產(chǎn)學(xué)研的背景為志愿者帶來好的發(fā)展機(jī)遇。

          其他福利:來自于名企的數(shù)據(jù)科學(xué)工作者,北大清華以及海外等名校學(xué)生他們都將成為你在翻譯小組的伙伴。


          點擊文末“閱讀原文”加入數(shù)據(jù)派團(tuán)隊~



          轉(zhuǎn)載須知

          如需轉(zhuǎn)載,請在開篇顯著位置注明作者和出處(轉(zhuǎn)自:數(shù)據(jù)派ID:DatapiTHU),并在文章結(jié)尾放置數(shù)據(jù)派醒目二維碼。有原創(chuàng)標(biāo)識文章,請發(fā)送【文章名稱-待授權(quán)公眾號名稱及ID】至聯(lián)系郵箱,申請白名單授權(quán)并按要求編輯。

          發(fā)布后請將鏈接反饋至聯(lián)系郵箱(見下方)。未經(jīng)許可的轉(zhuǎn)載以及改編者,我們將依法追究其法律責(zé)任。



          點擊“閱讀原文”擁抱組織



          瀏覽 74
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色录像网址 | www.操逼操逼 | 成人激情视频图片播放 | а 中文在线天堂精品 | 大香蕉综合|