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"}), 399
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)