From bb08ac2cabb2ccc5a682b15d1acf8dfecc010371 Mon Sep 17 00:00:00 2001 From: Collins Muneria Date: Sun, 15 Jun 2025 16:24:48 +0300 Subject: [PATCH] Add minimart project: SQL + Python + CSVs --- month1_student_management/main.py | 24 +--- month1_student_management/student_data.py | 107 +++++++++++++++--- .../report_generator.cpython-313.pyc | Bin 0 -> 1321 bytes .../python/__pycache__/utils.cpython-313.pyc | Bin 0 -> 2000 bytes month2_minimart_analysis/python/customers.csv | 11 ++ month2_minimart_analysis/python/main.py | 11 +- .../python/order_items.csv | 11 ++ month2_minimart_analysis/python/orders.csv | 11 ++ month2_minimart_analysis/python/products.csv | 11 ++ .../python/report_generator.py | 20 +++- month2_minimart_analysis/python/utils.py | 34 +++++- month2_minimart_analysis/sql/Script-18.sql | 0 month2_minimart_analysis/sql/Script-19.sql | 0 month2_minimart_analysis/sql/Script-20.sql | 0 month2_minimart_analysis/sql/Script-21.sql | 0 month2_minimart_analysis/sql/Script-22.sql | 0 month2_minimart_analysis/sql/Script-23.sql | 0 month2_minimart_analysis/sql/Script-24.sql | 0 month2_minimart_analysis/sql/Script-25.sql | 0 month2_minimart_analysis/sql/Script-6.sql | 0 .../sql/create_tables.sql | 1 - month2_minimart_analysis/sql/insert_data.sql | 1 - month2_minimart_analysis/sql/queries.sql | 1 - 23 files changed, 201 insertions(+), 42 deletions(-) create mode 100644 month2_minimart_analysis/python/__pycache__/report_generator.cpython-313.pyc create mode 100644 month2_minimart_analysis/python/__pycache__/utils.cpython-313.pyc create mode 100644 month2_minimart_analysis/python/customers.csv create mode 100644 month2_minimart_analysis/python/order_items.csv create mode 100644 month2_minimart_analysis/python/orders.csv create mode 100644 month2_minimart_analysis/python/products.csv create mode 100644 month2_minimart_analysis/sql/Script-18.sql create mode 100644 month2_minimart_analysis/sql/Script-19.sql create mode 100644 month2_minimart_analysis/sql/Script-20.sql create mode 100644 month2_minimart_analysis/sql/Script-21.sql create mode 100644 month2_minimart_analysis/sql/Script-22.sql create mode 100644 month2_minimart_analysis/sql/Script-23.sql create mode 100644 month2_minimart_analysis/sql/Script-24.sql create mode 100644 month2_minimart_analysis/sql/Script-25.sql create mode 100644 month2_minimart_analysis/sql/Script-6.sql delete mode 100644 month2_minimart_analysis/sql/create_tables.sql delete mode 100644 month2_minimart_analysis/sql/insert_data.sql delete mode 100644 month2_minimart_analysis/sql/queries.sql diff --git a/month1_student_management/main.py b/month1_student_management/main.py index 2ce37ee..aacac6d 100644 --- a/month1_student_management/main.py +++ b/month1_student_management/main.py @@ -1,20 +1,4 @@ -# Entry point for the student management system -from student_data import students, add_student, view_students, get_average_grade - -print("📚 Welcome to the Student Record System") - -while True: - print("\n1. Add student\n2. View students\n3. Get average grade\n4. Exit") - choice = input("Choose an option: ") - - if choice == "1": - add_student() - elif choice == "2": - view_students() - elif choice == "3": - print(f"📊 Average Grade: {get_average_grade():.2f}") - elif choice == "4": - print("Goodbye!") - break - else: - print("Invalid option.") \ No newline at end of file +from student_data import main +if __name__ == "__main__": + main() + diff --git a/month1_student_management/student_data.py b/month1_student_management/student_data.py index 38ded7e..7bbb410 100644 --- a/month1_student_management/student_data.py +++ b/month1_student_management/student_data.py @@ -1,20 +1,95 @@ students = [] - def add_student(): - """ - TODO: Prompt the user to enter student name, age, and grade. - Append the student as a dictionary to the students list. - """ - pass - + while True: + name = input("Enter student name: ") + marks = int(input("Enter student marks: ")) + student = {"name": name, "marks":marks} + students.append(student) + print(f"{name} has been added.\n") + another = input("Do you want to add another student? (yes/no): ").strip().lower() + if another != "yes": + break def view_students(): - """ - TODO: Loop through the students list and print each student's info. - """ - pass + if len(students) == 0: + print("No students to display.\n") + else: + print("Student List:") + for student in students: + print(f"Name: {student['name']}, marks: {student['marks']}") + print() +def get_average_marks(): + if len(students) == 0: + print("No students to calculate average grade.\n") + return 0 + total_marks = sum(student['marks'] for student in students) + average_marks = total_marks / len(students) + return average_marks +def convert_marks_to_grade(mark): + if mark >= 90: + return "A" + elif mark >= 85: + return "A-" + elif mark >= 80: + return "B+" + elif mark >= 75: + return "B" + elif mark >= 70: + return "B-" + elif mark >= 65: + return "C+" + elif mark >= 60: + return "C" + elif mark >= 55: + return "C-" + elif mark >= 50: + return "D+" + elif mark >= 45: + return "D" + elif mark >= 40: + return "D-" + else: + return "F" +def show_class_statistics(): + if len(students) == 0: + print("No students to show statistics.\n") + return + average = get_average_marks() + average_grade = convert_marks_to_grade(average) + print("=== Class Statistics ===") + print(f"Total Students: {len(students)}") + print(f"Average Marks: {average:.2f} (Grade: {average_grade})") +def main(): + print("Welcome to Student Data Management System!") + while True: + print("\nMenu Options:") + print("1. Add Student") + print("2. View All Students") + print("3. Show Class Statistics") + print("4. Exit") + try: + choice = input("\nEnter your choice (1-4): ").strip() + if choice == "1": + add_student() + elif choice == "2": + view_students() + elif choice == "3": + show_class_statistics() + elif choice == "4": + print("Thank you for using Student Data Management System!") + print("Goodbye!") + break + else: + print("Invalid choice! Please enter a number between 1 and 4.\n") + + except KeyboardInterrupt: + print("\n\nProgram interrupted. Goodbye!") + break + except Exception as e: + print(f"An error occurred: {e}") + print("Please try again.\n") + +if __name__ == "__main__": + main() + -def get_average_grade(): - """ - TODO: Return the average grade of all students. - """ - pass \ No newline at end of file + \ No newline at end of file diff --git a/month2_minimart_analysis/python/__pycache__/report_generator.cpython-313.pyc b/month2_minimart_analysis/python/__pycache__/report_generator.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..327f995b57d46a7eb9c91657b786ab12f3f6d096 GIT binary patch literal 1321 zcmaJ>&2QT_6sN2YD|Vw6bM|Gqglw>w*J`ASRW&) zuFfg@4>n-Kt~t859ewO>JDTu80ee`mo_5RNe_)g?r$tiq0V4T+@A3D3k03RkpRWLJ z%AcD%S404w=g!PZ#bW#hU;GA4U<$VZ63kK^pwhO`693H;Ha)4x%O{zCoCl1574kin zXbL&R=Tbhm`M}rW;!9YEXP&g>0*E9_?BskW%#@akT~prIadh&+C+wJCwuFvyBFJ4! zFr|rZd1V~{Q@%P;-%(Fzno6D*DO_jubkr)DWmEmM^vW18=ki!ow#u*UQ9kZb%xk>1 z$NAH>k9$-t$x=JmEAE0fsq z1CO-k*xXD8W@;fEGi9O`vudH4z!0`cg|Iy3LhDS`82Kz5uL z6&BD`xx3 z=n?xtfG}xe7(z@SY8NoJ!#E;4SDc(FbP;jf$nExUfbFD5cH+oJFo`+54I?b}}< zP~+NQks51HuMLe`w6>Ae?$O%4VaKGkt-Ws!8;e<^O&jh0gF$`RXb&4V|Gw0IBKL#A zoxVK0v~eT?xqhgBnCaK4etq!PNdNNbd8&V#=_b|9k#1%BeX8Fd>CRAk=STs@#|OsJ zfpPV}vUEl{0+OtZd6%FiG9_^%-^Hwy_>&`e0?-8>K@C1Ibv5J{p$or27rC4NQgHr~ SjzmEao`Kp}IwvTT^#1`Y)KKjJ literal 0 HcmV?d00001 diff --git a/month2_minimart_analysis/python/__pycache__/utils.cpython-313.pyc b/month2_minimart_analysis/python/__pycache__/utils.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c52c870344d6452d5f111596140275b2828e0938 GIT binary patch literal 2000 zcmcH(OKcNI^zC}rvAye0oTLQehJ~h;42`MsAt(g`G<+gLM6-<=H7l)_-Ho%zUb{1E zs)UQh3AhBIB4R0$IrNZ99CGB)1HJUnldUaPSaPV;Q*JJ~R6TWO;|)ltQZGDd-kW*f zd7qixcsvFK#(tSu(m8-X=^=nfd$XHk03Lx1GIJFW<5L!~3OgGPRNv6q=$n18`wvYa zkiVfyc$CDV5Kz=1vxfjh|v!o?zu@jzxkZ$T6Py z=z=RJ0g$MOvOv$WIQ~6=@c{tg#C=YfdNWvnYX^Mpo*qB`Q=5B~aN|coP6QSSkduMG z1PpV*Jteqy3P1n}@=Tt|rgmr&Gdl6S52U^jB5U_7L64vx7TUQ2%%rP=M zNa{04x-&>FIsiwA=fjW>oe3R=MJCJ5>`>z!gP=TFK4ck>Uo4a~CmZsjWn}55iXG&M zhK2P~#dg%P?s&W}!1N-LBzd>=ab*sh2rK7}qGemeKyyk+nJnp*qG>x=!A`{>8`aPp zO)8_(O;dN2MGIkP5Sv94J0==zv$0Yv+0N3CN<9@d|L7HD+ykW4M{gHG6Z-<{pIw+9MzS?`$vl z?}wVm%xK$ZFcbFsjmN$dk9n{8h2DwBzSnr%JMlvE%=||q+yG?xnU%O+!A_}2MmMM9 zTPq@&L8GEOd#6|l8G$6}?^Vk&i@q=$_SmxFMUbf(Dlzrg685;V<}7*K&5~t%kqhVL zi|XXmY?kw)`%%0|5Wx%YdH003JYzaKBquD zVf{k=a_w?`x;Fi^cXPtceBq`ht5e&_&ehxZZ?6y4$7*Bs)3wu2Bbzz5@4TD5P`$Dp zPp&T9UszAq57Z9SGqubQOPiv5@QfQjTfMZM?tXmy;qmnw^?WT~FVqT8Pc=p_x&4>j z^p)z>Eus5KxFHNTxZz!L3-BVUTGT9CRd?v~*rAiVLx039>&4o6sun5Iw-wEHEN7YU zg`gBffVzq99_pv2GCTU`$k-0v>JKM@l4n21ka4L62OUfSKQD+V$^%^kG{;tk*4_RR-3l?P*3bH zKHM3uPPJ0dd1&p}Z>f*(a$7?3L98kCt!b`s_{ro(ra5r(*^w6mpFiiGf73j7z46uD zi*s`?#m+|e(B{Z9u{nIPF?8v9p&@_Wn7`4K^~S8xNSnWli?4a;{G` 4 or (item["product_id"] == 2 and item["quantity"] >= 3): + print(f"Large order alert: Product ID {item['product_id']} - Quantity {item['quantity']}") diff --git a/month2_minimart_analysis/sql/Script-18.sql b/month2_minimart_analysis/sql/Script-18.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-19.sql b/month2_minimart_analysis/sql/Script-19.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-20.sql b/month2_minimart_analysis/sql/Script-20.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-21.sql b/month2_minimart_analysis/sql/Script-21.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-22.sql b/month2_minimart_analysis/sql/Script-22.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-23.sql b/month2_minimart_analysis/sql/Script-23.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-24.sql b/month2_minimart_analysis/sql/Script-24.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-25.sql b/month2_minimart_analysis/sql/Script-25.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/Script-6.sql b/month2_minimart_analysis/sql/Script-6.sql new file mode 100644 index 0000000..e69de29 diff --git a/month2_minimart_analysis/sql/create_tables.sql b/month2_minimart_analysis/sql/create_tables.sql deleted file mode 100644 index 1411bac..0000000 --- a/month2_minimart_analysis/sql/create_tables.sql +++ /dev/null @@ -1 +0,0 @@ --- SQL script to create necessary tables diff --git a/month2_minimart_analysis/sql/insert_data.sql b/month2_minimart_analysis/sql/insert_data.sql deleted file mode 100644 index 97dc4da..0000000 --- a/month2_minimart_analysis/sql/insert_data.sql +++ /dev/null @@ -1 +0,0 @@ --- SQL script to insert sample data diff --git a/month2_minimart_analysis/sql/queries.sql b/month2_minimart_analysis/sql/queries.sql deleted file mode 100644 index 883d8ae..0000000 --- a/month2_minimart_analysis/sql/queries.sql +++ /dev/null @@ -1 +0,0 @@ --- SQL queries for retrieving insights