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:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし,「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると,コマンドプロンプトから python コマンドを実行できない。
  4. 「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'])

ヒント

考察ポイント

演習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()

ヒント

考察ポイント