体重トレンド解析を実装する自分だけのWebアプリを作成するため、前回記事までに登録フォーマットの原型を作成し、データの特徴量を算出した後にデータをグラフ化しました。
今回は、グラフ化の第二弾ということで、1週間の曜日ごとの体重増減をグラフ化していきます。このグラフから、曜日ごとによる体重及び体脂肪量の増減が見やすくなるため、計画を立てやすくなると思います。
▼ Contents
1. Weekdayデータの作成
今回も図1のようなデータを例として使用し、グラフを作成していきたいと思います。データがない方は前回記事をご確認いただき、ご自身の体重データを作成してみてください。

まずは、グラフに必要な特徴量を算出しておきます。こちらは前回の記事でも算出した特徴量ですので、前回をお読みになっている方は飛ばしていただいて構いません。
df = df.astype(
{'Weight [kg]': 'float',
'Fat [%]': 'float',
'Breakfast': 'int',
'Lunch': 'int',
'Dinner': 'int',
'Running': 'int',
'Muscle': 'int',
'Sports': 'int'}
)
df['Date'] = pd.to_datetime(df['Date'])
df["Diff-Weight(Previous)"] = df["Weight [kg]"].diff().fillna(0)
df["Fat [kg]"] = (df["Weight [kg]"] * df["Fat [%]"] / 100)
df["Fat [kg](Previous)"] = df["Fat [kg]"].diff().fillna(0)
上記コードを実行すると、以下のようなデータテーブルが作成されます。体重と体脂肪量の前回値との差分が算出されていることがわかります。

続いて、曜日ごとの体重と体脂肪量の増減の合計を算出していきます。体重と体脂肪量の前回値を曜日ごとに合計することで算出していきます。以下のコードを実行してみてください。
df_data = df[['Date', 'Diff-Weight(Previous)', 'Fat [kg](Previous)']]
df_data["Weekday"] = df_data['Date'].dt.weekday
df_data = df_data.groupby('Weekday').agg('sum')
df_data.index = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
df_data = df_data.reset_index().rename(columns={'index': 'Weekday'})
df_add = pd.DataFrame(
{
"Weekday": "Total",
"Diff-Weight(Previous)": df_data.iloc[:, 1].sum(),
"Fat [kg](Previous)": df_data.iloc[:, 2].sum()
}, index=[8]
)
df_data = pd.concat([df_data, df_add])
df_data
実行すると、以下のテーブルのように、曜日ごとと合計の体重と体脂肪量の増減の合計表が作成されます。このデータテーブルをグラフ化していきます。

2. データのグラフ化
先ほど作成した曜日ごとのデータをグラフ化します。以下のコードを実行してみてください。
fig, ax = plt.subplots(1, 1, figsize=(12, 6)
ax.set_title('Weight [kg], Fat [kg] by Weekday', fontsize=15)
ax.bar(df_data["Weekday"], df_data.iloc[:, 1], label="Weight [kg]")
ax.bar(df_data["Weekday"], df_data.iloc[:, 2], label="Fat [kg]")
ax.set_xticklabels(df_data["Weekday"], rotation=0)
ax.set_xlabel("Weekday", fontsize=15)
ax.set_ylabel("Weight [kg], Fat [kg]", fontsize=15)
ax.grid(True)
ax.legend()
plt.rcParams["font.size"] = 15
plt.show()
実行すると以下の図のように、曜日ごとの体重と体脂肪量のグラフが作成されます。曜日ごとに 体重と体脂肪量の増減が変化してくると思いますので、生活の見直しや改善に役立てていただけると幸いです。

3. まとめと関連記事
今回のまとめコードは以下となります。コードがわかりやすいように関数化しています。
def show_data_weekday(df, figsize=(12, 6), font=15):
df_data = df[['Date', 'Diff-Weight(Previous)', 'Fat [kg](Previous)']]
df_data["Weekday"] = df_data['Date'].dt.weekday
df_data = df_data.groupby('Weekday').agg('sum')
df_data.index = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
df_data = df_data.reset_index().rename(columns={'index': 'Weekday'})
df_add = pd.DataFrame(
{
"Weekday": "Total",
"Diff-Weight(Previous)": df_data.iloc[:, 1].sum(),
"Fat [kg](Previous)": df_data.iloc[:, 2].sum()
}, index=[8]
)
df_data = pd.concat([df_data, df_add])
fig, ax = plt.subplots(1, 1, figsize=figsize)
ax.set_title('Weight [kg], Fat [kg] by Weekday', fontsize=font)
ax.bar(df_data["Weekday"], df_data.iloc[:, 1], label="Weight [kg]")
ax.bar(df_data["Weekday"], df_data.iloc[:, 2], label="Fat [kg]")
ax.set_xticklabels(df_data["Weekday"], rotation=0)
ax.set_xlabel("Weekday", fontsize=font)
ax.set_ylabel("Weight [kg], Fat [kg]", fontsize=font)
ax.grid(True)
ax.legend()
plt.rcParams["font.size"] = font
plt.show()
show_data_weekday(df, figsize=(12, 6), font=15)
以下は本記事の関連記事となります。随時更新中ですので公開次第、リンクを貼り付けていきます。

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

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