trttung1610 commited on
Commit
9bdca4a
1 Parent(s): ae670c2

Upload 6 files

Browse files
Files changed (6) hide show
  1. calories.xlsx +0 -0
  2. calories_compare.py +69 -0
  3. file_handle.py +20 -0
  4. requirements.txt +4 -0
  5. suggestion.py +130 -0
  6. vietnamekcal.xlsx +0 -0
calories.xlsx ADDED
Binary file (18.3 kB). View file
 
calories_compare.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fuzzywuzzy import fuzz
2
+ import pandas as pd
3
+ import gradio as gr
4
+
5
+ def calculate_total_calories(user_input):
6
+ df_menu = pd.read_excel('calories.xlsx')
7
+
8
+ # Split the user input into individual menu items
9
+ menu_items = user_input.split(',')
10
+
11
+ total_calories = 0
12
+ results = []
13
+
14
+ for item in menu_items:
15
+ # Split the menu item into quantity and item name
16
+ parts = item.strip().split(' ', 1)
17
+
18
+ if len(parts) == 2:
19
+ quantity = int(parts[0])
20
+ item_name = parts[1]
21
+ else:
22
+ quantity = 1 # Assume a default quantity of 1 if not specified
23
+ item_name = item.strip()
24
+
25
+ # Calculate the similarity scores between the item name and menu item names
26
+ similarity_scores = df_menu['food'].apply(lambda x: fuzz.token_set_ratio(x.lower(), item_name.lower()))
27
+
28
+ # Find the closest match with the highest similarity score
29
+ closest_match_index = similarity_scores.idxmax()
30
+ closest_match_score = similarity_scores[closest_match_index]
31
+
32
+ # Check if the similarity score is above a certain threshold
33
+ threshold = 60
34
+ if closest_match_score < threshold:
35
+ results.append("Không tìm thấy thông tin thức ăn: " + item_name)
36
+ continue
37
+
38
+ # Get the closest match menu item details
39
+ closest_match = df_menu.loc[closest_match_index]
40
+ menu_name = closest_match['food']
41
+ unit = closest_match['detail']
42
+ calories = closest_match['calo']
43
+
44
+ # Calculate the total calories for the current menu item
45
+ item_calories = calories * quantity
46
+ total_calories += item_calories
47
+ results.append("Tên món ăn: " + menu_name)
48
+ results.append("Số lượng: " + str(quantity))
49
+ results.append("Đơn vị: " + unit)
50
+ results.append("Lượng calories trong mỗi đơn vị: " + str(calories)+ " Kcals")
51
+ results.append("Tổng lượng calories của " + menu_name + ": " + str(item_calories)+ " Kcals")
52
+ results.append("") # Add an empty entry for spacing
53
+
54
+ results.append(str(total_calories) + " Kcals")
55
+ return "\n".join(results[0:-1]), results[-1]
56
+
57
+ output_text = [
58
+ gr.outputs.Textbox(label="Thông tin các thành phần trong bữa ăn"),
59
+ gr.outputs.Textbox(label="Tổng lượng calories của bữa ăn")
60
+ ]
61
+
62
+ def gradio_interface():
63
+ input_text = gr.inputs.Textbox(label="Hãy cho tôi biết bữa ăn hôm nay của bạn")
64
+ gr_interface = gr.Interface(fn=calculate_total_calories, inputs=input_text, outputs=output_text, title="Tính Toán Thực Đơn Hằng Ngày", examples=["1 phần cơm tấm sườn bì, 2 trái chuối", "1 phần phở bò, 1 phần bánh Flan"])
65
+ return gr_interface
66
+
67
+ if __name__ == "__main__":
68
+ gr_interface = gradio_interface()
69
+ gr_interface.launch()
file_handle.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+
3
+ df = pd.read_excel("./vietnamekcal.xlsx")
4
+
5
+ def convert_quantity(quantity):
6
+ quantity_parts = quantity.strip().split(' ')
7
+ amount = quantity_parts[0]
8
+ detail = ' '.join(quantity_parts[1:])
9
+ try:
10
+ return float(amount), detail
11
+ except ValueError:
12
+ return amount, detail
13
+
14
+ new_df = pd.DataFrame()
15
+ new_df['food'] = df['THỨC ĂN'].str.lower().str.strip()
16
+ new_df['amount'], new_df['detail'] = zip(*df['SỐ LƯỢNG'].apply(convert_quantity))
17
+ new_df['calo'] = (df['CALO (kcal)'] / new_df['amount'].apply(lambda x: float(x) if isinstance(x, str) else x)).astype(int)
18
+ new_df['amount'] = 1
19
+
20
+ new_df.to_excel('calories.xlsx', index=False) # Save as Excel file without including the index
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ fuzzywuzzy
2
+ pandas
3
+ gradio
4
+ openpyxl
suggestion.py ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+
3
+ def calculate_bmi(height, weight):
4
+ # Calculate BMI using the provided height and weight
5
+ # BMI Formula: weight (kg) / (height (m) ** 2)
6
+ height_m = height / 100 # Convert height from cm to m
7
+ bmi = weight / (height_m ** 2)
8
+ return bmi
9
+
10
+ def calculate_bmr(age, gender, height, weight):
11
+ # Calculate Basal Metabolic Rate (BMR) using the provided age, gender, height, and weight
12
+ if gender == "Nam":
13
+ # BMR Formula for males: 88.362 + (13.397 x weight in kg) + (4.799 x height in cm) - (5.677 x age in years)
14
+ bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
15
+ else:
16
+ # BMR Formula for females: 447.593 + (9.247 x weight in kg) + (3.098 x height in cm) - (4.330 x age in years)
17
+ bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)
18
+ return bmr
19
+
20
+ def calculate_tdee(bmr, activity_level):
21
+ # Calculate Total Daily Energy Expenditure (TDEE) using the provided BMR and activity level
22
+ tdee = bmr * activity_level
23
+ return tdee
24
+
25
+ def calculate_daily_calories_goal(tdee, goal):
26
+ # Calculate the daily calorie goal based on the provided TDEE and goal
27
+ if goal == "Giảm cân":
28
+ calories_goal = tdee - 500 # Aim for a 500 calorie deficit per day for weight loss
29
+ elif goal == "Tăng cân":
30
+ calories_goal = tdee + 500 # Aim for a 500 calorie surplus per day for weight gain
31
+ else:
32
+ calories_goal = tdee # Maintain current weight
33
+ if calories_goal < 0 :
34
+ return 0
35
+ else :
36
+ return calories_goal
37
+
38
+ def get_activity_factor(activity_input):
39
+ """
40
+ Get the activity factor based on the selected option.
41
+
42
+ Args:
43
+ activity_input (str): Selected activity option.
44
+
45
+ Returns:
46
+ float: Activity factor based on the selected option.
47
+ """
48
+ activity_factor_map = {
49
+ 'Không': 1.2,
50
+ 'Có': 1.55,
51
+ 'Thường Xuyên': 1.725
52
+ }
53
+
54
+ return activity_factor_map.get(activity_input, 1.2)
55
+
56
+ def process(height, weight, age, gender, activities, goal):
57
+ # Determine activity level
58
+ activity_level = get_activity_factor(activities)
59
+
60
+ # Calculate BMR
61
+ bmr = calculate_bmr(age, gender, height, weight)
62
+
63
+ # Calculate TDEE
64
+ tdee = calculate_tdee(bmr, activity_level)
65
+
66
+ # Calculate BMI
67
+ bmi = calculate_bmi(height, weight)
68
+
69
+ # Determine BMI category based on gender
70
+ bmi_category = ""
71
+ if gender == "Nam":
72
+ if bmi < 20:
73
+ bmi_category = "Thiếu cân, cần có chế độ ăn phù hợp để cải thiện tình trạng này"
74
+ elif 20 <= bmi < 25:
75
+ bmi_category = "Bình thường, thậm chí ở trong tình trạng tốt nếu bạn thường xuyên tập thể dục và ăn một chế độ ăn hợp lý"
76
+ elif 25 <= bmi < 30:
77
+ bmi_category = "Thừa cân, cần áp dụng biện pháp để khắc phục tình trạng trên"
78
+ else:
79
+ bmi_category = "Béo phì nặng, nếu không cải thiện sớm có thể gây ra các vấn đề liên quan đến tiêu hóa, hệ tuần hoàn, v.v."
80
+ else:
81
+ if bmi < 18:
82
+ bmi_category = "Thiếu cân, thiếu dinh dưỡng"
83
+ elif 18 <= bmi < 23:
84
+ bmi_category = "Bình thường"
85
+ elif 23 <= bmi < 30:
86
+ bmi_category = "Thừa cân"
87
+ else:
88
+ bmi_category = "Béo phì"
89
+
90
+ # Calculate daily calorie goal
91
+ calo_suggestion = calculate_daily_calories_goal(tdee, goal)
92
+
93
+ return bmi, bmr, tdee, bmi_category, calo_suggestion
94
+
95
+ inputs = [
96
+ gr.inputs.Number(label=" Chiều Cao (cm)"),
97
+ gr.inputs.Number(label=" Cân Nặng (kg)"),
98
+ gr.inputs.Number(label="Tuổi"),
99
+ gr.inputs.Radio(['Nam', 'Nữ'], label="Giới Tính"),
100
+ gr.inputs.Radio(['Không', "Có", 'Thường Xuyên'], label="Hoạt Động Thể Thao", default="Không" ),
101
+ gr.inputs.Radio(['Giảm cân', 'Tăng cân', 'Duy trì'], label="Mục Tiêu", default="Giảm cân")
102
+ ]
103
+
104
+ outputs = [
105
+ gr.outputs.Textbox(label="Chỉ số BMI"),
106
+ gr.outputs.Textbox(label="Chỉ số BMR"),
107
+ gr.outputs.Textbox(label="Chỉ số TDEE"),
108
+ gr.outputs.Textbox(label="Lượng Calories mỗi ngày nên là:")
109
+ ]
110
+
111
+ def do(height, weight, age, gender, activities, goal):
112
+ bmi, bmr, tdee, bmi_category, calorie_goal = process(height, weight, age, gender, activities, goal)
113
+
114
+ # Format the values with 2 decimal places
115
+ bmi = "{:.1f}".format(bmi)
116
+ bmr = "{:.1f}".format(bmr)
117
+ tdee = "{:.1f}".format(tdee)
118
+ calorie_goal = "{:.1f}".format(calorie_goal)
119
+
120
+ bmr = f"{bmr} / Ngày"
121
+ tdee = f"{tdee} / Ngày"
122
+ calorie_goal = f"{calorie_goal} / Ngày "
123
+ return bmi,bmr,tdee, calorie_goal
124
+
125
+
126
+ # Create a Gradio interface
127
+ interface = gr.Interface(fn=do, inputs=inputs, outputs=outputs,allow_flagging="never")
128
+
129
+ # Launch the interface
130
+ interface.launch()
vietnamekcal.xlsx ADDED
Binary file (33.4 kB). View file