python備忘録 血圧データとグラフ作成

 

python始める前後あたりでこちらのvtuberさんの動画を見て、python便利だなぁと手を出したわけです。


www.youtube.com

 

今月に入ってから作っていた血圧データ表示ツールがようやく完成。

以前はExcelLibreOfficeで表に組み込んでリストからグラフ作成していたのですが、入力ミスやズレた時にデータ修正が厄介だったので、CSVのテキストなら楽だろうということで(表計算ソフトだとずらした時に自動的にセル番号も変更されるので、それがちょっと面倒なことになる。)

 

ソースは以下の通り。

#血圧データCSVから表組みとグラフを出力するプログラム
 
from matplotlib import pyplot as plt
import pandas as pd
from decimal import Decimal
import math

plt.rcParams['font.family'] = 'MS Gothic' # fontの設定

base_data = 'blood_20240904-20241005.csv'

try:
    df = pd.read_csv(base_data)
except:
    print('ファイル名が違います。確認を。')
    exit()
#print(df)

table_sells = ''
table_date = ''
table_time = ''
table_up = ''
table_down = ''
table_tempo =''
all_data = len(df)
table_r = math.ceil(Decimal(all_data / 3))  #テーブルの横のセル数
#print('sell_count:',table_r)

for index, df_get in df.iterrows():
    if ((((index + 1) % (table_r)) == 1) or (index == 0)) and not (index == 1):
        table_date = '<tr><td><b>日付</b></td>'
        table_time = '<tr><td><b>時間</b></td>'
        table_up = '<tr><td><b>最高</b></td>'
        table_down = '<tr><td><b>最低</b></td>'
        table_tempo = '<tr><td><b>心拍数</b></td>'
    table_date += '<td>'+str(df_get['date'])+'</td>'
    table_time += '<td>'+str(df_get['time'])+'</td>'
    table_up+= '<td>'+str(df_get['up'])+'</td>'
    table_down += '<td>'+str(df_get['down'])+'</td>'
    table_tempo += '<td>'+str(df_get['tempo'])+'</td>'
    if ((((index + 1) % table_r) == 0) and not(index == 0)) or (index + 1 == all_data):
        table_date += '</tr>\n'
        table_time += '</tr>\n'
        table_up+= '</tr>\n'
        table_down += '</tr>\n'
        table_tempo += '</tr>\n'

        table_sells += table_date + table_time + table_up + table_down + table_tempo \
                +'<tr><td colspan=' + str(table_r + 1) + '> </td></tr>\n'

fig,ax = plt.subplots()
fig.autofmt_xdate(rotation=90, ha="center")

plt.plot(df['date'],df['up'],label='最高')
plt.plot(df['date'],df['down'],label='最低')
plt.plot(df['date'],df['tempo'],label='脈拍')
plt.xlabel('日付')
plt.ylabel('血圧、脈拍')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

fig.savefig('fig1.png',bbox_inches="tight")

html_head = '<head>\n<TITLE>血圧データ</TITLE><link href="style.css" rel="stylesheet" type="text/css">\n</head>\n'
html_image = '<center><img src=fig1.png></center>'
html = '<html>\n'+html_head+'<table border = 1>\n'+table_sells+'</table>\n'+html_image+'</html>\n'

html_file = open('blood_press.html','w', encoding='utf-8')
html_file.write(html)
html_file.close()

自分用なので、動けば良い程度のプログラムなので、精錬されてはいないと思いますが、なにか参考になるものがあればご自由に。自分もいろんなところから引用や参考にさせていただいていますので。

 

 

基礎データは日付、計測時間、最高血圧最低血圧、脈拍数の5つ。

このデータをCSVで作ります。

