當前位置:
首頁 > 最新 > 數據科學Python基礎

數據科學Python基礎


翻譯 | AI科技大本營

參與 | 王珂凝

審校 | reason_W


【AI科技大本營導讀】Python的強大和靈活相信已經毋庸置疑了。那麼數據科學中,我們又需要掌握哪些基礎知識點才能滿足使用需求呢?本文是國外一名數據科學博主的文章,文章不僅對Python中和數據科學有關的概念進行了解釋,還配上了相應的示例代碼和練習題目,非常適合想要入門數據科學的朋友。

Python中有很多種數據類型。常見的數據類型有浮點型(float),整型(int),字元串型(str),布爾型(bool),列表(list)。

浮點型-用於定義實數。

整型-用於定義整數。

字元串型-用於定義文本。可以使用單引號("value")、雙引號("value")或三引號("""value""")定義字元串,其中使用三引號定義的字元串可以出現在多行上,新行中的字元串也包含在變數的值中。這些字元串都可以用在函數文檔中。

布爾型-用於定義真值,對數據執行過濾操作。

列表-用於存儲變數值的集合。

我們可以使用函數type(variable_name)來檢查特定變數的數據類型。Python中運算符產生的結果會隨著數據變數類型的變化而變化,每種運算符內部實現的方法都不同。


list是一個基本的序列類型,我們可以使用list存儲一組包含任何數據類型的值,list雖然並不常用,但一個list可以包含各種數據類型。我們可以用「[]」創建:

fruits=["pineapple","apple","lemon","strawberry","orange","kiwi"]


我們可以使用索引從列表中獲取元素。Python的列表索引從0開始,因此,列表中第一個元素的索引值為0。我們也可以使用負索引訪問列表中的元素,若列表中最後一個元素的索引為-1,那麼其前一個元素的索引為-2,依此類推。我們也可以用「list slicing」 獲取這個list的子list:sliceable[start_index:end_index:step]

start_index是子list的開始索引,該索引指向的元素會是所得到的子list的第0個元素。

end_index是子list的結束索引,該索引指向的元素不會被包含在子list中。end_index的默認值是列表長度。step為步長值,代表索引每次增加的值,默認值為1。如果step為負,則end_index默認值為-列表長度-1。如果不設置step,則返回結果將是從start_index開始至list末尾的所有元素。

示例代碼:

fruits = ["pineapple","apple","lemon","strawberry","orange","kiwi"]

fruits[1]# apple

fruits[]#"pineapple"

fruits[-1]#"kiwi"

fruits[5]#"kiwi"

fruits[-3]#"strawberry"

# List slicing

fruits[::]# ["pineapple","apple","lemon","strawberry","orange","kiwi"]

fruits[:2]# ["pineapple","apple"]

fruits[-2:-1]# ["orange"]

fruits[3:]# ["strawberry","orange","kiwi"]

fruits[:4]# ["pineapple","apple","lemon","strawberry"]

fruits[:]# ["pineapple","apple","lemon","strawberry","orange","kiwi"]

fruits[::-1]# ["kiwi","orange","strawberry","lemon","apple","pineapple"]

fruits[::-2]# ["kiwi","strawberry","apple"]

fruits[::2]# ["pineapple","lemon","orange"]

# Understanding some default values

fruits[:6:1]# the same result as the result from fruits[::]

fruits[-1:-7:-1]# the same result as the result from fruits[::-1]

list的具體操作

添加元素:我們可以使用附加方法或「+」號運算符把元素添加到list中。在Python中,如果對兩個list使用「+」運算符,則將產生一個新的list,它會包含這兩個list中所有的元素。

將元素轉變為list類型:我們可以使用前面在索引和list slicing部分提到的「[]」把元素轉變成list類型。

刪除元素:我們可以使用remove(value)從list中進行元素刪除操作。該方法將刪除list中value處的第一個元素。

示例代碼:

# Add values to a list

fruits.append("peach")

fruits# ["pineapple","apple","lemon","strawberry","orange","kiwi","peach"]

fruits = fruits + ["fig","melon"]

fruits# ["pineapple","apple","lemon","strawberry","orange","kiwi","peach","fig","melon"]

# Change values from a list

fruits[:2] = ["grape","mango"]

fruits# ["grape","mango","lemon","strawberry","orange","kiwi","peach","fig","melon"]

# Delete values from a list

fruits.remove("mango")

fruits# ["grape","lemon","strawberry","orange","kiwi","peach","fig","melon"]

了解Python中list在計算機中的工作機制也很有必要。當我們創建一個新的列表my_list時,這個list將被存儲在計算機內存中,list的地址存儲在my_list變數中。變數my_list並不包含列表中的元素,只是一個對列表的引用。如果我們用「=」複製一個列表,如:my_list_copy = my_list,那麼我們在my_list_copy變數中複製的是其引用而不是列表中的值。如果想要複製列表中真實的值,則可使用list(my_list) 或slicing [:]。

