Python 數據科學基礎知識

翻譯:瘋狂的技術宅
原文: https://towardsdatascience.co...

Python 數據類型

在 Python 中有許多數據類型。最多見的是float(浮點型),int(整型),str(字符串),bool(布爾),list 和 dict(字典)。python

  • float - 用於表示實數。
  • int - 用於表示整數。
  • str - 表示文本。可使用單引號 'value' 、雙引號 「value」 或三引號 """value""" 來定義字符串。三引號字符串能夠用在多行文本上,還能夠用於註釋。
  • bool - 用於布爾值。
  • list - 用於存儲值的集合。
  • dict - 用於存儲鍵值對。

能夠用 type(variable_name) 函數來檢查特定變量的類型。 Python 中的運算符根據變量的類型而表現不一樣,每一個運算符都有不一樣的內置方法。git

下面是在 Python 中建立浮點數、整數、字符串和布爾值變量的例子。api

year_of_birth = 1994
height_cm = 170.50
subject = "Data Science"
is_success = True

print(type(year_of_birth), type(height_cm), type(subject), type(is_success))

# 輸出: <class 'int'> <class 'float'> <class 'str'> <class 'bool'>

Python 列表

Python 列表是一種基本的序列類型。咱們可使用此類型來存儲值的集合。一個列表能夠包含任何類型的值,同時一個列表也能夠包含另外一個列表進行嵌套。你也能夠建立一個混合使用 Python 類型的列表,不過這並不經常使用。可使用以下方法建立一個列表:數組

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

列表子集

能夠用索引從列表中獲取單個或多個元素。在Python中,索引從 0 開始。所以,列表中的第一個元素對應索引 0。咱們還可使用負索引來訪問元素,列表中的最後一個元素的索引爲 -1,倒數第二個元素的索引是 -2,依此類推。咱們在Python中也有一個名爲 切片 的東西,可用於從列表中獲取多個元素。能夠這樣使用: sliceable[start_index:end_index:step]數據結構

  • start_index 是切片的起始索引,此索引所在的元素包含在結果中,默認值爲 0
  • end_index 是切片的結束索引,此索引處的元素不會被包含到結果當中,默認值將是列表的長度。此外,若是 step 爲負值,則默認值能夠是 負的列表的長度 - 1。若是跳過此步驟,你會獲得從開始索引到結尾的全部元素。app

    • step 是索引增長的數量,默認值爲 1。若是把 step 設爲負值,會從後向前移動。
fruits = ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[1]  # apple
fruits[0]  # "pineapple"
fruits[-1] # "kiwi"
fruits[5]  # "kiwi"
fruits[-3] # "strawberry"

# List slicing
fruits[::]    # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[0: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[0:6:1]    # 與fruits[::]的結果相同
fruits[-1:-7:-1] # 與fruits[::-1]的結果相同

操做列表

  • 能夠用 append 方法或 + (加法運算符)將單個或多個元素添加到列表當中。若是你對兩個列表使用加法運算符,Python 將給出兩個列表合併後的新列表。機器學習

    • 能夠用方括號來修改列表中的單個或多個元素。
    • 能夠用 remove(value) 方法從列表中刪除一個元素。此方法用參數傳入的值刪除列表中存儲的第一個相同元素。
# 添加一個元素
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"]

# 修改
fruits[0:2] = ["grape", "mango"]
fruits 
#輸出 ["grape", "mango", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]

# 從列表中刪除
fruits.remove("mango")
fruits 
#輸出 ["grape", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]

瞭解列表背後的工做機制很是重要。當建立新列表 my_list 時,列表會存儲在計算機內存中,該列表的地址被存儲在 my_list 變量中。變量 my_list 不包含列表中的元素,它只包含對列表的引用。若是咱們用等號去複製一個列表時,好比 my_list_copy = my_list,你複製的只是列表的引用而不是列表的值。因此若是要複製列表實際的值,能夠用 list(my_list) 函數或切片 [ : ]函數

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"]

Python字典

字典用於存儲鍵值對形式的數據。當你但願經過惟一鍵對值進行索引時頗有用。在 Python 中,可使用花括號建立字典,鍵和值由冒號分隔。若是想得到給定鍵的值,能夠這樣作:our_dict[key]學習

字典與列表

讓咱們看一個例子,比較一下列表和詞典。假若有一些電影,咱們想存儲它們的評級,另外還但願經過電影名稱來很是快速地訪問電影的評級。這時能夠用兩個列表或一個字典來完成這類操做。在例子中,movies.index(「Ex Machina」)代碼返回電影 「Ex Machina」 的索引。ui

使用列表

movies = ["Ex Machina", "Mad Max: Fury Road", "1408"]
ratings = [7.7, 8.1, 6.8]

