From 149333930c5ae0c1330b13d3fae8cc4d494495d4 Mon Sep 17 00:00:00 2001 From: andwati Date: Sun, 28 Sep 2025 21:28:13 +0300 Subject: [PATCH] yolo --- app.py | 4 +- data/Data_Dictionary.xlsx | Bin 0 -> 14074 bytes data/~$Data_Dictionary.xlsx | Bin 0 -> 165 bytes src/components/form_components.py | 29 ++++++-- src/config/mappings.py | 118 ++++++++++++++++++++++++------ 5 files changed, 120 insertions(+), 31 deletions(-) create mode 100644 data/Data_Dictionary.xlsx create mode 100644 data/~$Data_Dictionary.xlsx 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 0000000000000000000000000000000000000000..1e1be97963fb72382474ec5adcd0bb2375ecb5f0 GIT binary patch literal 14074 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 @+{Dy%K8P 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 z zJ8eALxM%r`?xyiNOi+T4am{Vm}5#$+Z0>?HL)srzADOX2s|OoSO?CsG55 z0_2u}IF`B0+q0sN;cYju^Wd+m{OCLaGLFT*`!*d80QEi4i;;nc!n^D7s-8NEn_=kF z@r`{N!6mPf!?m0C*oF@3*6Xfo1J-A7IY}U3)ISa&|IAzYefqx7U;q#R|NS>U{ePRx zzuWnJg#Wf9!T`|9^KO;Qmnl7rXAC!}UAA;cuT6@2MHT z&XoURJN(|<->G?jtJ40v$G?eszZ>{H_uy{>QJ{bI_kXe${?0`B-OBGtJbzmWe-99U zWmo+xrRTrl_Uj4vXZbZv%KsYg-(CKmoApcQ&pAT&{^>85|C6cp-#q@x-}tlq@+k0U zxBr{MuY8U_%P$4}|Ao`r@hZ_fXD8~rl%mjO9Rus_g4 QdQYT+cyHAzte+ literal 0 HcmV?d00001 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,