如何七周成為數(shù)據(jù)分析師20:了解和掌握Python的函數(shù)
![](http://image.woshipm.com/wp-files/img/65.jpg)
本文是《如何七周成為數(shù)據(jù)分析師》的第二十教程,如果想要了解寫作初衷,可以先行閱讀七周指南。溫馨提示:如果您已經(jīng)熟悉Python,大可不必再看這篇文章,或只挑選部分。
Python之所以靈活,就是因為它函數(shù)式編程的特性。今天開始學習Python的一些高級特性。
控制流
Python等程序語言,都是從程序頂端從上到下一行行執(zhí)行語句,可以把它想象成線性。生活中的很多情況,并不只是單一的線性。
某程序員的老婆叫他上街買幾個桃子,吩咐如果有西瓜,買一個。 后來他就真的只買了一個桃子回來。這里就用到了典型的條件判斷(程序員有沒有買對的吐槽我們先放下),條件是如果有西瓜。
我們用If表示條件:
這是一個最簡單的邏輯判斷,當我們發(fā)現(xiàn)a大于5,輸出特定語句。python用縮進控制語法,當if后面的條件為true時,程序才會執(zhí)行縮進中的內(nèi)容,否則跳過。縮進在Jupyter中用tab輸入,也可以使用四個空格。
當條件為false時,可以用else,此時不會執(zhí)行if中的內(nèi)容,而是else。
條件可以進一步細化,用elif語句。
elif可以使用多個。不論if、elif還是else,后面都要加冒號。當if、elif、else中有一個條件執(zhí)行為true,后續(xù)的條件都pass不執(zhí)行。
我們把程序員買西瓜的故事簡單翻譯成代碼:
條件判斷中可以應(yīng)對更復雜的邏輯。比如有一個數(shù)字,我們即想判斷它的奇偶,也想判斷它能不能被3整除。
if中套著一個if,我們把它稱為嵌套。第二層的if,仍舊要遵循縮進規(guī)則,它是基于上第一層的邏輯,所以此時距行首八個空格。如果忽略了縮進,會報錯。新手在縮進很容易犯錯,尤其是在邏輯復雜有七八個縮進的時候。
while是Python的循環(huán)執(zhí)行語句,在某條件下,一直執(zhí)行語句,直到條件為False。
在上圖中,count作為計數(shù)器,每次循環(huán)都會累加1,直到count大于等于10。count=count+1可以有一種更優(yōu)雅的寫法:count += 1。
while還有兩個重要的命令,break和continue,break是終止整個循環(huán),continue是跳過本次循環(huán)。
第一個是在循環(huán)計數(shù)器為5時停止輸出,第二個循環(huán)是只輸出偶數(shù)。需要注意的是,如果while的條件始終不為true,那么它為無休止地進行下去,計算機會被拖垮。這也是為什么第二個循環(huán)會將count+=1放在上面,因為放在下面會讓continue跳過累計計數(shù),永遠不會達到10。
和依據(jù)條件進行循環(huán)的while不同,for語句可以設(shè)置循環(huán)的次數(shù)。
range函數(shù)用來控制循環(huán)次數(shù),默認從0開始,執(zhí)行n次。這里的i是循環(huán)過程中的數(shù)字變量,即第幾次循環(huán)。如果想設(shè)置循環(huán)的起始數(shù)字,用兩個參數(shù)表示,第一個為起始,第二個為終止。有一種進階用法是設(shè)置第三個參數(shù)n,叫步長,循環(huán)過程的計數(shù)不是默認的1,而是n,類似于count += n。
for in range 的用法,是循環(huán)一組數(shù)字。它也能引入更豐富的列表和字典。
這里for將列表里面的所有元素都遍歷出來,i表示list中第幾個元素。字典用for比較特殊,因為它是key-value鍵值對,需要聲明循環(huán)的目標是key還是value。
keys()可以不用加,默認的輸出就是key。dict的循環(huán)輸出依舊不是按賦值時的順序,這點要注意。如果想要同時輸出key和value,用items。
這里的k指代key,v指代value,items將key和value組成元組,把這些元組依舊返回。
嚴格意義上說,上述的代碼可以細分成循環(huán)、迭代和遍歷。循環(huán)是滿足一定條件下,執(zhí)行相同的代碼,while就是典型的循環(huán)。迭代是按順序范圍訪問列表中的項,比如for,上文中針對列表和字典的循環(huán)更應(yīng)該稱呼為迭代。遍歷是按一定的規(guī)則訪問所有的元素,它可以是線性,也可以是樹型。另外還有一種用法叫遞歸,它在函數(shù)中用到。
函數(shù)
大家在讀書時想必都學過函數(shù),y=f(x)就是一個典型的函數(shù),通過輸入x,經(jīng)過特定的函數(shù),最終輸出我們想要的結(jié)果y。
在計算機語言中,函數(shù)可以簡單地抽象為輸入和輸出。很多時候,我們并不需要知道輸入和輸出的底層計算過程,只需要知道這個函數(shù)能輸出什么。這點和Excel中的函數(shù)很像。
Python有很多內(nèi)置的函數(shù),abs、len、int、max等,具體的應(yīng)用可以查詢文檔。對于新手,不需要掌握全部的函數(shù),花費的精力太久,最好的方法是學會查詢。這一點通過搜索引擎加關(guān)鍵詞輕松做到。
當內(nèi)置函數(shù)無法滿足我們的需求時,就需要用到自定義函數(shù)。
通過def定義函數(shù),func是函數(shù)的名稱,括號中是函數(shù)的參數(shù),也可以理解為輸入。冒號依舊是必須的??s進塊內(nèi)是函數(shù)的主體,沒有被縮進的部分不會被認為是函數(shù)。
案例中的代碼是一個簡單的判斷器,輸入年齡x,在函數(shù)主體中進行判斷,分別輸出adult或者child。當我們定義好函數(shù),在后續(xù)的使用中直接調(diào)用函數(shù),并且輸入,不用再一遍遍的寫重復代碼。
函數(shù)的意義就是將工作中的重復內(nèi)容簡化,一個良好的程序員會定義清晰簡潔的函數(shù)。對于數(shù)據(jù)分析師,雖然函數(shù)的要求不那么嚴格,但是學會了也能將數(shù)據(jù)工作精簡。
比如你每天都需要重復相同的數(shù)據(jù)清洗工作,諸如拼接,計算,合并等,把繁瑣的工作步驟寫成一個函數(shù),正式名字叫封裝,以后的工作只需要運行函數(shù)就能輕松搞定。
函數(shù)可以定義多個參數(shù)/輸入,也能將運行后的結(jié)果輸出。
上面就是一個最簡單的加法函數(shù),return表示將結(jié)果返回。返回的結(jié)果可以用于賦值,result = add(3,10),result就是13。參數(shù)除了輸入的作用,本身還能作為開關(guān)。
案例是一個簡單的四則運算器,第三個參數(shù)就是開關(guān),選擇加減乘除。這點,不妨想一下excel的函數(shù)比如vlookup,它的第四個參數(shù)true和false就是判斷要精確匹配還是模糊匹配,是一個開關(guān)的作用。
如果足夠細心,你會發(fā)現(xiàn)vlookup的第四個參數(shù)可以忽略,因為它默認為True,在使用的過程中實際有三個就行了,方便使用。Python也能設(shè)置默認參數(shù)。
只要在參數(shù)部分自動賦值,就可以作為默認參數(shù),這里默認執(zhí)行plus,不需要額外聲明。
函數(shù)能夠進行復雜運算嗎?答案是肯定的,我們結(jié)合描述統(tǒng)計,通過輸入一組數(shù)據(jù),返回描述統(tǒng)計中的常用指標,最大值,最小值,中位值,平均值。
最大值、最小值和平均數(shù)的計算沒有難度,中位數(shù)復雜一些,奇數(shù)和偶數(shù)的計算邏輯不一樣,所以函數(shù)中要用到if判斷。大家可以思考一下為什么要排序,以及除法為什么是//而不是/,這些都是早期知識點的掌握。還可以再想一下,這個函數(shù)會不會有問題?
接下來繼續(xù)加大難度,如果是輸入一個數(shù)組,求其標準差,應(yīng)該怎么計算?
在計算標準差的過程中,我們要先定義一個空列表,循環(huán)求出(實際值-平均數(shù))^2的值,求和后再除以變異值,整個步驟略顯冗余。在Python中,步驟可以再精簡。
[(i-avg)**2 for i in x]是一種優(yōu)雅寫法,它直接將循環(huán)計算后的結(jié)果生成一個新列表,避免使用append,也不需要縮進。接下來看幾個簡化的應(yīng)用。
在完成標準差函數(shù)后,如果我們希望同時生成標準差和方差應(yīng)該如何處理?函數(shù)可以有多個輸入,那么自然也支持多個輸出。
return多個值時,它返回的是元組,也可以將元組賦值給多個變量。
在函數(shù)中,還有更多的用法,比如可變參數(shù),關(guān)鍵字參數(shù),遞歸函數(shù)等。不過數(shù)據(jù)分析師用不太到,很多業(yè)務(wù)分析是一次性的,代碼寫得丑就丑了,用拼音命名變量也可以,畢竟和excel比起來,效率提升還是足夠的。
包、模塊和類
學會函數(shù),工作中讓你省一半力氣,但是Python的優(yōu)勢就是還能再省力。比如中位數(shù)、標準差等,依舊需要寫代碼,有沒有現(xiàn)成的直接調(diào)用呢?
第一種思路是搜索,「python 中位數(shù)」和「python 標準差」的關(guān)鍵詞在網(wǎng)上可以搜出一堆,直接參考即可。
第二種思路是調(diào)包,世界上好心人很多,他們已經(jīng)寫好了現(xiàn)成的諸多功能,把它們共享在了網(wǎng)上,這些功能統(tǒng)一做成了「包」。
包的概念類似于文件夾,文件夾中放著很多文件,文件在Python中指代「模塊」,對應(yīng)一個.py文件。py文件中包含著具體的代碼,代碼太多會顯得比較凌亂,為了規(guī)范和整理代碼,引入了「類」。類是一種抽象的概念,是面向?qū)ο缶幊痰暮诵模瑪?shù)據(jù)分析不用深入理解這塊,只要知道類是各種函數(shù)的集合,方便復用,用起來很簡單就行。
拿之前的統(tǒng)計函數(shù)舉例,程序員老王是一個好人,它將統(tǒng)計的常用代碼做成了一個包叫「老王統(tǒng)計包」,老王統(tǒng)計包里面有多個模塊,比如描述統(tǒng)計模塊,概率模塊。描述統(tǒng)計模塊中有一個stats類,把計算平均數(shù)標準差的函數(shù)都裝進去了。
上述代碼就是一個簡化的類,list是根據(jù)Stats創(chuàng)建的實例,實例是編程名詞,粗糙理解就是把具體的數(shù)據(jù)存到內(nèi)存空間了。然后我們直接為list調(diào)用不同的函數(shù),不論sum、count還是avg,一次性出來。數(shù)據(jù)分析師不用專程學怎么創(chuàng)建類,大概了解就行。
接下來的問題是,怎么使用這些包、模塊和類呢?
Python提供了很方便的操作命令,pip install。以往后我們要學的pandas為例。打開終端/cmd,鍵入pip install pandas。如果系統(tǒng)里既安裝python2又安裝python3,則鍵入pip3 install pandas。
如果未安裝過,會自動安裝,已經(jīng)安裝過的會提醒已安裝。我們用的Anaconda3已經(jīng)集合了絕大部分的數(shù)據(jù)分析包,不需要安裝了。Anaconda3有另外一個命令可以安裝,是conda install,如果Python3.3,Python3.4,Python3.5安裝了一堆版本,這個命令可以切換版本方便點。
安裝包很容易遇到各種各樣的問題,windows會比較多,遇到的話擅用搜索引擎即可。
包安裝好以后就可以使用了,在Python用import表示加載包,也可以加載Python自帶的模塊。默認放在文件開頭。
Python提供了非常豐富的包和模塊,合理應(yīng)用這些模塊將極大程度的提供數(shù)據(jù)分析能力。numpy、scipy、pandas是數(shù)據(jù)分析最常用的三個包,matplotlib、seaborn是常用的繪圖包,scikit-learn、Gensim、NLTK是機器學習相關(guān)的包,urllib、BeautifulSoup是常用的爬蟲包等。
在下一篇內(nèi)容,會講解用Pandas進行數(shù)據(jù)分析。當然中間會穿插一到兩篇強化基礎(chǔ)的內(nèi)容,比如做Python的算法競賽題、高階函數(shù)如Map/Reduce和filter的使用、實現(xiàn)數(shù)據(jù)清洗等。
相關(guān)閱讀
互聯(lián)網(wǎng)數(shù)據(jù)分析能力的養(yǎng)成,需一份七周的提綱
如何七周成為數(shù)據(jù)分析師01:常見的Excel函數(shù)全部涵蓋在這里了
如何七周成為數(shù)據(jù)分析師02:Excel技巧大揭秘
如何七周成為數(shù)據(jù)分析師03:手把手教你Excel實戰(zhàn)
如何七周成為數(shù)據(jù)分析師:Excel技巧之甘特圖繪制(項目管理)
如何七周成為數(shù)據(jù)分析師:Excel技巧之打造多級菜單
如何七周成為數(shù)據(jù)分析師04:數(shù)據(jù)可視化之經(jīng)典圖表合集
如何七周成為數(shù)據(jù)分析師05:數(shù)據(jù)可視化之打造升職加薪的報表
如何七周成為數(shù)據(jù)分析師06:數(shù)據(jù)可視化之手把手打造BI
如何七周成為數(shù)據(jù)分析師07:快速掌握麥肯錫的分析思維
如何七周成為數(shù)據(jù)分析師08:如何建立數(shù)據(jù)分析的思維框架?
如何七周成為數(shù)據(jù)分析師09:寫給新人的數(shù)據(jù)庫指南
如何七周成為數(shù)據(jù)分析師10:SQL,從入門到熟練
如何七周成為數(shù)據(jù)分析師11:SQL,從熟練到掌握
如何七周成為數(shù)據(jù)分析師12:解鎖數(shù)據(jù)分析的正確姿勢(上)
如何七周成為數(shù)據(jù)分析師13:解鎖數(shù)據(jù)分析的正確姿勢(下)
如何七周成為數(shù)據(jù)分析師14:概率論的入門指南
如何七周成為數(shù)據(jù)分析師15:讀了本文,你就懂了概率分布
如何七周成為數(shù)據(jù)分析師16:數(shù)據(jù)分析必須懂的假設(shè)檢驗
如何七周成為數(shù)據(jù)分析師17:最全的運營數(shù)據(jù)指標解讀
如何七周成為數(shù)據(jù)分析師18:Python的新手教程
如何七周成為數(shù)據(jù)分析師19:Python的數(shù)據(jù)結(jié)構(gòu)
#專欄作家#
秦路,微信公眾號ID:tracykanc,人人都是產(chǎn)品經(jīng)理專欄作家。
本文由 @秦路?原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
我是誰 我在哪里
做數(shù)據(jù)分析,要懂這個嗎?
希望可以看到大神后續(xù)更多關(guān)于機器學習的文章 ??
可視化建議用pyecharts,用起來更加方便。最近才出的可視化包,是中國人開發(fā)的第三方庫,強力推薦。
matplotlib用起來,只能說非常不爽。
很棒 每個工作日都會看更新,py里面的數(shù)據(jù)分析熊貓占了一部分 函數(shù)個人用的不太多
后期是不是考慮從數(shù)據(jù)分析師寫一點大數(shù)據(jù)方向的呢