12.6.4 pyqRowEvalファンクション(オンプレミス・データベース)
このトピックでは、オンプレミスOracle Databaseで使用されるpyqRowEval
ファンクションについて説明します。pyqRowEval
ファンクションは、データを一連の行にチャンク化した後、各チャンクに対してユーザー定義Python関数を実行します。
pyqRowEval
ファンクションは、INP_NAM
パラメータで指定されたデータを、SCR_NAME
パラメータで指定されたPython関数に渡します。PAR_LST
パラメータを使用して、引数をPython関数に渡すことができます。
ROW_NUM
パラメータでは、Python関数の各呼出しに渡す最大行数を指定します。最後の行セットの行は、指定した数より少なくなることがあります。
Python関数は、boolean
、dict
、float
、int
、list
、str
、tuple
またはpandas.DataFrame
オブジェクトを返すことができます。OUT_FMT
パラメータを使用して、返される値の形式を定義できます。
構文
pyqRowEval(
inp_nam VARCHAR2,
par_lst VARCHAR2,
out_fmt VARCHAR2,
row_num NUMBER,
scr_name VARCHAR2,
scr_owner VARCHAR2 DEFAULT NULL)
パラメータ
パラメータ | 説明 |
---|---|
|
|
|
たとえば、入力データ型を
|
|
ファンクションによって返される出力の形式。次のいずれかになります。
|
ROW_NUM |
Python関数の各呼出しに含める行数。 |
|
OML4Pyスクリプト・リポジトリ内のユーザー定義Python関数の名前。 |
|
登録済Pythonスクリプトの所有者。デフォルト値は「NULL」です。NULLの場合、ユーザーのスクリプト・リポジトリでPythonスクリプトを検索します。 |
戻り値
ファンクションpyqRowEval
は、OUT_FMT
パラメータ値で指定された構造を持つ表を返します。
例12-17 pyqRowEvalファンクションの使用
次の例では、サンプルのirisデータの行チャンクを予測するために、Pythonモデルlinregrをロードします。モデルが作成され、例12-16のデータストアpymodelに保存されます。
この例では、Python関数を定義し、OML4Pyスクリプト・リポジトリに格納します。ユーザー定義Python関数を使用して、pyqEval
関数の結果としてデータベース表を作成します。OML4Pyデータストアからロードされたモデルに対して予測関数を実行するPython関数を定義します。次に、pyqTableEval
ファンクションを呼び出して、データベース表の行のチャンクに対して関数を呼び出します。
PL/SQLブロックで、関数sample_iris_table
を定義し、スクリプト・リポジトリに格納します。この関数は、irisデータ・セットをロードし、2つのpandas.DataFrame
オブジェクトを作成し、これらのオブジェクトの連結のサンプルを返します。
BEGIN
sys.pyqScriptCreate('sample_iris_table',
'def sample_iris_table(size):
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).sample(int(size))',
FALSE, TRUE); -- V_GLOBAL, V_OVERWRITE
END;
/
SELECT
文の結果としてデータベースでSAMPLE_IRIS表を作成します。この文は、同じ名前でスクリプト・リポジトリに保存されたsample_iris_table
ユーザー定義Python関数に対してpyqEval
関数を呼び出します。sample_iris_table
関数は、サイズsize
のirisデータのサンプルを返します。
CREATE TABLE sample_iris AS
SELECT *
FROM TABLE(pyqEval(
'{"size":20}',
'{"Species":"varchar2(10)","Sepal_Length":"number",
"Sepal_Width":"number","Petal_Length":"number",
"Petal_Width":"number"}',
'sample_iris_table'));
Python関数predict_model
を定義し、linregrPredict
という名前でスクリプト・リポジトリに格納します。この関数は、modelName
引数で指定されたPythonモデルを使用して、dat
のデータを予測します。これは、datastoreName
引数で指定されたデータストアからロードされます。予測は最終的に連結され、関数が返すオブジェクトとしてdat
を使用して返されます。
BEGIN
sys.pyqScriptCreate('linregrPredict',
'def predict_model(dat, modelName, datastoreName):
import oml
import pandas as pd
objs = oml.ds.load(name=datastoreName, to_globals=False)
pred = objs[modelName].predict(dat[["Sepal_Length","Sepal_Width",\
"Petal_Length"]])
return pd.concat([dat, pd.DataFrame(pred, \
columns=["Pred_Petal_Width"])], axis=1)',
FALSE, TRUE);
END;
/
pyqRowEval
ファンクションを呼び出すSELECT
文を実行して、指定されたデータ・セット内の各行チャンクに対して指定されたPython関数を実行します。
INP_NAM引数では、Python関数に渡すSAMPLE_IRIS
表のデータを指定します。
PAR_LST引数では、特殊な制御引数oml_connect
によってOML4Pyサーバーに接続することと、特殊な制御引数oml_input_type
によって入力データをpandas.DataFrame
として関数の引数modelName
およびdatastoreName
の値とともに渡すことを指定します。
OUT_FMT引数では、JSON文字列で、pyqRowEval
によって返される表の列名およびデータ型を指定します。
ROW_NUM引数では、SCR_NAMEで指定された関数の呼出しごとに5行を含めることを指定します。
SCR_NAMEパラメータでは、linregrPredict
を指定します。これは、呼び出すユーザー定義Python関数のスクリプト・リポジトリ内の名前です。
SELECT *
FROM table(pyqRowEval(
'SAMPLE_IRIS',
'{"oml_connect":1,"oml_input_type":"pandas.DataFrame",
"modelName":"linregr", "datastoreName":"pymodel"}',
'{"Species":"varchar2(10)", "Sepal_Length":"number",
"Sepal_Width":"number", "Petal_Length":"number",
"Petal_Width":"number","Pred_Petal_Width":"number"}',
5,
'linregrPredict'));
出力は次のようになります。
Species Sepal_Length Sepal_Width Petal_Length Petal_Width Pred_Petal_Width
---------- ------------ ----------- ------------ ----------- ------------------
versicolor 5.4 3 4.5 1.5 1.66731546068336
versicolor 6 3.4 4.5 1.6 1.63208723397328
setosa 5.5 4.2 1.4 0.2 0.289325450127603
virginica 6.4 3.1 5.5 1.8 2.00641535609046
versicolor 6.1 2.8 4.7 1.2 1.58248012323666
setosa 5.4 3.7 1.5 0.2 0.251046097050724
virginica 7.2 3 5.8 1.6 1.97554457713195
versicolor 6.2 2.2 4.5 1.5 1.32323976658868
setosa 4.8 3.1 1.6 0.2 0.294116926466465
virginica 6.7 3.3 5.7 2.5 2.0936178656911
virginica 7.2 3.6 6.1 2.5 2.26646663788204
setosa 5 3.6 1.4 0.2 0.259261360689759
virginica 6.3 3.4 5.6 2.4 2.14639883810232
virginica 6.1 3 4.9 1.8 1.73186245496453
versicolor 6.1 2.9 4.7 1.4 1.60476297762276
versicolor 5.7 2.8 4.5 1.3 1.56056992978395
virginica 6.4 2.7 5.3 1.9 1.8124673155904
setosa 5 3.5 1.3 0.3 0.184570194825823
versicolor 5.6 2.7 4.2 1.3 1.40178874834007
setosa 4.5 2.3 1.3 0.3 0.0208089790714202