【Python, Google Drive】体重管理&解析アプリを作ろう2 ~データ登録~

前回記事から、Pythonをベースに、DockerfileとGoogle DriveおよびStreamlitを用いた体重管理及び体重トレンド解析を実装する自分だけのWebアプリを作成していきます。

本体重アプリの特徴は以下です。

  • すべて無料で構築可能
  • HTML/CSSの知識不要
  • ご自身でアプリのカスタマイズが可能
  • 短時間で実装可能
  • 統計学知識不要

以上のように、誰でも取り掛かりやすい内容となっています。それでは早速やっていきましょう。

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. 関連記事

随時更新中です。公開次第、リンクを貼り付けていきます。

Baran

それでは、よいPythonライフを!

Baran

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

Baran

Twitterもやってまーす。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。