11.6.5 pyqGroupEvalファンクション(オンプレミス・データベース)
このトピックでは、オンプレミスOracle Databaseで使用されるpyqGroupEval
ファンクションについて説明します。pyqGroupEval
ファンクションは、データを1つ以上の列でグループ化し、各グループに対してユーザー定義Python関数を実行します。
pyqGroupEval
ファンクションは、SCR_NAME
パラメータで指定されたユーザー定義Python関数を実行します。INP_NAM
パラメータを使用して、データをPython関数に渡します。PAR_LST
パラメータを使用して、引数をPython関数に渡します。GRP_COL
パラメータを使用して、1つ以上のグループ化列を指定します。
Python関数は、boolean
、dict
、float
、int
、list
、str
、tuple
またはpandas.DataFrame
オブジェクトを返すことができます。OUT_FMT
パラメータを使用して、返される値の形式を定義します。
構文
pyqGroupEval(
inp_nam VARCHAR2,
par_lst VARCHAR2,
out_fmt VARCHAR2,
grp_col VARCHAR2,
scr_name VARCHAR2,
scr_owner VARCHAR2 DEFAULT NULL)
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
たとえば、入力データ型を
|
|
ファンクションによって返される出力の形式。次のいずれかになります。
|
GRP_COL |
データのパーティション化に使用するグループ化列の名前。複数の列を区切るには、カンマを使用します。たとえば、
|
|
OML4Pyスクリプト・リポジトリ内のユーザー定義Python関数の名前。 |
|
登録済Pythonスクリプトの所有者。デフォルト値は「NULL」です。NULLの場合、ユーザーのスクリプト・リポジトリでPythonスクリプトを検索します。 |
戻り値
ファンクションpyqGroupEval
は、OUT_FMT
パラメータ値で指定された構造を持つ表を返します。
例11-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_LST
引数では、特殊な制御引数oml_input_type
を指定します。
OUT_FMT
引数では、pyqGroupEval
によって返される表の列名およびデータ型が含まれるJSON文字列を指定します。
GRP_COL
パラメータでは、グループ化する列を指定します。
SCR_NAME
パラメータでは、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