在資料科學專案中,確保資料品質和有效呈現分析結果至關重要。Pandas 作為 Python 資料處理的核心函式庫,提供豐富的資料操作功能。然而,實際應用中,我們需要更進階的工具來進行資料驗證、視覺化和高效能運算。Great Expectations 允許我們定義資料預期,並自動驗證資料是否符合預期,確保資料的可靠性。Plotly 則提供互動式圖表,讓資料探索更直觀和深入。此外,Scikit-learn 和 XGBoost 等機器學習函式庫與 pandas 無縫整合,方便模型訓練和評估。DuckDB 則提供 SQL 查詢能力,簡化資料函式庫操作。最後,Ibis、Dask、Polars 和 cuDF 等函式庫,則針對不同規模和效能需求,提供 pandas 的延遲執行、平行計算和 GPU 加速等進階功能。

資料驗證與視覺化:pandas 生態系統的強大工具

在資料科學領域中,資料驗證和視覺化是兩個非常重要的環節。資料驗證確保了資料的品質和可靠性,而視覺化則幫助我們更好地理解資料的內在結構和關係。本文將介紹兩個強大的工具:Great Expectations 和 Plotly,分別用於資料驗證和視覺化。

使用 Great Expectations 進行資料驗證

Great Expectations 是一個用於資料驗證和測試的開源工具。它允許使用者定義資料的預期(expectations),並對資料進行驗證,以確保資料符合預期。

建立資料預期

首先,我們需要建立一個資料預期。例如,我們可以使用 ExpectColumnValuesToNotBeNull 來確保某一列不包含空值:

city_exp = gx.expectations.ExpectColumnValuesToNotBeNull(column="city08")
result = batch.validate(city_exp)
print(result)

這段程式碼定義了一個預期:city08 列不應包含空值。驗證結果將顯示在 result 中,包括成功與否、檢查的資料數量等資訊。

驗證結果分析

驗證結果包含了豐富的資訊,例如:

  • success:驗證是否成功
  • result:包含詳細的驗證結果,如檢查的資料數量、意外資料的數量和比例等
{
  "success": true,
  "expectation_config": {
    "type": "expect_column_values_to_not_be_null",
    "kwargs": {
      "batch_id": "pandas_datasource-vehicles",
      "column": "city08"
    },
    "meta": {}
  },
  "result": {
    "element_count": 48130,
    "unexpected_count": 0,
    "unexpected_percent": 0.0,
    "partial_unexpected_list": [],
    "partial_unexpected_counts": [],
    "partial_unexpected_index_list": []
  },
  "meta": {},
  "exception_info": {
    "raised_exception": false,
    "exception_traceback": null,
    "exception_message": null
  }
}

圖表翻譯:

此圖示展示了 Great Expectations 的驗證流程。首先,定義資料預期;接著,對資料批次進行驗證;最後,輸出驗證結果。這個過程確保了資料的品質和可靠性。

  flowchart TD
  A[定義資料預期] --> B[對資料批次進行驗證]
  B --> C[輸出驗證結果]
  C --> D{驗證是否成功?}
  D -->|是| E[繼續後續處理]
  D -->|否| F[處理驗證失敗的情況]

使用 Plotly 進行資料視覺化

Plotly 是一個強大的視覺化工具,支援互動式圖表。使用 Plotly,可以輕鬆地建立各種圖表,如散點圖、柱狀圖等。

建立互動式散點圖

df.plot(
    kind="scatter",
    x="city08",
    y="highway08",
    backend="plotly",
    hover_data={"make": True, "model": True, "year": True},
)

這段程式碼建立了一個互動式的散點圖,x 軸是 city08,y 軸是 highway08。當滑鼠懸停在資料點上時,會顯示額外的資訊,如製造商、型號和年份。

圖表翻譯:

此圖示展示了使用 Plotly 建立的互動式散點圖。圖中每個點代表一個資料樣本,懸停時可顯示詳細資訊。這個互動過程幫助使用者更深入地理解資料。

  flowchart TD
  A[載入資料] --> B[建立散點圖]
  B --> C[新增互動功能]
  C --> D[顯示資料點詳細資訊]

使用 PyGWalker 進行資料探索

PyGWalker 是一個根據圖形介面的資料探索工具。它允許使用者透過拖拽欄位來建立各種圖表,非常適合用於資料的初步探索。

