FugueSQL:PandasのDataFrameをSQL文で操作(1/2)

入門/解説

1.FugueSQL:PandasのDataFrameをSQL文で操作(1/2)まとめ

・Pandasは、Pythonで表形式データを扱う際に良く利用されるデータ構造
・Pythonに精通していない人にとってSQLでDataFramesを操作できると楽
・FugueSQLは純粋なSQLではないが標準SQLのSELECT構文と互換性がある

2.FugueSQLとは?

以下、www.kdnuggets.comより「Query Your Pandas DataFrames with SQL」の意訳です。元記事は2021年10月、Matthew Mayoさんの投稿で10月のゴールドランク記事でした。

Fugue(フーガ)とは、対位法を主体とした楽曲形式、との事ですが、バッファの小フーガなどは皆さんも聞いた事があるのではないでしょうか、アイキャッチ画像のクレジットはPhoto by Xavier von Erlach on Unsplash

Pandas、(より具体的には、その主要なデータ構造であるDataFrame)は、Pythonで表形式データを扱う際に良く利用されるデータストレージ構造です。はるか昔より、事実上の標準的な地位におさまっています。

Pandas DataFrameを使用時には、複合データへのアクセス、操作、および計算の実行に関する独自仕様を知っている必要があります。この仕様は、Python構文に準拠しているため、粘り強く時間をかければ習得できます。

もしあなたがPythonに精通している場合は、標準的なPandas APIを学ぶ準備が整っていると言えます。しかし、Pythonにそれほど精通していないユーザーの中には、データサイエンスやデータ分析、さらには関連する分野や職業においてPythonが重要な位置を占めていることから、Pythonを使う事にした人も少なくありません。

また、そのようなユーザーの多くは、データサイエンスで良く使われる言語であるSQLにも精通しているかもしれません。では、表形式データを操作する事に特化して書かれた言語であるSQLを使って、Pandas DataFramesのデータを操作することはできないしょうか?

ここでFugueの登場です。

Fugueは、「データの論理構成」と「プログラムの実行」を切り離す事を念頭に置いて作られたプロジェクトで、主に計算機の並列化を単純化することを目的としています。

Fugueは、ユーザーがネイティブのPythonまたはPandasでコードを記述し、それをSparkとDaskに移植できるようにする抽象化フレームワークです。

Fugueの取り組みの中核となるコンポーネントはFugueSQLです。FugueSQLは純粋なSQLではありません。その構文は「標準SQL、json、pythonの混合」として説明されています。ただし、基本的なクエリの場合は、期待どおりに動作することがわかります。具体的には、「標準SQLのSELECT構文と完全に互換性がある」ように設計されています。そのため、Pandasでデータを処理することに慣れていない人にとっては、一般的に分かりやすいものとなっています。

FugueSQLの利点して、Fugueプロジェクトの目標である複数のコンピュータで並行してコードを実行することもできますし、単独のコンピュータ内でDataFramesを対象にSQLを実行するともできます。

本記事では、貴方自身の作業時にFugureSQLをすぐに起動して実行する方法と、その方法の例を見ていきます。

インストールと準備

完全なFugueライブラリをインストールして、そのすべての並列化サービスを利用する場合は、次のようにインストールできます。

pip install fugue

代わりに、FugueSQL API(本記事のサンプルコードに必要なのはこれだけです)だけが必要な場合は、次のようにインストールします。

pip install fugue[sql]

インストールしたら、必要なライブラリをインポートします。

import pandas as pd
from fugue_sql import fsql

これで、あとは、サンプルコードでクエリを実行するために使用できるDataFrameを作成するだけです。これは私次第であり、現在、私は漫画のコレクションを整理することに深く関わっているので、先に進んで簡単な漫画本のデータセットを作成しましょう。

単純なDataFrameは、4つの列で構成されます。
・漫画本を特定するタイトル
・漫画本の出版社
・商業誌か?
・漫画本の状態(10点満点評価)
・状態を加味した漫画本の価値

上記の内容を実現するためのコードは次のとおりです。

comics_df = pd.DataFrame({'book': ['Secret Wars 8',
                                   'Tomb of Dracula 10',
                                   'Amazing Spider-Man 252',
                                   'New Mutants 98',
                                   'Eternals 1',
                                   'Amazing Spider-Man 300',
                                   'Department of Truth 1'],
                          'publisher': ['Marvel', 'Marvel', 'Marvel', 'Marvel', 'Marvel', 'Marvel', 'Image'],
                          'grade': [9.6, 5.0, 7.5, 8.0, 9.2, 6.5, 9.8],
                          'value': [400, 2500, 300, 600, 400, 750, 175]})

print(comics_df)

 

                     book publisher  grade  value
0           Secret Wars 8    Marvel    9.6    400
1      Tomb of Dracula 10    Marvel    5.0   2500
2  Amazing Spider-Man 252    Marvel    7.5    300
3          New Mutants 98    Marvel    8.0    600
4              Eternals 1    Marvel    9.2    400
5  Amazing Spider-Man 300    Marvel    6.5    750
6   Department of Truth 1     Image    9.8    175

以下のサンプルコードを理解するために、漫画データについてこれ以上理解する(または気にする)必要はありません。

例1:8.0より評価が高いコミックはどれですか?

タイトルがすべてを物語っています。FugueSQLと標準のSELECTステートメントを使用してPandasのDataFrameにクエリを実行し、私の漫画のどれが10点満点で8.0を超えているかを判断します。

これを行うには、最初にSQLステートメントを定義する必要があります。

# which of my books are graded above 8.0?
query_1 = """
SELECT book, publisher, grade, value FROM comics_df
WHERE grade > 8.0
PRINT
"""

SELECT構文のテーブル名としてPandasのDataFrameが指定されていることに注意してください。

クエリを定義したら、Fugueクエリエンジンを使用して実行する必要があります。

fsql(query_1).run()
[/pytho]

そして、以下が返される結果です。
<pre>[python]
PandasDataFrame
book:str              |publisher:str|grade:double|value:long
--------------------------------------------------------------+-------------+------------+----------
Secret Wars 8         |Marvel       |9.6         |400
Eternals 1            |Marvel       |9.2         |400
Department of Truth 1 |Image        |9.8         |175

DataFrameには8.0以上のグレードの本が3冊あります。

Secret Wars 8
Eternals 1
Department of Truth 1

この結果を元のDataFrameと比較すると、クエリが適切に返されていることがわかります。

出来ました!
非常にクールで、貴方がSQL構文に精通している場合は、非常に簡単です。

3.FugueSQL:PandasのDataFrameをSQL文で操作(1/2)関連リンク

1)www.kdnuggets.com
Query Your Pandas DataFrames with SQL

2)fugue-tutorials.readthedocs.io
FugueSQL

3)www.youtube.com
小フーガ ト短調 BWV578 (バッハ)

タイトルとURLをコピーしました