SELECTの結果からテーブル作成が可能で、かつ元のテーブルの変更があると再度計算してくれるらしい。
詳細
この記事では
カリフォルニアの住宅データセットであるCalifornia HousingをCSVに読み込む。
CSVをRustのライブラリを使ってSurrealDBに書き込む。
元テーブルから平均築年数を示すテーブル(average_house_age_tbl)を作る。
元テーブルから築30年未満の住宅を削除して、average_house_age_tblが更新されるかを確認する。
を実施します。
from sklearn.datasets import fetch_california_housing
import pandas as pd
def download_data():
# データをロード
california_housing = fetch_california_housing()
# データフレームに変換
california_df = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
# 目的変数(住宅価格)を追加
california_df['MEDV'] = california_housing.target
california_df.columns = ['med_inc', 'house_age', 'ave_rooms', 'ave_bedrms', 'population', 'ave_occup', 'latitude', 'longitude', 'medv']
# CSVファイルとして保存
california_df.to_csv('california_housing.csv', index=False)
if __name__ == "__main__":
download_data()
これでcalifornia_housing.csv
に住宅データとmedvを書き込めました。
20640件ありそうです。
ファイル形式で取っておきたいのでディスクベースで起動しました、インメモリでも起動できます。
詳細
surreal start --log trace --user surreal_user --pass surreal_pass --bind 0.0.0.0:8080 file:test.db
cargo add surrealdb
cargo add serde --features derive
cargo add tokio --features macros,rt-multi-thread
# CSVのパース用
cargo add csv serde serde_derive
構造体を決める
#[derive(Serialize, Debug, Deserialize)]
struct HousingRecord {
med_inc: f64,
house_age: f64,
ave_rooms: f64,
ave_bedrms: f64,
population: f64,
ave_occup: f64,
latitude: f64,
longitude: f64,
medv: f64,
}
DBへの接続
let db = Surreal::new::<Ws>("127.0.0.1:8080").await?;
db.signin(Root {
username: "surrealuser",
password: "surrealpass",
})
.await?;
db.use_ns("test_ns").use_db("test_db").await?;
CSVからDBへの書き込み
let mut rdr = csv::Reader::from_reader(io::stdin());
for result in rdr.deserialize() {
let record: HousingRecord = result?;
let housing_record: Record = db.create("housing").content(&record).await?;
}
書き込みの実行
cargo run < california_housing.csv
DBへの接続
surreal sql --conn http://localhost:8980 --user surrealuser --pass surrealpass
書き込んだ件数の確認(事前にSurrealistでログインする)
SELECT count() FROM housing GROUP ALL;
[
{
"count": 20640
}
]
元のテーブルから平均築年数だけを算出するテーブルを書く
DEFINE TABLE average_house_age_tbl AS
SELECT count() AS total, math::mean(house_age) as average_house_age
FROM housing
GROUP ALL;
SELECT * FROM average_house_age_tbl
計算できていることを確認
[
{
"average_house_age": 28.639486434108505,
"id": "average_house_age_tbl:[]",
"total": 20640
}
]
築年数30年未満のデータを元テーブル(housing)から消して、減っていることを確認
DELETE housing WHERE house_age < 30;
SELECT count() FROM housing GROUP ALL;
[
{
"count": 9971
}
]
平均築年数テーブル(average_house_age_tbl)を見て、更新されていることを確認
SELECT * FROM average_house_age_tbl;
[
{
"average_house_age": 39.54367666232034,
"id": "average_house_age_tbl:[]",
"total": 9971
}
]
SurrealDBへのCSV書き込みと、テーブルの情報からテーブルを生やすところまで行いました。
次回はDEFINE FUNCTIONやscripting functionを使って複雑なクエリをJavaScriptで書くかもしれません。
VSCode拡張(.surqlにハイライトがつく)
Surrealist(クライアントアプリ)