popup mlv

swiftのサンプルを動かしてみたり。

python pandasでsqlite3やpickleで読み込む話

python pandasのデータフレームを読み込む上で便利なやり方についての話です。csvexcelで読み込むのも便利ですがsqlite3のデータベースやpickle化して面倒な手続きを少なくすることができるのではないでしょうか。

SQLITE3で読み書きする

この場合はデータフレームへアクセスする話です。excelcsvと違いアクセス禁止などがないのでデータベースを開きながら編集が可能です。

import pandas as pd
import sqlite3

conn = sqlite3.connect('foo.sqlite3')
df = pd.DataFrame(columns=["col1", "col2"])
df["col1"] = ["hoge"]
df["col2"] = [1234]
# 出力
print(df)
df.to_sql("table1", conn, index=False, if_exists='replace')

# 読み込み
df2 = pd.read_sql_query('select * from {}'.format('table1'), conn)
print(df2)

sqlite3で注意する必要があるのは列の型が一致しないと書き込みでエラーが出るということです。型の不一致が起きないように読み込んだ後にデータフレームの型を一致させておたほうがいいと思います。csvexcelではここのあたりがゆるいので何もしなくていい場合がよくあります。

# 読み込み データフレームの"dt"列が時間の型であるとき
df2 = pd.read_sql_query('select * from {}'.format('table1'), conn)
df2["dt"] = pd.to_datetime(df2["dt"])

pickle化したのを読み書きする

この場合はメモリ上にあるデータフレームをファイルへ書き出すやり方です。pickle自体はjoblibやpython3で用意されていますがpandasをつかえばもっと短く簡単にアクセスできます。出力したときに型が維持されているので読み込む時に手続きをする必要もありません。

import pandas as pd

path = "bar.pkl"
df = pd.DataFrame(columns=["col1", "col2"])
df["col1"] = ["hoge"]
df["col2"] = [1234]
# 出力
print(df)
df.to_pickle(path)
# 読み込み
df2 = pd.read_pickle(path)
print(df2)

出力結果

2つの出力結果は同じです。

   col1  col2
0  hoge  1234

   col1  col2
0  hoge  1234

最後に

凝ったことをしなければexcelでの出力がクセがなく使いやすいのですが、データを保管する場合はやはりデータベースで扱えるほうがいいと思います。sqlite3であればDB Browser for SQLiteなどで編集も可能です。