示例代碼:

numbers = [10, 42, 28, 420]

numbers_copy = numbers

numbers_copy[2] = 100

numbers# [10, 42, 100, 420]

numbers_copy# [10, 42, 100, 420]

ratings = [4.5, 5.0, 3.5, 4.75, 4.00]

ratings_copy = ratings[:]

ratings_copy[0] = 2.0

ratings# [4.5, 5.0, 3.5, 4.75, 4.0]

ratings_copy# [2.0, 5.0, 3.5, 4.75, 4.0]

characters = ["A","B","C"]

characters_copy = list(characters)

characters_copy[-1] ="D"

characters# ["A", "B", "C"]

characters_copy# ["A", "B", "D"]


函數是用來解決特定任務的一段可重用代碼,我們可以使用def關鍵字來編寫函數:

示例代碼:

defis_prime(n):

ifn

returnFalse

elifn

returnTrue

elifn %2==orn %3==:

returnFalse

current_number =5

whilecurrent_number * current_number

ifn % current_number ==orn % (current_number +2) ==:

returnFalse

current_number = current_number +6

returnTrue

當然,Python中也有很多內置函數,如max(iterable [, key]), min(iterable [, key]), type(object), round(number[, ndigits])等。在很多情況下,當我們需要用到函數來解決特定任務時,可以通過查找內置函數或使用一個Python包來解決。

大部分函數都需要一些輸入並返回輸出,這些函數都有參數,Python將函數的輸入和參數進行匹配,「[]」內的參數則是可選的。

我們可以使用函數help([object]) 或?function_name來查看所有函數的幫助文檔。如果你是在Jupyter Notebook中使用help([object])函數的話,幫助文檔將會在當前的單元格中顯示,?function_name則會在分頁器中顯示幫助文檔。


我們已經知道Python中的字元串型,浮點型,整型和布爾型等,每個數據結構都是一個對象。而函數則是根據對象類型用於特定對象的方法,因此,每個對象都有一個特定的類型和一組對應於該類型的函數。

示例代碼:

# String methods

text ="Data Science"

text.upper()# "DATA SCIENCE"

text.lower()# "data science"

text.capitalize()# "Data science"

# Lists methods

numbers = [1, 4, 0, 2, 9, 9, 10]

numbers.reverse()

numbers# [10, 9, 9, 2, 0, 4, 1]

numbers.sort()

numbers# [0, 1, 2, 4, 9, 9, 10]

不同類型的對象可以對應相同名稱的函數,根據不同的對象類型,函數會有對應的不同的行為。

示例代碼:

numbers = [10, 30, 55, 40, 8, 30]

text ="Data Science"

numbers.index(8)# 4

text.index("a")# 1

numbers.count(30)# 2

text.count("i")# 1

請注意!有些函數可以改變調用它們的對象,如:被list類型調用的append()函數。


一個模塊是指一個包含Python定義和語句的文件。模塊指定了解決特定問題的函數、方法和新的Python類型。

而軟體包(package)則是目錄中模塊的集合。Python中有很多現成的軟體包,它們覆蓋了很多方面的問題,如:「NumPy」,「matplotlib」,「seaborn」和 「scikit-learn」都是非常著名的數據科學軟體包。

NumPy用於高效的處理數組。

Matplotlib和seaborn是用於數據可視化的流行庫。

scikit-learn是一個強大的機器學習庫。

Python中默認有些軟體包是預設的,但是也有很多Python中沒有但是我們需要用到的軟體包。如果我們想使用這些軟體包,就必須先確認這個包已經安裝過,或者使用pip命令(Python中預設的一個的軟體包管理工具)進行安裝。

當然我們也可以使用「Anaconda「。

Anaconda發行版是一個免費且易於安裝的軟體包管理器,環境管理器和Python發行版本,內置了1000多個免費社區支持的開源軟體包。

如果你不想自己費事安裝一些軟體包的話,可以使用「Anaconda」,在這個發行版中內置了很多有用的軟體包。


一旦安裝了所需要的軟體包,就可以將它們導入我們的Python文件中。我們可以從中導入整個軟體包、子模塊或特定的函數。另外,我們還可以給軟體包添加一個別名。導入語句的方式如下:

簡單的導入語句:

importnumpy

numbers = numpy.array([3,4,20,15,7,19,])

使用別名導入語句:

import numpy as np# np is an alias for the numpy package

numbers = np.array([3, 4, 20, 15, 7, 19, 0])# works fine

numbers = numpy.array([3, 4, 20, 15, 7, 19, 0])# NameError: name "numpy" is not defined

從具有別名的包中導入子模塊:

#importthe"pyplot"submodule from the"matplotlib"packagewith alias"plt"

importmatplotlib.pyplotasplt

從包中只導入一個函數:

from numpy import array

numbers = array([3, 4, 20, 15, 7, 19, 0])# works fine