使用 PyGWalker

import pygwalker as pyg
pyg.walk(df)

這段程式碼啟動了 PyGWalker,使用者可以在 Jupyter Notebook 中透過圖形介面進行資料探索。

圖表翻譯:

此圖示展示了 PyGWalker 的使用流程。使用者載入資料後,可以透過拖拽欄位來建立圖表,實作資料的視覺化探索。

  flowchart TD
  A[載入資料] --> B[啟動 PyGWalker]
  B --> C[拖拽欄位建立圖表]
  C --> D[視覺化探索資料]

scikit-learn 在資料科學中的應用

scikit-learn 是一個功能強大的機器學習函式庫,提供了多種演算法和工具,用於資料的分類別、迴歸、聚類別等任務。

線性迴歸模型範例

from sklearn.model_selection import train_test_split
from sklearn import linear_model

# 準備資料
num_df = df.select_dtypes(include=["number"])
num_df = num_df.drop(columns=["cylinders", "displ"])

target_col = "comb08"
X = num_df.drop(columns=[target_col])
y = num_df[target_col]

# 分割訓練和測試資料
X_train, X_test, y_train, y_test = train_test_split(X, y)

# 建立線性迴歸模型
model = linear_model.LinearRegression()
model.fit(X_train, y_train)

# 進行預測
y_pred = model.predict(X_test)

這段程式碼展示瞭如何使用 scikit-learn 建立一個線性迴歸模型,並對資料進行預測。

圖表翻譯:

此圖示展示了使用 scikit-learn 建立線性迴歸模型的流程。從資料準備到模型訓練和預測,每一步都清晰地展示了資料科學的工作流程。

  flowchart TD
  A[資料準備] --> B[分割訓練和測試資料]
  B --> C[建立線性迴歸模型]
  C --> D[訓練模型]
  D --> E[進行預測]

pandas 生態系統中的機器學習與資料函式庫整合

在資料分析領域中,pandas 函式庫提供了強大的資料處理能力。然而,當我們需要進行更進階的機器學習任務或資料函式庫操作時,就需要結合其他優秀的工具來實作。本文將深入探討 scikit-learn、XGBoost 和 DuckDB 這些與 pandas 高度相容的工具,並展示如何將它們整合到資料分析工作流程中。

使用 scikit-learn 進行線性迴歸分析

scikit-learn 是 Python 中最著名的機器學習函式庫之一,它提供了豐富的演算法和工具來進行資料探勘和資料分析。以下是一個使用 scikit-learn 進行線性迴歸分析的範例:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 將資料集分割為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立線性迴歸模型
regr = LinearRegression()
regr.fit(X_train, y_train)

# 對測試集進行預測
y_pred = regr.predict(X_test)

# 評估模型效能
mse = mean_squared_error(y_test, y_pred)
print(f"平均平方誤差:{mse:.4f}")

程式碼解析

  1. 首先使用 train_test_split 函式將資料集分割為訓練集和測試集,這是機器學習中常見的做法,有助於評估模型的泛化能力。
  2. 建立 LinearRegression 物件並使用訓練資料進行模型訓練。
  3. 使用訓練好的模型對測試集進行預測。
  4. 透過 mean_squared_error 函式計算預測結果與實際值的平均平方誤差,作為模型效能的評估指標。

使用 XGBoost 進行分類別任務

XGBoost 是另一個強大的機器學習函式庫,特別是在處理結構化資料時表現出色。以下是一個使用 XGBoost 進行分類別任務的範例:

from xgboost import XGBClassifier

# 篩選特定品牌的資料
brands = {"Dodge", "Toyota", "Volvo", "BMW", "Buick", "Audi", "Volkswagen", "Subaru"}
df_filtered = df[df["make"].isin(brands)]

# 準備特徵和目標變數
X = df_filtered.select_dtypes(include=["number"])
y = df_filtered["make"].astype(pd.CategoricalDtype()).cat.codes

# 分割資料集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立 XGBoost 分類別器
bst = XGBClassifier()
bst.fit(X_train, y_train)

# 進行預測並評估準確度
preds = bst.predict(X_test)
accuracy = (preds == y_test).sum() / len(y_test)
print(f"模型預測準確度:{accuracy:.2%}")

