Spaces:
Running
Running
Hozifa Elgharbawy
commited on
Commit
·
eb4249f
1
Parent(s):
ac2e12b
feat: Add nutrition prediction endpoint
Browse files
models-server/models/nutrition_model.py
ADDED
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import random
|
2 |
+
import pandas as pd
|
3 |
+
import numpy as np
|
4 |
+
import pickle
|
5 |
+
import sys
|
6 |
+
import os
|
7 |
+
import pickle
|
8 |
+
|
9 |
+
SERVER_FILE_DIR = os.path.dirname(os.path.abspath(__file__))
|
10 |
+
NUTRITION_MODEL_PATH = os.path.join(
|
11 |
+
SERVER_FILE_DIR, *"../resources/models/nutrition_model.pkl".split("/")
|
12 |
+
)
|
13 |
+
|
14 |
+
|
15 |
+
class NutritionModel:
|
16 |
+
def generate_plan(self,calories):
|
17 |
+
the_model = self.nutrition_model
|
18 |
+
lunch_attr = {"Calories":calories*0.5,
|
19 |
+
"FatContent":random.uniform(19, 97),
|
20 |
+
"SaturatedFatContent":random.uniform(6, 12),
|
21 |
+
"CholesterolContent": random.uniform(77, 299),
|
22 |
+
"SodiumContent":random.uniform(565, 2299),
|
23 |
+
"CarbohydrateContent":random.uniform(28, 317),
|
24 |
+
"FiberContent": random.uniform(2, 38),
|
25 |
+
"SugarContent": random.uniform(0, 38),
|
26 |
+
"ProteinContent":random.uniform(20, 123)}
|
27 |
+
|
28 |
+
lunch_df = pd.DataFrame(lunch_attr, index=[0])
|
29 |
+
|
30 |
+
breakfast_attr = {"Calories":calories*0.30,
|
31 |
+
"FatContent":random.uniform(8.7, 20),
|
32 |
+
"SaturatedFatContent":random.uniform(1.7, 3.7),
|
33 |
+
"CholesterolContent": random.uniform(0, 63),
|
34 |
+
"SodiumContent":random.uniform(163, 650),
|
35 |
+
"CarbohydrateContent":random.uniform(23, 56),
|
36 |
+
"FiberContent": random.uniform(2.6, 8),
|
37 |
+
"SugarContent": random.uniform(3.5, 13),
|
38 |
+
"ProteinContent":random.uniform(6, 25)}
|
39 |
+
|
40 |
+
breakfast_df = pd.DataFrame(breakfast_attr, index=[0])
|
41 |
+
|
42 |
+
dinner_attr = {"Calories":calories*0.30,
|
43 |
+
"FatContent":random.uniform(15, 33),
|
44 |
+
"SaturatedFatContent":random.uniform(6, 8),
|
45 |
+
"CholesterolContent": random.uniform(22, 86),
|
46 |
+
"SodiumContent":random.uniform(265, 775),
|
47 |
+
"CarbohydrateContent":random.uniform(14, 44),
|
48 |
+
"FiberContent": random.uniform(101, 110),
|
49 |
+
"SugarContent": random.uniform(3, 13),
|
50 |
+
"ProteinContent":random.uniform(11, 25)}
|
51 |
+
|
52 |
+
dinner_df = pd.DataFrame(dinner_attr, index=[0])
|
53 |
+
|
54 |
+
snack_attr = {"Calories":random.uniform(90, 190),
|
55 |
+
"FatContent":random.uniform(1.7, 10),
|
56 |
+
"SaturatedFatContent":random.uniform(0.7, 3),
|
57 |
+
"CholesterolContent": random.uniform(2, 16),
|
58 |
+
"SodiumContent":random.uniform(47, 200),
|
59 |
+
"CarbohydrateContent":random.uniform(10, 31),
|
60 |
+
"FiberContent": random.uniform(0.4, 2.5),
|
61 |
+
"SugarContent": random.uniform(5.7, 21),
|
62 |
+
"ProteinContent":random.uniform(3, 20)}
|
63 |
+
|
64 |
+
snack_df = pd.DataFrame(snack_attr, index=[0])
|
65 |
+
|
66 |
+
drinks_attr = {"Calories":random.uniform(60, 125),
|
67 |
+
"FatContent":random.uniform(0.2, 0.6),
|
68 |
+
"SaturatedFatContent":random.uniform(0, 0.1),
|
69 |
+
"CholesterolContent": random.uniform(0, 0.1),
|
70 |
+
"SodiumContent":random.uniform(3.5, 51),
|
71 |
+
"CarbohydrateContent":random.uniform(14, 30),
|
72 |
+
"FiberContent": random.uniform(0.2, 3.6),
|
73 |
+
"SugarContent": random.uniform(109, 122),
|
74 |
+
"ProteinContent":random.uniform(0.4, 6)}
|
75 |
+
|
76 |
+
drink_df = pd.DataFrame(drinks_attr, index=[0])
|
77 |
+
|
78 |
+
lunch = the_model.transform(lunch_df)
|
79 |
+
breakfast = the_model.transform(breakfast_df)
|
80 |
+
dinner = the_model.transform(dinner_df)
|
81 |
+
snack = the_model.transform(snack_df)
|
82 |
+
drink = the_model.transform(drink_df)
|
83 |
+
|
84 |
+
meals = np.concatenate((breakfast, lunch, dinner, snack, drink), axis=0)
|
85 |
+
meals = np.transpose(meals)
|
86 |
+
|
87 |
+
return meals
|
88 |
+
|
89 |
+
|
90 |
+
def load(self):
|
91 |
+
|
92 |
+
with open(NUTRITION_MODEL_PATH, "rb") as f:
|
93 |
+
self.nutrition_model = pickle.load(f)
|
94 |
+
|
models-server/resources/models/nutrition_model.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9cd0dc84cc9dcc0c985725e8d5cda8d9f9b0571c6c3219bdef2309f177b46ae1
|
3 |
+
size 258480
|
models-server/server.py
CHANGED
@@ -2,6 +2,7 @@ from flask import Flask, request, jsonify
|
|
2 |
from dotenv import load_dotenv
|
3 |
import os
|
4 |
from models.fitness_model import FitnessModel
|
|
|
5 |
|
6 |
load_dotenv()
|
7 |
|
@@ -11,6 +12,8 @@ PORT = os.getenv("MODELS_PORT") or "3030"
|
|
11 |
|
12 |
|
13 |
fitness_model = FitnessModel.load()
|
|
|
|
|
14 |
app = Flask("model-server")
|
15 |
|
16 |
|
@@ -36,11 +39,25 @@ def fitness_predict():
|
|
36 |
for paramName in paramNames:
|
37 |
value = request.json.get(paramName)
|
38 |
if value is None:
|
39 |
-
return jsonify({"error": f"{paramName} is missing"}),
|
40 |
params[paramName] = value
|
41 |
|
42 |
return jsonify({"result": fitness_model.predict(**params)})
|
43 |
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
if __name__ == "__main__":
|
46 |
-
app.run(host=HOST, port=PORT)
|
|
|
2 |
from dotenv import load_dotenv
|
3 |
import os
|
4 |
from models.fitness_model import FitnessModel
|
5 |
+
from models.nutrition_model import NutritionModel
|
6 |
|
7 |
load_dotenv()
|
8 |
|
|
|
12 |
|
13 |
|
14 |
fitness_model = FitnessModel.load()
|
15 |
+
nutrition_model = NutritionModel()
|
16 |
+
nutrition_model.load()
|
17 |
app = Flask("model-server")
|
18 |
|
19 |
|
|
|
39 |
for paramName in paramNames:
|
40 |
value = request.json.get(paramName)
|
41 |
if value is None:
|
42 |
+
return jsonify({"error": f"{paramName} is missing"}), 400
|
43 |
params[paramName] = value
|
44 |
|
45 |
return jsonify({"result": fitness_model.predict(**params)})
|
46 |
|
47 |
|
48 |
+
@app.post("/nutrition")
|
49 |
+
def nutrition_predict():
|
50 |
+
paramNames = ["calories"]
|
51 |
+
|
52 |
+
params = {}
|
53 |
+
for paramName in paramNames:
|
54 |
+
value = request.json.get(paramName)
|
55 |
+
if value is None:
|
56 |
+
return jsonify({"error": f"{paramName} is missing"}), 400
|
57 |
+
params[paramName] = value
|
58 |
+
print("nutrition_model", nutrition_model.generate_plan(**params), type(nutrition_model.generate_plan(**params)))
|
59 |
+
return jsonify({"result": list(nutrition_model.generate_plan(**params))})
|
60 |
+
|
61 |
+
|
62 |
if __name__ == "__main__":
|
63 |
+
app.run(host=HOST, port=PORT, debug=True)
|