Spaces:
Runtime error
Runtime error
import streamlit as st | |
import random | |
import pandas as pd | |
from PIL import Image | |
import requests | |
import json | |
from transformers import pipeline | |
import numpy as np | |
from transformers import AutoFeatureExtractor | |
from transformers import AutoModelForImageClassification | |
import plotly.graph_objects as go | |
import plotly | |
import re | |
st.set_page_config(layout='wide', | |
page_title='Recipes Recommender' | |
) | |
# st.sidebar.markdown("<h3 style='text-align: center;'>Project Location:</h3>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<p style='text-align: center;'><strong><a href='https://huggingface.co/Kaludi/food-category-classification-v2.0'>Model</a></strong> | <strong><a href='https://huggingface.co/datasets/Kaludi/food-category-classification-v2.0'>Dataset</a></strong> | <strong><a href='https://github.com/NebulaCrasher/curated-cuisine-coalition'>GitHub</a></strong></p>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<hr style='text-align: center;'>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<h3 style='text-align: center;'>Project Creators:</h3>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<p style='text-align: center;'><a href='https://github.com/Alhamzahalabboodi'><strong>Alhamzah Alabboodi</strong></a></p>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<p style='text-align: center;'><a href='https://github.com/amoonguaklang12'><strong>Anderson Moonguaklang</strong></a></p>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<p style='text-align: center;'><a href='https://github.com/Kaludii'><strong>Bilal Kaludi</strong></a></p>", unsafe_allow_html=True) | |
# st.sidebar.markdown("<p style='text-align: center;'><a href='https://github.com/NebulaCrasher'><strong>Davit Ksor</strong></a></p>", unsafe_allow_html=True) | |
def main(): | |
# st.title("Food Classification & Recipes Recommender") | |
# # st.markdown("This app is using a Food Category Image Classifier model that has been trained by [Kaludi](https://huggingface.co/Kaludi) to recognize **12** different categories of foods, which includes **Bread**, **Dairy**, **Dessert**, **Egg**, **Fried Food**, **Fruit**, **Meat**, **Noodles**, **Rice**, **Seafood**, **Soup**, and **Vegetable**. After classifying the category, it provides a personalized recipe recommendations based on user preferences for diet and cuisine. With its easy-to-use interface and integration with recipe databases, the app is perfect for food lovers looking for personalized recipe suggestions.") | |
# st.header("Try it out!") | |
# if st.checkbox("Show/Hide Examples"): | |
# st.header("Example Images") | |
# col1, col2, col3, col4 = st.columns(4) | |
# with col1: | |
# st.image("examples/example_0.jpg", width=260) | |
# st.image("examples/example_1.jpg", width=260) | |
# with col2: | |
# st.image("examples/example_2.jpg", width=260) | |
# st.image("examples/example_3.jpg", width=260) | |
# with col3: | |
# st.image("examples/example_4.jpg", width=260) | |
# st.image("examples/example_5.jpg", width=260) | |
# with col4: | |
# st.image("examples/example_6.jpg", width=260) | |
# st.image("examples/example_7.jpg", width=260) | |
# # display the text if the checkbox returns True value | |
# show_images = not show_images | |
# if show_images: | |
# st.header("Example Images") | |
# for image in images: | |
# st.image(image, width=260) | |
# select_health = st.radio("Select One (Not Functional Yet):", ["Regular", "Low-Calorie"], horizontal=True) | |
# menu = st.sidebar.selectbox('Pilih Menu',['Prediksi Makanan', 'Rekomendasi Resep']) | |
# if menu == 'Prediksi Makanan': | |
# uploaded_file = st.file_uploader("Upload Files", type=['png','jpeg','jpg']) | |
# loading_text = st.empty() | |
# if uploaded_file != None: | |
# loading_text.markdown("Loading...") | |
# img = Image.open(uploaded_file) | |
# extractor = AutoFeatureExtractor.from_pretrained("Kaludi/food-category-classification-v2.0") | |
# model = AutoModelForImageClassification.from_pretrained("Kaludi/food-category-classification-v2.0") | |
# inputs = extractor(img, return_tensors="pt") | |
# outputs = model(**inputs) | |
# # ... | |
# loading_text.empty() | |
# label_num=outputs.logits.softmax(1).argmax(1) | |
# label_num=label_num.item() | |
# probs = outputs.logits.softmax(dim=1) | |
# percentage = round(probs[0, label_num].item() * 100, 2) | |
# st.markdown("### Your Image:") | |
# st.image(img, width=260) | |
# st.write("The Predicted Classification is:") | |
# if label_num==0: | |
# st.write("**Roti** (" + f"{percentage}%)") | |
# elif label_num==1: | |
# st.write("**Produk dari Susu** (" + f"{percentage}%)") | |
# elif label_num==2: | |
# st.write("**Kue** (" + f"{percentage}%)") | |
# elif label_num==3: | |
# st.write("**Telur** (" + f"{percentage}%)") | |
# elif label_num==4: | |
# st.write("**Gorengan** (" + f"{percentage}%)") | |
# elif label_num==5: | |
# st.write("**Buah** (" + f"{percentage}%)") | |
# elif label_num==6: | |
# st.write("**Daging** (" + f"{percentage}%)") | |
# elif label_num==7: | |
# st.write("**Mie** (" + f"{percentage}%)") | |
# elif label_num==8: | |
# st.write("**Nasi** (" + f"{percentage}%)") | |
# elif label_num==9: | |
# st.write("**Seafood** (" + f"{percentage}%)") | |
# elif label_num==10: | |
# st.write("**Sup** (" + f"{percentage}%)") | |
# else: | |
# st.write("**Sayuran** (" + f"{percentage}%)") | |
# # st.write("You Selected **{}** For Diet and **{}** For Cuisine with Max".format(diet, cuisine), calories, "Calories For", ( "**Bread**" if label_num==0 else "**Dairy**" if label_num==1 else "**Dessert**" if label_num==2 else "**Egg**" if label_num==3 else "**Fried Food**" if label_num==4 else "**Fruit**" if label_num==5 else "**Meat**" if label_num==6 else "**Noodles**" if label_num==7 else "**Rice**" if label_num==8 else "**Seafood**" if label_num==9 else "**Soup**" if label_num==10 else "**Vegetable**")) | |
# # Dropdown for Diet | |
# elif menu == 'Rekomendasi Resep': | |
diet_options = ['All', 'Gluten-Free', 'Vegan', 'Vegetarian', 'Dairy-Free'] | |
diet = st.selectbox('Diet', diet_options) | |
# Dropdown for Cuisine | |
# cuisine_options = ['All', 'African', 'Asian', 'Caribbean', 'Central American', 'Europe', 'Middle Eastern', 'North American', 'Oceanic', 'South American'] | |
cuisine_options = ['All', 'Asian', 'Central American', 'Europe', 'Middle Eastern'] | |
cuisine = st.selectbox('Cuisine', cuisine_options) | |
# Slider for Calories | |
calories = st.slider("Select Max Calories (Per Serving)", 25, 1000, 500) | |
# print the calories | |
st.write("Selected: **{}** Max Calories.".format(calories)) | |
url = "https://alcksyjrmd.execute-api.us-east-2.amazonaws.com/default/nutrients_response" | |
# Dropdown for Cuisine | |
category = ['Bread', 'Dairy', 'Dessert', 'Egg', 'Fried', 'Fruit', 'Meat', 'Noodles', 'Rice','Seafood','Soup','Vegetable'] | |
# label_num = st.selectbox('Cuisine Type', cuisine_category) | |
# category = ("Bread" if label_num==0 else "Dairy" if label_num==1 else "Dessert" if label_num==2 else "Egg" if label_num==3 else "Fried" if label_num==4 else "Fruit" if label_num==5 else "Meat" if label_num==6 else "Noodles" if label_num==7 else "Rice" if label_num==8 else "Seafood" if label_num==9 else "**Soup**" if label_num==10 else "Vegetable") | |
params = {"f": category[-1], "k": str(calories)} | |
if diet != "All": | |
params["d"] = diet | |
if cuisine != "All": | |
params["c"] = cuisine | |
response = requests.get(url, params=params) | |
response_json = json.loads(response.content) | |
# Convert response_json to a list | |
response_json = list(response_json) | |
if len(response_json) == 0: | |
st.markdown("### Tidak ditemukan:") | |
st.write("**No recipes found. Please adjust your search criteria.**") | |
else: | |
if len(response_json) > 1: | |
random_recipe = random.choice(response_json) | |
if st.button("Get Recipe"): | |
response_json.remove(random_recipe) | |
if len(response_json) == 0: | |
st.write("No more recipes. Please adjust your search criteria.") | |
else: | |
random_recipe = random.choice(response_json) | |
st.markdown("### Recommended Recipe:") | |
st.write("**Title:** ", random_recipe['Title']) | |
if random_recipe['Image Link'].endswith(".jpg") or random_recipe['Image Link'].endswith(".jpeg") or random_recipe['Image Link'].endswith(".png"): | |
st.image(random_recipe['Image Link'], width=300) | |
else: | |
st.write("**Image Link:** ", random_recipe['Image Link']) | |
st.write("**Rating:** ", random_recipe['Rating']) | |
if random_recipe['Description'] != "Description not found": | |
st.write("**Description:** ", random_recipe['Description']) | |
st.write("**Ingredients:**<br>", random_recipe['Ingredients'].replace('\n', '<br>'), unsafe_allow_html=True) | |
st.write("**Recipe Facts:**<br>", random_recipe['Recipe Facts'].replace('\n', '<br>'), unsafe_allow_html=True) | |
st.write("**Directions:**<br>", random_recipe['Directions'].replace('\n', '<br>'), unsafe_allow_html=True) | |
# extract only numeric values and convert mg to g | |
values = [ | |
float(re.sub(r'[^\d.]+', '', random_recipe['Total Fat'])), | |
float(re.sub(r'[^\d.]+', '', random_recipe['Saturated Fat'])), | |
float(re.sub(r'[^\d.]+', '', random_recipe['Cholesterol'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', random_recipe['Sodium'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', random_recipe['Total Carbohydrate'])), | |
float(re.sub(r'[^\d.]+', '', random_recipe['Dietary Fiber'])), | |
float(re.sub(r'[^\d.]+', '', random_recipe['Total Sugars'])), | |
float(re.sub(r'[^\d.]+', '', random_recipe['Protein'])), | |
float(re.sub(r'[^\d.]+', '', random_recipe['Vitamin C'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', random_recipe['Calcium'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', random_recipe['Iron'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', random_recipe['Potassium'])) / 1000 | |
] | |
# Create a list of daily values (DV) for each nutrient based on a 2000 calorie per day diet, all are in grams | |
dv = [65, 20, 0.3, 2.3, 300, 28, 50, 50, 0.09, 1, 0.018, 4.7] | |
# Calculate the percentage of DV for each nutrient | |
dv_percent = [round(value * 100 / dv[i]) for i, value in enumerate(values)] | |
nutrition_html = """ | |
<div id="nutrition-info_6-0" class="comp nutrition-info"> | |
<table class="nutrition-info__table"> | |
<thead> | |
<tr> | |
<th class="nutrition-info__heading" colspan="3">Number of Servings: <span class="nutrition-info__heading-aside">{servings}</span></th> | |
</tr> | |
</thead> | |
<tbody class="nutrition-info__table--body"> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Calories</td> | |
<td class="nutrition-info__table--cell">{calories}</td> | |
<td class="nutrition-info__table--cell"></td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Total Fat</td> | |
<td class="nutrition-info__table--cell">{total_fat}</td> | |
<td class="nutrition-info__table--cell">{fat_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Saturated Fat</td> | |
<td class="nutrition-info__table--cell">{saturated_fat}</td> | |
<td class="nutrition-info__table--cell">{sat_fat_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Cholesterol</td> | |
<td class="nutrition-info__table--cell">{cholesterol}</td> | |
<td class="nutrition-info__table--cell">{chol_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Sodium</td> | |
<td class="nutrition-info__table--cell">{sodium}</td> | |
<td class="nutrition-info__table--cell">{sodium_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Total Carbohydrate</td> | |
<td class="nutrition-info__table--cell">{total_carbohydrate}</td> | |
<td class="nutrition-info__table--cell">{carb_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Dietary Fiber</td> | |
<td class="nutrition-info__table--cell">{dietary_fiber}</td> | |
<td class="nutrition-info__table--cell">{diet_fibe_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Total Sugars</td> | |
<td class="nutrition-info__table--cell">{total_sugars}</td> | |
<td class="nutrition-info__table--cell">{tot_sugars_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Protein</td> | |
<td class="nutrition-info__table--cell">{protein}</td> | |
<td class="nutrition-info__table--cell">{protein_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Vitamin C</td> | |
<td class="nutrition-info__table--cell">{vitc}</td> | |
<td class="nutrition-info__table--cell">{vitc_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Calcium</td> | |
<td class="nutrition-info__table--cell">{calc}</td> | |
<td class="nutrition-info__table--cell">{calc_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Iron</td> | |
<td class="nutrition-info__table--cell">{iron}</td> | |
<td class="nutrition-info__table--cell">{iron_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Potassium</td> | |
<td class="nutrition-info__table--cell">{pota}</td> | |
<td class="nutrition-info__table--cell">{pota_percent}% DV</td> | |
</tr> | |
</tbody> | |
</table> | |
</div> | |
""" | |
# Use the nutrition HTML and format it with the values | |
formatted_html = nutrition_html.format( | |
calories=random_recipe['Calories'], | |
total_fat=random_recipe['Total Fat'], | |
saturated_fat=random_recipe['Saturated Fat'], | |
cholesterol=random_recipe['Cholesterol'], | |
sodium=random_recipe['Sodium'], | |
total_carbohydrate=random_recipe['Total Carbohydrate'], | |
dietary_fiber=random_recipe['Dietary Fiber'], | |
total_sugars=random_recipe['Total Sugars'], | |
servings=random_recipe['Number of Servings'], | |
vitc=random_recipe['Vitamin C'], | |
calc=random_recipe['Calcium'], | |
iron=random_recipe['Iron'], | |
pota=random_recipe['Potassium'], | |
protein=random_recipe['Protein'], | |
fat_percent=dv_percent[0], | |
sat_fat_percent=dv_percent[1], | |
chol_percent=dv_percent[2], | |
sodium_percent=dv_percent[3], | |
carb_percent=dv_percent[4], | |
diet_fibe_percent=dv_percent[5], | |
tot_sugars_percent=dv_percent[6], | |
protein_percent=dv_percent[7], | |
vitc_percent=dv_percent[8], | |
calc_percent=dv_percent[9], | |
iron_percent=dv_percent[10], | |
pota_percent=dv_percent[11] | |
) | |
# Define a function to apply the CSS styles to the table cells | |
def format_table(val): | |
return f"background-color: #133350; color: #fff; border: 1px solid #ddd; border-radius: .25rem; padding: .625rem .625rem 0; font-family: Helvetica; font-size: 1rem;" | |
with st.container(): | |
# Add the nutrition table to the Streamlit app | |
st.write("<h2 style='text-align:left;'>Nutrition Facts (per serving)</h2>", unsafe_allow_html=True) | |
st.write(f"<div style='max-height:none; overflow:auto'>{formatted_html}</div>", unsafe_allow_html=True) | |
st.write("<p style='text-align:left;'>*The % Daily Value (DV) tells you how much a nutrient in a food serving contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.</p>", unsafe_allow_html=True) | |
# create pie chart | |
labels = ['Total Fat', 'Saturated Fat', 'Cholesterol', 'Sodium', 'Total Carbohydrate', 'Dietary Fiber', 'Total Sugars', 'Protein', 'Vitamin C', 'Calcium', 'Iron', 'Potassium'] | |
fig = go.Figure(data=[go.Pie(labels=labels, values=values)]) | |
st.markdown("### Macronutrients Pie Chart ;) (In Grams)") | |
st.plotly_chart(fig) | |
st.write("**Tags:** ", random_recipe['Tags']) | |
st.write("**Recipe URL:** ", random_recipe['Recipe URLs']) | |
st.write("*To download this recipe as a PDF, open the hamburger menu on the top right and click on Print.*") | |
st.markdown("### JSON Response:") | |
st.write(response_json) | |
else: | |
st.markdown("### Recommended Recipe:") | |
st.write("**Title:** ", response_json[0]['Title']) | |
if response_json[0]['Image Link'].endswith(".jpg") or response_json[0]['Image Link'].endswith(".jpeg") or response_json[0]['Image Link'].endswith(".png"): | |
st.image(response_json[0]['Image Link'], width=300) | |
else: | |
st.write("**Image Link:** ", response_json[0]['Image Link']) | |
st.write("**Rating:** ", response_json[0]['Rating']) | |
if response_json[0]['Description'] != "Description not found": | |
st.write("**Description:** ", response_json[0]['Description']) | |
st.write("**Ingredients:**<br>", response_json[0]['Ingredients'].replace('\n', '<br>'), unsafe_allow_html=True) | |
st.write("**Recipe Facts:**<br>", response_json[0]['Recipe Facts'].replace('\n', '<br>'), unsafe_allow_html=True) | |
st.write("**Directions:**<br>", response_json[0]['Directions'].replace('\n', '<br>'), unsafe_allow_html=True) | |
# extract only numeric values and convert mg to g | |
values = [ | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Total Fat'])), | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Saturated Fat'])), | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Cholesterol'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Sodium'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Total Carbohydrate'])), | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Dietary Fiber'])), | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Total Sugars'])), | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Protein'])), | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Vitamin C'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Calcium'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Iron'])) / 1000, | |
float(re.sub(r'[^\d.]+', '', response_json[0]['Potassium'])) / 1000 | |
] | |
# Create a list of daily values (DV) for each nutrient based on a 2000 calorie per day diet, all are in grams | |
dv = [65, 20, 0.3, 2.3, 300, 28, 50, 50, 0.09, 1, 0.018, 4.7] | |
# Calculate the percentage of DV for each nutrient | |
dv_percent = [round(value * 100 / dv[i]) for i, value in enumerate(values)] | |
nutrition_html = """ | |
<div id="nutrition-info_6-0" class="comp nutrition-info"> | |
<table class="nutrition-info__table"> | |
<thead> | |
<tr> | |
<th class="nutrition-info__heading" colspan="3">Number of Servings: <span class="nutrition-info__heading-aside">{servings}</span></th> | |
</tr> | |
</thead> | |
<tbody class="nutrition-info__table--body"> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Calories</td> | |
<td class="nutrition-info__table--cell">{calories}</td> | |
<td class="nutrition-info__table--cell"></td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Total Fat</td> | |
<td class="nutrition-info__table--cell">{total_fat}</td> | |
<td class="nutrition-info__table--cell">{fat_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Saturated Fat</td> | |
<td class="nutrition-info__table--cell">{saturated_fat}</td> | |
<td class="nutrition-info__table--cell">{sat_fat_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Cholesterol</td> | |
<td class="nutrition-info__table--cell">{cholesterol}</td> | |
<td class="nutrition-info__table--cell">{chol_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Sodium</td> | |
<td class="nutrition-info__table--cell">{sodium}</td> | |
<td class="nutrition-info__table--cell">{sodium_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Total Carbohydrate</td> | |
<td class="nutrition-info__table--cell">{total_carbohydrate}</td> | |
<td class="nutrition-info__table--cell">{carb_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Dietary Fiber</td> | |
<td class="nutrition-info__table--cell">{dietary_fiber}</td> | |
<td class="nutrition-info__table--cell">{diet_fibe_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Total Sugars</td> | |
<td class="nutrition-info__table--cell">{total_sugars}</td> | |
<td class="nutrition-info__table--cell">{tot_sugars_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Protein</td> | |
<td class="nutrition-info__table--cell">{protein}</td> | |
<td class="nutrition-info__table--cell">{protein_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Vitamin C</td> | |
<td class="nutrition-info__table--cell">{vitc}</td> | |
<td class="nutrition-info__table--cell">{vitc_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Calcium</td> | |
<td class="nutrition-info__table--cell">{calc}</td> | |
<td class="nutrition-info__table--cell">{calc_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Iron</td> | |
<td class="nutrition-info__table--cell">{iron}</td> | |
<td class="nutrition-info__table--cell">{iron_percent}% DV</td> | |
</tr> | |
<tr class="nutrition-info__table--row"> | |
<td class="nutrition-info__table--cell">Potassium</td> | |
<td class="nutrition-info__table--cell">{pota}</td> | |
<td class="nutrition-info__table--cell">{pota_percent}% DV</td> | |
</tr> | |
</tbody> | |
</table> | |
</div> | |
""" | |
# Use the nutrition HTML and format it with the values | |
formatted_html = nutrition_html.format( | |
calories=response_json[0]['Calories'], | |
total_fat=response_json[0]['Total Fat'], | |
saturated_fat=response_json[0]['Saturated Fat'], | |
cholesterol=response_json[0]['Cholesterol'], | |
sodium=response_json[0]['Sodium'], | |
total_carbohydrate=response_json[0]['Total Carbohydrate'], | |
dietary_fiber=response_json[0]['Dietary Fiber'], | |
total_sugars=response_json[0]['Total Sugars'], | |
servings=response_json[0]['Number of Servings'], | |
vitc=response_json[0]['Vitamin C'], | |
calc=response_json[0]['Calcium'], | |
iron=response_json[0]['Iron'], | |
pota=response_json[0]['Potassium'], | |
protein=response_json[0]['Protein'], | |
fat_percent=dv_percent[0], | |
sat_fat_percent=dv_percent[1], | |
chol_percent=dv_percent[2], | |
sodium_percent=dv_percent[3], | |
carb_percent=dv_percent[4], | |
diet_fibe_percent=dv_percent[5], | |
tot_sugars_percent=dv_percent[6], | |
protein_percent=dv_percent[7], | |
vitc_percent=dv_percent[8], | |
calc_percent=dv_percent[9], | |
iron_percent=dv_percent[10], | |
pota_percent=dv_percent[11] | |
) | |
# Define a function to apply the CSS styles to the table cells | |
def format_table(val): | |
return f"background-color: #133350; color: #fff; border: 1px solid #ddd; border-radius: .25rem; padding: .625rem .625rem 0; font-family: Helvetica; font-size: 1rem;" | |
with st.container(): | |
# Add the nutrition table to the Streamlit app | |
st.write("<h2 style='text-align:left;'>Nutrition Facts (per serving)</h2>", unsafe_allow_html=True) | |
st.write(f"<div style='max-height:none; overflow:auto'>{formatted_html}</div>", unsafe_allow_html=True) | |
st.write("<p style='text-align:left;'>*The % Daily Value (DV) tells you how much a nutrient in a food serving contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.</p>", unsafe_allow_html=True) | |
# create pie chart | |
labels = ['Total Fat', 'Saturated Fat', 'Cholesterol', 'Sodium', 'Total Carbohydrate', 'Dietary Fiber', 'Total Sugars', 'Protein', 'Vitamin C', 'Calcium', 'Iron', 'Potassium'] | |
fig = go.Figure(data=[go.Pie(labels=labels, values=values)]) | |
st.markdown("### Macronutrients Pie Chart ;) (In Grams)") | |
st.plotly_chart(fig) | |
st.write("**Tags:** ", response_json[0]['Tags']) | |
st.write("**Recipe URL:** ", response_json[0]['Recipe URLs']) | |
st.write("*To download this recipe as a PDF, open the hamburger menu on the top right and click on Print.*") | |
st.markdown("### JSON Response:") | |
st.write(response_json) | |
st.markdown("<hr style='text-align: center;'>", unsafe_allow_html=True) | |
# st.markdown("<p style='text-align: center'><a href='https://github.com/Kaludii'>Github</a> | <a href='https://huggingface.co/Kaludi'>HuggingFace</a></p>", unsafe_allow_html=True) | |
if __name__ == '__main__': | |
main() | |