movie_choice_index = movies.index("Ex Machina")
print(ratings[movie_choice_index]) # 7.7

使用字典

ratings = {
    "Ex Machina": 7.7,
    "Mad Max: Fury Road": 8.1,
    "1408" : 6.8
}

print(ratings["Ex Machina"]) # 7.7

能夠看出,使用字典更加直觀和方便。

操做字典

能夠對詞典中的數據進行添加更新刪除操做。當添加或更新數據時,能夠簡單地使用 our_dict[key] = value,想要刪除一個鍵值對時,能夠用 del(our_dict[key]) 操做。

ratings["Deadpool"] = 8.0
print(ratings) 
# {'Ex Machina': 7.7, 'Mad Max: Fury Road': 8.1, '1408': 6.8, 'Deadpool': 8.0}

ratings["Ex Machina"] = 7.8
print(ratings) 
# {'Ex Machina': 7.8, 'Mad Max: Fury Road': 8.1, '1408': 6.8, 'Deadpool': 8.0}

del(ratings["1408"])
print(ratings) 
# {'Ex Machina': 7.8, 'Mad Max: Fury Road': 8.1, 'Deadpool': 8.0}

還能夠檢查給定的鍵是否在字典中:key in our_dict

print("Ex Machina" in ratings) # True

函數

函數是解決特定問題的可重用代碼。能夠用 def 關鍵字編寫函數:

def is_prime(n):
    if n <= 1:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0 or n % 3 == 0:
        return False
    current_number = 5
    while current_number * current_number <= n:
        if n % current_number == 0 or n % (current_number + 2) == 0:
            return False
        current_number = current_number + 6
    return True

不過 Python 中有許多內置函數,例如 max( iterable[,key] )min( iterable [,key] )type( object )round( number[,ndigits] ) 等。因此當咱們須要一個解決某個問題的函數時,能夠先研究一下是否存在相關的內置函數或 Python 包。沒有必要去「從新發明輪子」。

方法

咱們已經知道 Python 中有字符串,浮點數,整數,布爾值等類型。這些數據結構都是一個對象。方法是一種可用於給定對象的函數,具體取決於對象的類型。因此每一個對象都有一個特定的類型和一組方法,具體形式取決於給出的類型。

# 字符串方法
text = "Data Science" 
text.upper() # "DATA SCIENCE"
text.lower() # "data science"
text.capitalize() # "Data science"

# 列表方法
numbers = [1, 4, 0, 2, 9, 9, 10]
numbers.reverse()
print(numbers) # [10, 9, 9, 2, 0, 4, 1]
numbers.sort()
print(numbers) # [0, 1, 2, 4, 9, 9, 10]

# 字典方法
ratings = {
    "Ex Machina": 7.7,
    "Mad Max: Fury Road": 8.1,
    "1408" : 6.8
}

print(ratings.keys()) # dict_keys(['Ex Machina', 'Mad Max: Fury Road', '1408'])
print(ratings.values()) # dict_values([7.7, 8.1, 6.8])
print(ratings.items()) # dict_items([('Ex Machina', 7.7), ('Mad Max: Fury Road', 8.1), ('1408', 6.8)])

不一樣類型的對象能夠有相同名稱的方法。根據對象的類型,方法有各自不一樣的行爲。

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

務必要當心!某些方法能夠更改調用它們的對象。例如在列表類型上調用append()方法時。

模塊是包含 Python 定義和聲明的文件。用於定義解決特定問題的函數、方法和新的 Python 類型。

包是模塊的集合。有許多 Python 包涵蓋了不一樣領域的解決方案。例如,NumPy、matplotlib、seaborn 和 scikit-learn 是很是着名的數據科學支持包。

  • NumPy 用於有效地處理數組
  • matplotlib 和 seaborn 是流行的數據可視化庫
  • scikit-learn 是一個功能強大的機器學習庫

默認狀況下,Python 中有一些內置包,可是咱們還須要更多的包,這些默認是不安裝的。若是想要使用某個軟件包,它就必須是已經安裝好的,或者先用 pip 安裝( Python的包管理系統 )。

另外,還有一種叫作Anaconda 的東西。

Anaconda Distribution 是一個免費,易於安裝的包管理器、環境管理器和 Python 發行版,其中包含1,000多個開源軟件包,並提供免費的社區支持。

因此若是你不想安裝太多的包,我建議你用 Anaconda。這個發行版中有不少有用的包。

導入聲明

安裝所需的包後,能夠把它們導入 Python 代碼文件。能夠從中導入整個包、子模塊或特定函數。另外還能夠爲包設置別名。能夠從下面的例子中看到 import 語句的不一樣方式。

