Navya-Sree commited on
Commit
bfa9fdf
Β·
verified Β·
1 Parent(s): 9867f63

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +411 -73
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": ["Variables & Data Types", "Control Flow", "Functions", "Data Structures"],
 
 
 
 
 
74
  "duration": "2 weeks",
75
- "projects": ["Calculator App", "To-Do List Manager"]
 
76
  },
77
  "Data Science Basics": {
78
- "topics": ["NumPy", "Pandas", "Data Visualization", "Statistics"],
 
 
 
 
 
79
  "duration": "3 weeks",
80
- "projects": ["EDA on Titanic Dataset", "Sales Data Analysis"]
 
81
  },
82
  "Machine Learning Introduction": {
83
- "topics": ["Supervised Learning", "Regression", "Classification", "Model Evaluation"],
 
 
 
 
 
84
  "duration": "4 weeks",
85
- "projects": ["House Price Prediction", "Iris Classification"]
 
86
  }
87
  },
88
  "Intermediate": {
89
  "Advanced ML": {
90
- "topics": ["Ensemble Methods", "Feature Engineering", "Cross-Validation", "Hyperparameter Tuning"],
 
 
 
 
 
91
  "duration": "4 weeks",
92
- "projects": ["Customer Churn Prediction", "Credit Risk Assessment"]
 
93
  },
94
  "Deep Learning": {
95
- "topics": ["Neural Networks", "CNNs", "RNNs", "Transfer Learning"],
 
 
 
 
 
96
  "duration": "6 weeks",
97
- "projects": ["Image Classification", "Text Sentiment Analysis"]
 
98
  },
99
  "NLP Fundamentals": {
100
- "topics": ["Text Processing", "Word Embeddings", "Named Entity Recognition", "Topic Modeling"],
 
 
 
 
 
101
  "duration": "4 weeks",
102
- "projects": ["Spam Detection", "Document Clustering"]
 
103
  }
104
  },
105
  "Advanced": {
106
  "Advanced Deep Learning": {
107
- "topics": ["GANs", "Autoencoders", "Transformers", "BERT/GPT"],
 
 
 
 
 
108
  "duration": "8 weeks",
109
- "projects": ["Image Generation", "Custom Chatbot"]
 
110
  },
111
  "MLOps": {
112
- "topics": ["Model Deployment", "Docker", "CI/CD", "Model Monitoring"],
 
 
 
 
 
113
  "duration": "4 weeks",
114
- "projects": ["End-to-End ML Pipeline", "Model API Development"]
 
115
  },
116
  "Research & Innovation": {
117
- "topics": ["Research Papers", "State-of-the-art Models", "Custom Architectures"],
 
 
 
 
 
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=30, color='#ff6e40'),
182
  text=[topic],
183
  textposition="middle center",
184
- textfont=dict(size=14, color='white'),
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='#e0e0e0', width=2),
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=25, color='#1e3d59'),
211
  text=[concept],
212
  textposition="top center",
213
- textfont=dict(size=10),
214
  hoverinfo='text',
215
- hovertext=f"{concept}: {details}",
216
  showlegend=False
217
  ))
218
 
219
  fig.update_layout(
220
  showlegend=False,
221
- height=400,
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 skill.lower() in resume_text.lower():
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 keyword.lower() in resume_text.lower():
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"- {topic}")
 
411
 
412
  st.markdown("**Projects:**")
413
  for project in module_info['projects']:
414
  st.markdown(f"- πŸ› οΈ {project}")
415
 
416
- col1, col2 = st.columns(2)
 
 
 
 
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 Resources", key=f"resources_{module_name}"):
424
- st.info("Resources: Documentation, Videos, Articles, Code Examples")
 
 
 
 
 
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(2)
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.expander(f"πŸ“ {project['name']} - {project['difficulty']}"):
 
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
- if st.session_state.quiz_answers.get(i) == q['correct']:
 
 
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
- # Show correct answers
592
- st.markdown("### Correct Answers:")
593
- for i, q in enumerate(st.session_state.current_quiz):
594
- st.markdown(f"Q{i+1}: {q['options'][q['correct']]}")
 
 
 
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
- if st.button(f"View Learning Path", key=f"path_{role}"):
634
- path = calculate_learning_path(skill_level, role)
635
- st.markdown("**Recommended Learning Path:**")
636
- for i, module in enumerate(path, 1):
637
- st.markdown(f"{i}. {module}")
 
 
 
 
 
 
 
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
- if st.button(f"Practice {category}", key=f"practice_{category}"):
685
- st.info("Practice session started! Prepare your answers and time yourself.")
 
 
 
 
 
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
- if st.button("Generate Cover Letter Template"):
771
- if company_name and position:
772
- cover_letter = f"""
773
- Dear Hiring Manager at {company_name
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)