程式碼解析

  1. 首先篩選出特定品牌的資料子集。
  2. 將資料中的數值型欄位作為特徵,同時將目標變數(品牌)轉換為類別型編碼。
  3. 使用 XGBoost 的 XGBClassifier 建立分類別模型並進行訓練。
  4. 在測試集上進行預測,並計算模型的預測準確度。

使用 DuckDB 進行 SQL 查詢

DuckDB 是一個輕量級的資料函式庫系統,能夠與 pandas DataFrame 無縫整合,提供 SQL 查詢能力。以下是使用 DuckDB 的範例:

import duckdb

# 將 pandas DataFrame 註冊到 DuckDB
duckdb.sql("CREATE TABLE vehicles AS SELECT * FROM df")

# 執行 SQL 查詢
result = duckdb.sql("SELECT COUNT(*) FROM vehicles WHERE make = 'Honda'")

# 顯示查詢結果
print(result)

程式碼解析

  1. 使用 duckdb.sql 方法將 pandas DataFrame 註冊為 DuckDB 中的資料表。
  2. 執行 SQL 查詢陳述式,統計特定條件下的資料筆數。
  3. 直接在 DataFrame 上使用 SQL 查詢,大大簡化了資料分析的過程。
  flowchart TD
    A[資料載入] --> B{資料清理}
    B -->|是| C[特徵工程]
    B -->|否| D[錯誤處理]
    C --> E[模型訓練]
    E --> F[模型評估]
    F -->|滿足需求| G[佈署模型]
    F -->|不滿足需求| E

圖表解析

此流程圖展示了從資料載入到模型佈署的完整流程。首先進行資料載入,接著進行資料清理。如果資料品質良好,則進入特徵工程階段;否則進行錯誤處理。完成特徵工程後進行模型訓練,並評估模型效能。若模型效能滿足需求,則佈署模型;若不滿足,則重新進行模型訓練和調整。

Ibis:統一的 DataFrame API

Ibis 是由 pandas 創始人開發的另一個優秀工具,它提供了一個統一的 DataFrame API,可以與多種後端儲存系統進行互動。Ibis 的設計理念是將查詢介面與資料儲存分離,使得使用者可以使用相同的 API 查詢不同來源的資料。

import ibis

# 建立 Ibis 連線
conn = ibis.pandas.connect({"vehicles": df})

# 使用 Ibis API 進行查詢
expr = conn.table("vehicles").filter(conn.table("vehicles").make == "Honda")

# 執行查詢並轉換為 pandas DataFrame
result = expr.execute()
print(result.head())

程式碼解析

  1. 使用 Ibis 的 pandas.connect 方法將 pandas DataFrame 連線到 Ibis。
  2. 使用 Ibis 的 API 建立查詢運算式,篩選出特定條件的資料。
  3. 執行查詢並將結果轉換為 pandas DataFrame。

pandas 生態系統中的關鍵技術與應用

在資料分析領域中,pandas 函式庫已成為不可或缺的核心工具。然而,隨著資料規模的擴大和效能需求的提升,許多其他函式庫開始與 pandas 形成互補或替代關係。本章將深入探討 pandas 生態系統中的重要技術,包括 Ibis、Dask、Polars 和 cuDF 等關鍵函式庫。

使用 Ibis 實作延遲執行

Ibis 是一個強大的函式庫,允許使用者以類別似 pandas 的 API 操作資料,但具備延遲執行的能力。要使用 Ibis 處理 pandas DataFrame,首先需要透過 ibis.memtable 函式進行包裝:

import ibis
import pandas as pd

# 載入資料
df = pd.read_csv(
    "data/vehicles.csv.zip",
    dtype_backend="numpy_nullable",
    usecols=["id", "year", "make", "model", "city08"],
)

# 使用 Ibis 處理 DataFrame
t = ibis.memtable(df)

# 執行篩選和欄位選擇
result = t.filter(t.make == "Honda").select("make", "model", "year", "city08")

程式碼解析

  1. 資料載入:使用 pandas 的 read_csv 方法載入指定資料欄位。
  2. Ibis 表格建立:透過 ibis.memtable 將 pandas DataFrame 轉換為 Ibis 表格。
  3. 資料查詢:使用 Ibis API 進行資料篩選和欄位選擇。

Ibis 的最大特點是採用延遲執行(lazy execution)機制,這意味著查詢操作不會立即執行,而是等待明確的執行指令。這種機制允許 Ibis 對查詢進行最佳化,例如調整篩選和投影操作的順序。

