okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Python DuckDB:データ分析のたびに重いデータベースを立てるの、まだ消耗していませんか?

Python DuckDB:データ分析のたびに重いデータベースを立てるの、まだ消耗していませんか?

📝 TL;DR (3行要約)

  1. DuckDBは、サーバーの構築が不要で、インストール後すぐに使える「分析特化型」の組み込みデータベースです。
  2. 大容量のCSVやParquetファイルをSQLで直接、かつ驚異的なスピードで処理できるのが最大の強みです。
  3. Python(Pandas/Polars)との相性が抜群で、メモリを節約しながら大規模データを扱いたい時に最適です。

1. 🤔 一体DuckDBとは何?(核心的な役割と主な使用例)

核心的な役割:あなたのPCを「超小型・高性能なデータ分析センター」に変える魔法

Pythonでデータ分析を始めようとすると、多くの初心者が「データの読み込みが遅い」「メモリが足りなくてエラーが出る」という壁にぶつかります。そこで登場するのがDuckDBです。

DuckDBを一言で表現するなら、「データ分析界のスイスアーミーナイフ」です。

比喩を使って説明しましょう。これまでのデータベース(PostgreSQLやMySQLなど)は、巨大な「工場」のようなものでした。動かすためには広い土地(サーバー)を確保し、専門のスタッフ(設定・管理)が必要で、準備だけで一苦労です。一方で、DuckDBは「プロ仕様のポータブル工具箱」です。カバンから取り出した瞬間に使え、工場並みの精密な作業をあなたのデスクの上(Pythonプログラムの中)で完結させてしまいます。

技術的な側面では、DuckDBは「組み込み型カラムナ(列指向)データベース」と呼ばれます。 - 組み込み型: SQLiteのように、別途サーバーを立てる必要がなく、Pythonライブラリとして動作します。 - カラムナ(列指向): データを「行」ではなく「列」単位で処理します。例えば「100万行の売上データから、金額の合計だけを知りたい」という時、列指向のDuckDBは金額の列だけをピンポイントでスキャンするため、従来のデータベースよりも圧倒的に速いのです。

主な使用例:どんな時に使うと幸せになれる?

DuckDBは、特に以下のようなシチュエーションでその真価を発揮します。

  1. 「ギガバイト級」の巨大なCSVファイルの集計 Pandasで数GBのCSVを読み込もうとして、PCがフリーズした経験はありませんか?DuckDBは、ファイルをすべてメモリに載せるのではなく、必要な分だけを効率よく読み込むため、ノートPCでも数千万行のデータをサクサク集計できます。

  2. バラバラな形式のデータ統合(データレイクの探索) 「手元にCSVがあるけれど、一部のデータはクラウド上のParquet形式で、さらにはJSONも混ざっている……」といった状況です。DuckDBなら、これら異なる形式のファイルに対して、まるで一つのテーブルであるかのようにSQLを投げ、結合(JOIN)や集計を行うことができます。

  3. BIツールやダッシュボードの裏側(高速化エンジン) StreamlitなどのWebフレームワークでデータ可視化アプリを作る際、背後でDuckDBを動かせば、ユーザーがボタンを押した瞬間に結果が返ってくるような爆速のアプリが作れます。


2. 💻 インストール方法

DuckDBのインストールは非常に簡単です。複雑な設定は一切不要で、標準的なpipコマンド一つで完了します。

pip install duckdb

もし、Pandasと一緒に使いたい(あるいは既に使っている)場合は、以下のコマンドで関連ライブラリも整えておくと便利です。

pip install duckdb pandas

これで準備は整いました。あなたのPCはすでに、強力な分析エンジンを手に入れています。


3. 🛠️ 実際に動作するサンプルコード

DuckDBの凄さを体感するために、CSVファイルを作成し、それをSQLで集計して、結果をPandasのデータフレームとして受け取る一連の流れを見てみましょう。

import duckdb
import pandas as pd
import numpy as np

# 1. テスト用のダミーデータ(CSV)を作成
# 100万行の売上データを作成します
print("⏳ テストデータを作成中...")
df_dummy = pd.DataFrame({
    'item_id': np.random.randint(1, 100, size=1000000),
    'price': np.random.rand(1000000) * 1000,
    'category': np.random.choice(['Electronics', 'Books', 'Toys', 'Clothing'], size=1000000)
})
df_dummy.to_csv('sales_data.csv', index=False)
print("✅ 'sales_data.csv' が作成されました。")

# 2. DuckDBを使ってSQLで集計
# インメモリで接続を開始します
con = duckdb.connect(database=':memory:')

