Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -21,10 +21,15 @@ course_df = pd.read_csv(os.path.join(DATA_DIR, "coursera_course_dataset_v2_no_nu
|
|
21 |
coding_df = pd.read_csv(os.path.join(DATA_DIR, "Software Questions.csv"), encoding="latin1")
|
22 |
|
23 |
# Preprocess datasets
|
24 |
-
coding_df.rename(columns={
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
job_df.rename(columns={'company_name': 'company', 'required_skills': 'skills'}, inplace=True)
|
26 |
course_df.rename(columns={'Title': 'course_title', 'Skills': 'skills'}, inplace=True)
|
27 |
-
coding_df.dropna(subset=['question', 'solutions'], inplace=True)
|
28 |
job_df["job_description"] = job_df["job_description"].fillna("")
|
29 |
|
30 |
# Load BERT model and vectorizer
|
@@ -34,7 +39,7 @@ vectorizer = TfidfVectorizer()
|
|
34 |
# Pydantic model for request body
|
35 |
class UserInput(BaseModel):
|
36 |
name: str
|
37 |
-
skills: List[str] # Required list of
|
38 |
answers: Optional[Dict[str, Dict[str, str]]] = None # Optional answers
|
39 |
|
40 |
# Evaluate coding answers
|
@@ -48,14 +53,16 @@ def evaluate_coding_with_time(user_code, correct_code, start_time):
|
|
48 |
return round(max(similarity, 0), 2)
|
49 |
|
50 |
# Get coding challenges
|
51 |
-
def get_coding_challenges(
|
52 |
skill_challenges = {}
|
53 |
-
for
|
54 |
-
relevant = coding_df[coding_df["
|
|
|
|
|
55 |
if not relevant.empty:
|
56 |
-
skill_challenges[
|
57 |
else:
|
58 |
-
skill_challenges[
|
59 |
return skill_challenges
|
60 |
|
61 |
# Assign proficiency level
|
@@ -90,13 +97,19 @@ def read_root():
|
|
90 |
|
91 |
# New endpoint to provide challenges
|
92 |
@app.get("/challenges")
|
93 |
-
def get_user_challenges(skills: List[str]):
|
94 |
if not skills:
|
95 |
raise HTTPException(status_code=400, detail="Skills list cannot be empty")
|
96 |
-
challenges = get_coding_challenges(skills)
|
97 |
-
# Return only questions (exclude solutions for the user)
|
98 |
return {
|
99 |
-
"challenges": {
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
}
|
101 |
|
102 |
@app.post("/assess")
|
|
|
21 |
coding_df = pd.read_csv(os.path.join(DATA_DIR, "Software Questions.csv"), encoding="latin1")
|
22 |
|
23 |
# Preprocess datasets
|
24 |
+
coding_df = coding_df.rename(columns={
|
25 |
+
'Question': 'question',
|
26 |
+
'Answer': 'solutions',
|
27 |
+
'Category': 'category',
|
28 |
+
'Difficulty': 'difficulty'
|
29 |
+
})
|
30 |
+
coding_df.dropna(subset=['question', 'solutions', 'category', 'difficulty'], inplace=True)
|
31 |
job_df.rename(columns={'company_name': 'company', 'required_skills': 'skills'}, inplace=True)
|
32 |
course_df.rename(columns={'Title': 'course_title', 'Skills': 'skills'}, inplace=True)
|
|
|
33 |
job_df["job_description"] = job_df["job_description"].fillna("")
|
34 |
|
35 |
# Load BERT model and vectorizer
|
|
|
39 |
# Pydantic model for request body
|
40 |
class UserInput(BaseModel):
|
41 |
name: str
|
42 |
+
skills: List[str] # Required list of categories (e.g., "General Programming", "Data Structures")
|
43 |
answers: Optional[Dict[str, Dict[str, str]]] = None # Optional answers
|
44 |
|
45 |
# Evaluate coding answers
|
|
|
53 |
return round(max(similarity, 0), 2)
|
54 |
|
55 |
# Get coding challenges
|
56 |
+
def get_coding_challenges(categories: List[str], num_questions=5, difficulty: Optional[str] = None):
|
57 |
skill_challenges = {}
|
58 |
+
for category in categories:
|
59 |
+
relevant = coding_df[coding_df["category"].str.contains(category, case=False, na=False)]
|
60 |
+
if difficulty:
|
61 |
+
relevant = relevant[relevant["difficulty"].str.lower() == difficulty.lower()]
|
62 |
if not relevant.empty:
|
63 |
+
skill_challenges[category] = relevant.sample(min(num_questions, len(relevant)))[["question", "solutions", "difficulty"]].to_dict(orient="records")
|
64 |
else:
|
65 |
+
skill_challenges[category] = []
|
66 |
return skill_challenges
|
67 |
|
68 |
# Assign proficiency level
|
|
|
97 |
|
98 |
# New endpoint to provide challenges
|
99 |
@app.get("/challenges")
|
100 |
+
def get_user_challenges(skills: List[str], difficulty: Optional[str] = None):
|
101 |
if not skills:
|
102 |
raise HTTPException(status_code=400, detail="Skills list cannot be empty")
|
103 |
+
challenges = get_coding_challenges(skills, difficulty=difficulty)
|
104 |
+
# Return only questions and difficulty (exclude solutions for the user)
|
105 |
return {
|
106 |
+
"challenges": {
|
107 |
+
category: [
|
108 |
+
{"question": challenge["question"], "difficulty": challenge["difficulty"]}
|
109 |
+
for challenge in challenge_list
|
110 |
+
]
|
111 |
+
for category, challenge_list in challenges.items()
|
112 |
+
}
|
113 |
}
|
114 |
|
115 |
@app.post("/assess")
|