PythonとR間のデータのやりとりにSQLiteを使う。
元々DBからデータとかを持ってくる場合は必要ないかも。
実験データなどcsvが大量に生成されるかつPython, Rで取り扱うときに使うといいかも。
モチベーション
データの加工とかはPythonでやってRに渡すときに使う。または逆パターン。
csvを使っていたが、データフレーム毎にファイル作ったりしてたのを1個のファイルで済ませたい。<-他の作業環境にデータ持ってく時に楽になるかも。csvを何個も移動する必要がないので。
データの追加とかも楽にしたい。
作業再開時にいちいちcsvを全部読み込むのがだるいので楽にしたい。
PythonでSQLiteを使う
データの準備
import pandas as pd
import seaboan as sns
df = sns.load_dataset('iris')
SQLiteのデータベースを作ってデータの保存。
import sqlite3
db = 'iris.sqlite' # データベースの名前
con = sqlite3.connect(db) # データベースへ接続
df.to_sql(name = 'iris', con = con, if_exists = 'replace', index = None)
# name = テーブルの名前, con = 接続先,
# if_exists = 接続先のデータベースに同名のテーブルが既にあった場合の動作
# 'replace' 上書き、書き換える
# 'append' 追加
# index = indexも保存するか?
con.close() # 切断
dbの拡張子を.sqliteにしているが別になんでもOK。
あとでわかりやすいように.sqliteにしてるだけ。
SQLiteのデータベースからデータを取得
pandasのデータフレームとして取得する。
import sqlite3
db = 'iris.sqlite' # データベースの名前
con = sqlite3.connect(db) # データベースへ接続
d = pd.read_sql(sql = "SELECT * FROM iris", con = con) # データ取得
# sql = SQLのクエリ
# con = データベースへの接続
con.close()
カラムの名前は勝手に入る。
SQLiteのテーブル名の取得
import sqlite3
db = 'iris.sqlite' # データベースの名前
con = sqlite3.connect(db) # データベースへ接続
cur = con.cursor() # cursorオブジェクト作成
cur.execute("SELECT name FROM sqlite_master WHERE type = 'table'") # SQL実行
print(cur.fetchall()) # 結果表示
cur.close() # 切断
con.close() # 切断
cur.execute("SELECT name FROM sqlite_master WHERE type = 'table'")で
sqlite_masterからテーブル名を取得している。
nameがテーブル名。
nameを*とかにすればカラム名も取得できる。(SQL界ではカラムというのかはわからないが。。。)
RでSQLiteを使う
参考にさせていただいたサイト
https://oku.edu.mie-u.ac.jp/~okumura/stat/sqlite.html
SQLiteのデータベースを作ってデータを保存
RのデータフレームをSQLiteで保存する。
library(RSQLite)
db = "~/Documents/iris.sqlite" # データベースのパス
con = dbConnect(SQLite(), db, synchronous = "off") # データベースへ接続
dbWriteTable(con, "iris", d, overwrite = T)
# "iris" 第2引数はテーブル名
# d 第3引数は保存したいデータフレーム
# overwrite = 同名のテーブルが既にある場合上書きするか。
dbDisconnect(db) # 切断
SQLiteのデータベースからデータの取得
SQLiteのデータをデータフレームとして取得する。
library(RSQLite)
db = "~/Documents/iris.sqlite" # データベースのパス
con = dbConnect(SQLite(), db, synchronous = "off") # データベースへ接続
d <- dbGetQuery(con, "SELECT * FROM iris") # データ取得 (普通にクエリで取得するだけ)
dbDisconnect(db) # 切断
カラムの名前は勝手に入る。
さいごに
正しいSQL_DBの使い方ではない気がする。
実験屋さんなどセンサーデータをロガーで取得 -> ロガーのデータをPythonやRでゴニョゴニョな方には使えるかも。
matlabはDatabase Toolboxのパッケージが必要そうなので今回は断念。