numbers = numpy.array([3, 4, 20, 15, 7, 19, 0])# NameError: name "numpy" is not defined

type(numbers)# numpy.ndarray

我們還可以使用from numpy import * 語句來進行導入,其中,*表示將該模塊中所有的東西都導入到本文件中。該導入語句會在當前命名空間內創建一個面向所有用numpy模塊定義的公共對象的引用。換句話說,我們可以使用numpy中所有的可用函數,並且只使用其名稱而不需要帶前綴。例如:你現在使用NumPy的絕對值函數可以直接這樣用:absolute(),而不是:numpy.absolute()。

但是我不建議你這樣使用,因為:

如果你將一些模塊中所有的函數都導入到文件中,那麼當前的命名空間將會有太多的函數。以至於要是有人查看你的代碼,很容易搞不清哪個函數對應哪個包。

如果兩個模塊中的某個函數名稱相同,那麼第二個導入的模塊將會覆蓋第一個模塊中相應的函數。


Numpy是Python用於科學計算的一個基礎軟體包,它運行速度很快且易於使用。這個包幫助我們對元素進行逐元素的計算。

在Python中,常規的list不會逐元素進行計算。雖然也可以使用,但是list運行速度很慢,我們需要編寫更多的代碼才能達到自己想要的結果。在大多數情況下,Numpy是一個更好的選擇。

與在Python中常規的list不同,Numpy數組中的元素只能有一個類型。如果將不同類型的數組傳遞給np.array(),則可以使用參數dtype表示不同的類型。若沒有給出這個參數,那麼數組類型將是保存對象所需的最小類型。

Numpy數組-類型轉換:

np.array([False,42,"Data Science"])# array(["False", "42", "Data Science"], dtype="

np.array([False,42], dtype = int)# array([ 0, 42])

np.array([False,42,53.99], dtype = float)# array([ 0. , 42. , 53.99])

# Invalid converting

np.array([False,42,"Data Science"], dtype = float)# could not convert string to float: "Data Science"

Numpy數組有自己的屬性和方法。還記得前面我們提到Python運算符在不同的數據類型上會有不同的表現嗎?Numpy中,運算符的表現就是逐元素運算。

Numpy數組上的運算符:

np.array([37,48,50]) +1# array([38, 49, 51])

np.array([20,30,40]) *2# array([40, 60, 80])

np.array([42,10,60]) /2# array([ 21., 5., 30.])

np.array([1,2,3]) * np.array([10,20,30])# array([10, 40, 90])

np.array([1,2,3]) - np.array([10,20,30])# array([ -9, -18, -27])

Numpy數組的數據類型為:nump.ndarry,ndarray代表著n維數組。上述例子中使用的是一維數組,我們也可以創建2,3,4或更多維數組。我們也可以獨立於數組的維度來獲取數組的子集。下面將以2維數組為例,獲取2維數組子集:

numbers = np.array([

[1, 2, 3],

[4, 5, 6],

[7, 8, 9],

[10, 11, 12]

])

numbers[2,1]# 8

numbers[-1,]# 10

numbers[]# array([1, 2, 3])

numbers[:,]# array([ 1, 4, 7, 10])

numbers[:3,2]# array([3, 6, 9])

numbers[1:3,1:3]# array([[5, 6],[8, 9]])

如果想查看數組的維度和每個維度有多少個元素,則可以使用shape屬性。對於2維數組來說,第一個元素表示行數,第二個元素表示列數。


np.mean() –會返回數組內元素的算術平均值(元素的總和除以元素的長度)。

np.median() –會返回數組內元素的中位數(數組排完序後計算得到的中位數,如果數組長度為偶數,則返回數組兩個中間值的平均值)

np.corrcoef() -返回相關係數矩陣。用於查看數據集中兩個(數組長度相同的)變數之間是否存在相關性。

np.std() -返回標準差。

使用Numpy進行一些基本的統計操作:

learning_hours = [1, 2, 6, 4, 10]

grades = [3, 4, 6, 5, 6]

np.mean(learning_hours) # 4.6

np.median(learning_hours) # 4.0

np.std(learning_hours) # 3.2

np.corrcoef(learning_hours, grades) # [[ 1. 0.88964891][0.88964891 1.]]

從上面這個例子中我們可以看出,learning_hours和grades之間有很高的相關性。

另外,也可以發現:

learning_hours的平均值是4.6。

learning_hours的中間值是4.0。

learning_hours的標準差是3.2。

Numpy中的一些基本的函數在Python的列表中也存在,如 np.sort() 和np.sum() 。但是需要注意的是,Numpy在數組中會強制執行單一類型,這會加快程序的計算速度。


我準備了一些練習如下,如子集,元素操作和一些基本統計操作。

獲取list的子集

獲取2維Numpy數組子集

Numpy元素操作

Numpy的基本統計操作


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

淺談Python框架,初學者的不容錯過的幾個重點,你知道嗎?
Python網路爬蟲四大選擇器總結

TAG:Python |