7.3.2 データベースへのローカルPythonデータのプッシュ

oml.push関数を使用して、ローカルPythonセッションからOracleデータベース・スキーマの一時表にデータをプッシュします。

oml.push関数は、ユーザーのデータベース・スキーマ内に一時表を作成し、その表にデータを挿入します。また、Pythonセッションでその表を参照する、対応するプロキシoml.DataFrameオブジェクトを作成して返します。この表は、それを参照するomlオブジェクトがPythonセッション・メモリーまたはOML4Pyデータストアに存在するかぎり存在します。

oml.push関数の構文は次のとおりです。

oml.push(x, oranumber=True, dbtypes=None)

x引数には、pandas.DataFrameまたは表のデータを含む同一サイズのタプルのリストを指定できます。タプルのリストでは、それぞれのタプルは表内の行を表し、列名はCOL1、COL2などに設定されます。

列のSQLデータ型は、次によって決定されます。

  • OML4Pyでは、表からサンプリングされた20個のランダムな行を調べて、デフォルトの列型が決定されます。20行未満の表については、すべての行を使用して列型が決定されます。

    列の値がすべてNoneである場合、または列について、サンプリングされた行にNoneではない一貫性のないデータ型が含まれている場合は、dbtypes引数で列のSQL型が指定されていないかぎり、デフォルトの列型を決定することはできず、ValueErrorが発生します。

  • 数値列については、boolであるoranumber引数によってSQLデータ型が決定されます。True (デフォルト)の場合、SQLデータ型はNUMBERです。Falseの場合、データ型はBINARY_DOUBLEです。

    xのデータにNaN値が含まれている場合は、oranumberFalseに設定する必要があります。

  • 文字列列については、デフォルトの型はVARCHAR2(4000)です。

  • バイト列については、デフォルトの型はBLOBです。

dbtypes引数を使用すると、表の列のSQLデータ型を指定できます。dbtypesの値には、strstr値にマップするdictまたはstr値のリストを指定できます。dictについては、キーは列の名前です。

例7-8 データベース表へのデータのプッシュ

この例では、様々なデータ型の列を含むpandas.core.frame.DataFrameオブジェクトであるpd_dfを作成します。pd_dfを一時データベース表にプッシュします。これにより、その表を参照するoml_dfオブジェクトが作成されます。次に、oml_dfオブジェクトからローカル・メモリー内のdfオブジェクトにデータをプルします。

import oml
import pandas as pd

pd_df = pd.DataFrame({'numeric': [1, 1.4, -4, 3.145, 5, None],
                      'string' : [None, None, 'a', 'a', 'a', 'b'],
                      'bytes' : [b'a', b'b', b'c', b'c', b'd', b'e']})

# Push the data set to a database table with the specified dbtypes 
# for each column.
oml_df = oml.push(pd_df, dbtypes = {'numeric': 'BINARY_DOUBLE', 
                                    'string':'CHAR(1)', 
                                    'bytes':'RAW(1)'})

# Display the data type of oml_df.
type(oml_df)

# Pull the data from oml_df into local memory.
df = oml_df.pull()

# Display the data type of df.
type(df)

# Create a list of tuples. 
lst = [(1, None, b'a'), (1.4, None, b'b'), (-4, 'a', b'c'),
       (3.145, 'a', b'c'), (5, 'a', b'd'), (None, 'b', b'e')]
       
# Create an oml.DataFrame using the list.       
oml_df2 = oml.push(lst, dbtypes = ['BINARY_DOUBLE','CHAR(1)','RAW(1)'])

type(oml_df2)

この例のリスト

>>> import oml
>>> import pandas as pd
>>>
>>> pd_df = pd.DataFrame({'numeric': [1, 1.4, -4, 3.145, 5, None],
...                       'string' : [None, None, 'a', 'a', 'a', 'b'],
...                       'bytes' : [b'a', b'b', b'c', b'c', b'd', b'e']})
>>> 
>>> # Push the data set to a database table with the specified dbtypes
... # for each column.
... oml_df = oml.push(pd_df, dbtypes = {'numeric': 'BINARY_DOUBLE',
...                                     'string':'CHAR(1)', 
...                                     'bytes':'RAW(1)'})
>>> 
>>> # Display the data type of oml_df.
... type(oml_df)
<class 'oml.core.frame.DataFrame'>
>>> 
>>> # Pull the data from oml_df into local memory.
... df = oml_df.pull()
>>> 
>>> # Display the data type of df.
... type(df)
<class 'pandas.core.frame.DataFrame'>
>>>
>>> # Create a list of tuples. 
... lst = [(1, None, b'a'), (1.4, None, b'b'), (-4, 'a', b'c'),
...        (3.145, 'a', b'c'), (5, 'a', b'd'), (None, 'b', b'e')]
>>> 
>>> # Create an oml.DataFrame using the list.       
... oml_df2 = oml.push(lst, dbtypes = ['BINARY_DOUBLE','CHAR(1)','RAW(1)'])
>>> 
>>> type(oml_df2)
<class 'oml.core.frame.DataFrame'>