CareerApp / app.py
MansoorSarookh's picture
Update app.py
cb817b6 verified
import streamlit as st
from datasets import load_dataset
import pandas as pd
from transformers import pipeline
import time
# Constants
universities_url = "https://www.4icu.org/top-universities-world/"
# Load datasets with caching to optimize performance
@st.cache_resource
def load_datasets():
ds_jobs = load_dataset("lukebarousse/data_jobs")
ds_courses = load_dataset("azrai99/coursera-course-dataset")
ds_custom_courses = pd.read_csv("final_cleaned_merged_coursera_courses.csv")
ds_custom_jobs = pd.read_csv("merged_data_science_jobs.csv")
ds_custom_universities = pd.read_csv("merged_university_data_cleaned (1).csv")
return ds_jobs, ds_courses, ds_custom_courses, ds_custom_jobs, ds_custom_universities
ds_jobs, ds_courses, ds_custom_courses, ds_custom_jobs, ds_custom_universities = load_datasets()
# Initialize the pipeline with caching, using an accessible model like 'google/flan-t5-large'
@st.cache_resource
def load_pipeline():
return pipeline("text2text-generation", model="google/flan-t5-large")
qa_pipeline = load_pipeline()
# Streamlit App Interface
st.title("Career Counseling Application")
st.subheader("Build Your Profile and Discover Tailored Career Recommendations")
# Sidebar for Profile Setup
st.sidebar.header("Profile Setup")
educational_background = st.sidebar.text_input("Educational Background (e.g., Degree, Major)")
interests = st.sidebar.text_input("Interests (e.g., AI, Data Science, Engineering)")
tech_skills = st.sidebar.text_area("Technical Skills (e.g., Python, SQL, Machine Learning)")
soft_skills = st.sidebar.text_area("Soft Skills (e.g., Communication, Teamwork)")
# Save profile data for session-based recommendations
if st.sidebar.button("Save Profile"):
with st.spinner('Saving your profile...'):
time.sleep(2) # Simulate processing time
st.session_state.profile_data = {
"educational_background": educational_background,
"interests": interests,
"tech_skills": tech_skills,
"soft_skills": soft_skills
}
st.session_state.question_index = 0 # Initialize question index
st.session_state.answers = {} # Initialize dictionary for answers
st.session_state.submitted = False # Track if an answer was just submitted
st.sidebar.success("Profile saved successfully!")
st.write("To provide more personalized job and course recommendations, please answer the following questions one by one:")
# Additional questions for more tailored recommendations
additional_questions = [
"What industry do you prefer working in (e.g., healthcare, finance, tech)?",
"What type of job role are you most interested in (e.g., research, management, development)?",
"Are you looking for remote, hybrid, or on-site opportunities?",
"Do you have any certifications or licenses related to your field?",
"What level of experience do you have (e.g., entry-level, mid-level, senior)?",
"What languages are you proficient in, apart from English (if any)?",
"Do you prefer working for startups, mid-sized companies, or large corporations?",
"What is your preferred learning style for courses (e.g., video tutorials, interactive projects, reading material)?",
"Are you open to relocation? If yes, to which cities or regions?",
"Do you have a preference for job roles in specific countries or regions?"
]
# Display questions one by one after the profile is saved
if "profile_data" in st.session_state and "question_index" in st.session_state:
total_questions = len(additional_questions)
# Show progress bar
progress = (st.session_state.question_index / total_questions) * 100
st.progress(int(progress))
st.write(f"Progress: {st.session_state.question_index} out of {total_questions} questions answered")
if st.session_state.question_index < total_questions:
question = additional_questions[st.session_state.question_index]
answer = st.text_input(question, key=f"q{st.session_state.question_index}")
# Submit button for each question
if st.button("Submit Answer", key=f"submit{st.session_state.question_index}"):
if answer:
st.session_state.answers[question] = answer
st.session_state.question_index += 1
# Trigger page refresh using st.session_state change
st.session_state.updated = True # Indicate that a change has occurred
st.query_params = {"updated": "true"} # Update query params to indicate change
else:
st.warning("Please enter an answer before submitting.")
# Check if all questions are answered and show the "Generate Response" button
if st.session_state.question_index == total_questions:
st.success("All questions have been answered. Click below to generate your recommendations.")
if st.button("Generate Response"):
# Save all answers in the profile data
st.session_state.profile_data.update(st.session_state.answers)
# Career and Job Recommendations Section
st.header("Job Recommendations")
with st.spinner('Generating job recommendations...'):
time.sleep(2) # Simulate processing time
job_recommendations = []
# Find jobs from ds_jobs
for job in ds_jobs["train"]:
job_title = job.get("job_title_short", "Unknown Job Title")
job_skills = job.get("job_skills", "") or ""
if any(skill.lower() in job_skills.lower() for skill in st.session_state.profile_data["tech_skills"].split(",")):
job_recommendations.append(job_title)
# Find jobs from ds_custom_jobs
for _, job in ds_custom_jobs.iterrows():
job_title = job.get("job_title", "Unknown Job Title")
job_skills = job.get("skills", "") or ""
if any(skill.lower() in job_skills.lower() for skill in st.session_state.profile_data["tech_skills"].split(",")):
job_recommendations.append(job_title)
# Remove duplicates and keep the unique job titles
job_recommendations = list(set(job_recommendations))
if job_recommendations:
st.subheader("Based on your profile, here are some potential job roles:")
for job in job_recommendations[:5]: # Limit to top 5 job recommendations
st.write("- ", job)
else:
st.write("No specific job recommendations found matching your profile. Here are some general recommendations:")
for job in ["Data Analyst", "Software Engineer", "Project Manager", "Research Scientist", "Business Analyst"][:5]:
st.write("- ", job)
# Course Suggestions Section
st.header("Recommended Courses")
with st.spinner('Finding courses related to your profile...'):
time.sleep(2) # Simulate processing time
course_recommendations = []
# Find relevant courses in ds_courses
for course in ds_courses["train"]:
if any(interest.lower() in course.get("Course Name", "").lower() for interest in st.session_state.profile_data["interests"].split(",")):
course_recommendations.append({
"name": course.get("Course Name", "Unknown Course Title"),
"url": course.get("Links", "#")
})
# Find relevant courses in ds_custom_courses
for _, row in ds_custom_courses.iterrows():
if any(interest.lower() in row["Course Name"].lower() for interest in st.session_state.profile_data["interests"].split(",")):
course_recommendations.append({
"name": row["Course Name"],
"url": row.get("Links", "#")
})
# Remove duplicates from course recommendations by converting to a set of tuples and back to a list
course_recommendations = list({(course["name"], course["url"]) for course in course_recommendations})
# If there are fewer than 5 exact matches, add nearly related courses
if len(course_recommendations) < 5:
for course in ds_courses["train"]:
if len(course_recommendations) >= 5:
break
if any(skill.lower() in course.get("Course Name", "").lower() for skill in st.session_state.profile_data["tech_skills"].split(",")):
course_recommendations.append((course.get("Course Name", "Unknown Course Title"), course.get("Links", "#")))
for _, row in ds_custom_courses.iterrows():
if len(course_recommendations) >= 5:
break
if any(skill.lower() in row["Course Name"].lower() for skill in st.session_state.profile_data["tech_skills"].split(",")):
course_recommendations.append((row["Course Name"], row.get("Links", "#")))
# Remove duplicates again after adding nearly related courses
course_recommendations = list({(name, url) for name, url in course_recommendations})
if course_recommendations:
st.write("Here are the top 5 courses related to your interests:")
for course in course_recommendations[:5]: # Limit to top 5 course recommendations
st.write(f"- [{course[0]}]({course[1]})")
# University Recommendations Section
st.header("Top Universities")
st.write("For further education, you can explore the top universities worldwide:")
st.write(f"[View Top Universities Rankings]({universities_url})")
# Conclusion
st.write("Thank you for using the Career Counseling Application!")