はじめに
今回は、社内で紹介されていたDuckDBに関する下記の記事が気になったので試してみました!
普段の業務ではSQLを使うことが多いので、DuckDBの特徴としてあげられている下記の点が特に気になりました。
- Pandas・dplyrなどに比べ、高速(クエリの最適化を行う)、SQL(表現力や移植性)が使える、トランザクションが使える
- ParquetやCSVの読み書き、Pands DataFrameの読み書き
- ローカルだけではなく、HTTP(S)、S3からも取得できるようです
この記事ではDuckDBを使って緯度経度情報を持つCSVを読み込み、Kepler.glで可視化(位置情報を扱う会社の記事なので🌏!)しています。
DuckDBをインストール
今回はpython環境にインストールしてみました。
※公式HPにあるように、PythonだけでなくRなど色々な環境でつかえるとのこと。
インストール方法は公式にある通り、下記でOKです。
なお、公式のGoogle Collab notebookのサンプルも公開されているので、そちらを参考にサクッと使うのもおすすめです!
pip install duckdb
今回は、Jupyterで使ってみたいので、こちらも公式ドキュメントを参考に下記のものもインストールします。
pip install notebook
pip install jupysql
pip install duckdb-engine
pip install pandas
加えて、kepler.glで可視化もしたいのでこちらもインストール。
pip install kepler.gl
使ってみる
Jupyter Notebookを開いて、必要なライブラリのインポート
import duckdb
import pandas as pd
%load_ext sql
jupysqlの設定
%config SqlMagic.autopandas = True # Pandasデータフレーム化
%config SqlMagic.feedback = False # フィードバック表示
%config SqlMagic.displaycon = False # 接続先情報表示
メモリ上にDBを構築してDuckDBに接続
%sql duckdb:///:memory:
CSVからテーブル作成
国土数値情報からダウンロードした東京都の郵便局データをQGISでCSV化したものを使いたいと思います。
# CSVを読み込んでテーブルを作成
%%sql
create table yuubin as
select *
from read_csv_auto('tokyo_yuubin.csv'); #郵便局データの読み込み
# 作成したテーブルに対してクエリを投げてみる
%%sql
select *
from yuubin;
次は住所に「渋谷」がつく郵便局を調べてみましょう!
%%sql
select *
from yuubin
where P30_006 like '渋谷%';
Kepler.glで地図にプロットしてみる
読み込んだCSVの緯度経度(latitude, longitude)をもとにKepler.glをつかって地図にプロットしてみましょう!
まずはkepler.glをインポート
from keplergl import KeplerGl
続いて、先程作成したテーブルをデータフレームに格納します。
%%sql
df <<
select *
from yuubin;
最後に、そのデータフレームをkeplerで読み込みます。
map_yuubin = KeplerGl(height=400)
map_yuubin.add_data(data=df, name='yuubin')
map_yuubin
そうすると、下図のようにインタラクティブなマップが表示され、グリグリ動かせます。
色を変えたり、マーカーサイズを変更したりと操作可能です。
今回は本当にさわりの部分のみを試してみましたが、色々と活用できそうな気配なので研究していきたいと思います!