Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -10,6 +10,8 @@ import re
|
|
10 |
from PIL import Image
|
11 |
import io
|
12 |
import base64
|
|
|
|
|
13 |
|
14 |
# Page configuration
|
15 |
st.set_page_config(
|
@@ -25,7 +27,9 @@ if 'user_progress' not in st.session_state:
|
|
25 |
'completed_lessons': [],
|
26 |
'quiz_scores': {},
|
27 |
'projects_completed': [],
|
28 |
-
'skill_level': 'Beginner'
|
|
|
|
|
29 |
}
|
30 |
|
31 |
if 'current_quiz' not in st.session_state:
|
@@ -63,6 +67,23 @@ st.markdown("""
|
|
63 |
border-radius: 10px;
|
64 |
margin: 1rem 0;
|
65 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
</style>
|
67 |
""", unsafe_allow_html=True)
|
68 |
|
@@ -70,53 +91,107 @@ st.markdown("""
|
|
70 |
LEARNING_MODULES = {
|
71 |
"Beginner": {
|
72 |
"Python Fundamentals": {
|
73 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
74 |
"duration": "2 weeks",
|
75 |
-
"projects": ["Calculator App", "To-Do List Manager"]
|
|
|
76 |
},
|
77 |
"Data Science Basics": {
|
78 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
79 |
"duration": "3 weeks",
|
80 |
-
"projects": ["EDA on Titanic Dataset", "Sales Data Analysis"]
|
|
|
81 |
},
|
82 |
"Machine Learning Introduction": {
|
83 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
84 |
"duration": "4 weeks",
|
85 |
-
"projects": ["House Price Prediction", "Iris Classification"]
|
|
|
86 |
}
|
87 |
},
|
88 |
"Intermediate": {
|
89 |
"Advanced ML": {
|
90 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
91 |
"duration": "4 weeks",
|
92 |
-
"projects": ["Customer Churn Prediction", "Credit Risk Assessment"]
|
|
|
93 |
},
|
94 |
"Deep Learning": {
|
95 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
96 |
"duration": "6 weeks",
|
97 |
-
"projects": ["Image Classification", "Text Sentiment Analysis"]
|
|
|
98 |
},
|
99 |
"NLP Fundamentals": {
|
100 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
101 |
"duration": "4 weeks",
|
102 |
-
"projects": ["Spam Detection", "Document Clustering"]
|
|
|
103 |
}
|
104 |
},
|
105 |
"Advanced": {
|
106 |
"Advanced Deep Learning": {
|
107 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
108 |
"duration": "8 weeks",
|
109 |
-
"projects": ["Image Generation", "Custom Chatbot"]
|
|
|
110 |
},
|
111 |
"MLOps": {
|
112 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
113 |
"duration": "4 weeks",
|
114 |
-
"projects": ["End-to-End ML Pipeline", "Model API Development"]
|
|
|
115 |
},
|
116 |
"Research & Innovation": {
|
117 |
-
"topics":
|
|
|
|
|
|
|
|
|
|
|
118 |
"duration": "Ongoing",
|
119 |
-
"projects": ["Research Paper Implementation", "Novel Model Development"]
|
|
|
120 |
}
|
121 |
}
|
122 |
}
|
@@ -127,19 +202,22 @@ QUIZ_DATABASE = {
|
|
127 |
{
|
128 |
"question": "What is the output of: print(type([1, 2, 3]))?",
|
129 |
"options": ["<class 'list'>", "<class 'tuple'>", "<class 'dict'>", "<class 'set'>"],
|
130 |
-
"correct": 0
|
|
|
131 |
},
|
132 |
{
|
133 |
"question": "Which method is used to add an element to a list?",
|
134 |
"options": ["add()", "append()", "insert_end()", "push()"],
|
135 |
-
"correct": 1
|
|
|
136 |
}
|
137 |
],
|
138 |
"Machine Learning": [
|
139 |
{
|
140 |
"question": "Which metric is best for imbalanced classification?",
|
141 |
"options": ["Accuracy", "F1-Score", "MSE", "MAE"],
|
142 |
-
"correct": 1
|
|
|
143 |
},
|
144 |
{
|
145 |
"question": "What does overfitting mean?",
|
@@ -149,7 +227,8 @@ QUIZ_DATABASE = {
|
|
149 |
"Model performs well on both training and test data",
|
150 |
"Model has too few parameters"
|
151 |
],
|
152 |
-
"correct": 1
|
|
|
153 |
}
|
154 |
]
|
155 |
}
|
@@ -158,15 +237,35 @@ QUIZ_DATABASE = {
|
|
158 |
JOB_TEMPLATES = {
|
159 |
"Data Scientist": {
|
160 |
"skills": ["Python", "Machine Learning", "Statistics", "SQL", "Data Visualization"],
|
161 |
-
"keywords": ["predictive modeling", "statistical analysis", "A/B testing", "data pipeline"]
|
|
|
162 |
},
|
163 |
"ML Engineer": {
|
164 |
"skills": ["Python", "TensorFlow/PyTorch", "MLOps", "Docker", "Cloud Platforms"],
|
165 |
-
"keywords": ["model deployment", "scalability", "optimization", "production systems"]
|
|
|
166 |
},
|
167 |
"Data Analyst": {
|
168 |
"skills": ["SQL", "Excel", "Tableau/PowerBI", "Python/R", "Statistics"],
|
169 |
-
"keywords": ["data insights", "reporting", "dashboards", "business intelligence"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
}
|
171 |
}
|
172 |
|
@@ -178,10 +277,10 @@ def create_mind_map(topic, concepts):
|
|
178 |
fig.add_trace(go.Scatter(
|
179 |
x=[0], y=[0],
|
180 |
mode='markers+text',
|
181 |
-
marker=dict(size=
|
182 |
text=[topic],
|
183 |
textposition="middle center",
|
184 |
-
textfont=dict(size=
|
185 |
hoverinfo='text',
|
186 |
hovertext=topic
|
187 |
))
|
@@ -198,7 +297,7 @@ def create_mind_map(topic, concepts):
|
|
198 |
fig.add_trace(go.Scatter(
|
199 |
x=[0, x], y=[0, y],
|
200 |
mode='lines',
|
201 |
-
line=dict(color='#
|
202 |
hoverinfo='none',
|
203 |
showlegend=False
|
204 |
))
|
@@ -207,23 +306,28 @@ def create_mind_map(topic, concepts):
|
|
207 |
fig.add_trace(go.Scatter(
|
208 |
x=[x], y=[y],
|
209 |
mode='markers+text',
|
210 |
-
marker=dict(size=
|
211 |
text=[concept],
|
212 |
textposition="top center",
|
213 |
-
textfont=dict(size=
|
214 |
hoverinfo='text',
|
215 |
-
hovertext=f"{concept}
|
216 |
showlegend=False
|
217 |
))
|
218 |
|
219 |
fig.update_layout(
|
220 |
showlegend=False,
|
221 |
-
height=
|
222 |
xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
|
223 |
yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
|
224 |
paper_bgcolor='white',
|
225 |
plot_bgcolor='white',
|
226 |
-
margin=dict(l=0, r=0, t=0, b=0)
|
|
|
|
|
|
|
|
|
|
|
227 |
)
|
228 |
|
229 |
return fig
|
@@ -237,7 +341,7 @@ def analyze_resume_ats(resume_text, job_role):
|
|
237 |
missing_skills = []
|
238 |
|
239 |
for skill in template["skills"]:
|
240 |
-
if
|
241 |
found_skills.append(skill)
|
242 |
else:
|
243 |
missing_skills.append(skill)
|
@@ -245,7 +349,7 @@ def analyze_resume_ats(resume_text, job_role):
|
|
245 |
# Check for action keywords
|
246 |
found_keywords = []
|
247 |
for keyword in template["keywords"]:
|
248 |
-
if
|
249 |
found_keywords.append(keyword)
|
250 |
|
251 |
# Calculate ATS score
|
@@ -277,6 +381,8 @@ def generate_recommendations(missing_skills, found_keywords, all_keywords):
|
|
277 |
|
278 |
recommendations.append("Quantify your achievements with numbers and percentages")
|
279 |
recommendations.append("Keep resume format simple and ATS-friendly (avoid complex formatting)")
|
|
|
|
|
280 |
|
281 |
return recommendations
|
282 |
|
@@ -292,7 +398,8 @@ def generate_quiz(topic, num_questions=5):
|
|
292 |
questions.append({
|
293 |
"question": f"Sample question {i+1} about {topic}?",
|
294 |
"options": ["Option A", "Option B", "Option C", "Option D"],
|
295 |
-
"correct": random.randint(0, 3)
|
|
|
296 |
})
|
297 |
return questions
|
298 |
|
@@ -315,9 +422,37 @@ def calculate_learning_path(current_level, target_role):
|
|
315 |
|
316 |
return path
|
317 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
318 |
# Sidebar navigation
|
319 |
with st.sidebar:
|
320 |
-
st.markdown("## π Learning Platform")
|
321 |
|
322 |
menu = st.selectbox(
|
323 |
"Navigation",
|
@@ -344,6 +479,14 @@ with st.sidebar:
|
|
344 |
|
345 |
avg_score = np.mean(list(st.session_state.user_progress['quiz_scores'].values())) if st.session_state.user_progress['quiz_scores'] else 0
|
346 |
st.metric("Avg Quiz Score", f"{avg_score:.1f}%")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
347 |
|
348 |
# Main content area
|
349 |
if menu == "Dashboard":
|
@@ -395,6 +538,13 @@ if menu == "Dashboard":
|
|
395 |
st.markdown(f"- Completed: **{lesson}**")
|
396 |
else:
|
397 |
st.markdown("Start learning to earn achievements!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
398 |
|
399 |
elif menu == "Learn":
|
400 |
st.markdown("<h1 class='main-header'>π Learning Modules</h1>", unsafe_allow_html=True)
|
@@ -406,22 +556,32 @@ elif menu == "Learn":
|
|
406 |
for module_name, module_info in modules.items():
|
407 |
with st.expander(f"π {module_name} - {module_info['duration']}"):
|
408 |
st.markdown("**Topics Covered:**")
|
409 |
-
for topic in module_info['topics']:
|
410 |
-
st.markdown(f"
|
|
|
411 |
|
412 |
st.markdown("**Projects:**")
|
413 |
for project in module_info['projects']:
|
414 |
st.markdown(f"- π οΈ {project}")
|
415 |
|
416 |
-
|
|
|
|
|
|
|
|
|
417 |
with col1:
|
418 |
if st.button(f"Start Learning", key=f"learn_{module_name}"):
|
419 |
st.session_state.user_progress['completed_lessons'].append(module_name)
|
420 |
st.success(f"Started learning {module_name}!")
|
421 |
|
422 |
with col2:
|
423 |
-
if st.button(f"View
|
424 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
425 |
|
426 |
elif menu == "Practice":
|
427 |
st.markdown("<h1 class='main-header'>π» Practice Coding</h1>", unsafe_allow_html=True)
|
@@ -437,17 +597,20 @@ elif menu == "Practice":
|
|
437 |
"Python Basics": {
|
438 |
"title": "List Comprehension",
|
439 |
"problem": "Create a list of squares for numbers 1 to 10 using list comprehension",
|
440 |
-
"hint": "Use [x**2 for x in range(1, 11)]"
|
|
|
441 |
},
|
442 |
"Data Manipulation": {
|
443 |
"title": "Pandas DataFrame Operations",
|
444 |
"problem": "Filter a DataFrame to show only rows where 'age' > 25 and 'salary' > 50000",
|
445 |
-
"hint": "Use df[(df['age'] > 25) & (df['salary'] > 50000)]"
|
|
|
446 |
},
|
447 |
"Machine Learning": {
|
448 |
"title": "Train-Test Split",
|
449 |
"problem": "Split your data into 80% training and 20% testing sets",
|
450 |
-
"hint": "Use train_test_split from sklearn.model_selection"
|
|
|
451 |
}
|
452 |
}
|
453 |
|
@@ -458,7 +621,7 @@ elif menu == "Practice":
|
|
458 |
|
459 |
code_input = st.text_area("Write your code here:", height=200)
|
460 |
|
461 |
-
col1, col2 = st.columns(
|
462 |
with col1:
|
463 |
if st.button("Run Code"):
|
464 |
st.success("Code executed successfully! (Simulation)")
|
@@ -467,6 +630,10 @@ elif menu == "Practice":
|
|
467 |
with col2:
|
468 |
if st.button("Show Hint"):
|
469 |
st.info(f"Hint: {challenge['hint']}")
|
|
|
|
|
|
|
|
|
470 |
|
471 |
elif menu == "Projects":
|
472 |
st.markdown("<h1 class='main-header'>π οΈ Hands-on Projects</h1>", unsafe_allow_html=True)
|
@@ -482,13 +649,17 @@ elif menu == "Projects":
|
|
482 |
"name": "Titanic Survival Prediction",
|
483 |
"description": "Predict passenger survival using logistic regression",
|
484 |
"skills": ["Pandas", "Scikit-learn", "Data Visualization"],
|
485 |
-
"difficulty": "ββ"
|
|
|
|
|
486 |
},
|
487 |
{
|
488 |
"name": "Stock Price Analysis",
|
489 |
"description": "Analyze and visualize stock market trends",
|
490 |
"skills": ["Pandas", "Matplotlib", "Time Series"],
|
491 |
-
"difficulty": "ββ"
|
|
|
|
|
492 |
}
|
493 |
],
|
494 |
"Intermediate Projects": [
|
@@ -496,21 +667,53 @@ elif menu == "Projects":
|
|
496 |
"name": "Customer Segmentation",
|
497 |
"description": "Segment customers using clustering algorithms",
|
498 |
"skills": ["K-Means", "PCA", "Feature Engineering"],
|
499 |
-
"difficulty": "βββ"
|
|
|
|
|
500 |
},
|
501 |
{
|
502 |
"name": "Sentiment Analysis",
|
503 |
"description": "Analyze sentiment from product reviews",
|
504 |
"skills": ["NLP", "NLTK", "Classification"],
|
505 |
-
"difficulty": "βββ"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
506 |
}
|
507 |
]
|
508 |
}
|
509 |
|
510 |
if project_category in projects:
|
511 |
for project in projects[project_category]:
|
512 |
-
with st.
|
|
|
513 |
st.markdown(f"**Description:** {project['description']}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
514 |
st.markdown("**Skills you'll learn:**")
|
515 |
for skill in project['skills']:
|
516 |
st.markdown(f"- {skill}")
|
@@ -519,8 +722,7 @@ elif menu == "Projects":
|
|
519 |
with col1:
|
520 |
if st.button(f"Start Project", key=f"start_{project['name']}"):
|
521 |
st.session_state.user_progress['projects_completed'].append(project['name'])
|
522 |
-
st.success("Project started!")
|
523 |
-
|
524 |
with col2:
|
525 |
if st.button(f"View Solution", key=f"solution_{project['name']}"):
|
526 |
st.code("""
|
@@ -543,10 +745,11 @@ model.fit(X_train, y_train)
|
|
543 |
accuracy = model.score(X_test, y_test)
|
544 |
print(f'Accuracy: {accuracy}')
|
545 |
""")
|
546 |
-
|
547 |
with col3:
|
548 |
if st.button(f"Download Dataset", key=f"data_{project['name']}"):
|
549 |
st.info("Dataset downloaded! (Simulation)")
|
|
|
|
|
550 |
|
551 |
elif menu == "Quizzes":
|
552 |
st.markdown("<h1 class='main-header'>π Knowledge Assessment</h1>", unsafe_allow_html=True)
|
@@ -559,8 +762,9 @@ elif menu == "Quizzes":
|
|
559 |
if st.button("Start Quiz"):
|
560 |
st.session_state.current_quiz = generate_quiz(quiz_topic, 5)
|
561 |
st.session_state.quiz_answers = {}
|
|
|
562 |
|
563 |
-
if st.session_state.current_quiz:
|
564 |
st.markdown(f"### Quiz: {quiz_topic}")
|
565 |
|
566 |
for i, q in enumerate(st.session_state.current_quiz):
|
@@ -568,18 +772,31 @@ elif menu == "Quizzes":
|
|
568 |
answer = st.radio(
|
569 |
"Select your answer:",
|
570 |
q['options'],
|
571 |
-
key=f"q_{i}"
|
|
|
572 |
)
|
573 |
st.session_state.quiz_answers[i] = q['options'].index(answer) if answer else None
|
574 |
|
575 |
if st.button("Submit Quiz"):
|
576 |
score = 0
|
|
|
577 |
for i, q in enumerate(st.session_state.current_quiz):
|
578 |
-
|
|
|
|
|
579 |
score += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
580 |
|
581 |
percentage = (score / len(st.session_state.current_quiz)) * 100
|
582 |
st.session_state.user_progress['quiz_scores'][quiz_topic] = percentage
|
|
|
|
|
583 |
|
584 |
if percentage >= 80:
|
585 |
st.success(f"Excellent! You scored {percentage:.0f}%")
|
@@ -588,10 +805,13 @@ elif menu == "Quizzes":
|
|
588 |
else:
|
589 |
st.error(f"Keep practicing! You scored {percentage:.0f}%")
|
590 |
|
591 |
-
|
592 |
-
st.markdown("###
|
593 |
-
for i,
|
594 |
-
st.
|
|
|
|
|
|
|
595 |
|
596 |
elif menu == "Career Guide":
|
597 |
st.markdown("<h1 class='main-header'>πΌ Career Guidance</h1>", unsafe_allow_html=True)
|
@@ -630,11 +850,18 @@ elif menu == "Career Guide":
|
|
630 |
st.markdown(f"**Key Skills:** {info['skills']}")
|
631 |
st.markdown(f"**Description:** {info['description']}")
|
632 |
|
633 |
-
|
634 |
-
|
635 |
-
st.
|
636 |
-
|
637 |
-
st.markdown(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
638 |
|
639 |
with tab2:
|
640 |
st.markdown("### πΊοΈ Skills Roadmap")
|
@@ -651,6 +878,17 @@ elif menu == "Career Guide":
|
|
651 |
st.markdown(f"**{period}:**")
|
652 |
for skill in skills:
|
653 |
st.markdown(f"- {skill}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
654 |
|
655 |
with tab3:
|
656 |
st.markdown("### π€ Interview Preparation")
|
@@ -681,8 +919,13 @@ elif menu == "Career Guide":
|
|
681 |
for q in questions:
|
682 |
st.markdown(f"β’ {q}")
|
683 |
|
684 |
-
|
685 |
-
|
|
|
|
|
|
|
|
|
|
|
686 |
|
687 |
elif menu == "Resume Builder":
|
688 |
st.markdown("<h1 class='main-header'>π ATS-Optimized Resume Builder</h1>", unsafe_allow_html=True)
|
@@ -730,6 +973,13 @@ elif menu == "Resume Builder":
|
|
730 |
st.markdown("### π‘ Recommendations:")
|
731 |
for rec in analysis['recommendations']:
|
732 |
st.markdown(f"β’ {rec}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
733 |
else:
|
734 |
st.error("Please paste your resume text")
|
735 |
|
@@ -766,8 +1016,96 @@ elif menu == "Resume Builder":
|
|
766 |
|
767 |
company_name = st.text_input("Company Name")
|
768 |
position = st.text_input("Position")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
769 |
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
from PIL import Image
|
11 |
import io
|
12 |
import base64
|
13 |
+
import textwrap
|
14 |
+
import time
|
15 |
|
16 |
# Page configuration
|
17 |
st.set_page_config(
|
|
|
27 |
'completed_lessons': [],
|
28 |
'quiz_scores': {},
|
29 |
'projects_completed': [],
|
30 |
+
'skill_level': 'Beginner',
|
31 |
+
'job_applications': [],
|
32 |
+
'mind_maps': {}
|
33 |
}
|
34 |
|
35 |
if 'current_quiz' not in st.session_state:
|
|
|
67 |
border-radius: 10px;
|
68 |
margin: 1rem 0;
|
69 |
}
|
70 |
+
.project-card {
|
71 |
+
border: 1px solid #e0e0e0;
|
72 |
+
border-radius: 10px;
|
73 |
+
padding: 1.5rem;
|
74 |
+
margin: 1rem 0;
|
75 |
+
transition: transform 0.3s;
|
76 |
+
}
|
77 |
+
.project-card:hover {
|
78 |
+
transform: translateY(-5px);
|
79 |
+
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
|
80 |
+
}
|
81 |
+
.mind-map-container {
|
82 |
+
background-color: #f9f9f9;
|
83 |
+
border-radius: 10px;
|
84 |
+
padding: 1.5rem;
|
85 |
+
margin: 1rem 0;
|
86 |
+
}
|
87 |
</style>
|
88 |
""", unsafe_allow_html=True)
|
89 |
|
|
|
91 |
LEARNING_MODULES = {
|
92 |
"Beginner": {
|
93 |
"Python Fundamentals": {
|
94 |
+
"topics": {
|
95 |
+
"Variables & Data Types": "Understanding basic data types and variables in Python",
|
96 |
+
"Control Flow": "Conditional statements and loops",
|
97 |
+
"Functions": "Creating and using functions",
|
98 |
+
"Data Structures": "Lists, tuples, dictionaries, sets"
|
99 |
+
},
|
100 |
"duration": "2 weeks",
|
101 |
+
"projects": ["Calculator App", "To-Do List Manager"],
|
102 |
+
"resources": ["Python Documentation", "Interactive Tutorial"]
|
103 |
},
|
104 |
"Data Science Basics": {
|
105 |
+
"topics": {
|
106 |
+
"NumPy": "Numerical computing with arrays",
|
107 |
+
"Pandas": "Data manipulation and analysis",
|
108 |
+
"Data Visualization": "Creating plots with Matplotlib and Seaborn",
|
109 |
+
"Statistics": "Descriptive and inferential statistics"
|
110 |
+
},
|
111 |
"duration": "3 weeks",
|
112 |
+
"projects": ["EDA on Titanic Dataset", "Sales Data Analysis"],
|
113 |
+
"resources": ["Pandas Cheat Sheet", "Visualization Gallery"]
|
114 |
},
|
115 |
"Machine Learning Introduction": {
|
116 |
+
"topics": {
|
117 |
+
"Supervised Learning": "Regression and classification",
|
118 |
+
"Model Evaluation": "Metrics and validation techniques",
|
119 |
+
"Feature Engineering": "Preprocessing and transformation",
|
120 |
+
"Scikit-learn": "Implementing ML algorithms"
|
121 |
+
},
|
122 |
"duration": "4 weeks",
|
123 |
+
"projects": ["House Price Prediction", "Iris Classification"],
|
124 |
+
"resources": ["Scikit-learn Documentation", "ML Tutorials"]
|
125 |
}
|
126 |
},
|
127 |
"Intermediate": {
|
128 |
"Advanced ML": {
|
129 |
+
"topics": {
|
130 |
+
"Ensemble Methods": "Random Forests, Gradient Boosting",
|
131 |
+
"Hyperparameter Tuning": "Grid search and random search",
|
132 |
+
"Dimensionality Reduction": "PCA, t-SNE",
|
133 |
+
"Model Deployment": "Basic deployment techniques"
|
134 |
+
},
|
135 |
"duration": "4 weeks",
|
136 |
+
"projects": ["Customer Churn Prediction", "Credit Risk Assessment"],
|
137 |
+
"resources": ["Advanced ML Techniques", "Deployment Guide"]
|
138 |
},
|
139 |
"Deep Learning": {
|
140 |
+
"topics": {
|
141 |
+
"Neural Networks": "Perceptrons and activation functions",
|
142 |
+
"CNNs": "Image classification",
|
143 |
+
"RNNs": "Sequence modeling",
|
144 |
+
"Transfer Learning": "Using pre-trained models"
|
145 |
+
},
|
146 |
"duration": "6 weeks",
|
147 |
+
"projects": ["Image Classification", "Text Sentiment Analysis"],
|
148 |
+
"resources": ["TensorFlow Tutorials", "PyTorch Examples"]
|
149 |
},
|
150 |
"NLP Fundamentals": {
|
151 |
+
"topics": {
|
152 |
+
"Text Processing": "Tokenization, stemming, lemmatization",
|
153 |
+
"Word Embeddings": "Word2Vec, GloVe",
|
154 |
+
"Named Entity Recognition": "Identifying entities in text",
|
155 |
+
"Topic Modeling": "LDA and NMF"
|
156 |
+
},
|
157 |
"duration": "4 weeks",
|
158 |
+
"projects": ["Spam Detection", "Document Clustering"],
|
159 |
+
"resources": ["NLP with Python", "Transformers Guide"]
|
160 |
}
|
161 |
},
|
162 |
"Advanced": {
|
163 |
"Advanced Deep Learning": {
|
164 |
+
"topics": {
|
165 |
+
"GANs": "Generative Adversarial Networks",
|
166 |
+
"Autoencoders": "Dimensionality reduction and generation",
|
167 |
+
"Transformers": "Attention mechanisms",
|
168 |
+
"BERT/GPT": "State-of-the-art language models"
|
169 |
+
},
|
170 |
"duration": "8 weeks",
|
171 |
+
"projects": ["Image Generation", "Custom Chatbot"],
|
172 |
+
"resources": ["Research Papers", "Advanced Implementations"]
|
173 |
},
|
174 |
"MLOps": {
|
175 |
+
"topics": {
|
176 |
+
"Model Deployment": "Docker and Kubernetes",
|
177 |
+
"CI/CD": "Continuous integration and deployment",
|
178 |
+
"Monitoring": "Model performance tracking",
|
179 |
+
"Scaling": "Distributed training"
|
180 |
+
},
|
181 |
"duration": "4 weeks",
|
182 |
+
"projects": ["End-to-End ML Pipeline", "Model API Development"],
|
183 |
+
"resources": ["MLOps Best Practices", "Cloud Platforms Guide"]
|
184 |
},
|
185 |
"Research & Innovation": {
|
186 |
+
"topics": {
|
187 |
+
"Research Papers": "Reading and implementing papers",
|
188 |
+
"State-of-the-art Models": "Cutting-edge architectures",
|
189 |
+
"Custom Architectures": "Designing novel models",
|
190 |
+
"Experimentation": "Designing and running experiments"
|
191 |
+
},
|
192 |
"duration": "Ongoing",
|
193 |
+
"projects": ["Research Paper Implementation", "Novel Model Development"],
|
194 |
+
"resources": ["Academic Journals", "Conference Proceedings"]
|
195 |
}
|
196 |
}
|
197 |
}
|
|
|
202 |
{
|
203 |
"question": "What is the output of: print(type([1, 2, 3]))?",
|
204 |
"options": ["<class 'list'>", "<class 'tuple'>", "<class 'dict'>", "<class 'set'>"],
|
205 |
+
"correct": 0,
|
206 |
+
"explanation": "In Python, square brackets [] denote a list."
|
207 |
},
|
208 |
{
|
209 |
"question": "Which method is used to add an element to a list?",
|
210 |
"options": ["add()", "append()", "insert_end()", "push()"],
|
211 |
+
"correct": 1,
|
212 |
+
"explanation": "The append() method adds an element to the end of a list."
|
213 |
}
|
214 |
],
|
215 |
"Machine Learning": [
|
216 |
{
|
217 |
"question": "Which metric is best for imbalanced classification?",
|
218 |
"options": ["Accuracy", "F1-Score", "MSE", "MAE"],
|
219 |
+
"correct": 1,
|
220 |
+
"explanation": "F1-Score considers both precision and recall, making it suitable for imbalanced datasets."
|
221 |
},
|
222 |
{
|
223 |
"question": "What does overfitting mean?",
|
|
|
227 |
"Model performs well on both training and test data",
|
228 |
"Model has too few parameters"
|
229 |
],
|
230 |
+
"correct": 1,
|
231 |
+
"explanation": "Overfitting occurs when a model learns the training data too well, including noise, and fails to generalize to new data."
|
232 |
}
|
233 |
]
|
234 |
}
|
|
|
237 |
JOB_TEMPLATES = {
|
238 |
"Data Scientist": {
|
239 |
"skills": ["Python", "Machine Learning", "Statistics", "SQL", "Data Visualization"],
|
240 |
+
"keywords": ["predictive modeling", "statistical analysis", "A/B testing", "data pipeline"],
|
241 |
+
"description": "Analyze complex data to help companies make decisions"
|
242 |
},
|
243 |
"ML Engineer": {
|
244 |
"skills": ["Python", "TensorFlow/PyTorch", "MLOps", "Docker", "Cloud Platforms"],
|
245 |
+
"keywords": ["model deployment", "scalability", "optimization", "production systems"],
|
246 |
+
"description": "Build and deploy ML models at scale"
|
247 |
},
|
248 |
"Data Analyst": {
|
249 |
"skills": ["SQL", "Excel", "Tableau/PowerBI", "Python/R", "Statistics"],
|
250 |
+
"keywords": ["data insights", "reporting", "dashboards", "business intelligence"],
|
251 |
+
"description": "Transform data into actionable insights"
|
252 |
+
}
|
253 |
+
}
|
254 |
+
|
255 |
+
# Mind map database
|
256 |
+
MIND_MAP_DB = {
|
257 |
+
"Machine Learning": {
|
258 |
+
"Supervised Learning": "Learning from labeled data",
|
259 |
+
"Unsupervised Learning": "Finding patterns in unlabeled data",
|
260 |
+
"Reinforcement Learning": "Learning through rewards and penalties",
|
261 |
+
"Deep Learning": "Neural networks with multiple layers"
|
262 |
+
},
|
263 |
+
"Data Science Process": {
|
264 |
+
"Data Collection": "Gathering raw data",
|
265 |
+
"Data Cleaning": "Handling missing values and outliers",
|
266 |
+
"Exploratory Analysis": "Understanding data patterns",
|
267 |
+
"Model Building": "Creating predictive models",
|
268 |
+
"Deployment": "Putting models into production"
|
269 |
}
|
270 |
}
|
271 |
|
|
|
277 |
fig.add_trace(go.Scatter(
|
278 |
x=[0], y=[0],
|
279 |
mode='markers+text',
|
280 |
+
marker=dict(size=50, color='#ff6e40'),
|
281 |
text=[topic],
|
282 |
textposition="middle center",
|
283 |
+
textfont=dict(size=18, color='white', family="Arial Black"),
|
284 |
hoverinfo='text',
|
285 |
hovertext=topic
|
286 |
))
|
|
|
297 |
fig.add_trace(go.Scatter(
|
298 |
x=[0, x], y=[0, y],
|
299 |
mode='lines',
|
300 |
+
line=dict(color='#1e3d59', width=2),
|
301 |
hoverinfo='none',
|
302 |
showlegend=False
|
303 |
))
|
|
|
306 |
fig.add_trace(go.Scatter(
|
307 |
x=[x], y=[y],
|
308 |
mode='markers+text',
|
309 |
+
marker=dict(size=35, color='#1e3d59'),
|
310 |
text=[concept],
|
311 |
textposition="top center",
|
312 |
+
textfont=dict(size=12, color='white'),
|
313 |
hoverinfo='text',
|
314 |
+
hovertext=f"<b>{concept}</b><br>{details}",
|
315 |
showlegend=False
|
316 |
))
|
317 |
|
318 |
fig.update_layout(
|
319 |
showlegend=False,
|
320 |
+
height=500,
|
321 |
xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
|
322 |
yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
|
323 |
paper_bgcolor='white',
|
324 |
plot_bgcolor='white',
|
325 |
+
margin=dict(l=0, r=0, t=0, b=0),
|
326 |
+
hoverlabel=dict(
|
327 |
+
bgcolor="white",
|
328 |
+
font_size=14,
|
329 |
+
font_family="Arial"
|
330 |
+
)
|
331 |
)
|
332 |
|
333 |
return fig
|
|
|
341 |
missing_skills = []
|
342 |
|
343 |
for skill in template["skills"]:
|
344 |
+
if re.search(rf'\b{re.escape(skill)}\b', resume_text, re.IGNORECASE):
|
345 |
found_skills.append(skill)
|
346 |
else:
|
347 |
missing_skills.append(skill)
|
|
|
349 |
# Check for action keywords
|
350 |
found_keywords = []
|
351 |
for keyword in template["keywords"]:
|
352 |
+
if re.search(rf'\b{re.escape(keyword)}\b', resume_text, re.IGNORECASE):
|
353 |
found_keywords.append(keyword)
|
354 |
|
355 |
# Calculate ATS score
|
|
|
381 |
|
382 |
recommendations.append("Quantify your achievements with numbers and percentages")
|
383 |
recommendations.append("Keep resume format simple and ATS-friendly (avoid complex formatting)")
|
384 |
+
recommendations.append("Include relevant certifications and projects")
|
385 |
+
recommendations.append("Tailor your resume for each job application")
|
386 |
|
387 |
return recommendations
|
388 |
|
|
|
398 |
questions.append({
|
399 |
"question": f"Sample question {i+1} about {topic}?",
|
400 |
"options": ["Option A", "Option B", "Option C", "Option D"],
|
401 |
+
"correct": random.randint(0, 3),
|
402 |
+
"explanation": f"This is an explanation for question {i+1}"
|
403 |
})
|
404 |
return questions
|
405 |
|
|
|
422 |
|
423 |
return path
|
424 |
|
425 |
+
def generate_cover_letter(company_name, position, user_skills):
|
426 |
+
"""Generate personalized cover letter"""
|
427 |
+
return f"""
|
428 |
+
Dear Hiring Manager at {company_name},
|
429 |
+
|
430 |
+
I am writing to express my interest in the {position} position at {company_name}.
|
431 |
+
With my background in {', '.join(user_skills[:3])} and passion for data-driven solutions,
|
432 |
+
I am confident in my ability to contribute effectively to your team.
|
433 |
+
|
434 |
+
In my previous experience, I have successfully:
|
435 |
+
- Developed machine learning models that improved accuracy by 25%
|
436 |
+
- Implemented data pipelines processing 1M+ records daily
|
437 |
+
- Created interactive dashboards that informed key business decisions
|
438 |
+
|
439 |
+
I am particularly drawn to {company_name} because of your innovative approach to
|
440 |
+
AI solutions and your commitment to [specific company value or project].
|
441 |
+
|
442 |
+
My attached resume provides further detail about my qualifications.
|
443 |
+
I would welcome the opportunity to discuss how my skills and experiences
|
444 |
+
align with the needs of your team.
|
445 |
+
|
446 |
+
Thank you for your time and consideration.
|
447 |
+
|
448 |
+
Sincerely,
|
449 |
+
[Your Name]
|
450 |
+
[Your Contact Information]
|
451 |
+
"""
|
452 |
+
|
453 |
# Sidebar navigation
|
454 |
with st.sidebar:
|
455 |
+
st.markdown("## π AI Learning Platform")
|
456 |
|
457 |
menu = st.selectbox(
|
458 |
"Navigation",
|
|
|
479 |
|
480 |
avg_score = np.mean(list(st.session_state.user_progress['quiz_scores'].values())) if st.session_state.user_progress['quiz_scores'] else 0
|
481 |
st.metric("Avg Quiz Score", f"{avg_score:.1f}%")
|
482 |
+
|
483 |
+
st.markdown("---")
|
484 |
+
st.markdown("### π Quick Actions")
|
485 |
+
if st.button("New Learning Session"):
|
486 |
+
st.session_state.user_progress['completed_lessons'].append("New Session")
|
487 |
+
st.success("Started new learning session!")
|
488 |
+
if st.button("Generate Practice Exercise"):
|
489 |
+
st.info("Generated new practice exercise!")
|
490 |
|
491 |
# Main content area
|
492 |
if menu == "Dashboard":
|
|
|
538 |
st.markdown(f"- Completed: **{lesson}**")
|
539 |
else:
|
540 |
st.markdown("Start learning to earn achievements!")
|
541 |
+
|
542 |
+
# Recommended next steps
|
543 |
+
st.markdown("---")
|
544 |
+
st.markdown("### π£ Your Next Steps")
|
545 |
+
st.markdown("1. Start with Python Fundamentals in the Learn section")
|
546 |
+
st.markdown("2. Practice coding challenges in the Practice section")
|
547 |
+
st.markdown("3. Build your first project: Titanic Survival Prediction")
|
548 |
|
549 |
elif menu == "Learn":
|
550 |
st.markdown("<h1 class='main-header'>π Learning Modules</h1>", unsafe_allow_html=True)
|
|
|
556 |
for module_name, module_info in modules.items():
|
557 |
with st.expander(f"π {module_name} - {module_info['duration']}"):
|
558 |
st.markdown("**Topics Covered:**")
|
559 |
+
for topic, description in module_info['topics'].items():
|
560 |
+
st.markdown(f"#### {topic}")
|
561 |
+
st.markdown(f"{description}")
|
562 |
|
563 |
st.markdown("**Projects:**")
|
564 |
for project in module_info['projects']:
|
565 |
st.markdown(f"- π οΈ {project}")
|
566 |
|
567 |
+
st.markdown("**Resources:**")
|
568 |
+
for resource in module_info['resources']:
|
569 |
+
st.markdown(f"- π {resource}")
|
570 |
+
|
571 |
+
col1, col2, col3 = st.columns(3)
|
572 |
with col1:
|
573 |
if st.button(f"Start Learning", key=f"learn_{module_name}"):
|
574 |
st.session_state.user_progress['completed_lessons'].append(module_name)
|
575 |
st.success(f"Started learning {module_name}!")
|
576 |
|
577 |
with col2:
|
578 |
+
if st.button(f"View Mind Map", key=f"mindmap_{module_name}"):
|
579 |
+
st.session_state.mind_maps[module_name] = module_info['topics']
|
580 |
+
|
581 |
+
with col3:
|
582 |
+
if st.button(f"Take Quiz", key=f"quiz_{module_name}"):
|
583 |
+
st.session_state.current_quiz = generate_quiz(module_name, 5)
|
584 |
+
st.experimental_rerun()
|
585 |
|
586 |
elif menu == "Practice":
|
587 |
st.markdown("<h1 class='main-header'>π» Practice Coding</h1>", unsafe_allow_html=True)
|
|
|
597 |
"Python Basics": {
|
598 |
"title": "List Comprehension",
|
599 |
"problem": "Create a list of squares for numbers 1 to 10 using list comprehension",
|
600 |
+
"hint": "Use [x**2 for x in range(1, 11)]",
|
601 |
+
"solution": "squares = [x**2 for x in range(1, 11)]"
|
602 |
},
|
603 |
"Data Manipulation": {
|
604 |
"title": "Pandas DataFrame Operations",
|
605 |
"problem": "Filter a DataFrame to show only rows where 'age' > 25 and 'salary' > 50000",
|
606 |
+
"hint": "Use df[(df['age'] > 25) & (df['salary'] > 50000)]",
|
607 |
+
"solution": "filtered_df = df[(df['age'] > 25) & (df['salary'] > 50000)]"
|
608 |
},
|
609 |
"Machine Learning": {
|
610 |
"title": "Train-Test Split",
|
611 |
"problem": "Split your data into 80% training and 20% testing sets",
|
612 |
+
"hint": "Use train_test_split from sklearn.model_selection",
|
613 |
+
"solution": "from sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
|
614 |
}
|
615 |
}
|
616 |
|
|
|
621 |
|
622 |
code_input = st.text_area("Write your code here:", height=200)
|
623 |
|
624 |
+
col1, col2, col3 = st.columns(3)
|
625 |
with col1:
|
626 |
if st.button("Run Code"):
|
627 |
st.success("Code executed successfully! (Simulation)")
|
|
|
630 |
with col2:
|
631 |
if st.button("Show Hint"):
|
632 |
st.info(f"Hint: {challenge['hint']}")
|
633 |
+
|
634 |
+
with col3:
|
635 |
+
if st.button("View Solution"):
|
636 |
+
st.code(challenge['solution"])
|
637 |
|
638 |
elif menu == "Projects":
|
639 |
st.markdown("<h1 class='main-header'>π οΈ Hands-on Projects</h1>", unsafe_allow_html=True)
|
|
|
649 |
"name": "Titanic Survival Prediction",
|
650 |
"description": "Predict passenger survival using logistic regression",
|
651 |
"skills": ["Pandas", "Scikit-learn", "Data Visualization"],
|
652 |
+
"difficulty": "ββ",
|
653 |
+
"duration": "2 days",
|
654 |
+
"dataset": "Titanic passenger data"
|
655 |
},
|
656 |
{
|
657 |
"name": "Stock Price Analysis",
|
658 |
"description": "Analyze and visualize stock market trends",
|
659 |
"skills": ["Pandas", "Matplotlib", "Time Series"],
|
660 |
+
"difficulty": "ββ",
|
661 |
+
"duration": "3 days",
|
662 |
+
"dataset": "Historical stock prices"
|
663 |
}
|
664 |
],
|
665 |
"Intermediate Projects": [
|
|
|
667 |
"name": "Customer Segmentation",
|
668 |
"description": "Segment customers using clustering algorithms",
|
669 |
"skills": ["K-Means", "PCA", "Feature Engineering"],
|
670 |
+
"difficulty": "βββ",
|
671 |
+
"duration": "1 week",
|
672 |
+
"dataset": "Customer transaction data"
|
673 |
},
|
674 |
{
|
675 |
"name": "Sentiment Analysis",
|
676 |
"description": "Analyze sentiment from product reviews",
|
677 |
"skills": ["NLP", "NLTK", "Classification"],
|
678 |
+
"difficulty": "βββ",
|
679 |
+
"duration": "1 week",
|
680 |
+
"dataset": "Amazon product reviews"
|
681 |
+
}
|
682 |
+
],
|
683 |
+
"Advanced Projects": [
|
684 |
+
{
|
685 |
+
"name": "Image Generation with GANs",
|
686 |
+
"description": "Generate realistic images using Generative Adversarial Networks",
|
687 |
+
"skills": ["TensorFlow", "Deep Learning", "GANs"],
|
688 |
+
"difficulty": "ββββ",
|
689 |
+
"duration": "2 weeks",
|
690 |
+
"dataset": "MNIST/CIFAR-10"
|
691 |
+
},
|
692 |
+
{
|
693 |
+
"name": "Real-time Object Detection",
|
694 |
+
"description": "Detect objects in real-time video streams",
|
695 |
+
"skills": ["Computer Vision", "YOLO", "OpenCV"],
|
696 |
+
"difficulty": "ββββ",
|
697 |
+
"duration": "2 weeks",
|
698 |
+
"dataset": "COCO dataset"
|
699 |
}
|
700 |
]
|
701 |
}
|
702 |
|
703 |
if project_category in projects:
|
704 |
for project in projects[project_category]:
|
705 |
+
with st.container():
|
706 |
+
st.markdown(f"### {project['name']}")
|
707 |
st.markdown(f"**Description:** {project['description']}")
|
708 |
+
|
709 |
+
col1, col2, col3 = st.columns(3)
|
710 |
+
with col1:
|
711 |
+
st.markdown(f"**Difficulty:** {project['difficulty']}")
|
712 |
+
with col2:
|
713 |
+
st.markdown(f"**Duration:** {project['duration']}")
|
714 |
+
with col3:
|
715 |
+
st.markdown(f"**Dataset:** {project['dataset']}")
|
716 |
+
|
717 |
st.markdown("**Skills you'll learn:**")
|
718 |
for skill in project['skills']:
|
719 |
st.markdown(f"- {skill}")
|
|
|
722 |
with col1:
|
723 |
if st.button(f"Start Project", key=f"start_{project['name']}"):
|
724 |
st.session_state.user_progress['projects_completed'].append(project['name'])
|
725 |
+
st.success("Project started! Check your learning resources.")
|
|
|
726 |
with col2:
|
727 |
if st.button(f"View Solution", key=f"solution_{project['name']}"):
|
728 |
st.code("""
|
|
|
745 |
accuracy = model.score(X_test, y_test)
|
746 |
print(f'Accuracy: {accuracy}')
|
747 |
""")
|
|
|
748 |
with col3:
|
749 |
if st.button(f"Download Dataset", key=f"data_{project['name']}"):
|
750 |
st.info("Dataset downloaded! (Simulation)")
|
751 |
+
|
752 |
+
st.markdown("---")
|
753 |
|
754 |
elif menu == "Quizzes":
|
755 |
st.markdown("<h1 class='main-header'>π Knowledge Assessment</h1>", unsafe_allow_html=True)
|
|
|
762 |
if st.button("Start Quiz"):
|
763 |
st.session_state.current_quiz = generate_quiz(quiz_topic, 5)
|
764 |
st.session_state.quiz_answers = {}
|
765 |
+
st.session_state.quiz_submitted = False
|
766 |
|
767 |
+
if st.session_state.get('current_quiz'):
|
768 |
st.markdown(f"### Quiz: {quiz_topic}")
|
769 |
|
770 |
for i, q in enumerate(st.session_state.current_quiz):
|
|
|
772 |
answer = st.radio(
|
773 |
"Select your answer:",
|
774 |
q['options'],
|
775 |
+
key=f"q_{i}",
|
776 |
+
index=None
|
777 |
)
|
778 |
st.session_state.quiz_answers[i] = q['options'].index(answer) if answer else None
|
779 |
|
780 |
if st.button("Submit Quiz"):
|
781 |
score = 0
|
782 |
+
results = []
|
783 |
for i, q in enumerate(st.session_state.current_quiz):
|
784 |
+
user_answer = st.session_state.quiz_answers.get(i)
|
785 |
+
correct = user_answer == q['correct'] if user_answer is not None else False
|
786 |
+
if correct:
|
787 |
score += 1
|
788 |
+
results.append({
|
789 |
+
"question": q['question'],
|
790 |
+
"user_answer": q['options'][user_answer] if user_answer is not None else "Not answered",
|
791 |
+
"correct_answer": q['options'][q['correct']],
|
792 |
+
"explanation": q.get('explanation', ''),
|
793 |
+
"is_correct": correct
|
794 |
+
})
|
795 |
|
796 |
percentage = (score / len(st.session_state.current_quiz)) * 100
|
797 |
st.session_state.user_progress['quiz_scores'][quiz_topic] = percentage
|
798 |
+
st.session_state.quiz_results = results
|
799 |
+
st.session_state.quiz_submitted = True
|
800 |
|
801 |
if percentage >= 80:
|
802 |
st.success(f"Excellent! You scored {percentage:.0f}%")
|
|
|
805 |
else:
|
806 |
st.error(f"Keep practicing! You scored {percentage:.0f}%")
|
807 |
|
808 |
+
if st.session_state.get('quiz_submitted', False):
|
809 |
+
st.markdown("### Detailed Results:")
|
810 |
+
for i, result in enumerate(st.session_state.quiz_results):
|
811 |
+
with st.expander(f"Question {i+1}"):
|
812 |
+
st.markdown(f"**Your answer:** {'β
' if result['is_correct'] else 'β'} {result['user_answer']}")
|
813 |
+
st.markdown(f"**Correct answer:** {result['correct_answer']}")
|
814 |
+
st.markdown(f"**Explanation:** {result['explanation']}")
|
815 |
|
816 |
elif menu == "Career Guide":
|
817 |
st.markdown("<h1 class='main-header'>πΌ Career Guidance</h1>", unsafe_allow_html=True)
|
|
|
850 |
st.markdown(f"**Key Skills:** {info['skills']}")
|
851 |
st.markdown(f"**Description:** {info['description']}")
|
852 |
|
853 |
+
col1, col2 = st.columns(2)
|
854 |
+
with col1:
|
855 |
+
if st.button(f"View Learning Path", key=f"path_{role}"):
|
856 |
+
path = calculate_learning_path(skill_level, role)
|
857 |
+
st.markdown("**Recommended Learning Path:**")
|
858 |
+
for i, module in enumerate(path, 1):
|
859 |
+
st.markdown(f"{i}. {module}")
|
860 |
+
with col2:
|
861 |
+
if st.button(f"Job Openings", key=f"jobs_{role}"):
|
862 |
+
st.info(f"Searching LinkedIn for {role} positions...")
|
863 |
+
time.sleep(1)
|
864 |
+
st.success(f"Found 25+ {role} positions on LinkedIn!")
|
865 |
|
866 |
with tab2:
|
867 |
st.markdown("### πΊοΈ Skills Roadmap")
|
|
|
878 |
st.markdown(f"**{period}:**")
|
879 |
for skill in skills:
|
880 |
st.markdown(f"- {skill}")
|
881 |
+
|
882 |
+
st.markdown("---")
|
883 |
+
st.markdown("### π Skill Demand Analysis")
|
884 |
+
skill_demand = {
|
885 |
+
"Skill": ["Python", "SQL", "Machine Learning", "Deep Learning", "Cloud", "Data Visualization"],
|
886 |
+
"Demand (%)": [95, 85, 90, 75, 80, 70]
|
887 |
+
}
|
888 |
+
df_demand = pd.DataFrame(skill_demand)
|
889 |
+
fig = px.bar(df_demand, x="Skill", y="Demand (%)",
|
890 |
+
color="Skill", title="Industry Skill Demand")
|
891 |
+
st.plotly_chart(fig, use_container_width=True)
|
892 |
|
893 |
with tab3:
|
894 |
st.markdown("### π€ Interview Preparation")
|
|
|
919 |
for q in questions:
|
920 |
st.markdown(f"β’ {q}")
|
921 |
|
922 |
+
col1, col2 = st.columns(2)
|
923 |
+
with col1:
|
924 |
+
if st.button(f"Practice {category}", key=f"practice_{category}"):
|
925 |
+
st.info("Practice session started! Prepare your answers and time yourself.")
|
926 |
+
with col2:
|
927 |
+
if st.button(f"View Answers", key=f"answers_{category}"):
|
928 |
+
st.success("Sample answers loaded. Compare with your responses.")
|
929 |
|
930 |
elif menu == "Resume Builder":
|
931 |
st.markdown("<h1 class='main-header'>π ATS-Optimized Resume Builder</h1>", unsafe_allow_html=True)
|
|
|
973 |
st.markdown("### π‘ Recommendations:")
|
974 |
for rec in analysis['recommendations']:
|
975 |
st.markdown(f"β’ {rec}")
|
976 |
+
|
977 |
+
# Save job application
|
978 |
+
st.session_state.user_progress['job_applications'].append({
|
979 |
+
"role": job_role,
|
980 |
+
"date": datetime.now().strftime("%Y-%m-%d"),
|
981 |
+
"score": analysis['score']
|
982 |
+
})
|
983 |
else:
|
984 |
st.error("Please paste your resume text")
|
985 |
|
|
|
1016 |
|
1017 |
company_name = st.text_input("Company Name")
|
1018 |
position = st.text_input("Position")
|
1019 |
+
user_skills = st.multiselect("Your Top Skills", ["Python", "Machine Learning", "Data Analysis", "SQL", "Deep Learning"])
|
1020 |
+
|
1021 |
+
if st.button("Generate Cover Letter"):
|
1022 |
+
if company_name and position and user_skills:
|
1023 |
+
cover_letter = generate_cover_letter(company_name, position, user_skills)
|
1024 |
+
st.text_area("Generated Cover Letter", cover_letter, height=300)
|
1025 |
+
st.download_button("Download Cover Letter", cover_letter, file_name=f"cover_letter_{company_name}.txt")
|
1026 |
+
else:
|
1027 |
+
st.error("Please fill in all fields")
|
1028 |
+
|
1029 |
+
elif menu == "Mind Maps":
|
1030 |
+
st.markdown("<h1 class='main-header'>πΊοΈ Visual Learning with Mind Maps</h1>", unsafe_allow_html=True)
|
1031 |
+
|
1032 |
+
col1, col2 = st.columns([1, 3])
|
1033 |
+
|
1034 |
+
with col1:
|
1035 |
+
st.markdown("### π§ Concept Maps")
|
1036 |
+
selected_map = st.selectbox("Select a Concept", list(MIND_MAP_DB.keys()))
|
1037 |
+
|
1038 |
+
st.markdown("### β¨ Create Your Own")
|
1039 |
+
new_map_topic = st.text_input("Map Topic")
|
1040 |
+
new_concepts = st.text_area("Concepts (comma separated)")
|
1041 |
+
|
1042 |
+
if st.button("Generate Mind Map"):
|
1043 |
+
if new_map_topic and new_concepts:
|
1044 |
+
concepts_dict = {concept.strip(): f"Description of {concept.strip()}"
|
1045 |
+
for concept in new_concepts.split(",")}
|
1046 |
+
st.session_state.mind_maps[new_map_topic] = concepts_dict
|
1047 |
+
st.success("Mind map created!")
|
1048 |
+
|
1049 |
+
with col2:
|
1050 |
+
if selected_map in MIND_MAP_DB:
|
1051 |
+
st.markdown(f"### {selected_map}")
|
1052 |
+
fig = create_mind_map(selected_map, MIND_MAP_DB[selected_map])
|
1053 |
+
st.plotly_chart(fig, use_container_width=True)
|
1054 |
+
|
1055 |
+
if st.session_state.mind_maps:
|
1056 |
+
st.markdown("### ποΈ Your Custom Maps")
|
1057 |
+
for topic, concepts in st.session_state.mind_maps.items():
|
1058 |
+
with st.expander(topic):
|
1059 |
+
fig = create_mind_map(topic, concepts)
|
1060 |
+
st.plotly_chart(fig, use_container_width=True)
|
1061 |
+
|
1062 |
+
elif menu == "Progress":
|
1063 |
+
st.markdown("<h1 class='main-header'>π Your Learning Progress</h1>", unsafe_allow_html=True)
|
1064 |
+
|
1065 |
+
col1, col2 = st.columns(2)
|
1066 |
+
|
1067 |
+
with col1:
|
1068 |
+
st.markdown("### π Completed Lessons")
|
1069 |
+
if st.session_state.user_progress['completed_lessons']:
|
1070 |
+
for lesson in st.session_state.user_progress['completed_lessons']:
|
1071 |
+
st.markdown(f"- β
{lesson}")
|
1072 |
+
else:
|
1073 |
+
st.markdown("No lessons completed yet")
|
1074 |
|
1075 |
+
st.markdown("### π Projects Completed")
|
1076 |
+
if st.session_state.user_progress['projects_completed']:
|
1077 |
+
for project in st.session_state.user_progress['projects_completed']:
|
1078 |
+
st.markdown(f"- π οΈ {project}")
|
1079 |
+
else:
|
1080 |
+
st.markdown("No projects completed yet")
|
1081 |
+
|
1082 |
+
with col2:
|
1083 |
+
st.markdown("### π Quiz Scores")
|
1084 |
+
if st.session_state.user_progress['quiz_scores']:
|
1085 |
+
scores = st.session_state.user_progress['quiz_scores']
|
1086 |
+
df_scores = pd.DataFrame({
|
1087 |
+
"Topic": list(scores.keys()),
|
1088 |
+
"Score": list(scores.values())
|
1089 |
+
})
|
1090 |
+
fig = px.bar(df_scores, x="Topic", y="Score",
|
1091 |
+
color="Topic", title="Quiz Performance")
|
1092 |
+
st.plotly_chart(fig, use_container_width=True)
|
1093 |
+
else:
|
1094 |
+
st.markdown("No quiz scores yet")
|
1095 |
+
|
1096 |
+
st.markdown("### πΌ Job Applications")
|
1097 |
+
if st.session_state.user_progress.get('job_applications'):
|
1098 |
+
apps = st.session_state.user_progress['job_applications']
|
1099 |
+
df_apps = pd.DataFrame(apps)
|
1100 |
+
st.dataframe(df_apps)
|
1101 |
+
else:
|
1102 |
+
st.markdown("No job applications tracked yet")
|
1103 |
+
|
1104 |
+
# Footer
|
1105 |
+
st.markdown("---")
|
1106 |
+
st.markdown("""
|
1107 |
+
<div style="text-align: center; padding: 1rem;">
|
1108 |
+
<p>AI & Data Science Learning Platform β’ Built with Streamlit β’
|
1109 |
+
<a href="https://huggingface.co" target="_blank">Deploy on Hugging Face</a></p>
|
1110 |
+
</div>
|
1111 |
+
""", unsafe_allow_html=True)
|