Spaces:
Sleeping
Sleeping
fahadcr14
commited on
Commit
·
d0c7e75
1
Parent(s):
076fbd9
final
Browse files- .gitignore +2 -0
- Dockerfile +1 -1
- ICT.xlsx +0 -0
- app.py +83 -18
- ccdata.xlsx +0 -0
- cloud_computing_model_10_activities.pkl +0 -0
- cloud_computing_model_11_activities.pkl +0 -0
- cloud_computing_model_12_activities.pkl +0 -0
- cloud_computing_model_13_activities.pkl +0 -0
- cloud_computing_model_14_activities.pkl +0 -0
- cloud_computing_model_5_activities.pkl +0 -0
- cloud_computing_model_6_activities.pkl +0 -0
- cloud_computing_model_7_activities.pkl +0 -0
- cloud_computing_model_8_activities.pkl +0 -0
- cloud_computing_model_9_activities.pkl +0 -0
- cloudcomputing.ipynb +0 -0
- ict.ipynb +0 -0
- ict_model_10_activities.pkl +0 -0
- ict_model_11_activities.pkl +0 -0
- ict_model_12_activities.pkl +0 -0
- ict_model_5_activities.pkl +0 -0
- ict_model_6_activities.pkl +0 -0
- ict_model_7_activities.pkl +0 -0
- ict_model_8_activities.pkl +0 -0
- ict_model_9_activities.pkl +0 -0
- requirements.txt +39 -0
- templates/index.html +31 -2
- web.ipynb +157 -0
.gitignore
CHANGED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
.venv/
|
2 |
+
env/
|
Dockerfile
CHANGED
@@ -14,7 +14,7 @@ RUN pip install --no-cache-dir -r requirements.txt
|
|
14 |
COPY . /app
|
15 |
|
16 |
# Expose the port Flask will run on
|
17 |
-
EXPOSE
|
18 |
|
19 |
# Run the Flask app
|
20 |
CMD ["python", "app.py"]
|
|
|
14 |
COPY . /app
|
15 |
|
16 |
# Expose the port Flask will run on
|
17 |
+
EXPOSE 5000
|
18 |
|
19 |
# Run the Flask app
|
20 |
CMD ["python", "app.py"]
|
ICT.xlsx
ADDED
Binary file (93.5 kB). View file
|
|
app.py
CHANGED
@@ -1,23 +1,88 @@
|
|
1 |
-
from flask import Flask, request,
|
|
|
|
|
2 |
|
3 |
app = Flask(__name__)
|
4 |
|
5 |
-
#
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
22 |
if __name__ == '__main__':
|
23 |
-
app.run(
|
|
|
1 |
+
from flask import Flask, request, render_template
|
2 |
+
import numpy as np
|
3 |
+
import pickle
|
4 |
|
5 |
app = Flask(__name__)
|
6 |
|
7 |
+
# Cloud Computing Weights and Max Marks
|
8 |
+
cc_weights = {
|
9 |
+
'A1': 1, 'Q1': 1.5, 'A2': 1, 'Q2': 1.5, 'A3': 1,
|
10 |
+
'A4': 4, 'Q3': 1.5, 'Mid': 35, 'AWS Labs': 3,
|
11 |
+
'Q4': 1.25, 'A5': 4, 'Q5': 1.25, 'A6': 4, 'Final': 40
|
12 |
+
}
|
13 |
+
cc_max_marks = {
|
14 |
+
'A1': 10, 'Q1': 21, 'A2': 10, 'Q2': 30, 'A3': 100,
|
15 |
+
'A4': 10, 'Q3': 41, 'Mid': 35, 'AWS Labs': 10,
|
16 |
+
'Q4': 40, 'A5': 100, 'Q5': 20, 'A6': 100, 'Final': 40
|
17 |
+
}
|
18 |
+
|
19 |
+
# ICT Weights and Max Marks
|
20 |
+
ict_weights = {
|
21 |
+
'Q1': 2.625, 'Q2': 2.625, 'A1': 2, 'Q3': 2.625, 'Q4': 2.625,
|
22 |
+
'Midterm': 35, 'Q5': 2.625, 'A2': 2, 'Q6': 2.625, 'Q7': 2.625,
|
23 |
+
'Q8': 2.625, 'Final': 40
|
24 |
+
}
|
25 |
+
ict_max_marks = {
|
26 |
+
'Q1': 30, 'Q2': 49, 'A1': 100, 'Q3': 30, 'Q4': 15,
|
27 |
+
'Midterm': 35, 'Q5': 45, 'A2': 100, 'Q6': 32, 'Q7': 24,
|
28 |
+
'Q8': 40, 'Final': 100
|
29 |
+
}
|
30 |
+
|
31 |
+
def normalize_input(input_activities, weights, max_marks):
|
32 |
+
"""
|
33 |
+
Normalize the input activities based on weights and max marks.
|
34 |
+
"""
|
35 |
+
normalized_activities = []
|
36 |
+
for activity, score in input_activities.items():
|
37 |
+
if score > 0: # Ignore zeros
|
38 |
+
normalized_score = (score / max_marks[activity]) * weights[activity]
|
39 |
+
normalized_activities.append(normalized_score)
|
40 |
+
return normalized_activities
|
41 |
+
|
42 |
+
def predict_final_score(input_activities, weights, max_marks, model_prefix):
|
43 |
+
"""
|
44 |
+
Predict the final score based on input activities after normalization.
|
45 |
+
"""
|
46 |
+
normalized_activities = normalize_input(input_activities, weights, max_marks)
|
47 |
+
n = len(normalized_activities)
|
48 |
+
|
49 |
+
if n == 0:
|
50 |
+
return "No valid activities entered. Please provide scores greater than 0."
|
51 |
+
|
52 |
+
try:
|
53 |
+
with open(f"{model_prefix}_model_{n}_activities.pkl", "rb") as file:
|
54 |
+
model = pickle.load(file)
|
55 |
+
except FileNotFoundError:
|
56 |
+
return f"No model available for {n} activities. Train the model first."
|
57 |
+
|
58 |
+
input_array = np.array(normalized_activities).reshape(1, -1)
|
59 |
+
predicted_score = model.predict(input_array)[0]
|
60 |
+
return round(predicted_score, 2)
|
61 |
+
|
62 |
+
@app.route('/', methods=['GET', 'POST'])
|
63 |
+
def home():
|
64 |
+
cc_predicted_score = None
|
65 |
+
ict_predicted_score = None
|
66 |
+
|
67 |
+
if request.method == 'POST':
|
68 |
+
# Identify the form (Cloud Computing or ICT)
|
69 |
+
form_type = request.form.get('form_type')
|
70 |
+
|
71 |
+
if form_type == 'cloud_computing':
|
72 |
+
input_activities = {activity: float(request.form.get(activity, 0)) for activity in cc_weights.keys()}
|
73 |
+
cc_predicted_score = predict_final_score(input_activities, cc_weights, cc_max_marks, "cc")
|
74 |
+
|
75 |
+
elif form_type == 'ict':
|
76 |
+
input_activities = {activity: float(request.form.get(activity, 0)) for activity in ict_weights.keys()}
|
77 |
+
ict_predicted_score = predict_final_score(input_activities, ict_weights, ict_max_marks, "ict")
|
78 |
+
|
79 |
+
return render_template(
|
80 |
+
'index.html',
|
81 |
+
cc_max_marks=cc_max_marks,
|
82 |
+
ict_max_marks=ict_max_marks,
|
83 |
+
cc_predicted_score=cc_predicted_score,
|
84 |
+
ict_predicted_score=ict_predicted_score
|
85 |
+
)
|
86 |
|
87 |
if __name__ == '__main__':
|
88 |
+
app.run(debug=False, port=5000)
|
ccdata.xlsx
ADDED
Binary file (42.9 kB). View file
|
|
cloud_computing_model_10_activities.pkl
ADDED
Binary file (135 kB). View file
|
|
cloud_computing_model_11_activities.pkl
ADDED
Binary file (131 kB). View file
|
|
cloud_computing_model_12_activities.pkl
ADDED
Binary file (134 kB). View file
|
|
cloud_computing_model_13_activities.pkl
ADDED
Binary file (135 kB). View file
|
|
cloud_computing_model_14_activities.pkl
ADDED
Binary file (129 kB). View file
|
|
cloud_computing_model_5_activities.pkl
ADDED
Binary file (130 kB). View file
|
|
cloud_computing_model_6_activities.pkl
ADDED
Binary file (132 kB). View file
|
|
cloud_computing_model_7_activities.pkl
ADDED
Binary file (134 kB). View file
|
|
cloud_computing_model_8_activities.pkl
ADDED
Binary file (129 kB). View file
|
|
cloud_computing_model_9_activities.pkl
ADDED
Binary file (131 kB). View file
|
|
cloudcomputing.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
ict.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
ict_model_10_activities.pkl
ADDED
Binary file (129 kB). View file
|
|
ict_model_11_activities.pkl
ADDED
Binary file (127 kB). View file
|
|
ict_model_12_activities.pkl
ADDED
Binary file (127 kB). View file
|
|
ict_model_5_activities.pkl
ADDED
Binary file (128 kB). View file
|
|
ict_model_6_activities.pkl
ADDED
Binary file (131 kB). View file
|
|
ict_model_7_activities.pkl
ADDED
Binary file (131 kB). View file
|
|
ict_model_8_activities.pkl
ADDED
Binary file (129 kB). View file
|
|
ict_model_9_activities.pkl
ADDED
Binary file (128 kB). View file
|
|
requirements.txt
CHANGED
@@ -1,17 +1,56 @@
|
|
|
|
|
|
1 |
certifi==2024.12.14
|
2 |
charset-normalizer==3.4.1
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
filelock==3.16.1
|
|
|
4 |
fsspec==2024.12.0
|
5 |
huggingface-hub==0.27.0
|
6 |
idna==3.10
|
|
|
|
|
|
|
|
|
|
|
7 |
joblib==1.4.2
|
|
|
|
|
|
|
|
|
|
|
8 |
numpy==2.2.1
|
|
|
9 |
packaging==24.2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
PyYAML==6.0.2
|
|
|
11 |
requests==2.32.3
|
12 |
scikit-learn==1.6.0
|
13 |
scipy==1.15.0
|
|
|
|
|
14 |
threadpoolctl==3.5.0
|
|
|
15 |
tqdm==4.67.1
|
|
|
16 |
typing_extensions==4.12.2
|
|
|
17 |
urllib3==2.3.0
|
|
|
|
|
|
1 |
+
asttokens==3.0.0
|
2 |
+
blinker==1.9.0
|
3 |
certifi==2024.12.14
|
4 |
charset-normalizer==3.4.1
|
5 |
+
click==8.1.8
|
6 |
+
comm==0.2.2
|
7 |
+
debugpy==1.8.11
|
8 |
+
decorator==5.1.1
|
9 |
+
et_xmlfile==2.0.0
|
10 |
+
executing==2.1.0
|
11 |
filelock==3.16.1
|
12 |
+
Flask==3.1.0
|
13 |
fsspec==2024.12.0
|
14 |
huggingface-hub==0.27.0
|
15 |
idna==3.10
|
16 |
+
ipykernel==6.29.5
|
17 |
+
ipython==8.31.0
|
18 |
+
itsdangerous==2.2.0
|
19 |
+
jedi==0.19.2
|
20 |
+
Jinja2==3.1.5
|
21 |
joblib==1.4.2
|
22 |
+
jupyter_client==8.6.3
|
23 |
+
jupyter_core==5.7.2
|
24 |
+
MarkupSafe==3.0.2
|
25 |
+
matplotlib-inline==0.1.7
|
26 |
+
nest-asyncio==1.6.0
|
27 |
numpy==2.2.1
|
28 |
+
openpyxl==3.1.5
|
29 |
packaging==24.2
|
30 |
+
pandas==2.2.3
|
31 |
+
parso==0.8.4
|
32 |
+
pexpect==4.9.0
|
33 |
+
platformdirs==4.3.6
|
34 |
+
prompt_toolkit==3.0.48
|
35 |
+
psutil==6.1.1
|
36 |
+
ptyprocess==0.7.0
|
37 |
+
pure_eval==0.2.3
|
38 |
+
Pygments==2.19.0
|
39 |
+
python-dateutil==2.9.0.post0
|
40 |
+
pytz==2024.2
|
41 |
PyYAML==6.0.2
|
42 |
+
pyzmq==26.2.0
|
43 |
requests==2.32.3
|
44 |
scikit-learn==1.6.0
|
45 |
scipy==1.15.0
|
46 |
+
six==1.17.0
|
47 |
+
stack-data==0.6.3
|
48 |
threadpoolctl==3.5.0
|
49 |
+
tornado==6.4.2
|
50 |
tqdm==4.67.1
|
51 |
+
traitlets==5.14.3
|
52 |
typing_extensions==4.12.2
|
53 |
+
tzdata==2024.2
|
54 |
urllib3==2.3.0
|
55 |
+
wcwidth==0.2.13
|
56 |
+
Werkzeug==3.1.3
|
templates/index.html
CHANGED
@@ -6,7 +6,36 @@
|
|
6 |
<title>Student Score Predictor</title>
|
7 |
</head>
|
8 |
<body>
|
9 |
-
<h1>
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
</body>
|
12 |
</html>
|
|
|
6 |
<title>Student Score Predictor</title>
|
7 |
</head>
|
8 |
<body>
|
9 |
+
<h1>Student Score Predictor</h1>
|
10 |
+
|
11 |
+
<h2>Cloud Computing</h2>
|
12 |
+
<form method="POST" action="/">
|
13 |
+
<input type="hidden" name="form_type" value="cloud_computing">
|
14 |
+
<p>Enter your scores for the activities:</p>
|
15 |
+
{% for activity, max_mark in cc_max_marks.items() %}
|
16 |
+
<label for="cc_{{ activity }}">{{ activity }} (Max Marks: {{ max_mark }}):</label>
|
17 |
+
<input type="number" step="0.1" name="{{ activity }}" id="cc_{{ activity }}"><br>
|
18 |
+
{% endfor %}
|
19 |
+
<button type="submit">Predict Cloud Computing Final Score</button>
|
20 |
+
</form>
|
21 |
+
|
22 |
+
{% if cc_predicted_score is not none %}
|
23 |
+
<h3 style="color: blue;">Predicted Cloud Computing Final Score: {{ cc_predicted_score }}</h3>
|
24 |
+
{% endif %}
|
25 |
+
|
26 |
+
<h2>ICT</h2>
|
27 |
+
<form method="POST" action="/">
|
28 |
+
<input type="hidden" name="form_type" value="ict">
|
29 |
+
<p>Enter your scores for the activities:</p>
|
30 |
+
{% for activity, max_mark in ict_max_marks.items() %}
|
31 |
+
<label for="ict_{{ activity }}">{{ activity }} (Max Marks: {{ max_mark }}):</label>
|
32 |
+
<input type="number" step="0.1" name="{{ activity }}" id="ict_{{ activity }}"><br>
|
33 |
+
{% endfor %}
|
34 |
+
<button type="submit">Predict ICT Final Score</button>
|
35 |
+
</form>
|
36 |
+
|
37 |
+
{% if ict_predicted_score is not none %}
|
38 |
+
<h3 style="color: green;">Predicted ICT Final Score: {{ ict_predicted_score }}</h3>
|
39 |
+
{% endif %}
|
40 |
</body>
|
41 |
</html>
|
web.ipynb
ADDED
@@ -0,0 +1,157 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": null,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"name": "stdout",
|
10 |
+
"output_type": "stream",
|
11 |
+
"text": [
|
12 |
+
" * Serving Flask app '__main__'\n",
|
13 |
+
" * Debug mode: off\n"
|
14 |
+
]
|
15 |
+
},
|
16 |
+
{
|
17 |
+
"name": "stderr",
|
18 |
+
"output_type": "stream",
|
19 |
+
"text": [
|
20 |
+
"\u001b[31m\u001b[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.\u001b[0m\n",
|
21 |
+
" * Running on http://127.0.0.1:5000\n",
|
22 |
+
"\u001b[33mPress CTRL+C to quit\u001b[0m\n"
|
23 |
+
]
|
24 |
+
},
|
25 |
+
{
|
26 |
+
"name": "stderr",
|
27 |
+
"output_type": "stream",
|
28 |
+
"text": [
|
29 |
+
"127.0.0.1 - - [06/Jan/2025 13:19:51] \"GET / HTTP/1.1\" 200 -\n",
|
30 |
+
"/home/faddy/Documents/7-sem/mlops/assignment4/.venv/lib/python3.11/site-packages/sklearn/utils/validation.py:2739: UserWarning: X does not have valid feature names, but GradientBoostingRegressor was fitted with feature names\n",
|
31 |
+
" warnings.warn(\n",
|
32 |
+
"127.0.0.1 - - [06/Jan/2025 13:20:05] \"POST / HTTP/1.1\" 200 -\n",
|
33 |
+
"127.0.0.1 - - [06/Jan/2025 13:20:16] \"POST / HTTP/1.1\" 200 -\n",
|
34 |
+
"127.0.0.1 - - [06/Jan/2025 13:20:28] \"POST / HTTP/1.1\" 200 -\n"
|
35 |
+
]
|
36 |
+
}
|
37 |
+
],
|
38 |
+
"source": [
|
39 |
+
"from flask import Flask, request, render_template\n",
|
40 |
+
"import numpy as np\n",
|
41 |
+
"import pickle\n",
|
42 |
+
"\n",
|
43 |
+
"app = Flask(__name__)\n",
|
44 |
+
"\n",
|
45 |
+
"# Cloud Computing Weights and Max Marks\n",
|
46 |
+
"cc_weights = {\n",
|
47 |
+
" 'A1': 1, 'Q1': 1.5, 'A2': 1, 'Q2': 1.5, 'A3': 1,\n",
|
48 |
+
" 'A4': 4, 'Q3': 1.5, 'Mid': 35, 'AWS Labs': 3,\n",
|
49 |
+
" 'Q4': 1.25, 'A5': 4, 'Q5': 1.25, 'A6': 4, 'Final': 40\n",
|
50 |
+
"}\n",
|
51 |
+
"cc_max_marks = {\n",
|
52 |
+
" 'A1': 10, 'Q1': 21, 'A2': 10, 'Q2': 30, 'A3': 100,\n",
|
53 |
+
" 'A4': 10, 'Q3': 41, 'Mid': 35, 'AWS Labs': 10,\n",
|
54 |
+
" 'Q4': 40, 'A5': 100, 'Q5': 20, 'A6': 100, 'Final': 40\n",
|
55 |
+
"}\n",
|
56 |
+
"\n",
|
57 |
+
"# ICT Weights and Max Marks\n",
|
58 |
+
"ict_weights = {\n",
|
59 |
+
" 'Q1': 2.625, 'Q2': 2.625, 'A1': 2, 'Q3': 2.625, 'Q4': 2.625,\n",
|
60 |
+
" 'Midterm': 35, 'Q5': 2.625, 'A2': 2, 'Q6': 2.625, 'Q7': 2.625,\n",
|
61 |
+
" 'Q8': 2.625, 'Final': 40\n",
|
62 |
+
"}\n",
|
63 |
+
"ict_max_marks = {\n",
|
64 |
+
" 'Q1': 30, 'Q2': 49, 'A1': 100, 'Q3': 30, 'Q4': 15,\n",
|
65 |
+
" 'Midterm': 35, 'Q5': 45, 'A2': 100, 'Q6': 32, 'Q7': 24,\n",
|
66 |
+
" 'Q8': 40, 'Final': 100\n",
|
67 |
+
"}\n",
|
68 |
+
"\n",
|
69 |
+
"def normalize_input(input_activities, weights, max_marks):\n",
|
70 |
+
" \"\"\"\n",
|
71 |
+
" Normalize the input activities based on weights and max marks.\n",
|
72 |
+
" \"\"\"\n",
|
73 |
+
" normalized_activities = []\n",
|
74 |
+
" for activity, score in input_activities.items():\n",
|
75 |
+
" if score > 0: # Ignore zeros\n",
|
76 |
+
" normalized_score = (score / max_marks[activity]) * weights[activity]\n",
|
77 |
+
" normalized_activities.append(normalized_score)\n",
|
78 |
+
" return normalized_activities\n",
|
79 |
+
"\n",
|
80 |
+
"def predict_final_score(input_activities, weights, max_marks, model_prefix):\n",
|
81 |
+
" \"\"\"\n",
|
82 |
+
" Predict the final score based on input activities after normalization.\n",
|
83 |
+
" \"\"\"\n",
|
84 |
+
" normalized_activities = normalize_input(input_activities, weights, max_marks)\n",
|
85 |
+
" n = len(normalized_activities)\n",
|
86 |
+
"\n",
|
87 |
+
" if n == 0:\n",
|
88 |
+
" return \"No valid activities entered. Please provide scores greater than 0.\"\n",
|
89 |
+
"\n",
|
90 |
+
" try:\n",
|
91 |
+
" with open(f\"{model_prefix}_model_{n}_activities.pkl\", \"rb\") as file:\n",
|
92 |
+
" model = pickle.load(file)\n",
|
93 |
+
" except FileNotFoundError:\n",
|
94 |
+
" return f\"No model available for {n} activities. Train the model first.\"\n",
|
95 |
+
"\n",
|
96 |
+
" input_array = np.array(normalized_activities).reshape(1, -1)\n",
|
97 |
+
" predicted_score = model.predict(input_array)[0]\n",
|
98 |
+
" return round(predicted_score, 2)\n",
|
99 |
+
"\n",
|
100 |
+
"@app.route('/', methods=['GET', 'POST'])\n",
|
101 |
+
"def home():\n",
|
102 |
+
" cc_predicted_score = None\n",
|
103 |
+
" ict_predicted_score = None\n",
|
104 |
+
"\n",
|
105 |
+
" if request.method == 'POST':\n",
|
106 |
+
" # Identify the form (Cloud Computing or ICT)\n",
|
107 |
+
" form_type = request.form.get('form_type')\n",
|
108 |
+
"\n",
|
109 |
+
" if form_type == 'cloud_computing':\n",
|
110 |
+
" input_activities = {\n",
|
111 |
+
" activity: float(request.form.get(activity, 0) or 0) # Default to 0 for empty inputs\n",
|
112 |
+
" for activity in cc_weights.keys()\n",
|
113 |
+
" }\n",
|
114 |
+
" cc_predicted_score = predict_final_score(input_activities, cc_weights, cc_max_marks, \"cloud_computing\")\n",
|
115 |
+
"\n",
|
116 |
+
" elif form_type == 'ict':\n",
|
117 |
+
" input_activities = {\n",
|
118 |
+
" activity: float(request.form.get(activity, 0) or 0) # Default to 0 for empty inputs\n",
|
119 |
+
" for activity in ict_weights.keys()\n",
|
120 |
+
" }\n",
|
121 |
+
" ict_predicted_score = predict_final_score(input_activities, ict_weights, ict_max_marks, \"ict\")\n",
|
122 |
+
"\n",
|
123 |
+
" return render_template(\n",
|
124 |
+
" 'index.html',\n",
|
125 |
+
" cc_max_marks=cc_max_marks,\n",
|
126 |
+
" ict_max_marks=ict_max_marks,\n",
|
127 |
+
" cc_predicted_score=cc_predicted_score,\n",
|
128 |
+
" ict_predicted_score=ict_predicted_score\n",
|
129 |
+
" )\n",
|
130 |
+
"\n",
|
131 |
+
"if __name__ == '__main__':\n",
|
132 |
+
" app.run(debug=False, port=5000)\n"
|
133 |
+
]
|
134 |
+
}
|
135 |
+
],
|
136 |
+
"metadata": {
|
137 |
+
"kernelspec": {
|
138 |
+
"display_name": ".venv",
|
139 |
+
"language": "python",
|
140 |
+
"name": "python3"
|
141 |
+
},
|
142 |
+
"language_info": {
|
143 |
+
"codemirror_mode": {
|
144 |
+
"name": "ipython",
|
145 |
+
"version": 3
|
146 |
+
},
|
147 |
+
"file_extension": ".py",
|
148 |
+
"mimetype": "text/x-python",
|
149 |
+
"name": "python",
|
150 |
+
"nbconvert_exporter": "python",
|
151 |
+
"pygments_lexer": "ipython3",
|
152 |
+
"version": "3.11.6"
|
153 |
+
}
|
154 |
+
},
|
155 |
+
"nbformat": 4,
|
156 |
+
"nbformat_minor": 2
|
157 |
+
}
|