python データベース(RDBMS)を作成しデータを格納。

f:id:hanamichi_sukusuku:20210222185408p:plain

実行結果

hw.sqlite3というデータベースファイルが生成される。
実際の機械学習のプログラムにおいてはデータベースでのデータを使用することがほとんどなのでデータベースを連携させ、機械学習を行えるようにデータベースの生成から学んでいく。

 

上記コードでデータベースファイルの作成。

今回では簡易に利用できるデータベース(RDBMS)として、SQLiteを利用。SQLiteであれば、pythonの標準ライブラリーなので手軽にSQLクエリーを利用してデータベースを操作できる。

今回作成しているデータベースは、身長と体重、体型の3つのフィールドを持つデータベースとする。

列  フィールド説明    DBフィールド名

0  顧客ID(自動で追加)     id

1  身長(cm)        height

2  体重(kg)        weight

3  体型(0~5の値)     typeNo

 

体型は6段階の値で表現

値  体型

0   低体重(痩せ型)

1  普通体重

2  肥満1

3  肥満2

4  肥満3

5  肥満4

 

データベースに接続して、SQL文の実行

with sqlite3.connect(dbpath) as conn:
 conn.execute(sql)

 

sqlite3.connect()でデータベースに接続し、オブジェクト生成。SQL文を実行するため、execute()メソッドを使用。

 

SQL文ではデータベースを作成するために三連引用符を使用。

CREATE TABLE IF NOT EXISTS person(カラム名 データ型, カラム名 データ型...)

CREATE TABLE(テーブル作成) IF NOT EXISTS(オプション、データベースに同じ名前のテーブルがないときだけテーブルを作成する制約) person(テーブル名)。

続く()内ではカラム名とデータ型を指定している。

id(カラム名)  INTEGER(データ型) PRIMARY KEY(制約、重複した値の保存を禁止する)

height(カラム名) NUMBER

weight(カラム名) NUMBER

typeNo(カラム名) INTEGER

INTEGERとNUMBERはどちらも整数型を表すそうだが明確な違いはわからなかった。

 

次に新規に身長と体重、体型を100件追加するプログラムを実行してデータベースにデータを格納していく。

f:id:hanamichi_sukusuku:20210222194619p:plain

実行結果

f:id:hanamichi_sukusuku:20210222194641p:plain

100件の身長、体重、体型のデータがデータベースに格納される。

 

データベースに接続し、関数呼び出し

with sqlite3.connect(dbpath) as conn:
# データを100件挿入 --- (*4)
 for i in range(100):
  insert_db(conn)
# トータルで挿入した行数を調べる --- (*5)
 c = conn.execute('SELECT count(*) FROM person')
 cnt = c.fetchone()
 print(cnt[0])

sqlite3.connect()で引数にデータベースファイルのパスを指定しデータベースに接続。

for文で100回insert_db()関数を実行。insert_db()関数では身長、体重、体型のデータをデータベースに格納し、内容を出力する。

c = conn.execute('SELECT cout(*) FROM preson')ではpersonテーブルのレコードの総数を取得している。SELECT文はデータベースからデータを取り出す時に使う。count(*)で全てのレコードの総数を取得。FROM句でテーブル指定。返り値はsqlite3.Cursorオブジェクト。

c.fetchone()でcorsorオブジェクトの1行目をタプルで取得する。

 

insert_db()関数、データベースにデータを格納

f:id:hanamichi_sukusuku:20210222200915p:plain

random.randint(130, 180)で130~180までの整数をランダムに変数heightに格納。

weightも同様。

体型はbmiによって値を変更。BMIは体重(kg) / (身長(cm)/100)の2乗 。

bmi = weight / (height / 100) ** 2

**を使用することで身長/100を2乗している。

if文でBMIの値によってtype_no(体型)に格納する値を変更。

 

sql = '''
INSERT INTO person (height, weight, typeNo)
VALUES (?,?,?)
'''
values = (height,weight, type_no)
print(values)
conn.executemany(sql,[values])

conn.executemany()で一度に複数のデータを保存する。タプルをリストのを扱うので第二引数で[]で囲っている。for文を回すように一つの指令(第一引数のSQL文)を複数のデータに実行する(第二引数)。

第一引数のSQL文のINSERTではデータベースにデータを保存したい時にはINSERT文を使う。

書式

INSERT INTO テーブル名(カラム名, カラム名..)

VALUES(値, 値,..)

 

VALUES(?,?)のようにすることでexecutemany()の第二引数で指定したリストが順番に?の部分に格納され、それぞれのカラムに保存される。