欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

今天小編給大家分享一下Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

創(chuàng)新互聯(lián)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比黑龍江網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式黑龍江網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋黑龍江地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴(lài)。

為什么是鏈?zhǔn)秸{(diào)用?

鏈?zhǔn)秸{(diào)用,或者也可以稱(chēng)為方法鏈(Method Chaining),從字面意思上來(lái)說(shuō)就是將一些列的操作或函數(shù)方法像鏈子一樣穿起來(lái)的 Code 方式。

我最開(kāi)始感知鏈?zhǔn)秸{(diào)用的「美」,還要從使用 R 語(yǔ)言的管道操作符開(kāi)始。

library(tidyverse) mtcars %>%     group_by(cyl) %>%     summarise(meanmeanOfdisp = mean(disp)) %>%     ggplot(aes(x=as.factor(cyl), y=meanOfdisp, fill=as.factor(seq(1,3))))+    geom_bar(stat = 'identity') +     guides(fill=F)

對(duì)于 R user 來(lái)說(shuō),對(duì)于這一段代碼很快就能明白整個(gè)流程步驟是怎樣的。這一切都是通過(guò)符號(hào)%>%(管道操作符)談起。

通過(guò)管道操作符,我們可以將左邊事物傳遞給下一個(gè)事物。這里我將mtcars數(shù)據(jù)集傳遞到group_by 函數(shù)中,然后將得到后的結(jié)果再傳遞到summarize函數(shù),最后傳遞到ggplot函數(shù)中進(jìn)行可視化繪制。

如果我沒(méi)有學(xué)會(huì)鏈?zhǔn)秸{(diào)用,那么最開(kāi)始學(xué)習(xí) R 語(yǔ)言的我一定是這樣寫(xiě):

library(tidyverse)  cyl4 <- mtcars[which(mtcars$cyl==4), ]  cyl6 <- mtcars[which(mtcars$cyl==6), ]  cyl8 <- mtcars[which(mtcars$cyl==8), ]  data <- data.frame(    ccyl = c(4, 6, 8),    meanOfdisp = c(mean(cyl4$disp), mean(cyl6$disp), mean(cyl8$disp))  )  graph <- ggplot(datadata=data, aes(x=factor(cyl), y=meanOfdisp,                                  fill = as.factor(seq(1,3))))   graph <- graph + geom_bar(stat = 'identity') + guides(fill=F)  graph

如果不使用管道操作符,那么我將會(huì)進(jìn)行不必要的賦值,并且覆蓋原有的數(shù)據(jù)對(duì)象,但其實(shí)當(dāng)中產(chǎn)生的cyl#、data 其實(shí)最后都只是為graph 這一張圖片所服務(wù)的,因此導(dǎo)致的問(wèn)題就是代碼會(huì)變得冗余。

鏈?zhǔn)秸{(diào)用在極大程度簡(jiǎn)潔代碼的同時(shí),也提高了代碼的可讀性,能夠很快速地了解到每一步都是在做什么。這種方式對(duì)于做數(shù)據(jù)分析或處理數(shù)據(jù)時(shí)是十分有用,減少創(chuàng)建不必要的變量時(shí),能夠以快速、簡(jiǎn)單的方式進(jìn)行探索。

你能在很多地方見(jiàn)到鏈?zhǔn)秸{(diào)用或者管道操作的身影,這里我舉除了 R 語(yǔ)言以外的兩個(gè)典型例子。

一個(gè)是 Shell 語(yǔ)句:

echo "`seq 1 100`" | grep -e "^[3-4].*" | tr "3" "*"

在 shell 語(yǔ)句中使用「|」管道操作符能夠快速地實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,這里我首先是打印1-100的所有整數(shù),然后將其傳入到grep方法中,提取由 3 或 4 開(kāi)頭的所有部分,再將這部分傳入到tr 方法中,并對(duì)數(shù)字包含 3 的部分用星號(hào)替換。結(jié)果如下:

另外一個(gè)是 Scala 語(yǔ)言:

object Test {    def main(args: Array[String]): Unit = {      val numOfseq = (1 to 100).toList      val chain = numOfseq.filter(_%2==0)        .map(_*2)        .take(10)    }  }

在這段示例中,首先numOfseq 這個(gè)變量包含了從 1-100 的所有整數(shù),然后從chain部分開(kāi)始,我首先在numOfseq的基礎(chǔ)上調(diào)用了filter 方法,用以篩選這些數(shù)字中為偶數(shù)的部分,其次在調(diào)用map 方法,將這些被篩選出來(lái)的數(shù)乘以 2,最后使用take 方法從新構(gòu)成的數(shù)字中取出前 10 個(gè)數(shù),這些數(shù)共同賦值給了chain 變量。

通過(guò)以上的敘述,相信你能對(duì)鏈?zhǔn)秸{(diào)用有一個(gè)初步的印象,但是一旦你掌握了鏈?zhǔn)秸{(diào)用,那么除了會(huì)讓你的代碼風(fēng)格有所改變以外,你的編程思維也會(huì)有不一樣的提升。

Python 中的鏈?zhǔn)秸{(diào)用

在 Python 中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的鏈?zhǔn)秸{(diào)用就是通過(guò)構(gòu)建類(lèi)方法并返回對(duì)象自身或返回歸屬類(lèi)(@classmethod)

class Chain:      def __init__(self, name):          self.name = name      def introduce(self):          print("hello, my name is %s" % self.name)          return self      def talk(self):          print("Can we make a friend?")          return self      def greet(self):          print("Hey! How are you?")          return self if __name__ == '__main__':      chain = Chain(name = "jobs")      chain.introduce()      print("-"*20)      chain.introduce().talk()      print("-"*20)      chain.introduce().talk().greet()

在這里我們創(chuàng)建一個(gè)Chain 類(lèi),需要傳遞一個(gè)name 字符串參數(shù)進(jìn)行實(shí)例對(duì)象的創(chuàng)建;當(dāng)中這個(gè)類(lèi)里有三個(gè)方法,分別是introduce、talk以及greet。

由于每次返回的是self 自身,那么我們就可以源源不斷地調(diào)用對(duì)象歸屬類(lèi)中的方法,結(jié)果如下:

hello, my name is jobs  --------------------  hello, my name is jobs  Can we make a friend?  --------------------  hello, my name is jobs  Can we make a friend?  Hey! How are you?

在 Pandas 中使用鏈?zhǔn)秸{(diào)用

前面鋪墊了這么多終于談到有關(guān)于 Pandas 鏈?zhǔn)秸{(diào)用部分

Pandas 中的大部分方法都很適合使用鏈?zhǔn)椒椒ㄟM(jìn)行操作,因?yàn)榻?jīng)過(guò) API 處理后返回的往往還是 Series 類(lèi)型或 DataFrame 類(lèi)型,所以我們可以直接就調(diào)用相應(yīng)的方法,這里我以我在今年 2 月份左右給別人做案例演示時(shí)爬取到的華農(nóng)兄弟 B 站視頻數(shù)據(jù)為例。可以通過(guò)鏈接進(jìn)行獲取。