簡單的導入

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

導入的同時設置別名

import numpy as np # np 是 numpy 包的別名
numbers = np.array([3, 4, 20, 15, 7, 19, 0]) # 工做正常
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # 出錯,NameError: name 'numpy' is not defined

從包導入子模塊並設置別名

# 從 matplotlib 包中導入 pyplot 子模塊並設置別名 "plt"
import matplotlib.pyplot as plt

僅從包中導入一個函數

from numpy import array
numbers = array([3, 4, 20, 15, 7, 19, 0]) # 工做正常
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # 出錯,NameError: name 'numpy' is not defined
type(numbers) # 輸出:numpy.ndarray

咱們也能夠這樣導入: from numpy import *。星號表示從該模塊導入全部內容。這條 import 語句會在當前命名空間中爲 numpy 模塊定義的全部公共對象建立引用。換句話說,咱們可使用 numpy 中的全部可用函數,在函數名稱能夠不帶前綴。例如,如今咱們能夠這樣使用 NumPy 的絕對值函數: absolute(),而不是numpy.absolute()

可是,我不建議你使用它,由於:

  • 若是從某些模塊中導入全部函數,那麼當前的命名空間將填充過多的函數,若是有人查看咱們的代碼的話,他可能會對某個函數到底屬於哪一個包而感到困惑。
  • 若是兩個模塊具備相同名稱的函數,則第二個導入的將會覆蓋第一個模塊的函數。

NumPy

NumPy 是用 Python 進行科學計算的基礎包。它很是快速且易於使用。這個包可以幫助咱們按元素進行計算(逐個元素)。

常規的 Python 列表不知道如何以元素方式進行操做。固然咱們也能夠用 Python 列表去作科學計算,可是它很是慢,並且還須要編寫更多的代碼來獲得想要的結果。更多時候使用 NumPy 纔是一個聰明的主意。

與常規 Python 列表不一樣,NumPy 數組中的元素老是隻有一種類型。若是咱們將一個不一樣類型的數組傳遞給np.array(),能夠用參數 dtype 設定想要的類型。若是沒有給出此參數,則會將類型肯定爲保存對象所需的最小類型。

NumPy 數組 —— 類型轉換

np.array([False, 42, "Data Science"])   # array(["False", "42", "Data Science"], dtype="<U12")
np.array([False, 42], dtype = int)      # array([ 0, 42])
np.array([False, 42, 53.99], dtype = float) # array([  0.  ,  42.  ,  53.99])

# 無效的類型轉換
np.array([False, 42, "Data Science"], dtype = 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 數組的類型,結果會是 numpy.ndarray。 ndarray 意味着是 n 維數組。在前面的例子中用了一維數組,可是也可使用 2, 3, 4 甚至更多維數組。咱們能夠在數組上進行子集化,而這與該數組的維數無關。下面是一些二維數組的例子。

二維數組的子集

numbers = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12]
])

numbers[2, 1]     # 8
numbers[-1, 0]    # 10
numbers[0]        # array([1, 2, 3])
numbers[:, 0]     # array([ 1,  4,  7, 10])
numbers[0:3, 2]   # array([3, 6, 9])
numbers[1:3, 1:3] # array([[5, 6],[8, 9]])

若是想要知道一個 numpy 數組有多少個維度,以及每一個維度有多少個元素,能夠用 shape 屬性。下面的代碼獲得二維數組的shape,返回的元組中的第一個元素是行數,第二個元素是列數。

NumPy 的 shape屬性

numbers = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12],
    [13, 14, 15]
])

numbers.shape # (5, 3)

基本統計

分析數據的第一步是熟悉數據。 NumPy 有一些基本方法來幫助咱們作到這一點。

  • np.mean() - 返回算術平均值(元素之和除以元素的個數)。
  • np.median() - 返回中位數(傳入的數組的中間值,若是數組的長度是偶數,將計算兩個中間值的平均值)
  • np.corrcoef() - 返回一個相關矩陣。當咱們想要查看數據集中兩個變量之間是否存在相關性時,或者在兩個具備相同長度的數組之間存在相關性時,這個函數很是有用。
  • np.std() - 返回標準誤差
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.        ]]

使用 NumPy 生成基本統計信息

從上面的例子中,咱們能夠看到學習時間和成績之間存在高度相關性。

此外還能夠看到:

  • 學習時間的平均值是 4.6
  • 學習時間的中位數爲 4.0
  • 學習時間的標準差爲 3.2

NumPy 還有一些基本函數,如 np.sort()np.sum() ,在基本的 Python 列表中也有一樣的函數。不過須要注意的是 NumPy 在數組中會強制統一類型,這加快了計算速度。

相關文章
相關標籤/搜索