在資料科學專案中,確保資料品質和有效呈現分析結果至關重要。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}")
程式碼解析
- 首先使用
train_test_split
函式將資料集分割為訓練集和測試集,這是機器學習中常見的做法,有助於評估模型的泛化能力。 - 建立
LinearRegression
物件並使用訓練資料進行模型訓練。 - 使用訓練好的模型對測試集進行預測。
- 透過
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%}")
程式碼解析
- 首先篩選出特定品牌的資料子集。
- 將資料中的數值型欄位作為特徵,同時將目標變數(品牌)轉換為類別型編碼。
- 使用 XGBoost 的
XGBClassifier
建立分類別模型並進行訓練。 - 在測試集上進行預測,並計算模型的預測準確度。
使用 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)
程式碼解析
- 使用
duckdb.sql
方法將 pandas DataFrame 註冊為 DuckDB 中的資料表。 - 執行 SQL 查詢陳述式,統計特定條件下的資料筆數。
- 直接在 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())
程式碼解析
- 使用 Ibis 的
pandas.connect
方法將 pandas DataFrame 連線到 Ibis。 - 使用 Ibis 的 API 建立查詢運算式,篩選出特定條件的資料。
- 執行查詢並將結果轉換為 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")
程式碼解析
- 資料載入:使用 pandas 的
read_csv
方法載入指定資料欄位。 - Ibis 表格建立:透過
ibis.memtable
將 pandas DataFrame 轉換為 Ibis 表格。 - 資料查詢:使用 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()
程式碼解析
- Dask DataFrame 建立:使用
dd.from_pandas
將 pandas DataFrame 轉換為 Dask DataFrame。 - 分割設定:透過
npartitions
引數控制資料分割的數量。 - 運算執行:使用
compute()
方法強制執行運算。
Dask 的平行計算能力可以顯著提升大規模資料處理的效能。然而,需要注意的是,Dask 也採用了延遲執行的機制,需要透過 .compute()
方法來觸發實際運算。
Polars:高效能的 DataFrame 實作
Polars 是一個新興的 DataFrame 函式庫,具備以下特點:
- Apache Arrow 原生支援
- 簡潔的型別系統
- 一致的缺失值處理
- 支援大於記憶體的資料集
- 延遲執行引擎和查詢最佳化
要將 pandas DataFrame 轉換為 Polars DataFrame,可以使用 polars.from_pandas
函式:
import polars as pl
# 建立 Polars DataFrame
pl_df = pl.from_pandas(df)
# 顯示前幾行資料
print(pl_df.head())
程式碼解析
- 資料轉換:使用
pl.from_pandas
將 pandas DataFrame 轉換為 Polars DataFrame。 - 資料檢視:使用
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 的環境 |
在選擇合適的函式庫時,需要根據具體的應用場景和效能需求進行綜合考量。每個函式庫都有其獨特的優勢和適用情況。