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

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

栄養素チェックアプリ【python + streamlit】

文科省が出している日本食品標準成分表示から、食品にどの栄養素がどのくらい含まれているかをチェックできるガジェットです。また、エイジングや快眠など目的に応じて必要な栄養素と必要な食品もチェックできます。

f:id:kslabo51:20220402113703j:plain

例えばこんな状況で

今回のガジェットは、今食べている食品にどのくらいの栄養があるのだろう。茹でたり生だったり料理の仕方でも違うのかな?エイジングしたいけど何を食べてどんな栄養素をとったらいいのかな?簡単にわかるといいなということから作ってみました。

f:id:kslabo51:20220402113829p:plain

pythonのpandasを利用してデータを整形し、それをstreamlitで表示するという形にしています。streamlitのselectboxとtext_inputを利用し、入力した値からpandasで検索して表示します。

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

  • 食品名を入力すると栄養素の一覧が確認できます。
  • それぞれの栄養素ごとに並べ替えしたりすることもできます。
  • エイジング、記憶力、快眠、腸活の4つの目的に応じた必要栄養素と食品の一覧を表示します。

注意点はこちら

  • 食品の表記をあまりまとめておらず生のデータのまま使用しています。そのため若干見づらい。。。

評価(自己)

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

※食品と栄養素の表記が見づらいことと、単位がバラバラなので一見してどのくらい必要なのかがわかりづらいです。データは今後修正する必要ありです。

実行環境

使用環境    streamlit 
使用言語    python
使用ライブラリ  pandas

 

コード

import pandas as pd
import streamlit as st

st.title('栄養素チェックアプリ')

data = pd.read_excel('ベースデータ.xlsx')

col1, col2 = st.columns(2)

with col2:
    st.write('> 日本食品標準成分表2020年版(八訂)')


st.write('#### ■素材の栄養素を調べる')
search = st.text_input('調べたい素材を入力してください')
df = data[data['食品名(単位)'].str.contains(search)].iloc[:, 2:]
st.dataframe(df)

aging = ['ビタミンA(μg)', 'ビタミンC(mg)', 'ビタミンE(mg)', 'ミネラル(mg)']
memory = ['炭水化物(g)', 'ビタミンB1(mg)', 'ビタミンB2(mg)', 'カルシウム(mg)', '脂質(g)']
sleep = ['アミノ酸組成によるたんぱく質(g)', 'マグネシウム(mg)', 'ビタミンB6(mg)']
intestines = ['食物繊維総量(g)', ]

sorted_aging = data.sort_values(aging, ascending=False).reset_index(False)
aging_ten = sorted_aging.loc[:, ['食品名(単位)', aging[0], aging[1], aging[2], aging[3]]]

sorted_memory = data.sort_values(memory, ascending=False).reset_index(False)
memory_ten = sorted_memory.loc[:, ['食品名(単位)', memory[0], memory[1], memory[2], memory[3], memory[4]]]

sorted_sleep = data.sort_values(sleep, ascending=False).reset_index(False)
sleep_ten = sorted_sleep.loc[:, ['食品名(単位)', sleep[0], sleep[1], sleep[2]]]

sorted_intestines = data.sort_values(intestines, ascending=False).reset_index(False)
intestines_ten = sorted_intestines.loc[:, ['食品名(単位)', intestines[0]]]

li = ['', 'エイジング', '記憶力', '快眠', '腸活']
st.write('#### ■目的別栄養素一覧')
select = st.selectbox('目的を選んでください', options=li, )

if select == li[1]:
    st.dataframe(aging_ten)
    target = aging_ten
elif select == li[2]:
    st.dataframe(memory_ten)
    target = memory_ten
elif select == li[3]:
    st.dataframe(sleep_ten)
    target = sleep_ten
elif select == li[4]:
    st.dataframe(intestines_ten)
    target = intestines_ten
else:
    target = None

select_food = ''

if target is not None:
    st.write('#### ■さらに素材を絞る')
    select_food = st.text_input('素材を絞ってください')
    if select_food != '':
        target_df = target[target['食品名(単位)'].str.contains(select_food)]
        st.dataframe(target_df)