ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

pythonで体調管理アプリ【with streamlit】

pythonで身長・体重からBMI値を算出、標準体重との差や、体温、食事、睡眠の管理を行うガジェットです。毎日のちょっとしたチェックに使用できます。

例えばこんな状況で

最近、体調が冴えないなと思っているのですが、いまいち管理しようとすると大変です。毎日の体調を簡単に管理するものがあるといいな。BMIも自動で計算できたらいいなという思いで作ったガジェットになります。

 

このガジェットでできることはこちら

  • 身長・体重・BMI・標準体重との差・食事・体温・睡眠時間が管理できます。
  • BMIと体温はグラフで可視化しています。
  • streamlitでを使用しているので新しいデータの入力も簡単に行うことができます。

 

評価(自己)

役立ち度  ★★★(平均)
効率化   ★★★(平均)
ミス防止  ★★★(平均)
楽しさ   ★★★(平均)
操作    ★★★(平均)

 

実行環境

使用環境    streamlit 
使用言語    python
使用ライブラリ  pandas,、altair、datetimeateutil.parser

※関連ファイル 日々記載したデータはエクセルファイル(体調管理.xlsx)に記録し吐き出しています。

 

コード

import pandas as pd
import datetime as dt
import altair as alt

import streamlit as st

st.title('体調管理アプリ')

df = pd.read_excel('体調管理.xlsx')
df.columns = ['日付', '曜日', '身長', '体重', 'BMI', '      判定', '適正体重差', '朝食           ', '昼食          ', '夕食          ', '睡眠時間', '体温']

st.write('#### 直近5日間のデータ')
st.dataframe(df.tail())

ymin = 15
ymax = 40

base = alt.Chart(df).encode(
    alt.X('日付:T', axis=alt.Axis(title=None))
)

line1 = base.mark_line(opacity=0.3, color='#57A44C').encode(
    alt.Y('BMI',
          axis=alt.Axis(title='bmi値変化', titleColor='#57A44C'),
          scale=alt.Scale(domain=[ymin, ymax])
         )
)

line2 = base.mark_line(stroke='#5276A7', interpolate='monotone').encode(
    alt.Y('体温',
          axis=alt.Axis(title='体温変化', titleColor='#5276A7'),
          scale=alt.Scale(domain=[ymin, ymax])
         )
)
chart = alt.layer(line1, line2).resolve_scale(
    y = 'independent'
)
st.altair_chart(chart, use_container_width=True)

st.write('#### 本日のデータを入力する')

col1, col2, col3 = st.columns(3)

with col1:
    year = st.number_input('年', min_value=2022, step=1)
with col2:
    month = st.number_input('月', min_value=1, max_value=12, step=1)
with col3:
    day = st.number_input('日', min_value=1, max_value=31, step=1)

if year != '' and month != '' and day != '':
    date = dt.date(year, month, day)

weekday = date.strftime('%a')

height = st.number_input('身長を入力してください', min_value=165.0, max_value=185.0, step=0.1)
weight = st.number_input('体重を入力してください', min_value=55.0, max_value=80.0, step=0.1)
body_temp = st.number_input('体温を入力してください', min_value=35.0, max_value=39.0, step=0.1)
bmi = round(weight / (height/100)**2, 2)
weight_diff = round((height/100)**2 * 22.0 - weight, 2)

if bmi < 18.5:
    style = '痩せ型'
elif 18.5 <= bmi < 25:
    style = '普通体重'
elif 25 <= bmi < 30:
    style = '肥満1'
elif 30 <= bmi < 35:
    style = '肥満2'
elif 35 <= bmi < 40:
    style = '肥満3'
else:
    style = '肥満4'
    
breakfast = st.text_input('朝食を入力してください')
lunch = st.text_input('昼食を入力してください')
dinner = st.text_input('夕食を入力してください')
sleep_hour = st.number_input('睡眠時間を入力してください', min_value=1.0, max_value=12.0, step=0.1)

if st.button('データを登録する'):
    _df = {
        '日付': date,
        '曜日': weekday, 
        '身長': height, 
        '体重': weight, 
        'BMI': bmi,
        '      判定': style,
        '適正体重差': weight_diff,
        '朝食           ': breakfast, 
        '昼食          ': lunch, 
        '夕食          ': dinner, 
        '睡眠時間': sleep_hour,
        '体温': body_temp
    }
    data = pd.DataFrame([_df])
    df = pd.concat([df, data])
    df.to_excel('体調管理.xlsx', index=False)
    st.write('完了しました。画面を更新(Ctr+r)してください')