AI開発にOracle Database上のデータを活用

Oracle Database 上のデータを活用

企業内で、AI開発を目指す方に役立つ情報を発信する為に、自らが気付いたテクニカルなポイントに対して、備忘ログとして残すとともに、活用いただく為に公開します。

キーワード:Oracle Database, pyhon, SQL, AI development, cx_Oracle

Overview

企業内のマスターデータ保管先であるリレーショナルデーターベースを有効活用し、AI開発を活性化させる。

Image of conventional AI development

・課題に応じて、マスターデータの保管先であるリレーショナルデータベースからデータ抽出し、CSVファイル化

・作成したCSVファイルを、AI開発用環境上へ配置

・Pythonのノウハウを使ってAI開発

Conventional problem

AI開発環境の要件は急速に変わるので、Dockerがよく使われると思います。ただし、Dockerはコンテナ内のデータを保存しないようにする必要があります。このため、ネットワークを介したリレーショナルデータベースへのアクセスによるAI開発の統合は、効率的なAI開発の重要な技術です。

・データ抽出や、CSVファイルの配置などが手間

・Pythonの勉強をして、データの前処理をプログラミングする必要

Solving conventional problems

リレーショナルデータベース上のデータを、Python上のプログラムから直接IOし、課題を解決

・DockerコンテナのPythonプログラムから直接IOでき簡単

・ネットワーク経由でIOする事で、Dockerコンテナーに関する複雑性を排除

・従来のSQL文の知識を使って、レコード抽出、項目選択、欠損データ保管処理等が実施可能

Prerequisites

リレーショナルデータベースとしては、企業における利用率が高い、Oracle Database を使い紹介

・各ソフトウエアのバージョンは、普段利用しているAIソフトウエアGRID社の”ReNom”を参考に決定

・ドライバーに関しては、Webを検索した際の利用動向から独断で決定

environment

・kaggleのタイタニック号の生存者に関する情報をサンプルとして利用します。Dataタグから "train.csv" をダウンロード

[データソース] ( https://www.kaggle.com/c/titanic )

・ "titanic_train" という名前で、ネットワーク経由でアクセスできるOracle上にテーブルを作成し、データを配置

・ダウンロードしたデータを事前にインポート

コンテナ環境

・ubunts 16.04 LTS ・Python:3.6 ・pandas:0.20.3 ・cx_Oracle:6.1 ( https://qiita.com/domekichi/items/5ee06a9421e3e90d0897 )

sample

Oracleクライアントと、cx_Orcleをインストールしておく。

cx_Oracleと、osをインポート

In [1]:
import cx_Oracle
import os
import numpy as np

Oracel Databaseに対する環境変数に対して、日本語のシフトJISを指定する。

In [2]:
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"

Oracle Databaseへの接続文字列を指定する。(ユーザーID, パスワード,サーバーネットワークアドレス, PORT番号, サービス名)

In [3]:
connection = cx_Oracle.connect("(User ID)/(password)/(server IP address):(PORT number)/(service name)")
con = connection.cursor()

取得するデータに対するSQL文を指定する。

In [4]:
sql = 'select * from titanic_train'

SQL文の実行

In [5]:
con.execute(sql)
Out[5]:
<cx_Oracle.Cursor on <cx_Oracle.Connection to system@//10.43.144.7:1521/ORCLPDB1>>

実行結果のすべてを変数を取り出し、numpy形式の行列に変換

In [6]:
row = con.fetchall()
rownp = np.array(row)
rownp
Out[6]:
array([['1', '0', '3', ..., '7', ' ', 'S'],
       ['2', '1', '1', ..., '71', 'C85', 'C'],
       ['3', '1', '3', ..., '8', ' ', 'S'],
       ...,
       ['889', '0', '3', ..., '23', ' ', 'S'],
       ['890', '1', '1', ..., '30', 'C148', 'C'],
       ['891', '0', '3', ..., '8', ' ', 'Q']],
      dtype='<U82')