前回記事から、Pythonをベースに、DockerfileとGoogle DriveおよびStreamlitを用いた体重管理及び体重トレンド解析を実装する自分だけのWebアプリを作成していきます。
本体重アプリの特徴は以下です。
- すべて無料で構築可能
- HTML/CSSの知識不要
- ご自身でアプリのカスタマイズが可能
- 短時間で実装可能
- 統計学知識不要
以上のように、誰でも取り掛かりやすい内容となっています。それでは早速やっていきましょう。
▼ Contents
1. 体重管理データをまとめるclass作成
はじめに体重関連のデータを格納するclassオブジェクト作成します。
まずは、値を格納するためにクラスのインスタンス を作成した際の初期値を設定します。
クラスが __init__()
メソッドを定義している場合、クラスのインスタンスを生成すると、新しく生成されたクラスインスタンスに対して自動的に __init__()
を呼び出されることを利用します。
ここでは、引数に
- 体重[kg]: weight
- 体脂肪率[%]: fat
- 朝食の有無: breakfast
- 昼食の有無: lunch
- 夕食の有無: dinner
- ランニングの有無: running
- 筋トレの有無: muscle
- スポーツの有無: sports
上記9つの引数を指定します。
class Diet:
def __init__(self, weight, fat, breakfast, lunch, dinner, running, muscle, sports):
self._weight = weight
self._fat = fat
self._breakfast = breakfast
self._lunch = lunch
self._dinner = dinner
self._running = running
self._muscle = muscle
self._sports = sports
上記クラスオブジェクトを作成後に、以下のコードを実行することで、各値を格納することができます。
diet = Diet(70, 15, 1, 1, 1, 1, 1, 1)
ただし、体重と体脂肪率は文字列型や負の値を入力されると、今後の計算に影響が出るため、以下のコードのようにgetterおよびsetter機能を用いて、 文字列型や負の値 が入力されないようにしておきます。
class Diet:
"""
中略
"""
@property
def weight(self):
return self._weight
@weight.setter
def weight(self, weight):
if not isinstance(weight, float):
print("Enter number")
elif weight <= 0:
print("Enter the value of more than 0")
else:
self._weight = weight
@property
def fat(self):
return self._fat
@fat.setter
def fat(self, fat):
if not isinstance(fat, float):
print("Enter number")
elif fat <= 0:
print("Enter the value of more than 0")
else:
self._fat = fat
次に、データ入力日を生成するクラスメソッドを作成します。以下のコードを確認してください。
import time
class Diet:
def __init__(self, weight, fat, breakfast, lunch, dinner, running, muscle, sports):
"""
中略
"""
self._date = Diet.get_time_str()
"""
中略
"""
@staticmethod
def get_time_str():
today = today = time.localtime()
return f'{today.tm_year}-{today.tm_mon}-{today.tm_mday}'
データ入力日を作成する関数はインスタンス変数を使用しないので、スタティックメソッドデコーダを使用しておきます。以下のコードで入力日を取得できているかか確認できます。
Diet.get_time_str()
最後に各値に名前をつけて、辞書型でデータをまとめる関数を作成しておきます。
class Diet:
def __init__(self, weight, fat, breakfast, lunch, dinner, running, muscle, sports):
"""
中略
"""
try:
self.trend_history = []
self.trend()
except:
print("Value Error")
def trend(self):
trend = {
"Date": self._date,
"Weight [kg]": self._weight,
"Fat [%]": self._fat,
"Breakfast": self._breakfast,
"Lunch": self._lunch,
"Dinner": self._dinner,
"Running": self._running,
"Muscle": self._muscle,
"Sports": self._sports
}
self.trend_history.append(trend)
以下のコードで辞書型で格納されているか確認することができます。
diet = Diet(70, 15, 1, 1, 1, 1, 1, 1)
diet.trend_history
上記コード実行後に、以下のような辞書型データを取得できます。
[{'Date': '2022-1-23',
'Weight [kg]': 70,
'Fat [%]': 15,
'Breakfast': 1,
'Lunch': 1,
'Dinner': 1,
'Running': 1,
'Muscle': 1,
'Sports': 1}]
これで体重データを纏めるコードは以上となります。ご自身でデータを追加したい場合は、このclassオブジェクトをまずご変更ください。
2. 本記事の全体コードまとめ
ここまでお疲れさまでした。次回はDietクラスオブジェクトを利用して、データ登録フォーマットの原型を作成していきます。次回はこちらです。
import time
class Diet:
def __init__(self, weight, fat, breakfast, lunch, dinner, running, muscle, sports):
self._weight = weight
self._fat = fat
self._breakfast = breakfast
self._lunch = lunch
self._dinner = dinner
self._running = running
self._muscle = muscle
self._sports = sports
self._date = Diet.get_time_str()
try:
self.trend_history = []
self.trend()
except:
print("Value Error")
def trend(self):
trend = {
"Date": self._date,
"Weight [kg]": self._weight,
"Fat [%]": self._fat,
"Breakfast": self._breakfast,
"Lunch": self._lunch,
"Dinner": self._dinner,
"Running": self._running,
"Muscle": self._muscle,
"Sports": self._sports
}
self.trend_history.append(trend)
@property
def weight(self):
return self._weight
@weight.setter
def weight(self, weight):
if not isinstance(weight, float):
print("Enter number")
elif weight <= 0:
print("Enter the value of more than 0")
else:
self._weight = weight
@property
def fat(self):
return self._fat
@fat.setter
def fat(self, fat):
if not isinstance(fat, float):
print("Enter number")
elif fat <= 0:
print("Enter the value of more than 0")
else:
self._fat = fat
@staticmethod
def get_time_str():
today = today = time.localtime()
return f'{today.tm_year}-{today.tm_mon}-{today.tm_mday}'
3. 関連記事
随時更新中です。公開次第、リンクを貼り付けていきます。

以下の記事も書いています。よかったらご覧ください。

Twitterもやってまーす。
それでは、よいPythonライフを!