6.オブジェクト指向データベース
本章のコードは,Windows 上の Python でも Colab でも動作する。iris データセットは URL から取得する方式とし,Windows 固有のファイルパス指定を排除している。
基礎知識
Python のデータ型
Python では,type 関数によりデータ型を確認できる。Python は動的型付け言語であり,変数に格納されるオブジェクトの型は実行時に変化する。以下に,整数型(int)と文字列型(str)の使用例を示す。
a = 100
print(type(a))
b = "Hello!"
print(type(b))
リスト(list)
リストは,複数の要素を順序付きで格納するデータ構造である。Python のリストは可変長で,異なる型の要素を格納できる。以下に,4つの整数を要素とするリストの例を示す。
v = [100, 101, 102, 103]
print(v)
等差数列の生成には range 関数を使用する。range(開始値, 終了値, 増分) の形式で記述する(終了値は含まれない)。
u = range(1, 11, 2)
print(list(u))
辞書(dictionary)
辞書は,キーと値のペアを格納するデータ構造であり,キーによる値の参照ができる。以下に,辞書の使用例を示す。キーを指定して要素を追加できる。keys メソッドにより,すべてのキーを取得できる。
d = {'x': 100, 'y': 200}
print(d)
d['z'] = 300
print(d)
print(d.keys())
デコレータ(@記号)
デコレータは,関数やクラスの動作を変更・拡張するための機能である。関数やクラスの定義の直前に @ 記号を用いて記述する。
データ処理基盤
pandas
pandas は,Python のデータ解析ライブラリである。表形式データの操作と統計処理のための機能を提供する。
pandas の Series
Series は,インデックス付きの1次元配列構造である。NumPy(数値計算ライブラリ)をベースとし,統計処理用のメソッドを備える。describe メソッドは,要素数,平均,標準偏差,最小値,四分位数,最大値を表示する。
import pandas as pd
s = pd.Series([100, 101, 102, 103])
print(s)
print(s.describe())
pandas の DataFrame
DataFrame は,2次元の表形式データを扱うデータ構造である。新しい列の追加は,列名を指定して値の並びを代入する。DataFrame の各列は Series 型であり,Series のメソッドを使用して各列の統計処理ができる。
import pandas as pd
x = pd.DataFrame()
x['id'] = [1, 2]
x['name'] = ['apple', 'orange']
x['price'] = [80, 150]
x['color'] = ['red', 'orange']
print(x)
print(x.keys())
print(x['price'])
print(type(x['price']))
print(x['price'].describe())
条件に合致する行の抽出には,query メソッドを使用する。
print(x.query("price > 100"))
numexpr は数式評価ライブラリであり,pandas の query メソッドの内部処理に使用される(インストールされている場合に自動的に利用される)。
CSV ファイルの操作
CSV ファイルの読み込みには pandas.read_csv を使用する。ヘッダー行が先頭にある場合は header=0 を指定する。URL を引数に指定することで,Web 上の CSV ファイルを直接読み込める(この方式は Windows でも Colab でも同一に動作する)。DataFrame を CSV ファイルとして保存するには to_csv メソッドを使用する。
import pandas as pd
URL = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'
iris = pd.read_csv(URL, header=0)
print(iris)
iris.to_csv('iris_out.csv')
データベース
オブジェクト指向データベース
オブジェクト指向データベースは,プログラム中のオブジェクトをそのままの構造で永続化(プログラム終了後もデータを保持すること)できるデータベースである。
ZODB(Zope Object Database)
ZODB は,Python オブジェクトの永続化を行うデータベースである。オブジェクトとリレーショナルデータベース間のデータ変換(オブジェクト・リレーショナルマッピング)を必要とせず,トランザクション(データベース操作の一貫性を保証する仕組み)機能を備える。
ZODB の基本操作
ZODB データベースへの接続と初期化は,以下のように行う。指定したファイルが存在しない場合は,自動的に作成される。
import ZODB
import ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('hoge.fs')
db = ZODB.DB(storage)
conn = db.open()
ZODB のルートオブジェクト(データベースの最上位のオブジェクト)は辞書と同様のインターフェースを持ち,キーと値のペアとしてデータを格納できる。データの永続化には transaction.commit() による確定処理(コミット)が必要である。コミットしない場合,プログラム終了時にデータは失われる。
演習準備
本演習では Python を使用する。Python が未インストールの場合は,下記の「Python 3.12 のインストール(Windows 上)」を展開し,手順に従いインストールすること。続いて,下記の「必要なライブラリのインストール」を実施すること。
Python 3.12 のインストール(Windows 上) [クリックして展開]
以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合,この手順は不要である。
方法1:winget によるインストール
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには,Windows キーまたはスタートメニューから「cmd」と入力し,表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
powershell -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $m=[Environment]::GetEnvironmentVariable('Path','Machine'); if($m -notlike \"*$s*\") { [Environment]::SetEnvironmentVariable('Path', \"$p;$s;$m\", 'Machine') }"
--scope machine を指定することで,システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後,コマンドプロンプトを再起動すると PATH が反映される。
方法2:インストーラーによるインストール
- Python 公式サイト(https://www.python.org/downloads/)にアクセスし,「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
- ダウンロードしたインストーラーを実行する。
- 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると,コマンドプロンプトから
pythonコマンドを実行できない。 - 「Install Python 3.xx for all users」にチェックを入れ,「Install」をクリックする。
インストールの確認
コマンドプロンプトで以下を実行する。
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は,内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は,インストールが正常に完了していない。
必要なライブラリのインストール [クリックして展開]
管理者権限のコマンドプロンプトで以下を実行する。--no-user はユーザーディレクトリへのインストールを抑止し,システム全体(全ユーザー向け)にインストールするためのオプションである。Colab で実行する場合は --no-user を付けず,ノートブックのセル先頭に ! を付けて !pip install -U pandas numexpr ZODB として実行する。
pip install -U --no-user pandas numexpr ZODB
演習
各演習はエディタ(メモ帳,VSCode など)でファイルにコードを記述し,python ファイル名.py で実行する。Colab で実行する場合は,各ファイルの内容をそのままセルに貼り付けて実行する。コードのまとまった単位ごとに保存・実行し,実行結果を確認しながら進める。
演習1.pandas による CSV データの読み込みと統計処理
手順
① 以下のコードをファイル ex1.py に保存し,python ex1.py で実行する。
import pandas as pd
URL = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'
iris = pd.read_csv(URL, header=0)
print(iris)
print(iris.describe())
print(type(iris))
print(iris.keys())
print(iris['sepal_length'])
print(iris['sepal_width'])
ヒント
pd.read_csvは URL を引数に指定して,Web 上の CSV ファイルを直接読み込める。iris.keys()は列名の一覧を返す。iris['sepal_length']のように列名を指定すると,該当列を Series として取得できる。
考察ポイント
print(iris)の出力から,行数・列数・列名・データの一部を読み取る。iris.describe()の出力から,各数値列の平均,標準偏差,最小値・最大値,四分位数を読み取る。type(iris)とtype(iris['sepal_length'])の違いから,DataFrame と Series の関係を確認する。
演習2.ZODB によるデータの永続化
手順
① 以下のコードをファイル ex2.py に保存し,python ex2.py で実行する。データベースファイル hoge.fs がカレントディレクトリに作成される。
import ZODB
import ZODB.FileStorage
import transaction
storage = ZODB.FileStorage.FileStorage('hoge.fs')
db = ZODB.DB(storage)
conn = db.open()
root = conn.root()
print(root.keys())
root['rose'] = 'red'
root['banana'] = 'yellow'
transaction.commit()
print(root.keys())
print(root)
conn.close()
db.close()
② 続けて,iris データセットおよび追加データを保存するコードを ex3.py に保存し,python ex3.py で実行する。
import ZODB
import ZODB.FileStorage
import transaction
import pandas as pd
storage = ZODB.FileStorage.FileStorage('hoge.fs')
db = ZODB.DB(storage)
conn = db.open()
root = conn.root()
URL = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'
iris = pd.read_csv(URL, header=0)
root['iris_data'] = iris
root['v'] = [100, 101, 102, 103]
root['d'] = {'x': 100, 'y': 200}
transaction.commit()
print(root.keys())
print(root['iris_data'])
print(root['v'])
print(root['d'])
conn.close()
db.close()
ヒント
- ルートオブジェクト
rootは辞書と同様の操作(キーによる代入・参照,keys()による一覧取得)ができる。 - データの永続化には
transaction.commit()の呼び出しが必要である。 conn.close()とdb.close()でデータベースへの接続を閉じる。
考察ポイント
ex2.pyを実行した後にex3.pyを実行し,print(root.keys())の出力に前回コミットしたキー('rose','banana')が含まれていることを確認する。- DataFrame,リスト,辞書という異なる型のオブジェクトが,変換処理を介さず直接データベースに格納できることを確認する。
root['iris_data']として取り出した値の型をtype関数で確認し,保存前と同じ DataFrame として復元されることを読み取る。