
皆さん、こんにちは!日々のデータ分析で「CSVファイルが大きすぎて読み込みに時間がかかる」「慣れ親しんだSQLでサクッと集計したい」と感じたことはありませんか? 今回は、そんな悩みを一瞬で解決してくれる、今大注目の組み込み型データベース「DuckDB」をご紹介します。環境構築の手間なく、まるで魔法のように高速なデータ処理を実現してみましょう!
DuckDBとは?
DuckDBは、データ分析(OLAP:オンライン分析処理)に特化した、インプロセスのリレーショナルデータベースです。SQLiteの「インストールが不要で、アプリに組み込んで手軽に使える」という便利さをそのままに、大量データの集計・分析を圧倒的な速さで行えるように設計されています。
最大の特長は、CSVやParquet、JSONといったファイルに対して、データベースに一度取り込む(インポートする)ことなく、直接SQLを実行してデータを抽出・集計できる点です。
「データ分析用のSQLite」と考えるとイメージしやすいかもしれませんね。データサイエンティストの新しい必須ツールになりつつあります!
DuckDBを導入するメリット
- ポータビリティと手軽さ:
`pip install duckdb`を実行するだけで準備完了です。面倒なデータベースサーバーの起動や、ユーザー権限の設定などは一切必要ありません。 - 圧倒的な実行速度:
「カラム(列)指向」のデータ保持と、CPUの性能を最大限に引き出す「ベクトル化クエリ実行エンジン」を採用しているため、ギガバイト級のデータでも数秒で集計が完了します。 - 多様なファイル形式の直接クエリ:
CSVやParquetファイルを、SQLの `FROM` 句に直接ファイルパスとして指定できます。 - Pythonエコシステムとの親密な連携:
PandasのDataFrameやPolarsのDataFrame、さらにはParquetファイルを、DuckDBはそのままテーブルとして認識し、SQLで操作できます。処理結果を再びPandas DataFrameとして受け取ることも簡単です。
DuckDBを使ってみよう!
今回は、簡易的なCSVファイルをその場で作って、DuckDBに直接SQLを投げてみましょう。その手軽さにきっと驚くはずです!
pip install duckdb pandasimport duckdb
import pandas as pd
# 1. テスト用のCSVファイルを作成します
data = {
"product": ["Apples", "Bananas", "Apples", "Oranges", "Bananas", "Apples"],
"category": ["Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit"],
"sales": [100, 150, 120, 80, 200, 110],
"store": ["Tokyo", "Tokyo", "Osaka", "Osaka", "Osaka", "Tokyo"]
}
df_sample = pd.DataFrame(data)
df_sample.to_csv("sales_data.csv", index=False)
# 2. DuckDBを使って、CSVファイルを直接SQLでクエリします
# データベース接続を開く(メモリ内の一時的な接続)
con = duckdb.connect()
# CSVファイルを直接読み込んで、店舗ごとの売上合計と平均を計算するSQLを実行
query = """
SELECT
store,
SUM(sales) as total_sales,
AVG(sales) as avg_sales
FROM 'sales_data.csv'
GROUP BY store
ORDER BY total_sales DESC;
"""
# クエリを実行し、結果をPandasのDataFrameとして取得
result_df = con.execute(query).df()
print("--- 集計結果 ---")
print(result_df)--- 集計結果 ---
store total_sales avg_sales
0 Osaka 400.0 133.333333
1 Tokyo 360.0 120.000000このコードを実行すると、DuckDBは内部で自動的にCSVのスキーマ(型)を推測し、高速に集計処理を行います。Pandasで一度全てをメモリに読み込む必要がないため、メモリ消費を大幅に節約できるのが嬉しいポイントです。
みーちゃんのワンポイント
DuckDBをPythonで使う際、最も強力なのは「Python上の変数(DataFrameなど)を、そのままSQLのテーブル名として参照できる」機能です。例えば、変数名が my_df なら、SQL文の中で SELECT * FROM my_df と書くだけで認識されます。メモリのコピーを発生させずに高速連携できるため、データの「前処理はSQLで、可視化や機械学習はPythonで」という使い分けに最適ですよ!

