はじめに
二軸グラフをpandasで奇麗に描画する方法がわからず、無限に時間を溶かしました
奇麗な二軸グラフの描画に悩む方がこの記事を参考にしていただければ幸いです
概要
時間軸のフォーマットが異なる二つのCSVデータを合成し、同じ描画エリアに二軸グラフのプロットを行ないます
構成
実在するセンサデータを使用すると怒られそうなのでデータを作るところから行います
全部で3部構成です
今回は「①データ生成編」です
使用するコードは以下に載せてあります
https://github.com/ozikot/BiaxialPlot/tree/master/ep1_generate
データ生成
二つのCSV形式のデータを作成します
異なるセンサから取得したセンサデータ、という設定です
以下にそれぞれのセンサデータの内容を示します
※あくまで模擬データです 実在するセンサ、センサデータとは関係ありません
- 心拍
- Time('YYYY/MM/DD hh :mm : ss')
- 例) 2018年11月12日13時31分20秒 -> 2018/11/12 13:31:20
- BPM
- 例) 100 -> 100 (そのまま)
- Time('YYYY/MM/DD hh :mm : ss')
- 体表温度
- Time(センサ取得日の0時0分を0とした経過時間) [μs]
- 例) 13時31分20秒 -> 48680000000
- Temperature [10-1 °C]
- 例) 25.4度 -> 254
- Time(センサ取得日の0時0分を0とした経過時間) [μs]
心拍データの生成
まず最初に心拍データを生成します
初期値100で幾何ランダムウォークを用いました
以下の記事を参考にさせて頂きました
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成するデータの行数
ds = 30000
# 幾何ランダムウォークで疑似的な心拍データの生成
dn = np.random.choice([-1, 1], size=ds)
p0 = 100 # 初期値は100
gwalk = np.cumprod(np.exp(dn * 0.001)) * p0
pd.Series(gwalk).plot()
# データフレームを生成
df = pd.DataFrame({
'Time' : pd.date_range('2018/09/01 00:00:00', periods=ds, freq='1S'),
'BPM' : pd.Series(gwalk)
})
# データフレームをCSVファイル形式で保存
df.to_csv('..//csv_file//heartbeat.csv')
いい感じですね
同じ要領で体表温度のデータを生成します
体表温度データの生成
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成するデータの行数
ds = 30000
# 幾何ランダムウォークで疑似的な体表温度データの生成
dn = np.random.choice([-1, 1], size=ds)
p0 = 20 # 初期値は20度
gwalk = np.cumprod(np.exp(dn * 0.001)) * p0
pd.Series(gwalk).plot()
# データフレームを生成
df = pd.DataFrame({
'Time' : pd.Series([i * 1000000 for i in range(0, ds)]),
'Temperature' : pd.Series(gwalk)
})
# データフレームをCSVファイル形式で保存
df.to_csv('..//csv_file//temp_bs.csv', index=None)
適当なところを拡大してみると、数値の遷移量がランダムになっており模擬データとしては十分だという事がわかります
おわりに
いかがでしたでしょうか
何かありましたらコメントかTwitter(https://twitter.com/ozikot) にて教えてください!
次回は今回作成した二つのデータを一つのデータに合成します