數據科學Python基礎
翻譯 | AI科技大本營
參與 | 王珂凝
審校 | reason_W
【AI科技大本營導讀】Python的強大和靈活相信已經毋庸置疑了。那麼數據科學中,我們又需要掌握哪些基礎知識點才能滿足使用需求呢?本文是國外一名數據科學博主的文章,文章不僅對Python中和數據科學有關的概念進行了解釋,還配上了相應的示例代碼和練習題目,非常適合想要入門數據科學的朋友。
▌Python中常見的數據類型
Python中有很多種數據類型。常見的數據類型有浮點型(float),整型(int),字元串型(str),布爾型(bool),列表(list)。
浮點型-用於定義實數。
整型-用於定義整數。
字元串型-用於定義文本。可以使用單引號("value")、雙引號("value")或三引號("""value""")定義字元串,其中使用三引號定義的字元串可以出現在多行上,新行中的字元串也包含在變數的值中。這些字元串都可以用在函數文檔中。
布爾型-用於定義真值,對數據執行過濾操作。
列表-用於存儲變數值的集合。
我們可以使用函數type(variable_name)來檢查特定變數的數據類型。Python中運算符產生的結果會隨著數據變數類型的變化而變化,每種運算符內部實現的方法都不同。
▌Python Lists
list是一個基本的序列類型,我們可以使用list存儲一組包含任何數據類型的值,list雖然並不常用,但一個list可以包含各種數據類型。我們可以用「[]」創建:
fruits=["pineapple","apple","lemon","strawberry","orange","kiwi"]
list中的子集
我們可以使用索引從列表中獲取元素。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()函數。
▌Packages
一個模塊是指一個包含Python定義和語句的文件。模塊指定了解決特定問題的函數、方法和新的Python類型。
而軟體包(package)則是目錄中模塊的集合。Python中有很多現成的軟體包,它們覆蓋了很多方面的問題,如:「NumPy」,「matplotlib」,「seaborn」和 「scikit-learn」都是非常著名的數據科學軟體包。
NumPy用於高效的處理數組。
Matplotlib和seaborn是用於數據可視化的流行庫。
scikit-learn是一個強大的機器學習庫。
Python中默認有些軟體包是預設的,但是也有很多Python中沒有但是我們需要用到的軟體包。如果我們想使用這些軟體包,就必須先確認這個包已經安裝過,或者使用pip命令(Python中預設的一個的軟體包管理工具)進行安裝。
當然我們也可以使用「Anaconda「。
Anaconda發行版是一個免費且易於安裝的軟體包管理器,環境管理器和Python發行版本,內置了1000多個免費社區支持的開源軟體包。
如果你不想自己費事安裝一些軟體包的話,可以使用「Anaconda」,在這個發行版中內置了很多有用的軟體包。
Import語句
一旦安裝了所需要的軟體包,就可以將它們導入我們的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
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網路爬蟲四大選擇器總結
TAG:Python |