數(shù)據(jù)字段信息如下所示,里面有 300 條數(shù)據(jù),并且 20 個(gè)字段:

Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

字段信息

但在使用這部分?jǐn)?shù)據(jù)之前,我們還需要對(duì)這部分?jǐn)?shù)據(jù)進(jìn)行初步的清洗,這里我主要選取了以下字段:

  •  aid:視頻對(duì)應(yīng)的 av 號(hào)

  •  comment:評(píng)論數(shù)

  •  play:播放量

  •  title:標(biāo)題

  •  video_review:彈幕數(shù)

  •  created:上傳日期

  •  length:視頻時(shí)長(zhǎng)

1、數(shù)據(jù)清洗

各字段對(duì)應(yīng)的值如下所示:

Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

字段值

從數(shù)據(jù)中我們可以看到:

  1.  title 字段前面都會(huì)帶有「華農(nóng)兄弟」四個(gè)字,如果對(duì)標(biāo)題字?jǐn)?shù)進(jìn)行統(tǒng)計(jì)時(shí)需要預(yù)先去除;

  2.  created 上傳日期似乎顯示成了一長(zhǎng)串的數(shù)值,但其實(shí)是從 1970 至今的時(shí)間戳,我們需要處理成可讀懂的年月日形式;

  3.  length 播放量長(zhǎng)度只顯示了分秒,但是小時(shí)并未用「00」來(lái)進(jìn)行補(bǔ)全,因此這里我們一方面需要將其補(bǔ)全,另一方面要將其轉(zhuǎn)換成對(duì)應(yīng)的時(shí)間格式

