盤點八個數據分析相關的Python庫(實例+代碼)
01 NumPy
關于NumPy,本節主要介紹ndarray多維數組對象和數組屬性。
1. ndarray 多維數組對象
NumPy庫中的ndarray是一個多維數組對象,由兩部分組成:實際的數據值和描述這些值的元數據。大部分的數組操作僅僅涉及修改元數據的部分,并不改變底層的實際數據。
數組中的所有元素類型必須是一致的,所以如果知道其中一個元素的類型,就很容易確定該數組需要的存儲空間??梢杂胊rray()函數創建數組,并通過dtype獲取其數據類型。
import numpy as np
a = np.array(6)
a.dtype
output: dtype('int64')
上例中,數組a的數據類型為int64,如果使用的是32位Python,則得到的數據類型可能是int32。
2. 數組屬性
NumPy數組有一個重要的屬性——維度(dimension),它的維度被稱作秩(rank)。以二維數組為例,一個二維數組相當于兩個一維數組。只看最外面一層,它相當于一個一維數組,該一維數組中的每個元素也是一維數組。那么,這個一維數組即二維數組的軸。
了解了以上概念,接著來看NumPy數組中比較重要的ndarray對象的屬性:
- ndarray.ndim:秩,即軸的數量或維度的數量
- ndarray.shape:數組的維度,如果存的是矩陣,如n×m矩陣則輸出為n行m列
- ndarray.size:數組元素的總個數,相當于.shape中n×m的值
- ndarray.dtype:ndarray對象的元素類型
- ndarray.itemsize:ndarray對象中每個元素的大小,以字節為單位
- ndarray.flags:ndarray對象的內存信息
- ndarray.real:ndarray元素的實部
- ndarray.imag:ndarray元素的虛部
- ndarray.data:包含實際數組元素的緩沖區,由于一般通過數組的索引獲取元素,所以通常不需要使用這個屬性
02 Matplotlib
Matplotlib是Python數據分析中常用的一個繪圖庫,常用來繪制各種數據的可視化效果圖。其中,matplotlib.pyplot包含了簡單的繪圖功能。
1. 實戰:繪制多項式函數
為了說明繪圖的原理,下面來繪制多項式函數的圖像。使用NumPy的多項式函數poly1d()來創建多項式。
# 引入所需要的庫
import numpy as np
import matplotlib.pyplot as plt
# 使用 polyld() 函數創建多項式 func=1x3+2x2+3x+4
func = np.poly1d(np.array([1,2,3,4]).astype(f?loat))
# 使用 NumPy 的 linspace() 函數在 -10 和 10 之間產生 30 個均勻分布的值,作為函數 x 軸的取值
x = np.linspace(-10, 10 , 30)
# 將 x 的值代入 func() 函數,計算得到 y 值
y=func(x)
# 調用 pyplot 的 plot 函數 (),繪制函數圖像
plt.plot(x, y)
# 使用 xlable() 函數添加 x 軸標簽
plt.xlabel('x')
# 使用 ylabel() 函數添加 y 軸標簽
plt.ylabel('y(x)')
# 調用 show() 函數顯示函數圖像
plt.show()
多項式函數的繪制結果如圖2-13所示。
▲圖2-13 多項式函數繪制
2. 實戰:繪制正弦和余弦值
為了明顯看到兩個效果圖的區別,可以將兩個效果圖放到一張圖中顯示。Matplotlib中的subplot()函數允許在一張圖中顯示多張子圖。subplot()常用的3個整型參數分別為子圖的行數、子圖的列數以及子圖的索引。
下面的實例將繪制正弦和余弦兩個函數的圖像。
# 導入相關包
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import f?igure
f?igure(num=None, f?igsize=(12, 8), dpi=80, facecolor='w', edgecolor='k')
# 計算正弦和余弦曲線上點的 x 和 y 坐標
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# subplot的3個參數,2、1、1 ,表示繪制2行1列圖像中的第一個子圖
plt.subplot(2, 1, 1)# 繪制第一個子圖
# 繪制第一個圖像
plt.plot(x, y_sin)
plt.title('Sin')
plt.subplot(2, 1, 2)# 繪制2行1 列圖像中的第二個子圖
plt.plot(x, y_cos)
plt.title('Cos')
plt.show()# 顯示圖像
正弦和余弦函數的繪制結果如圖2-14所示。
▲圖2-14 正弦和余弦函數繪制
03 PySpark
在大數據應用場景中,當我們面對海量的數據和復雜模型巨大的計算需求時,單機的環境已經難以承載,需要用到分布式計算環境來完成機器學習任務。
Apache Spark是一個快速而強大的框架,可以對彈性數據集執行大規模分布式處理。通過圖2-15所示的Apache Spark架構圖可以非常清晰地看到它的組成。
▲圖2-15 Apache Spark架構圖
Spark支持豐富的數據源,可以契合絕大部分大數據應用場景,同時,通過Spark核心對計算資源統一調度,由于計算的數據都在內存中存儲,使得計算效率大大提高。Spark原生支持的語言是Scala,但為了豐富應用場景和滿足各研發人員的語言偏好,Spark同時支持Java、Python與R。
PySpark是Spark社區發布的在Spark框架中支持Python的工具包,它的計算速度和能力與Scala相似。通過PySpark調用Spark的API,配合MLlib與ML庫,可以輕松進行分布式數據挖掘。
MLlib庫是Spark傳統的機器學習庫,目前支持4種常見的機器學習問題:分類、回歸、聚類和協同過濾。MLlib的所有算法皆基于Spark特有的RDD(Resilient Distributed Dataset,彈性分布式數據集)數據結構進行運算。由于RDD并不能很好地滿足更為復雜的建模需求,ML庫應運而生。
ML庫相較MLlib庫更新,它全面采用基于數據幀(Data Frame)的API進行操作,能夠提供更為全面的機器學習算法,且支持靜態類型分析,可以在編程過程中及時發現錯誤,而不需要等代碼運行。
Python中除了包含上面介紹的庫,還有其他一些常用庫。下面分別進行介紹。
04 SciPy
SciPy是一個開源算法庫和數學工具包,它基于NumPy構建,并擴展了NumPy的功能。SciPy包含線性代數、積分、插值、特殊函數、快速傅里葉變換等常用函數,功能與軟件MATLAB、Scilab和GNU Octave類似。Scipy常常結合Numpy使用,可以說Python的大多數機器學習庫都依賴于這兩個模塊。
05 Pandas
Pandas提供了強大的數據讀寫功能、高級的數據結構和各種分析工具。該庫的一大特點是能用一兩個命令完成復雜的數據操作。
Pandas中最基礎的數據結構是Series,用于表示一行數據,可以理解為一維的數組。另一個關鍵的數據結構為DataFrame,用于表示二維數組,作用和R語言里的data.frame很像。
Pandas內置了很多函數,用于分組、過濾和組合數據,這些函數的執行速度都很快。Pandas對于時間序列數據有一套獨特的分析機制,可對時間數據做靈活的分析與管理。
06 Scikit-Learn
Scikit-Learn是一個基于NumPy、SciPy、Matplotlib的開源機器學習工具包,功能強大,使用簡單,是Kaggle選手經常使用的學習庫。它主要涵蓋分類、回歸和聚類算法,例如SVM、邏輯回歸、樸素貝葉斯、隨機森林、K均值以及數據降維處理算法等,官方文檔齊全,更新及時。
Scikit-Learn基于Numpy和SciPy等Python數值計算庫,提供了高效的算法實現,并針對所有算法提供了一致的接口調用規則,包括KNN、K均值、PCA等,接口易用。
07 TensorFlow
TensorFlow是谷歌開源的數值計算框架,也是目前最為流行的神經網絡分析系統。它采用數據流圖的方式,可靈活搭建多種機器學習和深度學習模型。
08 Keras
Keras是一個用于處理神經網絡的高級庫,可以運行在TensorFlow和Theano上,現在發布的新版本可以使用CNTK或MxNet作為后端。Keras簡化了很多特定任務,并大大減少了樣板代碼數,目前主要用于深度學習領域。
關于作者:劉鵬,教授,清華大學博士,云計算、大數據和人工智能領域的知名專家,南京云創大數據科技股份有限公司總裁、中國大數據應用聯盟人工智能專家委員會主任。中國電子學會云計算專家委員會云存儲組組長、工業和信息化部云計算研究中心專家。
高中強,人工智能與大數據領域技術專家,有非常深厚的積累,擅長機器學習和自然語言處理,尤其是深度學習,熟悉Tensorflow、PyTorch等深度學習開發框架。曾獲“2019年全國大學生數學建模優秀命題人獎”。參與鐘南山院士指導新型冠狀病毒人工智能預測系統研發項目,與鐘南山院士團隊共同發表學術論文。
本文摘編自《Python金融數據挖掘與分析實戰》,經出版方授權發布。(ISBN:9787111696506)