iT邦幫忙

0

[Python]B14─資料科學⼯具概覽

Hi! 大家好,我是Eric,這次教大家Python的資料科學工具概覽!
/images/emoticon/emoticon12.gif


■ 資料科學工具概覽

前置作業
若使用的環境是Anaconda或Miniconda環境的話,我們可以先執行下列程式碼安裝這次介紹的工具套件。

$ conda install numpy scipy pandas matplotlib scikit-learn

NumPy:Python數值計算
NumPy是Python儲存與操作高維陣列一個非常有效率的工具。

NumPy有下面2個重要特性:

  1. 它提供了ndarray結構體,能夠高效地儲存和操作向量、矩陣和更高維度的資料集。
  2. 它提供易讀且高效率的語法來處理資料,支援從簡單的按元素的算術運算(element-wise)
    到相對複雜的線性代數運算。
  • NumPy的 陣列 基本上與Python的列表很像,舉例像是產生1-9的陣列:
import numpy as np      #引入NumPy套件,並取名為np
x = np.arange(1, 10)    #引入NumPy套件的.arange函式
x
  • NumPy陣列除了提供 高效率儲存資料 的方法,也提供了 高效率的函式針對元素進行運算 ,如將上面的x元素全部平方:
x ** 2
  • 比較上面陣列運算的結果與列表推導的結果:
[val ** 2 for val in range(1, 10)]
  • 不像列表受限於一維, NumPy陣列可以是多維的 ,像是下面我們將上面的x調整成3x3維度的陣列:
M = x.reshape((3, 3))
M
  • NumPy也可以做矩陣的運算,像是用 .T 計算轉置矩陣(transpose matrix):
M.T
  • 或是透過 np.dot()進行矩陣乘法
np.dot(M,[5,6,7])
  • 或是透過 np.linalg.eigvals()進行特徵值分解,特徵值是NxN維的矩陣A和N維的非零向量v,若滿足Av=λv,其中λ為一純量,則稱λ是v對應的特徵值。也就是特徵向量被施以線性變換A,只會使向量伸長或縮短,而其方向不變:
np.linalg.eigvals(M)

上面幾個線性代數的計算是現代資料分析的基礎,在**機器學習(machine learning)資料探勘(data mining)**尤為明顯。

Pandas:標籤化的行導向資料儲存(Labeled Column-oriented Data)
Pandas是一個比NumPy新很多的函式庫,基本上是以NumPy為基礎。Pandas提供了一個標籤化的介面來訪問多維資料,並且以 資料框(data frame) 物件的形式呈現,R語言的使用者可能會感受很熟悉。

import pandas as pd       #引入pandas套件,並命名為pd
df = pd.DataFrame({'label': ['A', 'B', 'C', 'A', 'B', 'C'],
'value': [1, 2, 3, 4, 5, 6]})
df
  • Pandas允許我們直接以名字選擇列進行操作:
df["label"]

-針對字串欄位套用字串處理函式

df["label"].str.lower()

-針對數值欄位套用總計(aggregate)函式

df['value'].sum()

-更重要的是可以直接應用高階的資料庫串接與分組操作,我們只用一行程式碼就計算出了相同標籤的數值總和,若是使用NumPy或核心的Python程式碼,可能會經過繁複的過程才能達到目的!

df.groupby("label").sum()

Matplotlib:MatLab風格的科學視覺化
Matplotlib是目前Python最受歡迎的科學視覺化函式庫,儘管它的愛好者都認為它的介面有時過於繁瑣,但它對於繪製各種類別的圖表可說非常強的工具套件。

  • 要使用Matplotlib,若是Jupyter Notebook的使用者,我們要先開啟記事本模式:
%matplotlib notebook              #Jupyter Notebook使用者需要額外執行這行程式碼
import matplotlib.pyplot as plt   #引入Matplotlib套件,並命名為plt
plt.style.use('ggplot')           #使用R語言的ggplot風格畫圖
  • 首先我們先用NumPy陣列建立一些資料,並將結果畫出來:
x = np.linspace(0, 10)     # 從 0 到 10 範圍內取值
y = np.sin(x)              # 取這些值的正弦值
plt.plot(x, y);            # 繪製成⼀條曲線
#若我們使用互動模式執行上面的程式碼,可以在一個互動式的視窗移動、縮放、滾動來瀏覽資料

SciPy:Python科學計算
SciPy是基於NumPy建立的一個科學計算功能集合。下面列出重要的模組:

  • scipy.fftpack:快速傅立葉轉換(Fast Fourier Transforms(FFT))
  • scipy.integrate:數值積分(numerical integration)
  • scipy.interpolate:數值插值(numerical interpolation)
  • scipy.linalg:線性代數方法
  • scipy.optimize:函式數值優化(numerical optimization of function)
  • scipy.sparse:稀疏矩陣儲存(sparse matrix storage)和線性代數
  • scipy.stats:統計分析方法(statisticals analysis)
  • 我們就來實際操作看看吧!在某些資料中間插值,並畫出平滑的曲線:
from scipy import interpolate

#選擇0-10之間的8個點
x = np.linspace(0, 10, 8)
y = np.sin(x)

#建立一個三次插值函式
func = interpolate.interp1d(x, y, kind="cubic")

#在1000個點的網格上進行插值運算
x_interp = np.linspace(0, 10, 1000)
y_interp = func(x_interp)

#繪製成果
plt.figure()   #新的圖片
plt.plot(x, y, "o")
plt.plot(x_interp, y_interp)
#我們看到的是點之間平滑的插值

其他資料科學函式庫

  • 機器學習的函式庫:Scikit-Learn
  • 圖像處理、分析的工具:Scikit-Image
  • 統計建模的工具:Statsmodels
  • 針對天文學和天體物理學的工具:AstroPy
  • 神經影像學工具:NiPy

■ Refer to《Python 旋風之旅,[正體中文]Will保哥》的第16章


尚未有邦友留言

立即登入留言