鏈?zhǔn)秸{(diào)用操作如下:

import re  import pandas as pd  # 定義字?jǐn)?shù)統(tǒng)計(jì)函數(shù) def word_count(text):      return len(re.findall(r"[\u4e00-\u9fa5]", text))  tidy_data = (      pd.read_csv('~/Desktop/huanong.csv')          .loc[:, ['aid', 'title', 'created', 'length',                    'play', 'comment', 'video_review']]          .assign(title = lambda df: df['title'].str.replace("華農(nóng)兄弟:", ""),                   title_count = lambda df: df['title'].apply(word_count),                  created = lambda df: df['created'].pipe(pd.to_datetime, unit='s'),                   created_date = lambda df: df['created'].dt.date,                  length = lambda df: "00:" + df['length'],                  video_length = lambda df: df['length'].pipe(pd.to_timedelta).dt.seconds                  )  )

這里首先是通過(guò)loc方法挑出其中的列,然后調(diào)用assign方法來(lái)創(chuàng)建新的字段,新的字段其字段名如果和原來(lái)的字段相一致,那么就會(huì)進(jìn)行覆蓋,從assign中我們可以很清楚地看到當(dāng)中字段的產(chǎn)生過(guò)程,同lambda 表達(dá)式進(jìn)行交互:

1.title 和title_count:

  •  原有的title字段因?yàn)閷儆谧址?lèi)型,可以直接很方便的調(diào)用str.* 方法來(lái)進(jìn)行處理,這里我就直接調(diào)用當(dāng)中的replace方法將「華農(nóng)兄弟:」字符進(jìn)行清洗

  •  基于清洗好的title 字段,再對(duì)該字段使用apply方法,該方法傳遞我們前面實(shí)現(xiàn)定義好的字?jǐn)?shù)統(tǒng)計(jì)的函數(shù),對(duì)每一條記錄的標(biāo)題中,對(duì)屬于\u4e00到\u9fa5這一區(qū)間內(nèi)的所有 Unicode 中文字符進(jìn)行提取,并進(jìn)行長(zhǎng)度計(jì)算

2.created和created_date:

  •  對(duì)原有的created 字段調(diào)用一個(gè)pipe方法,該方法會(huì)將created 字段傳遞進(jìn)pd.to_datetime 參數(shù)中,這里需要將unit時(shí)間單位設(shè)置成s秒才能顯示出正確的時(shí)間,否則仍以 Unix 時(shí)間錯(cuò)的樣式顯示

  •  基于處理好的created 字段,我們可以通過(guò)其屬于datetime64 的性質(zhì)來(lái)獲取其對(duì)應(yīng)的時(shí)間,這里 Pandas 給我們提供了一個(gè)很方便的 API 方法,通過(guò)dt.*來(lái)拿到當(dāng)中的屬性值

3.length 和video_length:

  •  原有的length 字段我們直接讓字符串00:和該字段進(jìn)行直接拼接,用以做下一步轉(zhuǎn)換

  •  基于完整的length時(shí)間字符串,我們?cè)俅握{(diào)用pipe方法將該字段作為參數(shù)隱式傳遞到pd.to_timedelta方法中轉(zhuǎn)化,然后同理和create_date字段一樣獲取到相應(yīng)的屬性值,這里我取的是秒數(shù)。

2、播放量趨勢(shì)圖

基于前面稍作清洗后得到的tidy_data數(shù)據(jù),我們可以快速地做一個(gè)播放量走勢(shì)的探索。這里我們需要用到created這個(gè)屬于datetime64的字段為 X 軸,播放量play 字段為 Y 軸做可視化展示。

# 播放量走勢(shì)  %matplotlib inline  %config InlineBackend.figure_format = 'retina'  import matplotlib.pyplot as plt  (tidy_data[['created', 'play']]   .set_index('created')   .resample('1M')   .sum()   .plot(      kind='line',      figsize=(16, 8),       title='Video Play Prend(2018-2020)',       grid=True,       legend=False    )  )  plt.xlabel("")  plt.ylabel('The Number Of Playing')

這里我們將上傳日期和播放量?jī)蓚€(gè)選出來(lái)后,需要先將created設(shè)定為索引,才能接著使用resample重采樣的方法進(jìn)行聚合操作,這里我們以月為統(tǒng)計(jì)顆粒度,對(duì)每個(gè)月播放量進(jìn)行加總,之后再調(diào)用plot 接口實(shí)現(xiàn)可視化。

