6.オブジェクト指向データベース

概要

本章では,Python の基本的なデータ型・データ構造(リスト,辞書)とデータ解析ライブラリ pandas を確認したうえで,オブジェクト指向データベース ZODB により Python オブジェクトをそのまま永続化する方法を学ぶ。本章のコードは,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 のインストール」を展開し,手順に従いインストールすること。続いて,下記の「必要なライブラリのインストール」を実施すること。

Python 3.12 のインストール

Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。

[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]

Windows での Python 3.12 のインストール

以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。

方法 1:winget によるインストール

インストールコマンドの実行方法

管理者権限コマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。

REM Python 3.12 をシステム領域にインストール
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\""

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\") -and (';'+$c+';' -notlike \"*;$s;*\")){[Environment]::SetEnvironmentVariable('Path',\"$p;$s;$c\",'Machine')}"

方法 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' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

必要なライブラリのインストール [クリックして展開]

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。続いて以下を実行する。--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 データの読み込みと統計処理

手順

① 以下のコードを実行する(メモ帳を用いる場合は a.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 によるデータの永続化

手順

① 以下のコードを実行する(メモ帳を用いる場合は a.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 データセットおよび追加データを保存する以下のコードを実行する(メモ帳を用いる場合は a.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()

ヒント

考察ポイント