diff --git a/app.py b/app.py
index d97dca2..8691fa0 100644
--- a/app.py
+++ b/app.py
@@ -51,10 +51,10 @@ def collect_user_input():
academic_bg = render_academic_background_section(preset, feature_maps)
# Family background
- family_bg = render_family_background_section(feature_maps)
+ family_bg = render_family_background_section(preset, feature_maps)
# Financial and social factors
- financial_social = render_financial_social_section()
+ financial_social = render_financial_social_section(preset)
# Academic performance
academic_performance = render_academic_performance_section(preset)
diff --git a/data/Data_Dictionary.xlsx b/data/Data_Dictionary.xlsx
new file mode 100644
index 0000000..1e1be97
Binary files /dev/null and b/data/Data_Dictionary.xlsx differ
diff --git a/data/~$Data_Dictionary.xlsx b/data/~$Data_Dictionary.xlsx
new file mode 100644
index 0000000..e719064
Binary files /dev/null and b/data/~$Data_Dictionary.xlsx differ
diff --git a/src/components/form_components.py b/src/components/form_components.py
index bbc6074..a6d872c 100644
--- a/src/components/form_components.py
+++ b/src/components/form_components.py
@@ -58,7 +58,8 @@ def render_personal_info_section(preset: str, feature_maps: Dict) -> Dict[str, A
nationality = st.selectbox(
"Nationality",
- [1, 2, 6, 11, 13, 14, 17, 21, 22, 24, 25, 26, 32, 41, 62, 100, 101, 103, 105, 108, 109],
+ options=list(feature_maps['nationality'].keys()),
+ format_func=lambda x: feature_maps['nationality'][x],
index=0
)
@@ -143,34 +144,40 @@ def render_academic_background_section(preset: str, feature_maps: Dict) -> Dict[
}
-def render_family_background_section(feature_maps: Dict) -> Dict[str, Any]:
+def render_family_background_section(preset: str, feature_maps: Dict) -> Dict[str, Any]:
"""Render family background input section"""
st.markdown('
', unsafe_allow_html=True)
st.markdown("### ๐จโ๐ฉโ๐งโ๐ฆ Family Background")
st.markdown('Parent education and occupation information
', unsafe_allow_html=True)
+ defaults = PRESET_CONFIGURATIONS[preset]
+
mothers_qualification = st.selectbox(
"Mother's Qualification",
options=list(feature_maps['qualification'].keys()),
- format_func=lambda x: feature_maps['qualification'].get(x, f"Qualification {x}")
+ format_func=lambda x: feature_maps['qualification'].get(x, f"Qualification {x}"),
+ index=list(feature_maps['qualification'].keys()).index(defaults["mothers_qualification"]) if defaults["mothers_qualification"] in feature_maps['qualification'] else 0
)
fathers_qualification = st.selectbox(
"Father's Qualification",
options=list(feature_maps['qualification'].keys()),
- format_func=lambda x: feature_maps['qualification'].get(x, f"Qualification {x}")
+ format_func=lambda x: feature_maps['qualification'].get(x, f"Qualification {x}"),
+ index=list(feature_maps['qualification'].keys()).index(defaults["fathers_qualification"]) if defaults["fathers_qualification"] in feature_maps['qualification'] else 0
)
mothers_occupation = st.selectbox(
"Mother's Occupation",
options=list(feature_maps['occupation'].keys()),
- format_func=lambda x: feature_maps['occupation'].get(x, f"Occupation {x}")
+ format_func=lambda x: feature_maps['occupation'].get(x, f"Occupation {x}"),
+ index=list(feature_maps['occupation'].keys()).index(defaults["mothers_occupation"]) if defaults["mothers_occupation"] in feature_maps['occupation'] else 0
)
fathers_occupation = st.selectbox(
"Father's Occupation",
options=list(feature_maps['occupation'].keys()),
- format_func=lambda x: feature_maps['occupation'].get(x, f"Occupation {x}")
+ format_func=lambda x: feature_maps['occupation'].get(x, f"Occupation {x}"),
+ index=list(feature_maps['occupation'].keys()).index(defaults["fathers_occupation"]) if defaults["fathers_occupation"] in feature_maps['occupation'] else 0
)
return {
@@ -181,31 +188,36 @@ def render_family_background_section(feature_maps: Dict) -> Dict[str, Any]:
}
-def render_financial_social_section() -> Dict[str, Any]:
+def render_financial_social_section(preset: str) -> Dict[str, Any]:
"""Render financial and social factors input section"""
st.markdown('', unsafe_allow_html=True)
st.markdown("### ๐ฐ Financial & Social")
st.markdown('Student financial status and special circumstances
',
unsafe_allow_html=True)
+ defaults = PRESET_CONFIGURATIONS[preset]
+
col1, col2 = st.columns(2)
with col1:
displaced = st.radio(
"Displaced Student",
[0, 1],
format_func=lambda x: "No" if x == 0 else "Yes",
+ index=defaults["displaced"],
horizontal=True
)
educational_special_needs = st.radio(
"Educational Special Needs",
[0, 1],
format_func=lambda x: "No" if x == 0 else "Yes",
+ index=defaults["educational_special_needs"],
horizontal=True
)
debtor = st.radio(
"Has Outstanding Debts",
[0, 1],
format_func=lambda x: "No" if x == 0 else "Yes",
+ index=defaults["debtor"],
horizontal=True
)
with col2:
@@ -213,18 +225,21 @@ def render_financial_social_section() -> Dict[str, Any]:
"Tuition Fees Up to Date",
[0, 1],
format_func=lambda x: "No" if x == 0 else "Yes",
+ index=defaults["tuition_fees_up_to_date"],
horizontal=True
)
scholarship_holder = st.radio(
"Scholarship Holder",
[0, 1],
format_func=lambda x: "No" if x == 0 else "Yes",
+ index=defaults["scholarship_holder"],
horizontal=True
)
international = st.radio(
"International Student",
[0, 1],
format_func=lambda x: "No" if x == 0 else "Yes",
+ index=defaults["international"],
horizontal=True
)
diff --git a/src/config/mappings.py b/src/config/mappings.py
index 2fc4386..4e106b8 100644
--- a/src/config/mappings.py
+++ b/src/config/mappings.py
@@ -17,19 +17,19 @@ def create_feature_mappings():
6: "Legally Separated",
}
- # Application mode mapping
+ # Application mode mapping (from data dictionary)
application_mode_map = {
- 1: "1st Phase - General Contingent",
+ 1: "1st phase - general contingent",
2: "Ordinance No. 612/93",
- 5: "1st Phase - Special Contingent (Azores)",
- 7: "Holders of Other Higher Courses",
+ 5: "1st phase - special contingent (Azores Island)",
+ 7: "Holders of other higher courses",
10: "Ordinance No. 854-B/99",
- 15: "International Student (Bachelor)",
- 16: "1st Phase - Special Contingent (Madeira)",
- 17: "2nd Phase - General Contingent",
- 18: "3rd Phase - General Contingent",
- 26: "Ordinance No. 533-A/99, item b2",
- 27: "Ordinance No. 533-A/99, item b3",
+ 15: "International student (bachelor)",
+ 16: "1st phase - special contingent (Madeira Island)",
+ 17: "2nd phase - general contingent",
+ 18: "3rd phase - general contingent",
+ 26: "Ordinance No. 533-A/99, item b2 (Different Plan)",
+ 27: "Ordinance No. 533-A/99, item b3 (Other Institution)",
39: "Over 23 years old",
42: "Transfer",
43: "Change of course",
@@ -60,7 +60,7 @@ def create_feature_mappings():
9991: "Management (evening attendance)",
}
- # Previous qualification mapping
+ # Previous qualification mapping (from data dictionary)
qualification_map = {
1: "Secondary education",
2: "Higher education - bachelor's degree",
@@ -77,7 +77,7 @@ def create_feature_mappings():
38: "Basic education 2nd cycle (6th/7th/8th year) or equiv.",
39: "Technological specialization course",
40: "Higher education - degree (1st cycle)",
- 42: "Professional course",
+ 42: "Professional higher technical course",
43: "Higher education - master (2nd cycle)",
}
@@ -117,12 +117,38 @@ def create_feature_mappings():
194: "Meal preparation assistants",
}
+ # Nationality mapping (from data dictionary)
+ nationality_map = {
+ 1: "Portuguese",
+ 2: "German",
+ 6: "Spanish",
+ 11: "Italian",
+ 13: "Dutch",
+ 14: "English",
+ 17: "Lithuanian",
+ 21: "Angolan",
+ 22: "Cape Verdean",
+ 24: "Guinean",
+ 25: "Mozambican",
+ 26: "Santomean",
+ 32: "Turkish",
+ 41: "Brazilian",
+ 62: "Romanian",
+ 100: "Moldova (Republic of)",
+ 101: "Mexican",
+ 103: "Ukrainian",
+ 105: "Russian",
+ 108: "Cuban",
+ 109: "Colombian",
+ }
+
return {
"marital_status": marital_status_map,
"application_mode": application_mode_map,
"course": course_map,
"qualification": qualification_map,
"occupation": occupation_map,
+ "nationality": nationality_map,
}
@@ -136,15 +162,39 @@ PRESET_CONFIGURATIONS = {
"course": 9254,
"prev_grade": 120,
"adm_grade": 120,
+ # Family background
+ "mothers_qualification": 1, # Secondary education
+ "fathers_qualification": 1, # Secondary education
+ "mothers_occupation": 4, # Administrative staff
+ "fathers_occupation": 7, # Skilled workers
+ # Financial & social
+ "displaced": 0,
+ "educational_special_needs": 0,
+ "debtor": 0,
+ "tuition_fees_up_to_date": 1,
+ "scholarship_holder": 0,
+ "international": 0,
},
"Typical Graduate Student": {
- "age": 19,
- "gender": 1,
- "marital": 1,
- "app_mode": 15,
- "course": 9254,
- "prev_grade": 160,
- "adm_grade": 142,
+ "age": 18, # Slightly younger, traditional student age
+ "gender": 0, # Female students often have slightly higher graduation rates
+ "marital": 1, # Single
+ "app_mode": 1, # 1st phase general contingent (most competitive)
+ "course": 9500, # Nursing (typically high graduation rate)
+ "prev_grade": 170, # Higher previous qualification grade
+ "adm_grade": 150, # Higher admission grade
+ # Family background
+ "mothers_qualification": 2, # Higher education - bachelor's degree
+ "fathers_qualification": 2, # Higher education - bachelor's degree
+ "mothers_occupation": 2, # Specialists in intellectual activities
+ "fathers_occupation": 2, # Specialists in intellectual activities
+ # Financial & social
+ "displaced": 0,
+ "educational_special_needs": 0,
+ "debtor": 0,
+ "tuition_fees_up_to_date": 1,
+ "scholarship_holder": 1, # Has scholarship (positive factor)
+ "international": 0,
},
"At-Risk Student": {
"age": 22,
@@ -154,15 +204,39 @@ PRESET_CONFIGURATIONS = {
"course": 171,
"prev_grade": 100,
"adm_grade": 110,
+ # Family background
+ "mothers_qualification": 19, # Basic education 3rd cycle
+ "fathers_qualification": 19, # Basic education 3rd cycle
+ "mothers_occupation": 9, # Unskilled workers
+ "fathers_occupation": 9, # Unskilled workers
+ # Financial & social
+ "displaced": 0,
+ "educational_special_needs": 0,
+ "debtor": 1, # Has debts (risk factor)
+ "tuition_fees_up_to_date": 0, # Behind on tuition
+ "scholarship_holder": 0,
+ "international": 0,
},
"International Student": {
"age": 21,
"gender": 0,
"marital": 1,
- "app_mode": 1,
+ "app_mode": 15, # International student (bachelor)
"course": 9238,
"prev_grade": 135,
"adm_grade": 130,
+ # Family background
+ "mothers_qualification": 2, # Higher education - bachelor's degree
+ "fathers_qualification": 2, # Higher education - bachelor's degree
+ "mothers_occupation": 2, # Specialists in intellectual activities
+ "fathers_occupation": 2, # Specialists in intellectual activities
+ # Financial & social
+ "displaced": 0,
+ "educational_special_needs": 0,
+ "debtor": 0,
+ "tuition_fees_up_to_date": 1,
+ "scholarship_holder": 0,
+ "international": 1, # Is international student
},
}
@@ -190,7 +264,7 @@ ACADEMIC_DEFAULTS = {
"1st_sem": {
"enrolled": 6,
"approved": 6,
- "grade": 14,
+ "grade": 16, # Higher grade (closer to maximum of 20)
"credited": 0,
"evaluations": 6,
"without": 0,
@@ -198,7 +272,7 @@ ACADEMIC_DEFAULTS = {
"2nd_sem": {
"enrolled": 6,
"approved": 6,
- "grade": 14,
+ "grade": 16, # Higher grade (closer to maximum of 20)
"credited": 0,
"evaluations": 6,
"without": 0,