date,time,up,down,tempo
9/4,10:10,117,72,56
9/5,8:21,121,81,63
9/6,9:42,119,80,58
9/7,9:38,115,79,55
9/8,10:15,117,81,62
9/9,10:47,117,79,62
9/10,9:59,109,74,61
9/11,10:06,117,76,63
9/12,9:54,119,79,57
9/13,9:06,118,81,59
9/14,10:34,117,76,54
9/15,10:17,113,85,64
9/16,10:25,121,76,58
9/17,8:09,119,81,55
9/18,9:54,119,79,61
9/19,10:31,116,74,60
9/20,9:42,116,78,57
9/21,11:10,116,72,59
9/22,10:19,116,79,59
9/23,11:17,118,79,64
9/24,10:45,117,82,62
9/25,10:13,118,83,54
9/26,11:19,119,81,60
9/27,8:28,116,85,64
9/28,10:22,119,76,58
9/29,8:28,116,77,61
9/30,10:18,118,76,56
10/1,8:21,120,82,57
10/2,10:21,118,77,59
10/3,9:15,123,81,56
10/4,10:40,118,81,59
10/5,10:18,119,80,62
10/6,8:51,118,83,59
10/7,7:50,115,76,71

読み込ませるCSVデータは決め打ちにしてしまいました。それ以外もファイル名は決め打ちです。

CSVデータの入力ツールや読み込みツール等は別途作らずにVScodeで色分けプラグイン入れて手入力です。

 

当初標準ライブラリのCSVのやつを使おうと思ったものの、うまくいかなかったので、さっさとpandasに切り替え。

pandasでCSVを読み込んで、pandasでグラフ表示。

XY軸それぞれ一つで3つのデータを折れ線グラフで表示させるようにします。

グラフデータ

当初はこのグラフに表もつけれると思っていたんですが、そういう作例がすぐに見つからなかったので諦めて、自分で簡単にできるHTMLにすることに。

データをfor文で回して、指定セル数事に改行的にテーブルを折り返します。

表組み

テーブルの整形はCSSで行っています。align廃止になってるんですね…。HTML4どころか下手すりゃHTML3で止まってます…。今回、ついでにCSSの使い方も少々わかりました。

table{
    border-collapse: collapse;
    margin: auto;
}
td{
    text-align: right;
}

HTML内臓にしても良かったですが、プログラムが煩雑になりそうだったので、すなおにCSSファイルを作って、linkタグで繋いでいます。

 

表組み制作でどうにもこうにも期待した形状にならなくて、そこだけで1時間以上もかかってしまいました。

0スタートのindexと改行のための剰余計算でズレちゃうんですよね。

 

そんなこんなでなんとか完成。

これで病院に行くときの資料作成に困らないです。

全体図

ネットで情報検索するといくらでも情報転がってるのが楽で良いですね。

perlより遥かに情報が多くて、python自体の各種ライブラリがかゆいところに手が届くものばかりなのが良いです。

もうちょっと外に出せるようなプログラムを組めれば良いんですが、特にアイデアが無いんですよね。日々の活動を楽にするだけのプログラムばかりなので。

 

以下は参考資料。

www.learning-nao.com

当初はPDFで一括主力する予定だったんです…。

machine-learning-skill-up.com

pandasでの読み込みとグラフ制作の参考資料です。

www.yutaka-note.com

X軸の表示のカスタムの参考にさせていただきました。

note.nkmk.me

pandasのデータの処理の仕方の参考にさせていただきました。

python.keicode.com

グラフを画像保存する方法の参考にさせていただきました。

qiita.com

凡例表示がグラフに重なってしまい見えにくかったので、場所を変えることができないかと探して見つけて、ここで解決でした。

www.yutaka-note.com

凡例をずらしたら画像からはみ出すようになってしまったので、対処法を探していろいろ回って発見したのがこちらのサイト。

どこに凡例を置こうが、全部まとめて出力してくれます。

 

書籍も数冊確保していますが、読み終わる前にネットで検索して解決しちゃうので、書籍ってほんとに必要なのかな?とも思ったり。

 

 

とはいえ、上記2冊ですけどね。

みんなのpythonはかなり前に買ったものの読む暇が無くてのこり1/5程度ですが、読めていません。

シリコンバレーの方は先日Yahoo!フリマで買ったものの、まだ1ページも読んでいません。

 

目的通りのプログラムを組むだけならネット検索だけで済むかと思いますが、普段使わないメソッドなんかにも目を通しておけば、いつか役に立つこともあるんじゃないかと思っています。書籍の国語辞典で調べると、必要じゃない語彙まで目に入るようなものです。

 

まだ組みたいプログラムはあるので、あまり苦労しないで組み上げれれば良いんですが…。