在資料科學專案中,確保資料品質和有效呈現分析結果至關重要。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 原生支援需要高效能資料處理的場景
cuDFGPU 加速擁有 Nvidia GPU 的環境

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