データがSQL対応のDB(データベース)に格納されている場合、SQLを使いデータを取得し操作することが多いことでしょう。
Python上ではPandasやPolarを使うかもしれませんが、SQLを利用したほうが便利な場面も少なくありません。
そこで登場するのがDuckDBです。
DuckDBは、インプロセス(例えば、Python内駆動)で動作するRDBMS(リレーショナルデータベース管理システム) で、指示を送信するクライアントもそれらを読み取って処理するサーバーも必要ありません。
そこが、PostgreSQLやMySQLなどの通常のRDBMSとの大きな違いです。
また、オンライン分析処理 (OLAP) 系のRDBMSのため、データ分析に適しています。
要するに、DuckDBは「組み込み用途のOLAP系のRDBMS」ということです。
似たようなものに、SQLiteというものがありますが遅速という問題があります。DuckDBは高速で動きます。
今回は、「Pythonデータ分析のためのDuckDB」ということで、DuckDBについて簡単にお話しします。
Contents
従来の分析用RDBMSの使い方の違い
従来は、必要なローデータ(CSVファイルなど)をPostgreSQLやMySQLなどのデータベースサーバーに適時インポートし、そこで分析用のデータセットなどを作成、それをPythonからSQLなどを使い読み込む、ということをしていました。
インプロセスで動作するDuckDBの場合、Python内のDuckDB 上でSQLを使用しローデータ(CSVファイルなど)を直接読み込み、データ分析やモデル構築用のデータセットを生成していきます。
「それだけ?」と言う問いに対し、「それだけだよ」となります。
この仕組みの威力は、どこで発揮するのかというと、次の2場面と言われています。
- インタラクティブなアナリティクス
- エッジコンピューティング
DuckDBは、PythonやR、Julia、C++、Javaなどで使用できますが、ここではPythonで使うことを前提で話しを進めます。
DuckDBのインストール
取り急ぎ、DuckDBのPythonライブラリー(パッケージ)をインストールしましょう。
以下、condaでインストールするときのコードです。
conda install -c conda-forge python-duckdb
以下、pipでインストールするときのコードです。
pip install duckdb
今回利用するサンプルデータ
DB(データベース)によくあるテーブルっぽいデータを今回利用します。
Kaggleに公開されている「フライト遅延データセット」です。
以下の弊社サイトのURLからもダウンロードできます。
2015 Flight Delays and Cancellations
https://www.salesanalytics.co.jp/1tzu
次の3つのデータテーブルからなります。
- airlines.csv(航空会社マスタテーブル)
- airports.csv(空港マスタテーブル)
- flights.csv(フライトのトランザクションデータテーブル)
Pandasで直接読み込んで、中身を見てみます。
先ず、データを読み込みます。
以下、コードです。
# データ読み込み import pandas as pd df_airports = pd.read_csv("airports.csv") df_airlines = pd.read_csv("airlines.csv") df_flights = pd.read_csv("flights.csv")
次に、データテーブルの変数の概要(INFO)と、データそのもの(DATA)を見ていきます。
airlines.csv(航空会社マスタテーブル)です。
以下、コードです。
# airlines.csv(航空会社マスタテーブル) print('----------------') print('INFO') print('----------------') print(df_airports.info()) print('----------------') print('DATA') print('----------------') print(df_airports)
以下、実行結果です。
---------------- INFO ---------------- <class 'pandas.core.frame.DataFrame'> RangeIndex: 322 entries, 0 to 321 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 IATA_CODE 322 non-null object 1 AIRPORT322 non-null object 2 CITY 322 non-null object 3 STATE 322 non-null object 4 COUNTRY 322 non-null object 5 LATITUDE 319 non-null float64 6 LONGITUDE 319 non-null float64 dtypes: float64(2), object(5) memory usage: 17.7+ KB None ---------------- DATA ---------------- IATA_CODE AIRPORT \ 0 ABE Lehigh Valley International Airport 1 ABI Abilene Regional Airport 2 ABQ Albuquerque International Sunport 3 ABR Aberdeen Regional Airport 4 ABY Southwest Georgia Regional Airport .. ... ... 317 WRG Wrangell Airport 318 WYS Westerly State Airport 319 XNA Northwest Arkansas Regional Airport 320 YAK Yakutat Airport 321 YUM Yuma International Airport CITY STATE COUNTRY LATITUDE LONGITUDE 0 Allentown PA USA 40.65236 -75.44040 1 Abilene TX USA 32.41132 -99.68190 2 Albuquerque NM USA 35.04022 -106.60919 3 Aberdeen SD USA 45.44906 -98.42183 4 Albany GA USA 31.53552 -84.19447 .. ... ... ... ... ... 317 Wrangell AK USA 56.48433 -132.36982 318 West Yellowstone MT USA 44.68840 -111.11764 319 Fayetteville/Springdale/Rogers AR USA 36.28187 -94.30681 320 Yakutat AK USA 59.50336 -139.66023 321 Yuma AZ USA 32.65658 -114.60597 [322 rows x 7 columns]
airports.csv(空港マスタテーブル)です。
以下、コードです。
# airports.csv(空港マスタテーブル) print('----------------') print('INFO') print('----------------') print(df_airlines.info()) print('----------------') print('DATA') print('----------------') print(df_airlines)
以下、実行結果です。
---------------- INFO ---------------- <class 'pandas.core.frame.DataFrame'> RangeIndex: 14 entries, 0 to 13 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 IATA_CODE 14 non-null object 1 AIRLINE 14 non-null object dtypes: object(2) memory usage: 352.0+ bytes None ---------------- DATA ---------------- IATA_CODE AIRLINE 0 UA United Air Lines Inc. 1 AA American Airlines Inc. 2 US US Airways Inc. 3 F9 Frontier Airlines Inc. 4 B6 JetBlue Airways 5 OO Skywest Airlines Inc. 6 AS Alaska Airlines Inc. 7 NK Spirit Air Lines 8 WN Southwest Airlines Co. 9 DL Delta Air Lines Inc. 10 EV Atlantic Southeast Airlines 11 HA Hawaiian Airlines Inc. 12 MQ American Eagle Airlines Inc. 13 VX Virgin America
flights.csv(フライトのトランザクションデータテーブル)です。
以下、コードです。
# flights.csv(フライトのトランザクションデータテーブル) print('----------------') print('INFO') print('----------------') print(df_flights.info()) print('----------------') print('DATA') print('----------------') print(df_flights)
以下、実行結果です。
---------------- INFO ---------------- <class 'pandas.core.frame.DataFrame'> RangeIndex: 5819079 entries, 0 to 5819078 Data columns (total 31 columns): # Column Dtype --- ------ ----- 0 YEAR int64 1 MONTH int64 2 DAY int64 3 DAY_OF_WEEK int64 4 AIRLINE object 5 FLIGHT_NUMBER int64 6 TAIL_NUMBER object 7 ORIGIN_AIRPORT object 8 DESTINATION_AIRPORT object 9 SCHEDULED_DEPARTURE int64 10 DEPARTURE_TIME float64 11 DEPARTURE_DELAY float64 12 TAXI_OUT float64 13 WHEELS_OFF float64 14 SCHEDULED_TIME float64 15 ELAPSED_TIME float64 16 AIR_TIME float64 17 DISTANCE int64 18 WHEELS_ON float64 19 TAXI_IN float64 20 SCHEDULED_ARRIVAL int64 21 ARRIVAL_TIME float64 22 ARRIVAL_DELAY float64 23 DIVERTED int64 24 CANCELLED int64 25 CANCELLATION_REASON object 26 AIR_SYSTEM_DELAY float64 27 SECURITY_DELAY float64 28 AIRLINE_DELAY float64 29 LATE_AIRCRAFT_DELAY float64 30 WEATHER_DELAY float64 dtypes: float64(16), int64(10), object(5) memory usage: 1.3+ GB None ---------------- DATA ---------------- YEAR MONTH DAY DAY_OF_WEEK AIRLINE FLIGHT_NUMBER TAIL_NUMBER \ 0 2015 1 1 4 AS 98 N407AS 1 2015 1 1 4 AA 2336 N3KUAA 2 2015 1 1 4 US 840 N171US 3 2015 1 1 4 AA 258 N3HYAA 4 2015 1 1 4 AS 135 N527AS ... ... ... ... ... ... ... ... 5819074 2015 12 31 4 B6 688 N657JB 5819075 2015 12 31 4 B6 745 N828JB 5819076 2015 12 31 4 B6 1503 N913JB 5819077 2015 12 31 4 B6 333 N527JB 5819078 2015 12 31 4 B6 839 N534JB ORIGIN_AIRPORT DESTINATION_AIRPORT SCHEDULED_DEPARTURE ... \ 0 ANC SEA 5 ... 1 LAX PBI 10 ... 2 SFO CLT 20 ... 3 LAX MIA 20 ... 4 SEA ANC 25 ... ... ... ... ... ... 5819074 LAX BOS 2359 ... 5819075 JFK PSE 2359 ... 5819076 JFK SJU 2359 ... 5819077 MCO SJU 2359 ... 5819078 JFK BQN 2359 ... ARRIVAL_TIME ARRIVAL_DELAY DIVERTED CANCELLED \ 0 408.0 -22.0 0 0 1 741.0 -9.0 0 0 2 811.0 5.0 0 0 3 756.0 -9.0 0 0 4 259.0 -21.0 0 0 ... ... ... ... ... 5819074 753.0 -26.0 0 0 5819075 430.0 -16.0 0 0 5819076 432.0 -8.0 0 0 5819077 330.0 -10.0 0 0 5819078 442.0 2.0 0 0 CANCELLATION_REASON AIR_SYSTEM_DELAY SECURITY_DELAY AIRLINE_DELAY \ 0 NaN NaN NaN NaN 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 3 NaN NaN NaN NaN 4 NaN NaN NaN NaN ... ... ... ... ... 5819074 NaN NaN NaN NaN 5819075 NaN NaN NaN NaN 5819076 NaN NaN NaN NaN 5819077 NaN NaN NaN NaN 5819078 NaN NaN NaN NaN LATE_AIRCRAFT_DELAY WEATHER_DELAY 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN ... ... ... 5819074 NaN NaN 5819075 NaN NaN 5819076 NaN NaN 5819077 NaN NaN 5819078 NaN NaN [5819079 rows x 31 columns]
どのようなデータなのか、なんとなく感覚的に掴めたかと思います。
DuckDBのデータベースの作成
では、3つのデータテーブルを持つDuckDBのデータベースを作成します。
以下、コードです。
import duckdb # DB の作成 conn = duckdb.connect('flight-delays.duckdb') c = conn.cursor() # CSV からデータをインポートしてテーブルを作成 c.execute( "CREATE TABLE airports AS SELECT * FROM read_csv_auto('airports.csv');" ) c.execute( "CREATE TABLE airlines AS SELECT * FROM read_csv_auto('airlines.csv');" ) c.execute( "CREATE TABLE flights AS SELECT * FROM read_csv_auto('flights.csv');" )
作成したDBに、どのようなテーブルがあるのか確認します。
以下、コードです。
# DBのテーブルの確認 print(c.execute('SHOW TABLES').df())
以下、実行結果です。
name 0 airlines 1 airports 2 flights
各テーブル
各テーブルを見てみます。
airlines(航空会社マスタテーブル)です。
以下、コードです。
# airlines(航空会社マスタテーブル) c.sql(''' SELECT * FROM airports ''')
以下、実行結果です。
┌───────────┬─────────────────────────────┬────────────────────────────────┬─────────┬─────────┬──────────┬────────────┐ │ IATA_CODE │ AIRPORT │ CITY │ STATE │ COUNTRY │ LATITUDE │ LONGITUDE │ │ varchar │ varchar │ varchar │ varchar │ varchar │ double │ double │ ├───────────┼─────────────────────────────┼────────────────────────────────┼─────────┼─────────┼──────────┼────────────┤ │ ABE │ Lehigh Valley Internation… │ Allentown │ PA │ USA │ 40.65236 │ -75.4404 │ │ ABI │ Abilene Regional Airport │ Abilene │ TX │ USA │ 32.41132 │ -99.6819 │ │ ABQ │ Albuquerque International… │ Albuquerque │ NM │ USA │ 35.04022 │ -106.60919 │ │ ABR │ Aberdeen Regional Airport │ Aberdeen │ SD │ USA │ 45.44906 │ -98.42183 │ │ ABY │ Southwest Georgia Regiona… │ Albany │ GA │ USA │ 31.53552 │ -84.19447 │ │ ACK │ Nantucket Memorial Airport │ Nantucket │ MA │ USA │ 41.25305 │ -70.06018 │ │ ACT │ Waco Regional Airport │ Waco │ TX │ USA │ 31.61129 │ -97.23052 │ │ ACV │ Arcata Airport │ Arcata/Eureka │ CA │ USA │ 40.97812 │ -124.10862 │ │ ACY │ Atlantic City Internation… │ Atlantic City │ NJ │ USA │ 39.45758 │ -74.57717 │ │ ADK │ Adak Airport │ Adak │ AK │ USA │ 51.87796 │ -176.64603 │ │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ │ TYS │ McGhee Tyson Airport │ Knoxville │ TN │ USA │ 35.81249 │ -83.99286 │ │ UST │ Northeast Florida Regiona… │ St. Augustine │ FL │ USA │ NULL │ NULL │ │ VEL │ Valdez Airport │ Vernal │ UT │ USA │ 40.4409 │ -109.50992 │ │ VLD │ Valdosta Regional Airport │ Valdosta │ GA │ USA │ 30.7825 │ -83.27672 │ │ VPS │ Destin-Fort Walton Beach … │ Valparaiso │ FL │ USA │ 30.48325 │ -86.5254 │ │ WRG │ Wrangell Airport │ Wrangell │ AK │ USA │ 56.48433 │ -132.36982 │ │ WYS │ Westerly State Airport │ West Yellowstone │ MT │ USA │ 44.6884 │ -111.11764 │ │ XNA │ Northwest Arkansas Region… │ Fayetteville/Springdale/Rogers │ AR │ USA │ 36.28187 │ -94.30681 │ │ YAK │ Yakutat Airport │ Yakutat │ AK │ USA │ 59.50336 │ -139.66023 │ │ YUM │ Yuma International Airport │ Yuma │ AZ │ USA │ 32.65658 │ -114.60597 │ ├───────────┴─────────────────────────────┴────────────────────────────────┴─────────┴─────────┴──────────┴────────────┤ │ 322 rows (20 shown) 7 columns │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
airports(空港マスタテーブル)です。
以下、コードです。
# airports(空港マスタテーブル c.sql(''' SELECT * FROM airports ''')
以下、実行結果です。
┌───────────┬─────────────────────────────┬────────────────────────────────┬─────────┬─────────┬──────────┬────────────┐ │ IATA_CODE │ AIRPORT │ CITY │ STATE │ COUNTRY │ LATITUDE │ LONGITUDE │ │ varchar │ varchar │ varchar │ varchar │ varchar │ double │ double │ ├───────────┼─────────────────────────────┼────────────────────────────────┼─────────┼─────────┼──────────┼────────────┤ │ ABE │ Lehigh Valley Internation… │ Allentown │ PA │ USA │ 40.65236 │ -75.4404 │ │ ABI │ Abilene Regional Airport │ Abilene │ TX │ USA │ 32.41132 │ -99.6819 │ │ ABQ │ Albuquerque International… │ Albuquerque │ NM │ USA │ 35.04022 │ -106.60919 │ │ ABR │ Aberdeen Regional Airport │ Aberdeen │ SD │ USA │ 45.44906 │ -98.42183 │ │ ABY │ Southwest Georgia Regiona… │ Albany │ GA │ USA │ 31.53552 │ -84.19447 │ │ ACK │ Nantucket Memorial Airport │ Nantucket │ MA │ USA │ 41.25305 │ -70.06018 │ │ ACT │ Waco Regional Airport │ Waco │ TX │ USA │ 31.61129 │ -97.23052 │ │ ACV │ Arcata Airport │ Arcata/Eureka │ CA │ USA │ 40.97812 │ -124.10862 │ │ ACY │ Atlantic City Internation… │ Atlantic City │ NJ │ USA │ 39.45758 │ -74.57717 │ │ ADK │ Adak Airport │ Adak │ AK │ USA │ 51.87796 │ -176.64603 │ │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ │ TYS │ McGhee Tyson Airport │ Knoxville │ TN │ USA │ 35.81249 │ -83.99286 │ │ UST │ Northeast Florida Regiona… │ St. Augustine │ FL │ USA │ NULL │ NULL │ │ VEL │ Valdez Airport │ Vernal │ UT │ USA │ 40.4409 │ -109.50992 │ │ VLD │ Valdosta Regional Airport │ Valdosta │ GA │ USA │ 30.7825 │ -83.27672 │ │ VPS │ Destin-Fort Walton Beach … │ Valparaiso │ FL │ USA │ 30.48325 │ -86.5254 │ │ WRG │ Wrangell Airport │ Wrangell │ AK │ USA │ 56.48433 │ -132.36982 │ │ WYS │ Westerly State Airport │ West Yellowstone │ MT │ USA │ 44.6884 │ -111.11764 │ │ XNA │ Northwest Arkansas Region… │ Fayetteville/Springdale/Rogers │ AR │ USA │ 36.28187 │ -94.30681 │ │ YAK │ Yakutat Airport │ Yakutat │ AK │ USA │ 59.50336 │ -139.66023 │ │ YUM │ Yuma International Airport │ Yuma │ AZ │ USA │ 32.65658 │ -114.60597 │ ├───────────┴─────────────────────────────┴────────────────────────────────┴─────────┴─────────┴──────────┴────────────┤ │ 322 rows (20 shown) 7 columns │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
flights(フライトのトランザクションデータテーブル)です。
以下、コードです。
# flights(フライトのトランザクションデータテーブル) c.sql(''' SELECT * FROM flights ''')
以下、実行結果です。
┌───────┬───────┬───────┬─────────────┬───┬────────────────┬───────────────┬─────────────────────┬───────────────┐ │ YEAR │ MONTH │ DAY │ DAY_OF_WEEK │ … │ SECURITY_DELAY │ AIRLINE_DELAY │ LATE_AIRCRAFT_DELAY │ WEATHER_DELAY │ │ int64 │ int64 │ int64 │ int64 │ │ int64 │ int64 │ int64 │ int64 │ ├───────┼───────┼───────┼─────────────┼───┼────────────────┼───────────────┼─────────────────────┼───────────────┤ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ · │ · │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ · │ · │ · │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 6 │ 1 │ 0 │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 15 │ 0 │ 0 │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 28 │ 70 │ 0 │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 7 │ 10 │ 0 │ │ 2015 │ 1 │ 1 │ 4 │ … │ NULL │ NULL │ NULL │ NULL │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 5 │ 11 │ 0 │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 112 │ 63 │ 0 │ │ 2015 │ 1 │ 1 │ 4 │ … │ 0 │ 0 │ 20 │ 1 │ ├───────┴───────┴───────┴─────────────┴───┴────────────────┴───────────────┴─────────────────────┴───────────────┤ │ ? rows (>9999 rows, 20 shown) 31 columns (8 shown) │ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
データフレームに変換したflightsを表示します。「.df()」を付けるだけです。
以下、コードです。
# flightsをDataFrameとして抽出 print( c.sql(''' SELECT * FROM flights ''').df() )
以下、実行結果です。
YEAR MONTH DAY DAY_OF_WEEK AIRLINE FLIGHT_NUMBER TAIL_NUMBER \ 0 2015 1 1 4 AS 98 N407AS 1 2015 1 1 4 AA 2336 N3KUAA 2 2015 1 1 4 US 840 N171US 3 2015 1 1 4 AA 258 N3HYAA 4 2015 1 1 4 AS 135 N527AS ... ... ... ... ... ... ... ... 5819074 2015 12 31 4 B6 688 N657JB 5819075 2015 12 31 4 B6 745 N828JB 5819076 2015 12 31 4 B6 1503 N913JB 5819077 2015 12 31 4 B6 333 N527JB 5819078 2015 12 31 4 B6 839 N534JB ORIGIN_AIRPORT DESTINATION_AIRPORT SCHEDULED_DEPARTURE ... \ 0 ANC SEA 0005 ... 1 LAX PBI 0010 ... 2 SFO CLT 0020 ... 3 LAX MIA 0020 ... 4 SEA ANC 0025 ... ... ... ... ... ... 5819074 LAX BOS 2359 ... 5819075 JFK PSE 2359 ... 5819076 JFK SJU 2359 ... 5819077 MCO SJU 2359 ... 5819078 JFK BQN 2359 ... ARRIVAL_TIME ARRIVAL_DELAY DIVERTED CANCELLED CANCELLATION_REASON \ 0 0408 -22.0 0 0 NaN 1 0741 -9.0 0 0 NaN 2 0811 5.0 0 0 NaN 3 0756 -9.0 0 0 NaN 4 0259 -21.0 0 0 NaN ... ... ... ... ... ... 5819074 0753 -26.0 0 0 NaN 5819075 0430 -16.0 0 0 NaN 5819076 0432 -8.0 0 0 NaN 5819077 0330 -10.0 0 0 NaN 5819078 0442 2.0 0 0 NaN AIR_SYSTEM_DELAY SECURITY_DELAY AIRLINE_DELAY LATE_AIRCRAFT_DELAY \ 0 NaN NaN NaN NaN 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 3 NaN NaN NaN NaN 4 NaN NaN NaN NaN ... ... ... ... ... 5819074 NaN NaN NaN NaN 5819075 NaN NaN NaN NaN 5819076 NaN NaN NaN NaN 5819077 NaN NaN NaN NaN 5819078 NaN NaN NaN NaN WEATHER_DELAY 0 NaN 1 NaN 2 NaN 3 NaN 4 NaN ... ... 5819074 NaN 5819075 NaN 5819076 NaN 5819077 NaN 5819078 NaN [5819079 rows x 31 columns]
条件付きデータ抽出
flightsの1月の、特定の変数(YEAR,MONTH,DAY,AIRLINE,FLIGHT_NUMBER,DEPARTURE_DELAY)のデータを抽出します。
以下、コードです。
# flights(フライトのトランザクションデータテーブル)の1月のデータを抽出 c.sql(''' SELECT YEAR, MONTH, DAY, AIRLINE, FLIGHT_NUMBER, DEPARTURE_DELAY, FROM flights WHERE MONTH=1 ''')
以下、実行結果です。
┌───────┬───────┬───────┬─────────┬───────────────┬─────────────────┐ │ YEAR │ MONTH │ DAY │ AIRLINE │ FLIGHT_NUMBER │ DEPARTURE_DELAY │ │ int64 │ int64 │ int64 │ varchar │ int64 │ int64 │ ├───────┼───────┼───────┼─────────┼───────────────┼─────────────────┤ │ 2015 │ 1 │ 1 │ AS │ 98 │ -11 │ │ 2015 │ 1 │ 1 │ AA │ 2336 │ -8 │ │ 2015 │ 1 │ 1 │ US │ 840 │ -2 │ │ 2015 │ 1 │ 1 │ AA │ 258 │ -5 │ │ 2015 │ 1 │ 1 │ AS │ 135 │ -1 │ │ 2015 │ 1 │ 1 │ DL │ 806 │ -5 │ │ 2015 │ 1 │ 1 │ NK │ 612 │ -6 │ │ 2015 │ 1 │ 1 │ US │ 2013 │ 14 │ │ 2015 │ 1 │ 1 │ AA │ 1112 │ -11 │ │ 2015 │ 1 │ 1 │ DL │ 1173 │ 3 │ │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ │ · │ · │ · │ · │ · │ · │ │ 2015 │ 1 │ 1 │ F9 │ 1111 │ -1 │ │ 2015 │ 1 │ 1 │ F9 │ 754 │ 17 │ │ 2015 │ 1 │ 1 │ HA │ 9 │ -3 │ │ 2015 │ 1 │ 1 │ MQ │ 2774 │ 98 │ │ 2015 │ 1 │ 1 │ MQ │ 2811 │ 5 │ │ 2015 │ 1 │ 1 │ HA │ 165 │ 11 │ │ 2015 │ 1 │ 1 │ MQ │ 3046 │ -12 │ │ 2015 │ 1 │ 1 │ MQ │ 3048 │ 16 │ │ 2015 │ 1 │ 1 │ MQ │ 3118 │ 175 │ │ 2015 │ 1 │ 1 │ MQ │ 3428 │ 21 │ ├───────┴───────┴───────┴─────────┴───────────────┴─────────────────┤ │ ? rows (>9999 rows, 20 shown) 6 columns │ └───────────────────────────────────────────────────────────────────┘
この抽出したデータを、データフレームに変換し「jan_flights」に格納します。
以下、コードです。
jan_flights = c.sql(''' SELECT YEAR, MONTH, DAY, AIRLINE, FLIGHT_NUMBER, DEPARTURE_DELAY, FROM flights WHERE MONTH=1 ''').df()
「jan_flights」を見てみます。
以下、コードです。
print(jan_flights)
以下、実行結果です。
YEAR MONTH DAY AIRLINE FLIGHT_NUMBER DEPARTURE_DELAY 0 2015 1 1 AS 98 -11.0 1 2015 1 1 AA 2336 -8.0 2 2015 1 1 US 840 -2.0 3 2015 1 1 AA 258 -5.0 4 2015 1 1 AS 135 -1.0 ... ... ... ... ... ... ... 469963 2015 1 31 B6 839 0.0 469964 2015 1 31 DL 1887 0.0 469965 2015 1 31 F9 300 3.0 469966 2015 1 31 F9 422 0.0 469967 2015 1 31 UA 1104 -1.0 [469968 rows x 6 columns]
新たなテーブルとしてDBに追加
「jan_flights」を、新たなテーブルとしてDBに付け加えます。
以下、コードです。
# DBにテーブルとして追加 c.register('jan_flights', jan_flights)
再度、DBにどのようなテーブルがあるのか確認します。
以下、コードです。
# DBのテーブルの確認 print(c.execute('SHOW TABLES').df())
以下、実行結果です。
name 0 airlines 1 airports 2 flights 3 jan_flights
集計
トランザクションデータ「flights」に対し、AIRLINEごとのカウント数を計算し、それを降順で並び替え「jan_flights_count」に格納します。
以下、コードです。
jan_flights_count = c.sql(''' SELECT count(*) as Count, AIRLINE FROM jan_flights GROUP BY AIRLINE ORDER BY Count DESC ''').df()
「jan_flights_count」を見てみます。
以下、コードです。
print(jan_flights_count)
以下、実行結果です。
Count AIRLINE 0 100042 WN 1 64421 DL 2 49925 EV 3 48114 OO 4 44059 AA 5 38395 UA 6 33489 US 7 29900 MQ 8 21623 B6 9 13257 AS 10 8743 NK 11 6829 F9 12 6440 HA 13 4731 VX
グラフ表示
「jan_flights_count」を棒グラフで表現します。
以下、コードです。
import matplotlib.pyplot as plt plt.bar( x=jan_flights_count['AIRLINE'], height=jan_flights_count['Count'], ) plt.show()
以下、実行結果です。
まとめ
今回は、「Pythonデータ分析のためのDuckDB」ということで、DuckDBについて簡単に紹介しました。
DBの作り方、テーブルの追加、SQLの使い方などを、簡単な例で説明しました。
Python上のDB上のテーブル操作やデータ加工の入り口はDuckDBで、ある程度加工したらはPandasやPolarにバトンタッチします。
また、もしJupyter系のNotebookで利用するのであれば、JupySQLと組み合わせると最強です。JupySQLは別途説明します。