From a896ae2964f76f8b537741c67e04cfb1a2a646da Mon Sep 17 00:00:00 2001 From: Adrienucl <adrien.payen@student.uclouvain.be> Date: Sat, 2 Dec 2023 17:53:23 +0100 Subject: [PATCH] 90% of the project done --- .DS_Store | Bin 0 -> 6148 bytes .../algorithme_gestion_etudiants.py | 593 +++++++++++------- .../algorithme_student_generate.py | 2 +- 3 files changed, 353 insertions(+), 242 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f9eff7d8caa48695afec3a1f76904ad3a16c43f0 GIT binary patch literal 6148 zcmeHKO>Yx15FMu}-BpFO2atL}vcxrNLqLV9mu*N79Jq8VIJ8yBva7PNwWI8&IYg26 z3_pe|zl6U7&mS$M1yL?Yz)WO6dpysUpS5;|h(v#yJs^sRC_pjT3Q_&Q%(yAntmQqc zKw;;|siq<2q)@Z{4GNgEi)c&}()1Q5_wD>nt#694{8_1Ar=?D9EYTit^NTgR#jAWU zz^yQ&!Y`-t3jgEp^3z#0_UnI2$7NB~-R@`6T4}G|S_{^K_249Vqi0Dys;5<dG&wT8 zL#@m7qCHAq6!~lz-Fd22Jt|Z_v4kSa5pw*pP??_f^;Bh*<tA<*2!n7KZOrGr?I#`C zd%Uyg$oWpM+mVkRZZ8&LaQFV!?!oX~d8YJxs{{#r2i9(TynqjA{8Fd$WTHx~P7!P7 z3F(0Lq4t2D12^f6vSlU3Jw$zf66mtA0;~Wla03PWT@|d~AeKW|0aoDuQo!5~62)Nb zv2kdx4pcS;0Jh<_hPKHi3`cs5JvI(80uzo3bX4I}4B_bTOCJ||Y#cf|37>ojzq0Td zim<C=erdx=#16S;1z3S)1y)=)GVlNX&-4Ff68BgER^XpfK(q(RppPy2xAofQ%v&o_ sUZEH>agD=E3L5q)Myz>?H&Cp>FHHj&du$xS1LHpeRtBzEfj_FiR}xi#kN^Mx literal 0 HcmV?d00001 diff --git a/projet_personnel/algorithme_gestion_etudiants.py b/projet_personnel/algorithme_gestion_etudiants.py index ea3f6fd..49466a2 100644 --- a/projet_personnel/algorithme_gestion_etudiants.py +++ b/projet_personnel/algorithme_gestion_etudiants.py @@ -3,8 +3,24 @@ import pandas as pd import os import statistics import re +from IPython.display import display +from tabulate import tabulate -file_path = '/content/Data_Base.xlsx' +all_course_BAC1 = ("Anglais 1", "Fondements du droit public", "Fondements du droit de l'entreprise", "Economie", "Espagnol 1", "Comptabilité", "Informatique de gestion", "Mathématiques de gestion 1", "Statistiques et probabilités", "Pilosophie", "Psychologie", "Sociologie", "Séminaire de travail universitaire en gestion") + +all_course_BAC2 = ("Anglais 2", "Droit de l'entreprise", "Macroéconomie", "Microéconomie", "Espagnol 2", "Marketing", "Production", "Informatique et algorithmique", "Finance", "Inférences statistiques", "Mathématiques de gestion 2", "Technologies industrielles") + +all_course_BAC3 = ("Anglais 3", "Economie industrielle", "Espagnol 3", "Séminaire : organisations et transformation digitale", "Management humain", "Projet entrepreneurial", "Comptabilité et contrôle de gestion", "Gestion de données", "Coding project", "Econométrie", "Recherche opérationnelle", "Optimization", "Séminaire : organisation et mutations sociales", "Questions de sciences religieuses") + +all_course_MA1 = ("Advanced English 1", "Español avanzado 1", "Data analytics", "Projet quantitatif et gestion de projet", "Data Mining", "Nouvelles technologies et pratiques émergentes", "Web mining", "Machine learning", "Quantitative Decision Making", "Recommender Systems", "Pilotage stratégique de l'entreprise", "Séminaire on Current Managerial Issues") + +all_course_MA2 = ("Advanced English 2", "Español avanzado 1", "Responsabilité sociétale de l'entreprise","Integrated Information Systems", "Mémoire", "Séminaire d'accompagnement du mémoire") + + + + + +file_path = '/Users/adrien/vscodeworkspace/coding-project/Data_Base.xlsx' data = pd.read_excel(file_path) excel_file_path = 'export_names.xlsx' @@ -27,25 +43,25 @@ def register_student(data): # Setting up the patterns to follow for entering information while True: - Name = input("What is the student's name? ") # Ask the user for the name - if name_pattern.match(Name): # Check if the name matches the specified format - print("The name is valid.") + Firstname = input("What is the student's firstname? ") # Ask the user for the name + if name_pattern.match(Firstname): # Check if the name matches the specified format + print(f"The firstname is valid : {Firstname}") break # Exit the loop if the name is valid else: - print("The name is not valid. Make sure to follow the specified format.") + print("The firstname is not valid. Make sure to follow the specified format.") while True: - Surname = input("What is the student's surname? ") # Ask the user for the surname - if name_pattern.match(Surname): - print("The surname is valid.") + Lastname = input("What is the student's lastname? ") # Ask the user for the surname + if name_pattern.match(Lastname): + print(f"The lastname is valid : {Lastname}") break # Exit the loop if the surname is valid else: - print("The surname is not valid. Make sure to follow the specified format.") + print("The lastname is not valid. Make sure to follow the specified format.") while True: Date_of_birth = input("Please enter a date in the format dd/mm/yyyy: ") if date_pattern.match(Date_of_birth): - print("The date is valid.") + print(f"The date is valid : {Date_of_birth}") break # Exit the loop if the date is valid else: print("The date is not valid. Make sure to follow the format dd/mm/yyyy.") @@ -53,7 +69,7 @@ def register_student(data): while True: Place_of_birth = input("What is the city of birth? ") if place_of_birth_pattern.match(Place_of_birth): - print("The city of birth is valid.") + print(f"The place of birth is valid : {Place_of_birth}") break # Exit the loop if the city of birth is valid else: print("The city of birth is not valid. Make sure to use only letters and spaces.") @@ -61,7 +77,7 @@ def register_student(data): while True: Address = input("Please enter an address in the format 'street number, city': ") if address_pattern.match(Address): - print("The address is valid.") + print(f"The address is valid : {Address}") break # Exit the loop if the address is valid else: print("The address is not valid. Make sure to follow the format 'street number, city'.") @@ -69,7 +85,7 @@ def register_student(data): while True: Telephone = input("What is the telephone number? (in the format 000/00.00.00) ") if telephone_pattern.match(Telephone): - print("The telephone number is valid.") + print(f"The telephone number is valid : {Telephone}") break # Exit the loop if the telephone number is valid else: print("The telephone number is not valid. Make sure to follow the requested format.") @@ -77,7 +93,7 @@ def register_student(data): while True: Email = input("Enter the university email (@student.uclouvain.be): ") if email_pattern.match(Email): - print("The email is valid.") + print(f"The email is valid : {Email}") break # Exit the loop if the email is valid else: print("The email is not valid. Make sure to follow the requested format.") @@ -85,7 +101,7 @@ def register_student(data): while True: Gender = input("What is your gender? (For Male enter M, for Female enter F, and for another type enter O): ") if gender_pattern.match(Gender): - print("The gender is valid.") + print(f"The gender is valid : {Gender}") break # Exit the loop if the gender is valid else: print("The gender is not valid. Make sure to follow the requested format.") @@ -93,7 +109,7 @@ def register_student(data): while True: Academic_year = input("What is your academic year? (BAC1/BAC2/BAC3/MA1/MA2): ") if academic_year_pattern.match(Academic_year): - print("The academic year is valid.") + print(f"The academic year is valid : {Academic_year}") break # Exit the loop if the academic year is valid else: print("The academic year is not valid. Make sure to follow the requested format.") @@ -143,15 +159,15 @@ def register_student(data): else: print("The campus choice is not valid. Make sure to follow the requested format.") - register(data, Name, Surname, Date_of_birth, Place_of_birth, Address, Telephone, Email, Gender, Academic_year, Courses_and_grade, Campus) + register(data, Firstname, Lastname, Date_of_birth, Place_of_birth, Address, Telephone, Email, Gender, Academic_year, Courses_and_grade, Campus) -def register(data, name, surname, date_of_birth, place_of_birth, address, telephone, email, gender, academic_year, courses_and_grade, campus): - matricule = generate_matricule(name, surname, date_of_birth) +def register(data, firstname, lastname, date_of_birth, place_of_birth, address, telephone, email, gender, academic_year, courses_and_grade, campus): + matricule = generate_matricule(firstname, lastname, date_of_birth) student = { - "Name": name, - "Surname": surname, + "Name": firstname, + "Surname": lastname, "Date of Birth": date_of_birth, "Place of Birth": place_of_birth, "Address": address, @@ -173,10 +189,10 @@ def register(data, name, surname, date_of_birth, place_of_birth, address, teleph return -def generate_matricule(name, surname, date_of_birth): - consonants_name = ''.join([c for c in name if c.lower() not in 'aeiouy'])[:3] - consonants_surname = ''.join([c for c in surname if c.lower() not in 'aeiouy'])[:2] - last_consonant_surname = ''.join([c for c in surname if c.lower() not in 'aeiouy']).lower()[-1] # not sure if it's the consonant of the first name or the last name +def generate_matricule(firstname, lastname, date_of_birth): + consonants_name = ''.join([c for c in firstname if c.lower() not in 'aeiouy'])[:3] + consonants_surname = ''.join([c for c in lastname if c.lower() not in 'aeiouy'])[:2] + last_consonant_surname = ''.join([c for c in lastname if c.lower() not in 'aeiouy']).lower()[-1] # not sure if it's the consonant of the first name or the last name birth_year_last_two_digits = str(date_of_birth)[-2:] random_integer = random.randint(0, 10) matricule_e = f"{consonants_name}{consonants_surname}{last_consonant_surname}{birth_year_last_two_digits}{random_integer}" @@ -184,7 +200,7 @@ def generate_matricule(name, surname, date_of_birth): return matricule_e - +# MODIFYING THE DATA OF A STUDENT def modify(data): while True: matricule_to_modify = input("Enter the matricule of the student you want to modify (or 'q' to quit): ") @@ -192,146 +208,165 @@ def modify(data): print("Operation canceled.") break - student_index = data[data['Matricule'] == matricule_to_modify.lower()].index.tolist() + student_row = data[data['Matricule'] == matricule_to_modify.lower()] - if not student_index: + if student_row.empty: print("No student found with the specified matricule.") return - student_index = student_index[0] - print(f"\nModifying the student with matricule {matricule_to_modify}:\n") - print("1. Name") - print("2. Surname") - print("3. Date of Birth") - print("4. Place of Birth") - print("5. Address") - print("6. Telephone") - print("7. Email") - print("8. Sex (M | F | O)") - print("9. Academic Year") - print("10. Curriculum") - print("11. Courses already passed and their grade") - print("12. Campus") - - field_to_modify = int(input("Enter the number of the field you want to modify: ")) - - field_name_to_modify = field_mapping.get(field_to_modify, None) - print(f"You are modifying the field: {field_name_to_modify}") - - if field_to_modify == 1: # If the field to modify is the name (Name) - while True: - name = input("What is the name you want to modify? ") - if name_pattern.match(name): - print("The name is valid.") - data.at[student_index, 'Name'] = name - break # Exit the loop if the name is valid - else: - print("The name is not valid. Make sure to follow the specified format.") - elif field_to_modify == 2: - while True: # Ask the user for the surname - surname = input("What is the surname? ") - if name_pattern.match(surname): - print("The surname is valid.") - data.at[student_index, 'Surname'] = surname - break # Exit the loop if the surname is valid - else: - print("The surname is not valid. Make sure to follow the specified format.") - elif field_to_modify == 3: - while True: - date_of_birth = input("Please enter a date in the format dd/mm/yyyy: ") - if date_pattern.match(date_of_birth): - print("The date is valid.") - data.at[student_index, 'Date of Birth'] = date_of_birth - break # Exit the loop if the date is valid - else: - print("The date is not valid. Make sure to follow the format dd/mm/yyyy.") - elif field_to_modify == 4: - while True: - place_of_birth = input("What is the city of birth? ") - if place_of_birth_pattern.match(place_of_birth): - print("The city of birth is valid.") - data.at[student_index, 'Place of Birth'] = place_of_birth - break # Exit the loop if the city of birth is valid - else: - print("The city of birth is not valid. Make sure to use only letters and spaces.") - elif field_to_modify == 5: - while True: - address = input("Please enter an address in the format 'street number, city': ") - if address_pattern.match(address): - print("The address is valid.") - data.at[student_index, 'Address'] = address - break # Exit the loop if the address is valid - else: - print("The address is not valid. Make sure to follow the format 'street number, city'.") - elif field_to_modify == 6: - while True: - telephone = input("What is the telephone number? (in the format 000/00.00.00) ") - if telephone_pattern.match(telephone): - print("The telephone number is valid.") - data.at[student_index, 'Telephone'] = telephone - break # Exit the loop if the telephone number is valid - else: - print("The telephone number is not valid. Make sure to follow the requested format.") - elif field_to_modify == 7: - while True: - email = input("Enter the university email (@student.uclouvain.be): ") - if email_pattern.match(email): - print("The email is valid.") - data.at[student_index, 'Email'] = email - break # Exit the loop if the email is valid - else: - print("The email is not valid. Make sure to follow the requested format.") - elif field_to_modify == 8: - while True: - gender = input("What is your gender? (For Male enter M, for Female enter F, and for other type enter O): ") - if gender_pattern.match(gender): - print("The gender is valid.") - data.at[student_index, 'Gender'] = gender - break # Exit the loop if the gender is valid - else: - print("The gender is not valid. Make sure to follow the requested format.") - elif field_to_modify == 9: - while True: - academic_year = input("What is your academic year? (BAC1/BAC2/BAC3/MA1/MA2): ") - if academic_year_pattern.match(academic_year): - print("The academic year is valid.") - data.at[student_index, 'Academic Year'] = academic_year - break # Exit the loop if the academic year is valid - else: - print("The academic year is not valid. Make sure to follow the requested format.") - elif field_to_modify == 11: # Courses and grades - print("Courses already passed and their grade:\n") - for course, grade in data.iloc[student_index].items(): - if course not in field_mapping.values(): - print(f"{course}: {grade}") - - while True: - course_to_modify = input("Enter the course you want to modify: ") - if course_to_modify in data.columns: # The course has been found, you can continue with the rest of your code - print("The specified course has been found.") - break # Exit the loop since the course has been found - else: - print("The specified course has not been found. Please select a new one.") - - new_grade = input(f"Enter the new grade for {course_to_modify}: ") - while not new_grade.isdigit() or int(new_grade) not in range(0, 21): - print("The grade must be an integer between 0 and 20.") + print("\nDetails of the student before modification:") + print(student_row[['Matricule', 'Firstname', 'Lastname']]) + + confirmation = input("Do you really want to modify this student? (YES/NO) ").upper() + if confirmation == "YES": + student_index = student_row.index[0] + + print(f"\nModifying the student with matricule {matricule_to_modify}:\n") + print("1. Firstname") + print("2. Lastname") + print("3. Date of Birth") + print("4. Place of Birth") + print("5. Address") + print("6. Telephone") + print("7. Email") + print("8. Sex (M | F | O)") + print("9. Academic Year") + print("10. Curriculum") + print("11. Courses already passed and their grade") + print("12. Campus") + + field_to_modify = int(input("Enter the number of the field you want to modify: ")) + + field_name_to_modify = field_mapping.get(field_to_modify, None) + print(f"You are modifying the field: {field_name_to_modify}") + + if field_to_modify == 1: # If the field to modify is the name (Name) + while True: + firstname = input("What is the name you want to modify? ") + if name_pattern.match(firstname): + print(f"The firstname is valid : {firstname}") + if field_to_modify in (1, 2, 3): + matricule = generate_matricule(firstname, data.at[student_index, 'Lastname'], data.at[student_index, 'Date of Birth']) + data.at[student_index, 'Firstame'] = firstname + break # Exit the loop if the name is valid + else: + print("The name is not valid. Make sure to follow the specified format.") + elif field_to_modify == 2: + while True: # Ask the user for the surname + lastname = input("What is the surname? ") + if name_pattern.match(lastname): + print(f"The lastname is valid : {lastname}") + if field_to_modify in (1, 2, 3): + matricule = generate_matricule(data.at[student_index, 'Firstname'], lastname, data.at[student_index, 'Date of Birth']) + data.at[student_index, 'Lastname'] = lastname + break # Exit the loop if the surname is valid + else: + print("The surname is not valid. Make sure to follow the specified format.") + elif field_to_modify == 3: + while True: + date_of_birth = input("Please enter a date in the format dd/mm/yyyy: ") + if date_pattern.match(date_of_birth): + print(f"The date is valid : {date_of_birth}") + if field_to_modify in (1, 2, 3): + matricule = generate_matricule(data.at[student_index, 'Firstname'], data.at[student_index, 'Lastname'], date_of_birth) + data.at[student_index, 'Date of Birth'] = date_of_birth + break # Exit the loop if the date is valid + else: + print("The date is not valid. Make sure to follow the format dd/mm/yyyy.") + elif field_to_modify == 4: + while True: + place_of_birth = input("What is the city of birth? ") + if place_of_birth_pattern.match(place_of_birth): + print(f"The city of birth is valid : {place_of_birth}") + data.at[student_index, 'Place of Birth'] = place_of_birth + break # Exit the loop if the city of birth is valid + else: + print("The city of birth is not valid. Make sure to use only letters and spaces.") + elif field_to_modify == 5: + while True: + address = input("Please enter an address in the format 'street number, city': ") + if address_pattern.match(address): + print(f"The address is valid : {address}") + data.at[student_index, 'Address'] = address + break # Exit the loop if the address is valid + else: + print("The address is not valid. Make sure to follow the format 'street number, city'.") + elif field_to_modify == 6: + while True: + telephone = input("What is the telephone number? (in the format 000/00.00.00) ") + if telephone_pattern.match(telephone): + print(f"The telephone number is valid : {telephone}") + data.at[student_index, 'Telephone'] = telephone + break # Exit the loop if the telephone number is valid + else: + print("The telephone number is not valid. Make sure to follow the requested format.") + elif field_to_modify == 7: + while True: + email = input("Enter the university email (@student.uclouvain.be): ") + if email_pattern.match(email): + print(f"The email is valid : {email}") + data.at[student_index, 'Email'] = email + break # Exit the loop if the email is valid + else: + print("The email is not valid. Make sure to follow the requested format.") + elif field_to_modify == 8: + while True: + gender = input("What is your gender? (For Male enter M, for Female enter F, and for other type enter O): ") + if gender_pattern.match(gender): + print(f"The gender is valid : {gender}") + data.at[student_index, 'Gender'] = gender + break # Exit the loop if the gender is valid + else: + print("The gender is not valid. Make sure to follow the requested format.") + elif field_to_modify == 9: + while True: + academic_year = input("What is your academic year? (BAC1/BAC2/BAC3/MA1/MA2): ") + if academic_year_pattern.match(academic_year): + print(f"The academic year is valid : {academic_year}") + data.at[student_index, 'Academic Year'] = academic_year + break # Exit the loop if the academic year is valid + else: + print("The academic year is not valid. Make sure to follow the requested format.") + elif field_to_modify == 11: # Courses and grades + print("Courses already passed and their grade:\n") + for course, grade in data.iloc[student_index].items(): + if course not in field_mapping.values(): + print(f"{course}: {grade}") + + while True: + course_to_modify = input("Enter the course you want to modify: ") + if course_to_modify in data.columns: # The course has been found, you can continue with the rest of your code + print("The specified course has been found.") + break # Exit the loop since the course has been found + else: + print("The specified course has not been found. Please select a new one.") + new_grade = input(f"Enter the new grade for {course_to_modify}: ") + while not new_grade.isdigit() or int(new_grade) not in range(0, 21): + print("The grade must be an integer between 0 and 20.") + new_grade = input(f"Enter the new grade for {course_to_modify}: ") + + # Update the grade + data.at[student_index, course_to_modify] = int(new_grade) + elif field_to_modify == 12: + while True: + campus = input("Enter 'Louvain-la-Neuve' or 'Mons' depending on the campus: ") + if campus_pattern.match(campus): + print(f"The campus choice is valid : {campus}") + data.at[student_index, 'Campus'] = campus + break # Exit the loop if the campus choice is valid + else: + print("The campus choice is not valid. Make sure to follow the requested format.") - # Update the grade - data.at[student_index, course_to_modify] = int(new_grade) - elif field_to_modify == 12: - while True: - campus = input("Enter 'Louvain-la-Neuve' or 'Mons' depending on the campus: ") - if campus_pattern.match(campus): - print("The campus choice is valid.") - data.at[student_index, 'Campus'] = campus - break # Exit the loop if the campus choice is valid - else: - print("The campus choice is not valid. Make sure to follow the requested format.") else: - new_value = input(f"Enter the new value for the selected field: ") - data.at[student_index, field_mapping[field_to_modify]] = new_value + print("Modification canceled.") + break # Exit the loop if modification is canceled + + data.at[student_index, 'Matricule'] = matricule # Update the Matricule column with the new matricule + + print("be careful because of a modification the registration number has changed :") + + print(f"the new matricule is : {matricule}") # Save the modified data to the Excel file data.to_excel(file_path, index=False) @@ -353,6 +388,7 @@ field_mapping = { } +# DELETION OF A STUDENT BASED ON HIS MATRICULE BECAUSE IT'S UNIQUE def delete(data): matricule_to_delete = input("Enter the matricule of the student you want to delete: ") student_index = data[data['Matricule'] == matricule_to_delete.lower()].index.tolist() @@ -380,104 +416,96 @@ def delete(data): print("Deletion canceled.") + # FIND def find_student(data): - search_criteria = input("Enter the search criteria (Name/Surname/Matricule): ").capitalize() - if search_criteria == "Name": - name_search = input("Enter the name of the student: ") - results = data[data['Name'].str.contains(name_search, case=False, na=False)] - elif search_criteria == "Surname": - surname_search = input("Enter the surname of the student: ") - results = data[data['Surname'].str.contains(surname_search, case=False, na=False)] - elif search_criteria == "Matricule": - matricule_search = input("Enter the matricule of the student: ") - results = data[data['Matricule'].str.contains(matricule_search, case=False, na=False)] + print("Below the search criteria : ") + print("1. By his/her lastname") + print("2. By his/her firstname") + print("3. By his/her matricule") + + search_criteria = input("Enter the number of what you want to do: ") + + if search_criteria == "1": + surname_search = input("Enter the lastname of the student: ") + results = data[data['Lastname'].str.contains(surname_search, case=False, na=False)] + elif search_criteria == "2": + name_search = input("Enter the firstname of the student: ") + results = data[data['Firstname'].str.contains(name_search, case=False, na=False)] + elif search_criteria == "3": + matricule_search = input("Enter the matricule of the student: ") + results = data[data['Matricule'].str.contains(matricule_search, case=False, na=False)] else: - print("Invalid search criteria.") - return + print("Invalid search criteria.") + return if results.empty: print("No student found with the specified criteria.") else: print("Student(s) found:") for index, row in results.iterrows(): - print(f"Name: {row['Name']}, Surname: {row['Surname']}, Matricule: {row['Matricule']}") + print(f"Firstname: {row['Firstname']}, Lastname: {row['Lastname']}, Matricule: {row['Matricule']}") + # SHOW def filter_students(data): if data.empty: print("The list of students is empty.") else: - print("\nList of students:") + table_data = [] for index, row in data.iterrows(): - print(f"Name: {row['Name']}, Surname: {row['Surname']}, Matricule: {row['Matricule']}") + table_data.append([row['Firstname'], row['Lastname'], row['Matricule']]) + headers = ["Firstname", "Lastname", "Matricule"] + print(tabulate(table_data, headers=headers, tablefmt="pretty")) + + export_choice = input("Do you want to export the list to an Excel file? (yes/no): ").lower() + if export_choice == "yes": + export_to_excel(data) + read_choice = input("Do you want to read the exported list from an Excel file? (yes/no): ").lower() + if read_choice == "yes": + read_exported_list() -# Using the function export_filtered_student_list_to_excel -# export_filtered_student_list_to_excel(data, 'filtered_student_list.xlsx') +def export_to_excel(data): + excel_filename = input("Enter the name of the Excel file (without extension): ") + excel_filename += ".xlsx" -""" -print('To filter students, enter SCREEN') -print('To export the list to an Excel document, enter EXPORT') -print('To read the list, enter READ') -choice = input("") -if choice == "SCREEN": - filter_students(data) -elif choice == "EXPORT": - export(data) -elif choice == "READ": - read(data) -""" - -def filter_students(data): - show_list = input("Do you want to see the list of students? YES/NO") - if show_list == "YES": - for index, row in data.iterrows(): - print(f"Name: {row['Name']}, Surname: {row['Surname']}, Matricule: {row['Matricule']}") - - export_choice = input("Do you want to export the list? YES/NO") - - if export_choice == "YES": - try: - data.to_excel(excel_file_path, index=False) - print(f"The list of students has been successfully exported to {excel_file_path}.") - except Exception as e: - print(f"Error exporting to Excel: {e}") - - read_choice = input("Do you want to read the exported list? YES/NO") - - if read_choice == "YES": - try: - os.system(f"start excel {excel_file_path}") - except Exception as e: - print(f"Error opening the Excel file: {e}") - return open_excel(excel_file_path) + try: + data.to_excel(excel_filename, index=False) + print(f"List successfully exported to {excel_filename}.") + except Exception as e: + print(f"An error occurred during export: {e}") - return - return +def read_exported_list(): + excel_filename = input("Enter the name of the Excel file to read (include .xlsx extension): ") -def open_excel(excel_file_path): try: - os.system(f"start excel {excel_file_path}") + exported_data = pd.read_excel(excel_filename) + print("\nExported List:") + print(exported_data) + print("\nExported list successfully read from Excel.") + except FileNotFoundError: + print(f"File not found: {excel_filename}") except Exception as e: - print(f"Error opening the Excel file: {e}") + print(f"An error occurred during reading: {e}") + -# SORTING +# SORTING def sort(data): - print('1. Sort in ascending alphabetical order') - print('2. Sort in descending alphabetical order') - print('3. Sort by date of birth') - print('4. Sort by age') - print('5. Sort by matricule') - print('6. Sort by academic year') - print('7. Get all people who passed a course') - print('8. Get all people who failed a course') - print('9. Get all Bachelor students') + print('1. Sort in ascending alphabetical order') + print('2. Sort in descending alphabetical order') + print('3. Sort by date of birth') + print('4. Sort by age') + print('5. Sort by matricule') + print('6. Sort by academic year') + print('7. Get all people who passed a course') + print('8. Get all people who failed a course') + print('9. Get all Bachelor students') print('10. Get all Master students') - sorting_choice = input("") + sorting_choice = input("Enter the number of what you want to do: ") if sorting_choice == "1": sort_ascending(data) elif sorting_choice == "2": @@ -501,24 +529,107 @@ def sort(data): return def sort_ascending(data): - if 'Name' not in data.columns: - print("The 'Name' column does not exist in the DataFrame.") - return + sorted_data = data.sort_values(by='Firstname', ascending=True) + see_the_data(sorted_data, columns_to_show=['Firstname', 'Lastname', 'Matricule']) + export_option(sorted_data) + +def sort_descending(data): + sorted_data = data.sort_values(by='Firstname', ascending=False) + see_the_data(sorted_data, columns_to_show=['Firstname', 'Lastname', 'Matricule']) + export_option(sorted_data) + +def sort_by_date(data): + sorted_data = data.sort_values(by='Date of Birth') + see_the_data(sorted_data, columns_to_show=['Firstname', 'Lastname', 'Date of Birth']) + export_option(sorted_data) + +def sort_by_age(data): + data['Age'] = (pd.to_datetime('today') - pd.to_datetime(data['Date of Birth'])).astype('<m8[Y]') + sorted_data = data.sort_values(by='Age', ascending=True) + see_the_data(sorted_data, columns_to_show=['Firstname', 'Lastname', 'Age']) + export_option(sorted_data) + + + + +def sort_by_matricule(data): + sorted_data = data.sort_values(by='Matricule', ascending=True) + see_the_data(sorted_data, columns_to_show=['Firstname', 'Lastname', 'Matricule']) + export_option(sorted_data) + +def sort_by_academic_year(data): + sorted_data = data.sort_values(by='AcademicYear', ascending=True) + see_the_data(sorted_data, columns_to_show=['Firstname', 'Lastname', 'AcademicYear']) + export_option(sorted_data) + + + + +# attention il faut pouvoir matcher ceci avec les résultats obtenus +def sort_passed(data): + passed_data = data[data['PassedCourse'] == True] + see_the_data(passed_data, columns_to_show=['Firstname', 'Lastname', 'PassedCourse']) + export_option(passed_data) + +def sort_failed(data): + failed_data = data[data['PassedCourse'] == False] + see_the_data(failed_data, columns_to_show=['Firstname', 'Lastname', 'PassedCourse']) + export_option(failed_data) + + + + + +def sort_bachelor(data): + bachelor_data = data[data['Academic Year'] == 'BAC1' or 'BAC2' or 'BAC3'] + see_the_data(bachelor_data, columns_to_show=['Firstname', 'Lastname', 'Academic Year']) + export_option(bachelor_data) + +def sort_master(data): + master_data = data[data['Academic Year'] == 'MA1' or 'MA2'] + see_the_data(master_data, columns_to_show=['Firstname', 'Lastname', 'Academic Year']) + export_option(master_data) + +# export the data into an excel +def export_option(data): + export = input("Do you want to export in a file? (YES/NO) ").upper() + if export == "YES": + filename = input("Enter the filename: ") + filename = filename + '.xlsx' + export_data_to_excel(data, filename) + +def export_data_to_excel(data, filename): + data.to_excel(filename, index=False) + print(f"\nData exported to {filename}") + +# see the data needed +def see_the_data(data, columns_to_show=None): + if columns_to_show is None: + columns_to_show = data.columns + + data_to_show = data[columns_to_show] + table = tabulate(data_to_show, headers='keys', tablefmt='grid') + print(table) - # Sort the DataFrame by the 'Name' column - sorted_data = data.sort_values(by='Name', ascending=True) - # Display the sorted list - print("\nList of students sorted in alphabetical order (ascending):") - for index, row in sorted_data.iterrows(): - print(f"Name: {row['Name']}, Surname: {row['Surname']}, Matricule: {row['Matricule']}") # Example usage # Replace 'data' with the name of your DataFrame + + + + + + + + + + + # STATS -def statistics(data): +def statistics_analysis(data): print('1. Get basic statistics') print('2. Get all student grades') print('3. Get all grades for a course') @@ -649,7 +760,7 @@ def export_stats(data): # Action def action(): - print("What do you want to do?\n Below, you will find what is possible followed by the commands to type.\n") + print("What do you want to do?\nBelow, you will find what is possible followed by the commands to type.\n") print("1. Register a student") print("2. Modify one or more fields") print("3. Delete a student") @@ -678,11 +789,11 @@ def action(): elif command == "4": find_student(data) elif command == "5": - show(data) + filter_students(data) elif command == "6": sort(data) elif command == "7": - statistics(data) + statistics_analysis(data) elif command == "8": return False diff --git a/projet_personnel/algorithme_student_generate.py b/projet_personnel/algorithme_student_generate.py index 098b34b..b37fb2c 100644 --- a/projet_personnel/algorithme_student_generate.py +++ b/projet_personnel/algorithme_student_generate.py @@ -184,7 +184,7 @@ for each in range(number_of_students): # générer des données grades[courses] = random.randint(0, 20) - data_generated.append({"Name": last_name, "Surname": first_name, "Academic Year" : academic_year, "Place of Birth" : city_of_birth , "Telephone": phone, "Address": adress_of_student, "Genre" : gender_of_student, "Email" : email_formated, "Campus" : campus, "Date of Birth" : complete_date_of_birth, "Matricule" : matricule, **grades}) + data_generated.append({"Firstname": last_name, "Lastname": first_name, "Academic Year" : academic_year, "Place of Birth" : city_of_birth , "Telephone": phone, "Address": adress_of_student, "Genre" : gender_of_student, "Email" : email_formated, "Campus" : campus, "Date of Birth" : complete_date_of_birth, "Matricule" : matricule, **grades}) # génération de données qui ne peuvent pas se ressembler -- GitLab