print("\n🚀 DuckDBで集計を実行します...")
# 直接CSVファイルを読み込んでSQLを実行できるのがDuckDBの魔法です!
query = """
    SELECT 
        category, 
        COUNT(*) as total_sales, 
        AVG(price) as average_price
    FROM 'sales_data.csv'
    GROUP BY category
    ORDER BY average_price DESC
"""

# クエリを実行し、結果を直接PandasのDataFrameとして取得
result_df = con.execute(query).df()

# 3. 結果を表示
print("📊 集計結果:")
print(result_df)

# 4. 後片付け
con.close()

4. 🔍 コードの詳細説明

上記のコードで行っていることを、いくつかの重要なブロックに分けて解説します。

① データの準備とCSVへの書き出し

ここでは、Pythonの標準的なライブラリ(Pandas, NumPy)を使って、100万行という少し大きめのデータを作成しています。通常、これだけのデータを初心者が扱うのは大変ですが、DuckDBがいかにスムーズに処理するかを試すための「土俵」を作っています。

② DuckDBへの接続(duckdb.connect

duckdb.connect(database=':memory:') という部分は非常に重要です。 - :memory: を指定すると、データはディスクに保存されず、メモリ上だけで動作します。一時的な分析に最適です。 - もしデータを保存したい場合は、'my_database.db' のようにファイル名を指定するだけで、永続的なデータベースファイルが作成されます。

③ CSVへの直接クエリ(DuckDBの真骨頂)

ここが最も驚くべきポイントです。FROM 'sales_data.csv' という記述に注目してください。通常のデータベースであれば、まず「テーブルを作成」し、次に「データをインポート」するという手順が必要です。しかし、DuckDBはCSVファイルを直接テーブルとして認識し、SQLを実行できます。これにより、面倒な前準備なしにいきなり分析を開始できるのです。

④ SQLの実行とPandasとの連携(.df() メソッド)

con.execute(query).df() という一行で、SQLの実行から結果の変換までを完結させています。.df() は「結果をPandasのDataFrame形式で返してね」という命令です。これにより、DuckDBで高速に集計した結果を、そのまま慣れ親しんだPandasでグラフ化したり、さらに加工したりすることが可能になります。


5. ⚠️ 注意点またはヒント

初心者がDuckDBを使う際に、覚えておくべき大事なポイントを2つ紹介します。

  1. 「更新」よりも「読み込み」が得意! DuckDBは「分析用(OLAP)」のデータベースです。数百万行のデータを一気に集計するのは得意ですが、Webアプリのように「1行だけデータを追加する」「1行だけユーザー情報を更新する」といった頻繁な書き込み操作を大量に行うのには向いていません。そのような用途には、兄弟分であるSQLiteを使うのが正解です。道具の使い分けを意識しましょう。

  2. ワイルドカードを使った一括読み込みが最強 例えば、sales_2023_01.csv, sales_2023_02.csv ... と月ごとに分かれた大量のファイルがある場合、DuckDBなら SELECT * FROM 'sales_2023_*.csv' と書くだけで、すべてのファイルを自動的に結合して読み込んでくれます。Pandasで一つずつループを回して結合する手間が省けるだけでなく、メモリ消費も劇的に抑えられます。


6. 🔗 一緒に見ておくと良いライブラリ

Polars (ポーラーズ) DuckDBに興味を持ったあなたなら、Polarsも間違いなく気に入るはずです。Polarsは、Pandasに代わる「次世代の超高速データフレームライブラリ」です。DuckDBと同じく「列指向」の考え方で作られており、DuckDBとPolarsは互いにデータをゼロコピー(メモリ内でデータをコピーせず、そのまま受け渡しすること)でやり取りできる非常に密接な関係にあります。「SQLで書きたい時はDuckDB」「メソッドチェーンで書きたい時はPolars」という風に使い分けると、データ分析のレベルが一段階上がります。


🎉 まとめ

今日は、Pythonでのデータ分析を劇的に効率化するDuckDBについて学びました。

  • サーバー不要で、pip一つですぐに使える。
  • CSVやParquetを直接SQLで叩けるから、前処理が圧倒的に楽。
  • メモリ消費が少ないので、大きなデータもノートPCで扱える。

これからは、「データが大きすぎてPandasが動かない……」と悩む必要はありません。あなたの武器庫にDuckDBという強力なツールが加わったのです。

🚀 今日の挑戦課題

「手元にある適当なCSVファイルを、DuckDBを使って読み込み、特定の列の平均値をSQLで計算してみよう!」

まずは、今回紹介したサンプルコードをコピー&ペーストして動かすところから始めてください。SQLの書き方が不安な方は、まずは SELECT * FROM 'ファイル名.csv' LIMIT 5 と打つだけでも、その速さに驚くはずです。

あなたのデータ分析ライフが、DuckDBでもっと軽やかで楽しいものになることを願っています!