要將查詢結果轉換回 pandas DataFrame,可以使用 to_pandas() 方法:

result.to_pandas().head()

輸出結果:

      make           model  year  city08
0     Honda  Accord Wagon  1993      18
1     Honda  Accord Wagon  1993      20
2     Honda   Civic Del Sol  1994      25
3     Honda   Civic Del Sol  1994      30
4     Honda   Civic Del Sol  1994      23

Dask:實作平行計算的 DataFrame 解決方案

Dask 是另一個與 pandas 緊密相關的函式庫,它提供了類別似 pandas DataFrame 的 API,但具備平行計算和處理大規模資料集的能力。要將 pandas DataFrame 轉換為 Dask DataFrame,可以使用 dask.dataframe.from_pandas 函式:

import dask.dataframe as dd

# 建立 Dask DataFrame
ddf = dd.from_pandas(df, npartitions=10)

# 執行運算
result = ddf.compute()

程式碼解析

  1. Dask DataFrame 建立:使用 dd.from_pandas 將 pandas DataFrame 轉換為 Dask DataFrame。
  2. 分割設定:透過 npartitions 引數控制資料分割的數量。
  3. 運算執行:使用 compute() 方法強制執行運算。

Dask 的平行計算能力可以顯著提升大規模資料處理的效能。然而,需要注意的是,Dask 也採用了延遲執行的機制,需要透過 .compute() 方法來觸發實際運算。

Polars:高效能的 DataFrame 實作

Polars 是一個新興的 DataFrame 函式庫,具備以下特點:

  1. Apache Arrow 原生支援
  2. 簡潔的型別系統
  3. 一致的缺失值處理
  4. 支援大於記憶體的資料集
  5. 延遲執行引擎和查詢最佳化

要將 pandas DataFrame 轉換為 Polars DataFrame,可以使用 polars.from_pandas 函式:

import polars as pl

# 建立 Polars DataFrame
pl_df = pl.from_pandas(df)

# 顯示前幾行資料
print(pl_df.head())

程式碼解析

  1. 資料轉換:使用 pl.from_pandas 將 pandas DataFrame 轉換為 Polars DataFrame。
  2. 資料檢視:使用 head() 方法顯示資料的前幾行。

Polars 也支援延遲執行,可以透過 pl.LazyFrame 實作:

# 建立 LazyFrame
lz_df = pl.LazyFrame(df)

# 執行篩選和欄位選擇
result = lz_df.filter(lz_df['make'] == 'Honda').select(["make", "model", "year", "city08"]).collect()

Mermaid 圖表:資料處理流程

  flowchart TD
    A[資料載入] --> B[pandas DataFrame 建立]
    B --> C{Ibis/Dask/Polars 轉換}
    C -->|Ibis| D[Ibis 延遲執行]
    C -->|Dask| E[Dask 平行計算]
    C -->|Polars| F[Polars 高效能處理]
    D --> G[結果輸出]
    E --> G
    F --> G

圖表解析

此圖示展示了從資料載入到不同函式庫處理的流程。首先,資料被載入並建立為 pandas DataFrame。接著,可以選擇轉換到 Ibis、Dask 或 Polars。每個函式庫都有其特定的處理方式:Ibis 採用延遲執行、Dask 實作平行計算,而 Polars 則提供高效能的資料處理能力。最終,所有路徑都匯聚到結果輸出的階段。

cuDF:GPU 加速的 pandas 替代方案

對於擁有 Nvidia GPU 的使用者,cuDF 提供了一個強大的加速方案。透過簡單的安裝步驟:

import cudf.pandas
cudf.pandas.install()
import pandas as pd

就可以將現有的 pandas 程式碼在 GPU 上執行,無需修改程式碼。這種方法可以顯著提升效能,特別是在合適的硬體環境下。

技術比較與選型考量

函式庫 核心特點 適用場景
Ibis 延遲執行、查詢最佳化 需要靈活查詢最佳化的場景
Dask 平行計算、大規模資料處理 處理大於記憶體的資料集
Polars 高效能、Apache Arrow 原生支援 需要高效能資料處理的場景
cuDF GPU 加速 擁有 Nvidia GPU 的環境

在選擇合適的函式庫時,需要根據具體的應用場景和效能需求進行綜合考量。每個函式庫都有其獨特的優勢和適用情況。