DuckDB 作為一個嵌入式分析型資料函式庫,以其零組態的特性和高效能的向量化執行引擎,為資料科學家提供了強大的分析利器。不同於傳統資料函式庫需要繁瑣的伺服器設定和管理,DuckDB 可以直接在應用程式中執行,簡化了開發流程。其向量化執行引擎能夠一次處理多條資料,大幅提升了查詢速度,尤其在處理大量資料時,效能優勢更加明顯。此外,DuckDB 與 Python 和 Polars 等資料科學工具的無縫整合,讓資料科學家能夠更便捷地進行資料分析和探索。它支援標準 SQL 語法,降低了學習成本,同時也提供了豐富的擴充功能,例如空間資料分析,滿足更多元的應用場景。對於需要快速原型設計和本地資料處理的專案,DuckDB 是一個理想的選擇。
玄貓解析:DuckDB 技術內幕與資料分析實戰
為何玄貓選擇 DuckDB:資料分析的新星
在眾多資料函式庫解決方案中,DuckDB 以其獨特的優勢脫穎而出。作為一位資料工程師,我發現 DuckDB 不僅容易上手,而與在處理分析型查詢時表現出色。它是一個快速、嵌入式與零組態的 OLAP 資料倉管理系統,特別適合需要快速原型設計和本地資料處理的專案。
DuckDB 的核心優勢:玄貓的解讀
DuckDB 的優勢不僅僅在於其速度,還包括:
- 高效能:DuckDB 採用向量化執行和平行處理,使其在分析查詢上表現出色。
- 易於整合:它可以輕鬆與 Python 和 R 等語言整合,方便資料科學家使用。
- 零組態:無需複雜的設定,即可快速開始使用。
- 嵌入式:DuckDB 是一個嵌入式資料函式庫,這意味著它可以直接在應用程式中執行,無需額外的伺服器。
DuckDB 與其他資料函式庫的比較:玄貓的觀點
與傳統的關聯式資料函式庫(如 MySQL 或 PostgreSQL)相比,DuckDB 更適合於分析型查詢。雖然它不具備傳統資料函式庫的所有功能,但在資料分析方面,DuckDB 提供了更快的速度和更高的效率。
實戰演練:玄貓帶你分析 2015 年航班延誤與取消資料
從 CSV 開始:資料匯入與初步探索
首先,我們從一個 CSV 檔案開始,這個檔案包含了 2015 年的航班延誤與取消資料。
import duckdb
import pandas as pd
# 建立與連線到 DuckDB 資料函式庫
con = duckdb.connect('flight_data.duckdb', read_only=False)
# 從 CSV 檔案讀取資料
df = pd.read_csv('2015-Flight-Delays-and-Cancellations.csv')
# 將 DataFrame 寫入 DuckDB 資料函式庫
con.execute("CREATE TABLE flights AS SELECT * FROM df")
# 查詢資料
result = con.execute("SELECT * FROM flights LIMIT 5").fetchdf()
print(result)
con.close()
內容解密
duckdb.connect('flight_data.duckdb', read_only=False): 建立或連線到名為flight_data.duckdb的 DuckDB 資料函式庫。read_only=False表示我們有讀寫許可權。pd.read_csv('2015-Flight-Delays-and-Cancellations.csv'): 使用 Pandas 從 CSV 檔案讀取資料,並將其儲存在 DataFramedf中。con.execute("CREATE TABLE flights AS SELECT * FROM df"): 建立一個名為flights的表格,並將 DataFramedf中的所有資料匯入到這個表格中。con.execute("SELECT * FROM flights LIMIT 5").fetchdf(): 從flights表格中選取前 5 列資料,並將結果儲存在 Pandas DataFrame 中。
使用 SQL 進行資料分析:玄貓的技巧
DuckDB 支援 SQL 查詢,這使得資料分析變得非常簡單。以下是一些常用的 SQL 查詢範例:
import duckdb
con = duckdb.connect('flight_data.duckdb', read_only=False)
# 查詢總航班數量
total_flights = con.execute("SELECT COUNT(*) FROM flights").fetchone()[0]
print(f"總航班數量: {total_flights}")
# 查詢延誤超過 60 分鐘的航班數量
delayed_flights = con.execute("SELECT COUNT(*) FROM flights WHERE DepDelay > 60").fetchone()[0]
print(f"延誤超過 60 分鐘的航班數量: {delayed_flights}")
# 查詢取消的航班數量
cancelled_flights = con.execute("SELECT COUNT(*) FROM flights WHERE Cancelled = 1").fetchone()[0]
print(f"取消的航班數量: {cancelled_flights}")
con.close()
內容解密
con.execute("SELECT COUNT(*) FROM flights").fetchone()[0]: 計算flights表格中的總列數,即總航班數量。con.execute("SELECT COUNT(*) FROM flights WHERE DepDelay > 60").fetchone()[0]: 計算flights表格中DepDelay(延誤時間)大於 60 分鐘的列數。con.execute("SELECT COUNT(*) FROM flights WHERE Cancelled = 1").fetchone()[0]: 計算flights表格中Cancelled(取消)欄位值為 1 的列數。
進階分析:玄貓帶你挖掘更多資訊
除了基本的查詢,我們還可以進行更進階的分析,例如找出最常發生延誤的航空公司:
import duckdb
con = duckdb.connect('flight_data.duckdb', read_only=False)
# 找出最常發生延誤的航空公司
most_delayed_carrier = con.execute("""
SELECT Carrier, COUNT(*) AS DelayCount
FROM flights
WHERE DepDelay > 0
GROUP BY Carrier
ORDER BY DelayCount DESC
LIMIT 1
""").fetchdf()
print("最常發生延誤的航空公司:")
print(most_delayed_carrier)
con.close()
內容解密
- 這段 SQL 查詢找出
flights表格中DepDelay(延誤時間)大於 0 的列,然後按照Carrier(航空公司)進行分組,計算每個航空公司的延誤次數,並按照延誤次數降序排序,最後選取第一列,即最常發生延誤的航空公司。
使用 JupySQL 進行互動式分析:玄貓的效率工具
JupySQL 是一個 Jupyter Notebook 的擴充功能,可以讓我們在 Notebook 中直接執行 SQL 查詢,並將結果以表格或圖表的形式呈現。這對於互動式資料分析非常有用。
安裝 JupySQL:玄貓的建議
首先,我們需要安裝 JupySQL 和 duckdb-engine:
pip install jupysql duckdb-engine
在 Jupyter Notebook 中使用 JupySQL:玄貓的示範
%load_ext sql
%sql duckdb:///flight_data.duckdb
%sql SELECT Carrier, COUNT(*) AS DelayCount FROM flights WHERE DepDelay > 0 GROUP BY Carrier ORDER BY DelayCount DESC LIMIT 5
內容解密
%load_ext sql: 載入 SQL 擴充功能。%sql duckdb:///flight_data.duckdb: 連線到 DuckDB 資料函式庫。%sql SELECT Carrier, COUNT(*) AS DelayCount FROM flights WHERE DepDelay > 0 GROUP BY Carrier ORDER BY DelayCount DESC LIMIT 5: 執行 SQL 查詢,並將結果以表格形式呈現。
DuckDB:小而美的分析利器,資料科學家的效率加速器
為何我放棄傳統資料倉儲:DuckDB 的輕量化與高效能
在資料分析的旅程中,我們常常面臨資料量不斷增長、分析需求日益複雜的挑戰。傳統資料倉儲雖然功能強大,但往往過於笨重,佈署和維護成本高昂。玄貓在尋找更輕量、更高效的替代方案時,發現了 DuckDB 這個令人驚豔的開源專案。
DuckDB 是一個專為 OLAP(Online Analytical Processing)工作負載設計的嵌入式資料函式庫。它最大的優勢在於其輕量化和高效能。你可以把它想像成一個「隨身碟資料函式庫」,無需複雜的伺服器組態,就能在你的 Python 環境中直接使用 SQL 進行資料分析。
DuckDB 的閃光點:速度、整合與易用性
DuckDB 具備以下幾個關鍵優勢:
- 向量化執行引擎: DuckDB 採用向量化執行引擎,能夠一次處理多個資料列,大幅提升查詢速度。
- 與 Python 無縫整合: DuckDB 可以直接在 Python 中使用,與 pandas、Polars 等資料科學工具整合。
- SQL 相容性: DuckDB 支援標準 SQL 語法,讓你無需學習新的查詢語言。
- 可擴充性: DuckDB 支援擴充功能,可以輕鬆擴充其功能,例如支援空間資料分析。
安裝與設定:快速上手 DuckDB
要開始使用 DuckDB,只需簡單的幾行 Python 程式碼:
import duckdb
# 建立一個記憶體資料函式庫
con = duckdb.connect(database=':memory:', read_only=False)
# 或者,建立一個持久化的資料函式庫
# con = duckdb.connect(database='my_database.duckdb', read_only=False)
這段程式碼會建立一個 DuckDB 連線。你可以選擇建立一個記憶體資料函式庫(:memory:),或者建立一個持久化的資料函式庫(my_database.duckdb)。
從 CSV 到 Parquet:DuckDB 的資料讀取大法
DuckDB 支援多種資料格式,包括 CSV、Parquet 和 JSON。以下是一些範例:
CSV 檔案讀取
# 建立一個表格,並從 CSV 檔案讀取資料
con.execute("CREATE TABLE my_table AS SELECT * FROM read_csv_auto('my_data.csv')")
Parquet 檔案讀取
# 建立一個表格,並從 Parquet 檔案讀取資料
con.execute("CREATE TABLE my_table AS SELECT * FROM read_parquet('my_data.parquet')")
JSON 檔案讀取
# 建立一個表格,並從 JSON 檔案讀取資料
con.execute("CREATE TABLE my_table AS SELECT * FROM read_json_auto('my_data.json')")
DuckDB 與 Polars:強強聯手的資料處理
Polars 是一個根據 Rust 的高效能 DataFrame 函式庫。DuckDB 可以與 Polars 無縫整合,讓你能夠利用 Polars 的速度和 DuckDB 的 SQL 功能。
import polars as pl
# 建立一個 Polars DataFrame
df = pl.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie']})
# 將 Polars DataFrame 註冊到 DuckDB
con.register('my_dataframe', df)
# 使用 SQL 查詢 Polars DataFrame
result = con.execute("SELECT * FROM my_dataframe WHERE id > 1").fetchdf()
print(result)
DuckDB 的進階應用:空間資料分析
DuckDB 支援空間資料分析,讓你能夠處理地理空間資料。首先,你需要載入 spatial 擴充功能:
con.execute("INSTALL spatial")
con.execute("LOAD spatial")
然後,你可以使用空間函式進行分析,例如計算兩個點之間的距離:
con.execute("CREATE TABLE my_points (id INTEGER, geom GEOMETRY)")
con.execute("INSERT INTO my_points VALUES (1, ST_Point(1, 2)), (2, ST_Point(3, 4))")
result = con.execute("SELECT ST_Distance(geom, ST_Point(0, 0)) FROM my_points").fetchdf()
print(result)