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)
|