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