Pythonデータ分析のためのDuckDB(組み込み用途のOLAP系のRDBMS)

Pythonデータ分析のためのDuckDB(組み込み用途のOLAP系のRDBMS)

データがSQL対応のDB(データベース)に格納されている場合、SQLを使いデータを取得し操作することが多いことでしょう。

Python上ではPandasPolarを使うかもしれませんが、SQLを利用したほうが便利な場面も少なくありません。

そこで登場するのがDuckDBです。

DuckDBは、インプロセス(例えば、Python内駆動)で動作するRDBMS(リレーショナルデータベース管理システム) で、指示を送信するクライアントもそれらを読み取って処理するサーバーも必要ありません。

そこが、PostgreSQLMySQLなどの通常のRDBMSとの大きな違いです。

また、オンライン分析処理 (OLAP) 系のRDBMSのため、データ分析に適しています。

要するに、DuckDBは「組み込み用途のOLAP系のRDBMS」ということです。

似たようなものに、SQLiteというものがありますが遅速という問題があります。DuckDBは高速で動きます。

今回は、「Pythonデータ分析のためのDuckDB」ということで、DuckDBについて簡単にお話しします。

従来の分析用RDBMSの使い方の違い

従来は、必要なローデータ(CSVファイルなど)をPostgreSQLMySQLなどのデータベースサーバーに適時インポートし、そこで分析用のデータセットなどを作成、それを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]

 

条件付きデータ抽出

flights1月の、特定の変数(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は別途説明します。

Jupyter Notebook上でSQLをらくらく実行するJupySQL