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の取り組みの中核となるコンポーネントは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 (バッハ)