10.5.5 pyqGroupEvalファンクション(オンプレミス・データベース)
このトピックでは、オンプレミスOracle Databaseで使用されるpyqGroupEvalファンクションについて説明します。pyqGroupEvalファンクションは、データを1つ以上の列でグループ化し、各グループに対してユーザー定義Python関数を実行します。
pyqGroupEvalファンクションは、EXP_NAMパラメータで指定されたユーザー定義Python関数を実行します。INP_NAMパラメータを使用して、データをPython関数に渡します。PAR_QRYパラメータを使用して、引数をPython関数に渡します。GRP_COLパラメータを使用して、1つ以上のグループ化列を指定します。
Python関数は、boolean、dict、float、int、list、str、tupleまたはpandas.DataFrameオブジェクトを返すことができます。OUT_QRYパラメータを使用して、返される値の形式を定義します。
構文
pyqGroupEval (
INP_NAM VARCHAR2 IN
PAR_QRY VARCHAR2 IN
OUT_QRY VARCHAR2 IN
GRP_COL VARCHAR2 IN
EXP_NAM VARCHAR2 IN)
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
|
|
|
たとえば、入力データ型を
|
|
|
ファンクションによって返される出力の形式。次のいずれかになります。
|
GRP_COL |
データのパーティション化に使用するグループ化列の名前。複数の列を区切るには、カンマを使用します。たとえば、
|
|
|
OML4Pyスクリプト・リポジトリ内のユーザー定義Python関数の名前。 |
戻り値
ファンクションpyqGroupEvalは、OUT_QRYパラメータ値で指定された構造を持つ表を返します。
例10-18 pyqGroupEvalファンクションの使用方法
この例では、Python関数create_iris_tableを定義し、create_iris_tableという名前でOML4Pyスクリプト・リポジトリに格納します。次に、pyqEvalを呼び出して、ユーザー定義Python関数を呼び出し、IRISデータベース表を作成します。この例では、パッケージirisPkgを作成し、データ・カーソルの指定でそのパッケージを使用して、ユーザー定義pyqGroupEvalファンクションであるirisGroupEval関数に渡します。別のPython関数group_countを定義し、mygroupcountという名前でスクリプト・リポジトリに格納します。この例では、次に、irisGroupEval関数を呼び出し、mygroupcountという名前で保存されたPython関数に渡します。
PL/SQLブロックで、Python関数create_iris_tableを定義し、create_iris_tableという名前でスクリプト・リポジトリに格納します。
BEGIN
sys.pyqScriptCreate('create_iris_table',
'def create_iris_table():
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
x = pd.DataFrame(iris.data, columns = ["Sepal_Length",\
"Sepal_Width","Petal_Length","Petal_Width"])
y = pd.DataFrame(list(map(lambda x: {0:"setosa", 1: "versicolor",\
2: "virginica"}[x], iris.target)),\
columns = ["Species"])
return pd.concat([y, x], axis=1)');
END;
/
create_iris_tableという名前でスクリプト・リポジトリに格納されているPython関数を使用して、pyqEvalファンクションを呼び出してデータベース表IRISを作成します。
CREATE TABLE IRIS AS
(SELECT * FROM pyqEval(
NULL,
'{"Species":"VARCHAR2(10)","Sepal_Length":"number",
"Sepal_Width":"number","Petal_Length":"number",
"Petal_Width":"number"}',
'create_iris_table'
));
Python関数group_countを定義し、mygroupcountという名前でスクリプト・リポジトリに格納します。この関数は、データdatの各グループに対して生成されたpandas.DataFrameを返します。
BEGIN
sys.pyqScriptCreate('mygroupcount',
'def group_count(dat):
import pandas as pd
return pd.DataFrame([(dat["Species"][0], dat.shape[0])],\
columns = ["Species", "CNT"]) ');
END;
/
pyqGroupEvalファンクションを呼び出す問合せを発行します。このファンクションのINP_NAM引数では、関数に渡すIRIS表内のデータを指定します。
PAR_QRY引数では、特別な制御引数oml_input_typeを指定します。
OUT_QRY引数では、pyqGroupEvalによって返される表の列名およびデータ型が含まれるJSON文字列を指定します。
GRP_COLパラメータでは、グループ化する列を指定します。
EXP_NAMパラメータでは、mygroupcountという名前でスクリプト・リポジトリに格納されているユーザー定義Python関数を指定します。
SELECT *
FROM table(
pyqGroupEval(
'IRIS',
'{"oml_input_type":"pandas.DataFrame"}',
'{"Species":"varchar2(10)", "CNT":"number"}',
'Species',
'mygroupcount'));
出力は次のようになります。
Species CNT
---------- ----------
setosa 50
versicolor 50
virginica 50