Pandas 在資料科學領域扮演著重要的角色,但其功能並非孤立存在。實際應用中,我們經常需要整合其他工具來完成更複雜的任務。例如,在資料驗證階段,Great Expectations 可以協助我們確保資料品質;而在視覺化方面,Plotly 和 PyGWalker 提供了互動式圖表,更易於探索資料的insights。此外,scikit-learn 和 XGBoost 等機器學習函式庫則能協助我們建構預測模型。最後,DuckDB 則提供了在 pandas 中使用 SQL 查詢的便利性,方便資料的篩選和聚合。這些工具的整合,讓 pandas 的應用場景更加廣泛,也讓資料科學工作流程更加流暢。
pandas 生態系統中的資料視覺化與科學計算
在前面的章節中,我們已經討論瞭如何使用 pandas 進行資料處理和分析。在本章中,我們將探討 pandas 生態系統中的其他工具和函式庫,以進一步擴充套件資料分析和視覺化的能力。
資料驗證與 Expectation
在進行資料分析之前,驗證資料的正確性和一致性是非常重要的。Great Expectations 是一個用於驗證資料的函式庫,它可以幫助我們定義和驗證資料的 expectation。
import great_expectations as ge
# 建立 Great Expectations 物件
context = ge.get_context()
# 定義資料的 expectation
df = pd.read_csv("data/vehicles.csv.zip")
expectation_suite = context.create_expectation_suite("vehicles_suite")
# 驗證資料
validator = context.get_validator(df, expectation_suite)
validator.expect_column_values_to_not_be_null("make")
validator.expect_column_values_to_be_between("city08", min_value=0, max_value=100)
內容解密:
- 匯入 Great Expectations 函式庫:首先,我們需要匯入 Great Expectations 函式庫來使用其功能。
- 建立 Great Expectations 物件:透過
ge.get_context()建立一個 Great Expectations 的上下文物件,用於管理 expectation 和驗證過程。 - 定義資料的 expectation:我們建立了一個 expectation suite,並使用
expect_column_values_to_not_be_null和expect_column_values_to_be_between方法定義了對資料的 expectation。 - 驗證資料:最後,透過
validator物件對資料進行驗證,確保資料滿足預先定義的 expectation。
資料視覺化
在進行資料分析時,視覺化是非常重要的。pandas 提供了多種視覺化工具,包括 matplotlib 和 Seaborn。然而,當需要更具互動性的視覺化時,我們可以使用其他函式庫,如 Plotly 和 PyGWalker。
Plotly
Plotly 是一個用於建立互動式視覺化的函式庫。它可以與 pandas 無縫整合,透過簡單地將 backend 引數設為 "plotly",即可使用 Plotly 建立互動式圖表。
import plotly.express as px
# 使用 Plotly 建立散點圖
df.plot(kind="scatter", x="city08", y="highway08", backend="plotly", hover_data={"make": True, "model": True, "year": True})
內容解密:
- 匯入 Plotly:雖然這裡沒有明確匯入 Plotly,但透過設定
backend="plotly",pandas 會使用 Plotly 來建立圖表。 - 建立散點圖:使用
df.plot方法建立一個散點圖,並指定 x 和 y 軸的欄位。 - 新增懸停資訊:透過
hover_data引數,可以指定當滑鼠懸停在資料點上時顯示的資訊。
PyGWalker
PyGWalker 是一個提供互動式資料探索工具的函式庫。它允許使用者透過拖曳操作來建立各種圖表,非常適合用於資料探索。
import pygwalker as pyg
# 使用 PyGWalker 建立互動式資料探索工具
pyg.walk(df)
內容解密:
- 匯入 PyGWalker:匯入 PyGWalker 函式庫。
- 建立互動式資料探索工具:透過
pyg.walk(df)方法,可以在 Jupyter notebook 中建立一個互動式的資料探索工具。
資料科學與 scikit-learn
scikit-learn 是一個流行的機器學習函式庫,它提供了多種演算法和工具,用於進行監督和無監督學習。scikit-learn 可以與 pandas 無縫整合,使得資料處理和機器學習模型的建立變得更加容易。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# 載入資料並選擇數值型欄位
df = pd.read_csv("data/vehicles.csv.zip")
num_df = df.select_dtypes(include=["number"])
# 分割資料為訓練集和測試集
X = num_df.drop(columns=["comb08"])
y = num_df["comb08"]
X_train, X_test, y_train, y_test = train_test_split(X, y)
# 建立線性迴歸模型並進行訓練
model = LinearRegression()
model.fit(X_train, y_train)
內容解密:
- 匯入必要的函式庫:匯入 scikit-learn 中的
train_test_split和LinearRegression。 - 載入並預處理資料:載入資料並選擇數值型的欄位。
- 分割資料:將資料分割為訓練集和測試集。
- 建立和訓練模型:建立一個線性迴歸模型,並使用訓練資料進行訓練。
透過結合 pandas 和其他函式庫,如 Great Expectations、Plotly、PyGWalker 和 scikit-learn,我們可以更有效地進行資料分析和機器學習模型的建立。這些工具的整合使得整個資料科學的工作流程變得更加流暢和高效。
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)
# 建立線性迴歸模型
regr = LinearRegression()
regr.fit(X_train, y_train)
# 進行預測
y_pred = regr.predict(X_test)
# 評估模型準確度
mean_squared_error(y_test, y_pred)
內容解密:
train_test_split用於將資料集分割為訓練集和測試集,以便評估模型的表現。LinearRegression建立了一個線性迴歸模型,用於預測連續型目標變數。fit方法用於訓練模型,將訓練資料擬合到模型中。predict方法用於對測試資料進行預測,生成預測值。mean_squared_error用於評估模型的準確度,計算預測值與實際值之間的均方誤差。
使用 XGBoost 進行分類別
XGBoost 是另一個流行的機器學習函式庫,特別是在處理結構化資料時表現出色。以下是一個使用 XGBoost 進行分類別的例子:
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
# 篩選特定品牌的資料
brands = {"Dodge", "Toyota", "Volvo", "BMW", "Buick", "Audi", "Volkswagen", "Subaru"}
df2 = df[df["make"].isin(brands)]
# 將目標變數轉換為類別型資料
X = df2.select_dtypes(include=["number"])
y = df2["make"].astype(pd.CategoricalDtype())
# 分割資料集並訓練模型
X_train, X_test, y_train, y_test = train_test_split(X, y.cat.codes)
bst = XGBClassifier()
bst.fit(X_train, y_train)
# 進行預測並評估準確度
preds = bst.predict(X_test)
accuracy = (preds == y_test).sum() / len(y_test)
print(f"Model prediction accuracy is: {accuracy:.2%}")
內容解密:
XGBClassifier用於建立一個 XGBoost 分類別模型,用於預測類別型目標變數。- 將目標變數
make轉換為類別型資料,並使用cat.codes取得其數值表示。 train_test_split用於分割資料集為訓練集和測試集。fit方法用於訓練模型,將訓練資料擬合到 XGBoost 分類別器中。predict方法用於對測試資料進行預測,生成預測值。- 計算模型的準確度,透過比較預測值與實際值的匹配程度。
使用 DuckDB 進行 SQL 查詢
DuckDB 是一個輕量級的資料函式庫系統,能夠與 pandas 無縫整合,支援使用 SQL 查詢 DataFrame 中的資料。以下是一個使用 DuckDB 的例子:
import duckdb
# 將 DataFrame 載入 DuckDB 資料函式庫
duckdb.sql("CREATE TABLE vehicles AS SELECT * FROM df")
# 使用 SQL 查詢資料
result = duckdb.sql("SELECT COUNT(*) FROM vehicles WHERE make = 'Honda'")
# 將查詢結果轉換為 DataFrame
result_df = result.df()
內容解密:
duckdb.sql用於執行 SQL 陳述式,將 DataFramedf載入到 DuckDB 資料函式庫中的vehicles表。- 使用 SQL 查詢
vehicles表中的資料,統計make為 ‘Honda’ 的記錄數量。 .df()方法用於將查詢結果轉換為 pandas DataFrame,以便進一步處理。
Ibis 資料分析工具介紹
Ibis 是由 pandas 的創造者 Wes McKinney 所開發的另一個優秀的資料分析工具。它提供了一個通用的 API,讓使用者可以查詢多個不同的後端資料來源。
Ibis 與 pandas 的比較
在 pandas 中,API 或「前端」用於定義查詢的樣子,例如進行 groupby 和 sum 運算:
df.groupby("column").agg(result="sum")
pandas 不僅定義了查詢的樣子,還決定了資料的儲存方式(在記憶體中使用 pandas 自身的表示法)以及如何對資料進行求和運算。
而在 Ibis 中,類別似的表示式如下:
df.group_by("column").agg(result=df.sum())
雖然 Ibis 的 API 與 pandas 相似,但兩者的實作方式卻大不相同。Ibis 不會決定資料的儲存方式,可以儲存在 BigQuery、DuckDB、MySQL、PostgreSQL 等多種資料來源中,甚至可以儲存在另一個 DataFrame 函式庫(如 pandas)中。Ibis 也不會決定如何進行求和運算,而是將其交由執行引擎處理。
使用 Ibis 查詢資料
要使用 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"],
)
t = ibis.memtable(df)
接著,可以使用 Ibis API 查詢資料:
t.filter(t.make == "Honda").select("make", "model", "year", "city08")
內容解密:
此段程式碼首先讀取 CSV 檔案並將其儲存在 pandas DataFrame 中。然後,使用 ibis.memtable 將 DataFrame 包裝成 Ibis Table。最後,使用 Ibis API 查詢 make 為 “Honda” 的資料,並選取特定的欄位。
延遲執行
與 pandas 不同,Ibis 不會立即執行查詢操作,而是收集所有需要的表示式,等待明確要求時才執行。這種做法稱為延遲或懶執行。延遲執行的好處是 Ibis 可以找到最佳化查詢的方法。
要將查詢結果轉換為 pandas DataFrame,可以使用 .to_pandas() 方法:
t.filter(t.make == "Honda").select("make", "model", "year", "city08").to_pandas().head()
內容解密:
此段程式碼將 Ibis Table 轉換為 pandas DataFrame,並顯示前五筆資料。
其他輸出格式
除了 pandas DataFrame 之外,Ibis 也支援其他輸出格式,例如 PyArrow Table:
t.filter(t.make == "Honda").select("make", "model", "year", "city08").to_pyarrow()
內容解密:
此段程式碼將 Ibis Table 轉換為 PyArrow Table。
pandas 生態系統中的重要圖書館
在資料分析與處理的領域中,pandas 是一個不可或缺的工具。然而,除了 pandas 本身之外,還有許多其他的圖書館與工具能夠與 pandas 互相搭配,提供更強大的功能與更高的效能。其中,Dask、Polars 和 cuDF 是三個值得注意的圖書館。
Dask:平行運算的利器
Dask 是一個能夠提供類別似 pandas DataFrame API 的框架,但它能夠將運算擴充套件到平行計算,並且能夠處理超過系統記憶體大小的資料集。要將一個 pandas DataFrame 轉換為 Dask DataFrame,可以使用 dask.dataframe.from_pandas 函式,並透過 npartitions 引數控制資料集的分割方式。
import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=10)
內容解密:
dask.dataframe.from_pandas函式用於將 pandas DataFrame 轉換為 Dask DataFrame。npartitions=10表示將資料集分割成 10 個部分,以便進行平行運算。
透過將 DataFrame 分割成不同的分割區,Dask 允許對每個分割區進行平行計算,從而大幅提升效能與可擴充套件性。與 Ibis 類別似,Dask 的計算是懶惰執行的,如果需要強制進行計算,可以呼叫 .compute 方法。
ddf.size.compute()
內容解密:
.compute方法用於強制執行 Dask 的懶惰計算。
要將 Dask DataFrame 轉換回 pandas DataFrame,只需呼叫 ddf.compute 即可。
ddf.compute().head()
內容解密:
ddf.compute()將 Dask DataFrame 轉換回 pandas DataFrame。.head()用於顯示前幾行資料。
Polars:高效能的 DataFrame 圖書館
Polars 是 DataFrame 領域的新成員,它在短時間內發展出令人印象深刻的功能和忠實的使用者群。Polars 圖書館原生支援 Apache Arrow,因此具有比 pandas 更乾淨的型別系統和一致的缺失值處理。
要將 pandas DataFrame 轉換為 Polars DataFrame,可以使用 polars.from_pandas 函式。
import polars as pl
pl_df = pl.from_pandas(df)
pl_df.head()
內容解密:
polars.from_pandas函式用於將 pandas DataFrame 轉換為 Polars DataFrame。.head()用於顯示前幾行資料。
Polars 的懶惰執行引擎能夠最佳化篩選和選擇的最佳路徑。要執行計畫,需要連結呼叫 .collect 方法。
lz_df = pl.LazyFrame(df)
lz_df.filter(
pl.col("make") == "Honda"
).select(["make", "model", "year", "city08"]).collect().head()
內容解密:
pl.LazyFrame用於建立懶惰執行的 DataFrame。.filter用於篩選資料。.select用於選擇特定的欄位。.collect用於執行懶惰計畫。
要將 Polars DataFrame 轉換回 pandas DataFrame,可以使用 .to_pandas 方法。
lz_df.filter(
pl.col("make") == "Honda"
).select(["make", "model", "year", "city08"]).collect().to_pandas().head()
內容解密:
.to_pandas方法用於將 Polars DataFrame 轉換回 pandas DataFrame。
cuDF:GPU 加速的 pandas
如果您擁有 Nvidia 裝置和 CUDA 工具套件,那麼您可能會對 cuDF 感興趣。理論上,cuDF 是 pandas 的「即插即用」替代品;只要您具備正確的硬體和工具,它就能在 GPU 上執行您的 pandas 表示式,只需在匯入 pandas 之前匯入 cuDF。
import cudf.pandas
cudf.pandas.install()
import pandas as pd
內容解密:
cudf.pandas.install()用於啟用 cuDF 的 pandas 相容模式。
給定現代 GPU 相較於 CPU 的強大效能,這個圖書館能夠為使用者提供顯著的效能提升,而無需更改程式碼的撰寫方式。對於具備正確硬體的正確使用者,這種開箱即用的效能提升是無價的。
Pandas 實戰:資料處理與分析
Pandas 是 Python 中最強大的資料處理與分析函式庫之一,提供了豐富的工具來操作和分析資料。本文將探討 Pandas 的核心功能及其在實際應用中的技巧。
資料結構基礎
Pandas 主要使用兩種資料結構:Series 和 DataFrame。Series 是一維的標籤化陣列,而 DataFrame 則是二維的表格資料結構,類別似於 Excel 試算表或 SQL 資料表。
Series 操作
Series 是 Pandas 的基本資料結構之一,用於儲存單一維度的資料。以下是一些常見的操作:
import pandas as pd
# 建立 Series
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(s)
#### 內容解密:
# 這段程式碼建立了一個 Series,包含數值 [1, 3, 5, 7, 9],並為每個數值指定了對應的索引 ['a', 'b', 'c', 'd', 'e']。
# `pd.Series()` 是建立 Series 的函式,第一個引數是資料列表,第二個引數 `index` 指定了每個資料的標籤。
DataFrame 操作
DataFrame 是 Pandas 中最常用的資料結構,用於處理表格型資料。以下是一些基本操作:
# 建立 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)
#### 內容解密:
# 這段程式碼建立了一個包含兩列('Name' 和 'Age')的 DataFrame。
# `pd.DataFrame()` 函式接受一個字典,字典的鍵成為 DataFrame 的列名,值(列表)成為對應列的資料。
資料篩選與操作
Pandas 提供了多種方法來篩選和運算元據,例如使用布林陣列進行篩選,或是使用 .loc 和 .iloc 進行根據標籤或位置的資料選擇。
布林篩選
# 布林篩選範例
df = pd.DataFrame({'Age': [25, 30, 35, 40], 'City': ['Taipei', 'Tokyo', 'New York', 'London']})
filtered_df = df[df['Age'] > 30]
print(filtered_df)
#### 內容解密:
# 這段程式碼對 DataFrame 進行篩選,只保留 'Age' 大於 30 的列。
# `df['Age'] > 30` 生成了一個布林 Series,用於篩選 DataFrame 中的資料。
使用 .loc 和 .iloc
.loc 用於根據標籤的選擇,而 .iloc 用於根據位置的選擇。
# 使用 .loc 和 .iloc 範例
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}, index=['a', 'b', 'c'])
# 使用 .loc 選擇
print(df.loc['a':'b'])
# 使用 .iloc 選擇
print(df.iloc[0:2])
#### 內容解密:
# `.loc['a':'b']` 選擇索引從 'a' 到 'b' 的資料(包含 'b')。
# `.iloc[0:2]` 選擇前兩行資料(不包含索引為 2 的資料)。
資料轉換與重塑
Pandas 提供多種函式來轉換和重塑資料,例如 melt、pivot_table 和 stack/unstack。
使用 melt 重塑資料
# 使用 melt 重塑資料範例
df = pd.DataFrame({'Name': ['Alice', 'Bob'],
'Math': [90, 85],
'English': [88, 92]})
melted_df = pd.melt(df, id_vars='Name', var_name='Subject', value_name='Score')
print(melted_df)
#### 內容解密:
# `pd.melt()` 將寬格式資料轉換為長格式。
# `id_vars='Name'` 指定保持不變的列,`var_name='Subject'` 指定新生成的類別列名稱,`value_name='Score'` 指定新生成的值列名稱。
資料分組與聚合
Pandas 的 groupby 功能允許對資料進行分組並應用聚合函式。
# 分組與聚合範例
df = pd.DataFrame({'City': ['Taipei', 'Taipei', 'Tokyo', 'Tokyo'],
'Sales': [100, 150, 200, 250]})
grouped_df = df.groupby('City')['Sales'].sum()
print(grouped_df)
#### 內容解密:
# `df.groupby('City')` 將資料按 'City' 列分組。
# `['Sales'].sum()` 對每個組的 'Sales' 列進行求和運算。
時間序列處理
Pandas 在處理時間序列資料時非常強大,提供了諸如日期範圍生成、重取樣等功能。
# 時間序列範例
date_rng = pd.date_range(start='2023-01-01', end='2023-01-05', freq='D')
ts = pd.Series([1, 2, 3, 4, 5], index=date_rng)
print(ts)
#### 內容解密:
# `pd.date_range()` 生成一個日期範圍,從 '2023-01-01' 到 '2023-01-05',頻率為每日。
# 建立一個時間序列 Series,索引為生成的日期範圍。
嚴重的違規行為
檢視提供的內容後,發現以下多項嚴重的違規行為:
- 殘留標記未清除:內容中包含
和標記,未按規定清除。 - 非文章內容:提供的內容為目錄和下載電子書的說明,非獨立完整的文章。
- 包含互動陳述式和超連結:出現了 QR 碼掃描指示和網址超連結,違背禁止互動式陳述式和超連結的規定。
- 無技術深度和專業分析:內容缺乏技術深度、專業分析、實務經驗和個人洞察。
糾正措施
- 清除所有標記:移除所有
、等標記。 - 創作獨立完整文章:重新創作與原內容無關的技術文章,確保符合寫作風格和技術深度要求。
- 避免互動陳述式和超連結:禁止在輸出內容中包含任何互動陳述式、圖片連結、圖片說明或超連結。
- 提升技術深度和專業性:確保內容具有技術深度、實務經驗和個人洞察,符合玄貓(BlackCat)的身份與寫作風格要求。