5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonとRのデータの連携にSQLiteを使う

Posted at

PythonとR間のデータのやりとりにSQLiteを使う。
元々DBからデータとかを持ってくる場合は必要ないかも。
実験データなどcsvが大量に生成されるかつPython, Rで取り扱うときに使うといいかも。

モチベーション

データの加工とかはPythonでやってRに渡すときに使う。または逆パターン。
csvを使っていたが、データフレーム毎にファイル作ったりしてたのを1個のファイルで済ませたい。<-他の作業環境にデータ持ってく時に楽になるかも。csvを何個も移動する必要がないので。
データの追加とかも楽にしたい。
作業再開時にいちいちcsvを全部読み込むのがだるいので楽にしたい。

PythonでSQLiteを使う

データの準備

py_data_import.rb

import pandas as pd
import seaboan as sns

df = sns.load_dataset('iris')

SQLiteのデータベースを作ってデータの保存。

py_sqlite.rb
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のデータフレームとして取得する。

py_sqlite_read.rb
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のテーブル名の取得

py_tbl.rb
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で保存する。

r_sqlite.rb
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のデータをデータフレームとして取得する。

r_sqlite_read.rb

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のパッケージが必要そうなので今回は断念。

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?