鏈?zhǔn)秸{(diào)用的一個(gè)小技巧就是,可以利用括號(hào)作用域連續(xù)的特性使整個(gè)鏈?zhǔn)秸{(diào)用的操作不會(huì)報(bào)錯(cuò),當(dāng)然如果不喜歡這種方式也可以手動(dòng)在每條操作后面追加一個(gè)\符號(hào),所以上面的整個(gè)操作就會(huì)變成這樣:

tidy_data[['created', 'play']] \   .set_index('created') \   .resample('1M')   .sum()   .plot( \      kind='line', \      figsize=(16, 8), \      title='Video Play Prend(2018-2020)', \      grid=True, \      legend=False \    )

但是相比于追加一對(duì)括號(hào)來(lái)說(shuō),這種尾部追加\符號(hào)的方式并不推薦,也不優(yōu)雅。

但是如果既沒(méi)有在括號(hào)作用域或未追加\ 符號(hào),那么在運(yùn)行時(shí) Python 解釋器就會(huì)報(bào)錯(cuò)。

3、鏈?zhǔn)秸{(diào)用性能

通過(guò)前兩個(gè)案例我們可以看出鏈?zhǔn)秸{(diào)用可以說(shuō)是比較優(yōu)雅且快速地能實(shí)現(xiàn)一套數(shù)據(jù)操作的流程,但是鏈?zhǔn)秸{(diào)用也會(huì)因?yàn)椴煌膶?xiě)法而存在性能上的差異。

這里我們繼續(xù)基于前面的tidy_data操作,這里我們基于created_date 來(lái)對(duì)play、comment和video_review進(jìn)行求和后的數(shù)值進(jìn)一步以 10 為底作對(duì)數(shù)化。最后需要得到以下結(jié)果:

Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

統(tǒng)計(jì)表格

寫(xiě)法一:一般寫(xiě)法

Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

一般寫(xiě)法

這種寫(xiě)法就是基于tidy_data拷貝后進(jìn)行操作,操作得到的結(jié)果會(huì)不斷地覆蓋原有的數(shù)據(jù)對(duì)象

寫(xiě)法二:鏈?zhǔn)秸{(diào)用寫(xiě)法

Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

鏈?zhǔn)秸{(diào)用寫(xiě)法

可以看到,鏈?zhǔn)秸{(diào)用的寫(xiě)法相比于一般寫(xiě)法而言會(huì)快上一點(diǎn),不過(guò)由于數(shù)據(jù)量比較小,因此二者時(shí)間的差異并不大;但鏈?zhǔn)秸{(diào)用由于不需要額外的中間變量已經(jīng)覆蓋寫(xiě)入步驟,在內(nèi)存開(kāi)銷(xiāo)上會(huì)少一些。

結(jié)尾:鏈?zhǔn)秸{(diào)用的優(yōu)劣

從本文的只言片語(yǔ)中,你能領(lǐng)略到鏈?zhǔn)秸{(diào)用使得代碼在可讀性上大大的增強(qiáng),同時(shí)以盡肯能少的代碼量去實(shí)現(xiàn)更多操作。

當(dāng)然,鏈?zhǔn)秸{(diào)用并不算是完美的,它也存在著一定缺陷。比如說(shuō)當(dāng)鏈?zhǔn)秸{(diào)用的方法超過(guò) 10 步以上時(shí),那么出錯(cuò)的幾率就會(huì)大幅度提高,從而造成調(diào)試或 Debug 的困難。比如這樣:

(data    .method1(...)    .method2(...)    .method3(...)    .method4(...)    .method5(...)    .method6(...)    .method7(...) # Something Error    .method8(...)    .method9(...)    .method10(...)    .method11(...)  )

以上就是“Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)標(biāo)題:Python怎么實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
轉(zhuǎn)載來(lái)于:http://chinadenli.net/article42/gjsdec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航、電子商務(wù)、網(wǎng)站制作、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)