11.6.3 pyqTableEvalファンクション(オンプレミス・データベース)
このトピックでは、オンプレミスOracle Databaseで使用されるpyqTableEval
ファンクションについて説明します。pyqTableEval
ファンクションは、Oracle Database表のデータに対してユーザー定義Python関数を実行します。
INP_NAM
パラメータを使用して、データをPython関数に渡します。PAR_LST
パラメータを使用して、引数をPython関数に渡すことができます。
Python関数は、boolean
、dict
、float
、int
、list
、str
、tuple
またはpandas.DataFrame
オブジェクトを返すことができます。OUT_FMT
パラメータを使用して、返される値の形式を定義できます。
構文
pyqTableEval(
inp_nam VARCHAR2,
par_lst VARCHAR2,
out_fmt VARCHAR2,
scr_name VARCHAR2,
scr_owner VARCHAR2 DEFAULT NULL)
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
たとえば、入力データ型を
|
|
ファンクションによって返される出力の形式。次のいずれかになります。
|
|
OML4Pyスクリプト・リポジトリ内のユーザー定義Python関数の名前。 |
|
登録済Pythonスクリプトの所有者。デフォルト値は「NULL」です。NULLの場合、ユーザーのスクリプト・リポジトリでPythonスクリプトを検索します。 |
戻り値
ファンクションpyqTableEval
は、OUT_FMT
パラメータ値で指定された構造を持つ表を返します。
例11-16 pyqTableEvalファンクションの使用
この例では、ユーザー定義Python関数をcreate_iris_tableという名前でOML4Pyスクリプト・リポジトリに格納します。この関数を使用して、pyqEval
ファンクションを呼び出した結果としてデータベース表を作成します。線形回帰モデルを入力データに適合させて、モデルをOML4Pyデータストアに保存する別のユーザー定義Python関数を作成します。この例では、pyqTableEval
ファンクションを呼び出すSQL SELECT
文を実行して、myLinearRegressionModelという名前でスクリプト・リポジトリに格納されている関数を呼び出します。
PL/SQLブロックで、Python関数create_iris_table
を定義し、create_iris_tableという名前でスクリプト・リポジトリに格納し、同じ名前でスクリプト・リポジトリに格納されている既存のユーザー定義Python関数を上書きします。
create_iris_table
関数は、irisデータ・セットをインポートしてロードし、2つのpandas.DataFrame
オブジェクトを作成した後、これらのオブジェクトの連結を返します。
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)',
FALSE, TRUE); -- V_GLOBAL, V_OVERWRITE
END;
/
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関数fit_model
を定義し、myLinearRegressionModelという名前でプライベート関数としてスクリプト・リポジトリに格納し、その名前で格納されている既存のユーザー定義Python関数を上書きします。
fit_model
関数は、回帰モデルを入力データdat
に適合させ、適合モデルをmodelName
引数で指定されたオブジェクトとしてdatastoreName
引数で指定されたデータストアに保存します。fit_model
関数は、適合モデルを文字列形式で返します。
デフォルトでは、Pythonオブジェクトは、指定されたdatastoreName
で新しいデータストアに保存されます。オブジェクトを既存のデータストアに保存するには、oml.ds.save
呼出しでoverwrite
またはappend
引数をTrue
に設定します。
BEGIN
sys.pyqScriptCreate('myLinearRegressionModel',
'def fit_model(dat, modelName, datastoreName):
import oml
from sklearn import linear_model
regr = linear_model.LinearRegression()
regr.fit(dat.loc[:, ["Sepal_Length", "Sepal_Width", \
"Petal_Length"]], dat.loc[:,["Petal_Width"]])
oml.ds.save(objs={modelName:regr}, name=datastoreName, overwrite=True)
return str(regr)',
FALSE, TRUE);
END;
/
pyqTableEval
ファンクションを呼び出すSELECT
文を実行します。pyqTableEval
ファンクションのINP_NAMパラメータでは、Python関数に渡すデータとしてIRIS表を指定します。PAR_LSTパラメータでは、Python関数に渡すモデルおよびデータストアの名前を指定し、ユーザー定義Python関数の呼出しの間にデータベースへのOML4Py接続を確立するためのoml_connect
制御引数を指定します。OUT_FMTパラメータでは、XML形式で値を返すことを指定し、SCR_NAMEパラメータでは、呼び出すPython関数としてスクリプト・リポジトリ内のmyLinearRegressionModel関数を指定します。XML出力はCLOBです。set long [length]
をコールすると、詳細出力を取得できます。
SELECT *
FROM table(pyqTableEval(
'IRIS',
'{"modelName":"linregr",
"datastoreName":"pymodel",
"oml_connect":1}',
'XML',
'myLinearRegressionModel'));
出力は次のようになります。
NAME VALUE
----- ------------------------------------------------------------
<root><str>LinearRegression()</str></root>