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
値が含まれている場合は、oranumber
をFalse
に設定する必要があります。 -
文字列列については、デフォルトの型は
VARCHAR2(4000)
です。 -
バイト列については、デフォルトの型は
BLOB
です。
dbtypes
引数を使用すると、表の列のSQLデータ型を指定できます。dbtypes
の値には、str
をstr
値にマップする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'>
親トピック: データベースとPythonセッションの間のデータの移動