Python code for Data Analysis Tool in excel
Python code for Data Analysis Tool in excel
def create_class_assessment_tool(output_file="Class_Assessment_Tool.xlsx"):
"""Create an Excel class assessment tool with three sheets for data entry,
analysis, and dashboard."""
# Create sheets
mark_sheet = wb.active
mark_sheet.title = "Mark Schedule"
summary_sheet = wb.create_sheet("Summary Analysis")
dashboard_sheet = wb.create_sheet("Dashboard")
return output_file
def setup_mark_schedule(ws):
"""Set up the Mark Schedule sheet with headers, formulas, and formatting."""
# Set column widths
ws.column_dimensions['A'].width = 5 # SN
ws.column_dimensions['B'].width = 30 # Name
ws.column_dimensions['C'].width = 8 # Sex
ws.column_dimensions['D'].width = 15 # Assessment 1
ws.column_dimensions['E'].width = 15 # Assessment 2
ws.column_dimensions['F'].width = 15 # Assessment 3
ws.column_dimensions['G'].width = 15 # Average
ws.column_dimensions['H'].width = 12 # Grade
ws.column_dimensions['I'].width = 18 # Remark
# Add title
ws.merge_cells('A1:I1')
ws['A1'] = "CLASS ASSESSMENT RECORD"
ws['A1'].font = Font(size=16, bold=True)
ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
ws.row_dimensions[1].height = 30
# Set up headers
headers = ["SN", "Name", "Sex", "Assessment 1", "Assessment 2", "Assessment 3",
"Average", "Grade", "Remark"]
for col, header in enumerate(headers, 1):
cell = ws.cell(row=4, column=col)
cell.value = header
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center')
cell.fill = PatternFill(start_color="D3D3D3", end_color="D3D3D3",
fill_type="solid")
# Add formulas
# Average formula
avg_cell = ws.cell(row=row, column=7)
avg_cell.value = f'=IF(COUNTA(D{row}:F{row})=0,"",AVERAGE(D{row}:F{row}))'
avg_cell.number_format = '0.00'
# Grade formula
grade_cell = ws.cell(row=row, column=8)
grade_cell.value =
(f'=IF(G{row}="","",IF(G{row}>=75,"ONE",IF(G{row}>=70,"TWO",'
f'IF(G{row}>=65,"THREE",IF(G{row}>=60,"FOUR",IF(G{row}>=55,"FIVE",'
f'IF(G{row}>=50,"SIX",IF(G{row}>=45,"SEVEN",IF(G{row}>=40,"EIGHT",'
f'IF(G{row}>=0,"NINE","X"))))))))))')
# Remark formula
remark_cell = ws.cell(row=row, column=9)
remark_cell.value =
(f'=IF(H{row}="","",IF(H{row}="X","ABSENT",IF(H{row}="NINE","UNSATISFACTORY",'
f'IF(OR(H{row}="SEVEN",H{row}="EIGHT"),"SATISFACTORY",'
f'IF(OR(H{row}="FIVE",H{row}="SIX"),"CREDIT",'
f'IF(OR(H{row}="THREE",H{row}="FOUR"),"MERIT","DISTINCTION"))))))')
fill=PatternFill(start_color=colors['DISTINCTION'],
end_color=colors['DISTINCTION'],
fill_type='solid')))
ws.conditional_formatting.add(f'H5:H104',
FormulaRule(formula=['OR(H5="THREE",H5="FOUR")'],
fill=PatternFill(start_color=colors['MERIT'],
end_color=colors['MERIT'],
fill_type='solid')))
ws.conditional_formatting.add(f'H5:H104',
FormulaRule(formula=['OR(H5="FIVE",H5="SIX")'],
fill=PatternFill(start_color=colors['CREDIT'],
end_color=colors['CREDIT'],
fill_type='solid')))
ws.conditional_formatting.add(f'H5:H104',
FormulaRule(formula=['OR(H5="SEVEN",H5="EIGHT")'],
fill=PatternFill(start_color=colors['SATISFACTORY'],
end_color=colors['SATISFACTORY'],
fill_type='solid')))
ws.conditional_formatting.add(f'H5:H104',
FormulaRule(formula=['H5="NINE"'],
fill=PatternFill(start_color=colors['UNSATISFACTORY'],
end_color=colors['UNSATISFACTORY'],
fill_type='solid')))
ws.conditional_formatting.add(f'H5:H104',
FormulaRule(formula=['H5="X"'],
fill=PatternFill(start_color=colors['ABSENT'],
end_color=colors['ABSENT'],
fill_type='solid')))
fill=PatternFill(start_color=colors['DISTINCTION'],
end_color=colors['DISTINCTION'],
fill_type='solid')))
ws.conditional_formatting.add(f'I5:I104',
FormulaRule(formula=['I5="MERIT"'],
fill=PatternFill(start_color=colors['MERIT'],
end_color=colors['MERIT'],
fill_type='solid')))
ws.conditional_formatting.add(f'I5:I104',
FormulaRule(formula=['I5="CREDIT"'],
fill=PatternFill(start_color=colors['CREDIT'],
end_color=colors['CREDIT'],
fill_type='solid')))
ws.conditional_formatting.add(f'I5:I104',
FormulaRule(formula=['I5="SATISFACTORY"'],
fill=PatternFill(start_color=colors['SATISFACTORY'],
end_color=colors['SATISFACTORY'],
fill_type='solid')))
ws.conditional_formatting.add(f'I5:I104',
FormulaRule(formula=['I5="UNSATISFACTORY"'],
fill=PatternFill(start_color=colors['UNSATISFACTORY'],
end_color=colors['UNSATISFACTORY'],
fill_type='solid')))
ws.conditional_formatting.add(f'I5:I104',
FormulaRule(formula=['I5="ABSENT"'],
fill=PatternFill(start_color=colors['ABSENT'],
end_color=colors['ABSENT'],
fill_type='solid')))
# Add title
ws.merge_cells('A1:G1')
ws['A1'] = "SUMMARY ANALYSIS"
ws['A1'].font = Font(size=16, bold=True)
ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
ws.row_dimensions[1].height = 30
if grade != "TOTAL":
# Male Count
ws.cell(row=row_num, column=2).value = f'=COUNTIFS(\'Mark Schedule\'!
$C$5:$C$104,"M",\'Mark Schedule\'!$H$5:$H$104,"{grade}")'
# Male Percentage
ws.cell(row=row_num, column=3).value = f'=IF(COUNTIF(\'Mark Schedule\'!
$C$5:$C$104,"M")=0,0,B{row_num}/COUNTIF(\'Mark Schedule\'!$C$5:$C$104,"M"))'
ws.cell(row=row_num, column=3).number_format = '0.00%'
# Female Count
ws.cell(row=row_num, column=4).value = f'=COUNTIFS(\'Mark Schedule\'!
$C$5:$C$104,"F",\'Mark Schedule\'!$H$5:$H$104,"{grade}")'
# Female Percentage
ws.cell(row=row_num, column=5).value = f'=IF(COUNTIF(\'Mark Schedule\'!
$C$5:$C$104,"F")=0,0,D{row_num}/COUNTIF(\'Mark Schedule\'!$C$5:$C$104,"F"))'
ws.cell(row=row_num, column=5).number_format = '0.00%'
# Total Count
ws.cell(row=row_num, column=6).value = f'=B{row_num}+D{row_num}'
# Total Percentage
ws.cell(row=row_num, column=7).value = f'=IF(COUNT(\'Mark Schedule\'!
$C$5:$C$104)=0,0,F{row_num}/COUNT(\'Mark Schedule\'!$C$5:$C$104))'
ws.cell(row=row_num, column=7).number_format = '0.00%'
else:
# Total row calculations
ws.cell(row=row_num, column=2).value = f'=SUM(B6:B15)'
ws.cell(row=row_num, column=3).value = f'=IF(COUNTIF(\'Mark Schedule\'!
$C$5:$C$104,"M")=0,0,B{row_num}/COUNTIF(\'Mark Schedule\'!$C$5:$C$104,"M"))'
ws.cell(row=row_num, column=3).number_format = '0.00%'
if category != "TOTAL":
# Male Count
ws.cell(row=row_num, column=2).value = f'=COUNTIFS(\'Mark Schedule\'!
$C$5:$C$104,"M",\'Mark Schedule\'!$I$5:$I$104,"{category}")'
# Male Percentage
ws.cell(row=row_num, column=3).value = f'=IF(COUNTIF(\'Mark Schedule\'!
$C$5:$C$104,"M")=0,0,B{row_num}/COUNTIF(\'Mark Schedule\'!$C$5:$C$104,"M"))'
ws.cell(row=row_num, column=3).number_format = '0.00%'
# Female Count
ws.cell(row=row_num, column=4).value = f'=COUNTIFS(\'Mark Schedule\'!
$C$5:$C$104,"F",\'Mark Schedule\'!$I$5:$I$104,"{category}")'
# Female Percentage
ws.cell(row=row_num, column=5).value = f'=IF(COUNTIF(\'Mark Schedule\'!
$C$5:$C$104,"F")=0,0,D{row_num}/COUNTIF(\'Mark Schedule\'!$C$5:$C$104,"F"))'
ws.cell(row=row_num, column=5).number_format = '0.00%'
# Total Count
ws.cell(row=row_num, column=6).value = f'=B{row_num}+D{row_num}'
# Total Percentage
ws.cell(row=row_num, column=7).value = f'=IF(COUNT(\'Mark Schedule\'!
$C$5:$C$104)=0,0,F{row_num}/COUNT(\'Mark Schedule\'!$C$5:$C$104))'
ws.cell(row=row_num, column=7).number_format = '0.00%'
else:
# Total row calculations
ws.cell(row=row_num, column=2).value = f'=SUM(B20:B25)'
ws.cell(row=row_num, column=3).value = f'=IF(COUNTIF(\'Mark Schedule\'!
$C$5:$C$104,"M")=0,0,B{row_num}/COUNTIF(\'Mark Schedule\'!$C$5:$C$104,"M"))'
ws.cell(row=row_num, column=3).number_format = '0.00%'
# Add title
ws.merge_cells('A1:G1')
ws['A1'] = "DASHBOARD"
ws['A1'].font = Font(size=16, bold=True)
ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
ws.row_dimensions[1].height = 30
# Scorecard/KPI Section
ws['A4'] = "Scorecard/KPI Section"
ws['A4'].font = Font(bold=True)
chart1.add_data(data, titles_from_data=True)
chart1.set_categories(cats)
chart2.add_data(data, titles_from_data=True)
chart2.set_categories(labels)
chart3.add_data(data, titles_from_data=True)
chart3.set_categories(labels)
chart4.add_data(data, titles_from_data=True)
chart4.set_categories(labels)
def setup_instructions(ws):
"""Set up the Instructions sheet with user guidance."""
# Set column widths
ws.column_dimensions['A'].width = 100
# Add title
ws.merge_cells('A1:A2')
ws['A1'] = "INSTRUCTIONS FOR USING THE CLASS ASSESSMENT TOOL"
ws['A1'].font = Font(size=16, bold=True)
ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
ws.row_dimensions[1].height = 30
# Add instructions
instructions = [
"1. Enter student data in the 'Mark Schedule' sheet.",
"2. Ensure that the 'Sex' column contains only 'M' or 'F'.",
"3. Ensure that assessment scores are between 0 and 100.",
"4. The 'Average', 'Grade', and 'Remark' columns will be automatically
calculated.",
"5. View summary statistics and analysis in the 'Summary Analysis' sheet.",
"6. View visual representations of the data in the 'Dashboard' sheet.",
"7. Do not modify cells with formulas or conditional formatting.",
"8. Save the file after entering data to preserve changes."
]