Spaces:
Runtime error
Runtime error
| from shiny import App, render, reactive,ui | |
| from shiny.ui import h2, tags | |
| from data_process import univ_reg_dict,topic_qlist_dict,qlist_qcontent_dict | |
| from data_process import univ_reg_display,qlist_qcontent_display | |
| from data_process import lea_display,topic_display | |
| from data_process import qlist_qcontent_inverse_dict_edu,qlist_qcontent_inverse_dict_prn,qlist_qcontent_inverse_dict_sp | |
| from data_process import edu_df,prn_df | |
| from data_process_func import * | |
| #from data_process_func import record_login | |
| from encrypto_file import checkpassword | |
| from data_process import lea_univ_dict | |
| import pandas as pd | |
| import io | |
| import csv | |
| import asyncio | |
| #import matplotlib.pyplot as plt | |
| from matplotlib import pyplot as plt | |
| from data_process import get_v_counts | |
| table_only = {'Q6','Q21','Q21_6_TEXT','Q139','Q139_6_TEXT','Q35','Q35_6_TEXT','Q219','Q219_6_TEXT','Q175','Q175_4_TEXT','Q218','Q218_4_TEXT','Q26','Q34','Q34_4_TEXT'} | |
| total_status = {"login":-1,"authlevel":-1} | |
| app_ui = ui.page_fluid( | |
| ui.panel_title("Login"), | |
| ui.row( | |
| ui.input_text("username","Username:",placeholder="username"), | |
| ui.input_password("password","Password:"), | |
| ui.input_action_button("submit","Log in/Log out",width='200px'), | |
| ui.output_text_verbatim("validate_pass",placeholder=True), | |
| ui.input_action_button("show_guide","Guideline",width='150px'), | |
| ), | |
| ui.panel_title("Main Page"), | |
| ui.row( | |
| ui.column( | |
| 3, | |
| ui.panel_well( | |
| ui.output_text("out_text1"), | |
| ui.input_radio_buttons("role","role:",{"principal":"Principal","educator":"Educator"}), | |
| ) | |
| ), | |
| ui.column( | |
| 3, | |
| ui.panel_well( | |
| ui.output_text("out_text2"), | |
| ) | |
| ), | |
| #ui.input_action_button("more_guide","Additional Guide",width='150px'), | |
| ui.column( | |
| 3, | |
| ui.panel_well( | |
| ui.output_text("out_text3"), | |
| ui.input_select("cate","Topic:",topic_display), | |
| ui.input_select("question","Question:",[]), | |
| ) | |
| ), | |
| ui.column( | |
| 3, | |
| ui.panel_well( | |
| ui.output_text("out_text4"), | |
| ui.download_button("save_fig","Download LEA figure",width='150px',len ='150px'), | |
| ui.download_button("save_fig_st","Download State figure",width='150px',len ='150px'), | |
| ui.output_text("out_text5"), | |
| ui.download_button("save_result","Download LEA table",width='150px'), | |
| ui.download_button("save_result_st","Download State table",width='150px'), | |
| ) | |
| ) | |
| ), | |
| ui.row( | |
| ui.column( | |
| 6, | |
| ui.panel_well( | |
| ui.panel_title("Selected LEA Result: "), | |
| ui.output_text("print_txt1"), | |
| ui.output_plot("plot_curr"), | |
| ui.output_text("print_txt2"), | |
| ui.output_table("print_table"), | |
| ) | |
| ), | |
| ui.column( | |
| 6, | |
| ui.panel_well( | |
| ui.panel_title("State Result: "), | |
| ui.output_text("print_txt3"), | |
| ui.output_plot("plot_curr_st"), | |
| ui.output_text("print_txt4"), | |
| ui.output_table("print_table_st"), | |
| ) | |
| ), | |
| ) | |
| ) | |
| def server(input, output, session): | |
| login_status = -1 | |
| log_role = "notset" | |
| correct_or_not = -1 | |
| lea_region = "notselected" | |
| choices = [0,0,0,0] | |
| value_counts = 0 | |
| # 0 means result of lea displayed | |
| # 1 means result of univ displayed | |
| lea_or_univ = 0 | |
| total_size = 0 | |
| display_text = "" | |
| displayed_table = pd.DataFrame() | |
| curr_fig = 0 | |
| file_name = "" | |
| def out_text1(): | |
| return "Choose Roles:" | |
| def out_text2(): | |
| return "Choose University/LEA Region:" | |
| def out_text3(): | |
| return "Choose Topic/Question:" | |
| def out_text4(): | |
| return "Click here to download the selected LEA/district figure shown below!" | |
| def out_text5(): | |
| return "Click here to download the selected LEA/district result table shown below!" | |
| def out_text6(): | |
| return "Click here to download the state result figure shown below!" | |
| def out_text7(): | |
| return "Click here to download the state result table shown below!" | |
| def validate_pass(): | |
| try: | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| except: | |
| pass | |
| if total_status["authlevel"] == -1: | |
| txt = "Please Log in first!!!" | |
| if total_status["authlevel"] == 1: | |
| txt = "Welcome, admin!" | |
| if total_status["authlevel"] ==2 : | |
| try: | |
| curr_lea = input.lea_region() | |
| except: | |
| curr_lea = "N/A" | |
| txt = "Welcome, LEA of "+ str(curr_lea) + " !" | |
| return txt | |
| def additional_guide(): | |
| m_2 = ui.modal("Log in to see!!!",title = "Guide",easy_close=True,footer=None,) | |
| ui.modal_show(m_2) | |
| def showguide(): | |
| m = ui.modal( | |
| "You need to login to see/save the figures and result tables. Once you logged out, you need to press 'F5' to refresh the page before login again!!! ", | |
| title="Brief guide", | |
| easy_close=True, | |
| footer=None, | |
| ) | |
| ui.modal_show(m) | |
| def submit(): | |
| nonlocal login_status | |
| nonlocal log_role | |
| global correct_or_not | |
| nonlocal choices | |
| #print(login_status) | |
| #log in! | |
| if login_status==-1: | |
| username = input.username() | |
| password = str(input.password()) | |
| correct_or_not = checkpassword(username,password) | |
| if correct_or_not ==1 or correct_or_not==2: | |
| ui.remove_ui(selector="div:has(> #username)") | |
| ui.remove_ui(selector="div:has(> #password)") | |
| login_status=1 | |
| log_role = username | |
| if correct_or_not ==1: | |
| total_status["login"]=1 | |
| total_status["authlevel"]=1 | |
| """ | |
| ui.insert_ui( | |
| ui.input_radio_buttons("role_select","role:",{"principal":"Principal","educator":"Educator"}), | |
| selector="#out_text1", | |
| where="afterEnd" | |
| ) | |
| """ | |
| ui.insert_ui( | |
| ui.input_select("lea_region","",[]), | |
| selector="#out_text2", | |
| where="afterEnd" | |
| ) | |
| ui.insert_ui( | |
| ui.input_select("univ_region","",univ_reg_display), | |
| selector="#out_text2", | |
| where="afterEnd" | |
| ) | |
| """ | |
| ui.insert_ui( | |
| ui.input_select("question","question",[]), | |
| selector="#out_text3", | |
| where="afterEnd" | |
| ) | |
| ui.insert_ui( | |
| ui.input_select("cate","topic",topic_display), | |
| #ui.input_select("question","question",[]), | |
| selector="#out_text3", | |
| where="afterEnd" | |
| ) | |
| """ | |
| if correct_or_not ==2: | |
| total_status["authlevel"]=2 | |
| total_status["login"]=1 | |
| lea_info = input.username() | |
| curr_univ_region = lea_univ_dict[lea_info] | |
| try: | |
| curr_univ_region = lea_univ_dict[lea_info] | |
| except: | |
| curr_univ_region = "Undefined!" | |
| ui.insert_ui( | |
| ui.input_select("lea_region","",{lea_info:lea_info}), | |
| selector="#out_text2", | |
| where="afterEnd" | |
| ) | |
| ui.insert_ui( | |
| ui.input_select("univ_region","",{curr_univ_region:curr_univ_region}), | |
| selector="#out_text2", | |
| where="afterEnd" | |
| ) | |
| """ | |
| ui.insert_ui( | |
| ui.input_select("question","question",[]), | |
| selector="#out_text3", | |
| where="afterEnd" | |
| ) | |
| ui.insert_ui( | |
| ui.input_select("cate","topic",topic_display), | |
| #ui.input_select("question","question",[]), | |
| selector="#out_text3", | |
| where="afterEnd" | |
| ) | |
| """ | |
| #log out! | |
| elif login_status ==1: | |
| ui.insert_ui( | |
| ui.input_text("username","Username:",placeholder="username"), | |
| selector="#submit", | |
| where="beforeBegin", | |
| ) | |
| ui.insert_ui( | |
| ui.input_password("password","Password"), | |
| selector="#submit", | |
| where="beforeBegin", | |
| ) | |
| #ui.remove_ui(selector="div:has(< #role_select)") | |
| ui.update_select( | |
| "lea_region", | |
| choices=[] | |
| ) | |
| ui.update_select( | |
| "univ_region", | |
| choices=[] | |
| ) | |
| ui.remove_ui(selector="div:has(> #univ_region)") | |
| ui.remove_ui(selector="div:has(> #lea_region)") | |
| #ui.remove_ui(selector="div:has(> #cate)") | |
| #ui.remove_ui(selector="div:has(> #question)") | |
| login_status = -1 | |
| correct_or_not = -1 | |
| username = "test1" | |
| password = "test1" | |
| log_role = "notset" | |
| for i in range(4): | |
| choices[i] = 0 | |
| total_status["authlevel"] = -1 | |
| total_status["login"] = -1 | |
| def print_txt1(): | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| return "Here is the result from "+str(univ_region)+" University Region and "+str(lea)+" LEA or district." | |
| def print_txt3(): | |
| #topics =input.cate() | |
| #qs = input.question() | |
| return "Here is the result from all LEA/district in Utah." | |
| def print_txt2(): | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| if correct_or_not ==2: | |
| lea = input.username() | |
| univ_region = lea_univ_dict[lea] | |
| if(role=="educator"): | |
| df_curr = edu_df.copy() | |
| reg_locator = "Q43" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_edu | |
| elif(role=="principal"): | |
| df_curr = prn_df.copy() | |
| reg_locator = "Q7" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_prn | |
| try: | |
| df_region = df_curr[df_curr[reg_locator]==lea] | |
| except: | |
| display_text = "No result found in "+str(input.lea_region())+" LEA/district" | |
| #df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| sz1,sz2 = df_region.shape | |
| if sz1 ==0: | |
| display_text = "No result found in "+str(input.lea_region())+" LEA/district" | |
| if sz1>=10: | |
| display_text = "The result of "+str(input.lea_region())+" LEA/district is displayed." | |
| else: | |
| display_text ="Due to the privacy, the result of that LEA region will be hidden, instead, results of the "+str(input.univ_region())+" University Region will be displayed." | |
| return display_text | |
| def print_txt4(): | |
| try: | |
| lea = input.lea_region() | |
| except: | |
| lea = " " | |
| try: | |
| univ_region = input.univ_region() | |
| except: | |
| univ_region = " " | |
| role = input.role() | |
| topics =input.cate() | |
| qs = input.question() | |
| v_count_df,display_text,total_size =get_v_counts(role,univ_region,lea,qs,qlist_qcontent_inverse_dict_edu,qlist_qcontent_inverse_dict_prn,edu_df,prn_df,"a") | |
| return display_text | |
| def update_select(): | |
| #print("After log in") | |
| global correct_or_not | |
| univ_region_chose = input.univ_region() | |
| curr_role = input.role() | |
| #print("Correct or not in LEA update is "+str(correct_or_not)) | |
| #print(univ_region_chose) | |
| if correct_or_not ==1: | |
| try: | |
| lea_list_dict = list(univ_reg_dict[univ_region_chose]) | |
| lea_display = list_display(lea_list_dict) | |
| ui.update_select( | |
| "lea_region", | |
| choices=lea_display | |
| ) | |
| except: | |
| pass | |
| elif correct_or_not ==2: | |
| lea = input.username() | |
| ui.update_select( | |
| "lea_region", | |
| choices={lea:lea} | |
| ) | |
| def update_select1(): | |
| curr_role = input.role() | |
| curr_topic = input.cate() | |
| list1 = list(topic_qlist_dict[curr_role][curr_topic]) | |
| display_list = get_qlist_by_cate(list1, qlist_qcontent_dict) | |
| ui.update_select( | |
| "question", | |
| choices= display_list | |
| ) | |
| # need rework on this function | |
| def plot_curr_v1(): | |
| global lea_or_univ | |
| global display_text | |
| #global login_status | |
| nonlocal total_size | |
| nonlocal value_counts | |
| nonlocal curr_fig | |
| nonlocal file_name | |
| nonlocal login_status | |
| try: | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| if correct_or_not ==2: | |
| lea = input.username() | |
| univ_region = lea_univ_dict[lea] | |
| if(role=="educator"): | |
| df_curr = edu_df.copy() | |
| reg_locator = "Q43" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_edu | |
| elif(role=="principal"): | |
| df_curr = prn_df.copy() | |
| reg_locator = "Q7" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_prn | |
| if qlist_qcontent_inverse_dict[qs] in table_only: | |
| fig,ax = plt.subplots() | |
| ax.set_title("Results will be shown in table only!") | |
| return fig | |
| df_region = df_curr[df_curr[reg_locator]==lea] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| sz1,sz2 = df_region.shape | |
| if (sz1 >=10): | |
| display_text = "There is the result" | |
| lea_or_univ =0 | |
| total_size = sz1 | |
| if (sz1<= 10): | |
| lea_set = univ_reg_dict[univ_region] | |
| df_region = df_curr[df_curr[reg_locator].isin(lea_set)] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| display_text = "Due to the privacy, the result of that LEA region will be hidden, instead, results of the University Region will be displayed" | |
| sz1,sz2 = df_region.shape | |
| lea_or_univ = 1 | |
| total_size = sz1 | |
| v_count_df = pd.DataFrame(df_region_qs.value_counts(sort=True)).reset_index() | |
| v_labels = list(v_count_df.iloc[:,0]) | |
| displayed_table = v_count_df | |
| #print(displayed_table) | |
| values = list(v_count_df.iloc[:,1]) | |
| from matplotlib import pyplot as plt | |
| fig,ax = plt.subplots() | |
| ax.pie(values,labels = v_labels,autopct = '%2.2f%%') | |
| question_code = v_count_df.columns[1] | |
| q_details = qlist_qcontent_dict[question_code] | |
| ax.set_title("Question "+str(question_code)+": "+q_details+" .") | |
| file_name =input.role()+" "+input.lea_region()+" "+input.qs()+"_result.png" | |
| curr_fig = fig | |
| return fig | |
| except: | |
| from matplotlib import pyplot as plt | |
| try: | |
| region = input.lea_region() | |
| except: | |
| from matplotlib import pyplot as plt | |
| return | |
| if login_status ==-1: | |
| return | |
| def plot_curr(): | |
| #print("lea part, the current log in status is :" + str(total_status["authlevel"])) | |
| from matplotlib import pyplot as plt | |
| if total_status["authlevel"] == 1 or total_status["authlevel"] ==2: | |
| #print("The role of the current log in is :", total_status["authlevel"]) | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| if correct_or_not ==2: | |
| lea = input.username() | |
| univ_region = lea_univ_dict[lea] | |
| if(role=="educator"): | |
| df_curr = edu_df.copy() | |
| reg_locator = "Q43" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_edu | |
| elif(role=="principal"): | |
| df_curr = prn_df.copy() | |
| reg_locator = "Q7" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_prn | |
| if qlist_qcontent_inverse_dict[qs] in table_only: | |
| fig,ax = plt.subplots() | |
| ax.set_title("Results will be shown in table only!") | |
| return fig | |
| df_region = df_curr[df_curr[reg_locator]==lea] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| sz1,sz2 = df_region.shape | |
| if (sz1 >=10): | |
| #lea_or_univ =0 | |
| total_size = sz1 | |
| if (sz1<= 10): | |
| lea_set = univ_reg_dict[univ_region] | |
| df_region = df_curr[df_curr[reg_locator].isin(lea_set)] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| display_text = "Due to the privacy, the result of that LEA region will be hidden, instead, results of the University Region will be displayed" | |
| sz1,sz2 = df_region.shape | |
| total_size = sz1 | |
| v_count_df = pd.DataFrame(df_region_qs.value_counts(sort=True)).reset_index() | |
| print(v_count_df) | |
| question_code = v_count_df.columns[0] | |
| values = list(v_count_df.iloc[:,1]) | |
| total_counts = sum(values) | |
| percent_list = [round(x/total_counts*100,2) for x in values] | |
| new_title_1 = ["Each Response","Percentage"] | |
| v_count_df.columns = new_title_1 | |
| v_count_df["Percentage"] = percent_list | |
| v_labels = list(v_count_df.iloc[:,0]) | |
| fig,ax = plt.subplots() | |
| ax.pie(values,labels = v_labels,autopct = '%2.2f%%') | |
| q_details = qlist_qcontent_dict[question_code] | |
| #ax.set_title("Question "+str(question_code)+": "+q_details+" .") | |
| return fig | |
| else: | |
| #print("logged out") | |
| fig,ax = plt.subplots() | |
| ax.set_title("LEA results will be shown after logged in!!!") | |
| try: | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| except: | |
| pass | |
| return fig | |
| def plot_curr_st(): | |
| #print("state part, the current log in status is :" + str(total_status["authlevel"])) | |
| from matplotlib import pyplot as plt | |
| global lea_or_univ | |
| nonlocal total_size | |
| nonlocal value_counts | |
| role = input.role() | |
| qs = input.question() | |
| try: | |
| univ_region = input.univ_region() | |
| except: | |
| univ_region = " " | |
| try: | |
| lea = input.lea_region() | |
| except: | |
| lea = " " | |
| if qlist_qcontent_inverse_dict_sp[input.role()][input.question()] in table_only: | |
| fig,ax = plt.subplots() | |
| ax.set_title("Results will be shown in table only!") | |
| return fig | |
| v_count_df,display_text,total_size =get_v_counts(role,univ_region,lea,qs,qlist_qcontent_inverse_dict_edu,qlist_qcontent_inverse_dict_prn,edu_df,prn_df,"a") | |
| print(v_count_df) | |
| v_labels = list(v_count_df.iloc[:,0]) | |
| values = list(v_count_df.iloc[:,1]) | |
| displayed_table = v_count_df | |
| #print(v_count_df) | |
| fig,ax = plt.subplots() | |
| ax.pie(values,labels = v_labels,autopct = '%2.2f%%') | |
| question_code = v_count_df.columns[1] | |
| q_details = qlist_qcontent_dict[question_code] | |
| try: | |
| q_details = qlist_qcontent_dict[question_code] | |
| except: | |
| q_details = "Question is not listed" | |
| #ax.set_title("Question "+str(question_code)+": "+q_details+" .") | |
| #file_name =input.role()+" "+input.lea_region()+" "+input.qs()+"_result.png" | |
| return fig | |
| """ | |
| """ | |
| def print_table(): | |
| global lea_or_univ | |
| nonlocal total_size | |
| nonlocal value_counts | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| if correct_or_not ==2: | |
| lea = input.username() | |
| univ_region = lea_univ_dict[lea] | |
| if(role=="educator"): | |
| df_curr = edu_df.copy() | |
| reg_locator = "Q43" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_edu | |
| elif(role=="principal"): | |
| df_curr = prn_df.copy() | |
| reg_locator = "Q7" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_prn | |
| df_region = df_curr[df_curr[reg_locator]==lea] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| sz1,sz2 = df_region.shape | |
| if (sz1 >=10): | |
| #lea_or_univ =0 | |
| total_size = sz1 | |
| if (sz1<= 10): | |
| lea_set = univ_reg_dict[univ_region] | |
| df_region = df_curr[df_curr[reg_locator].isin(lea_set)] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| display_text = "Due to the privacy, the result of that LEA region will be hidden, instead, results of the University Region will be displayed" | |
| sz1,sz2 = df_region.shape | |
| #lea_or_univ = 1 | |
| total_size = sz1 | |
| v_count_df = pd.DataFrame(df_region_qs.value_counts(sort=True)).reset_index() | |
| question_code = v_count_df.columns[1] | |
| values = list(v_count_df.iloc[:,1]) | |
| total_counts = sum(values) | |
| percent_list = [round(x/total_counts*100,2) for x in values] | |
| new_title_1 = ["Each Response","Percentage"] | |
| v_count_df.columns = new_title_1 | |
| v_count_df["Percentage"] = percent_list | |
| #v_count_df.iloc[1,:] = percent_list | |
| #print(v_count_df) | |
| #v_count_df.columns = new_title | |
| #v_count_df["Percentage"] = percent_list | |
| return v_count_df | |
| def print_table_st(): | |
| global lea_or_univ | |
| nonlocal total_size | |
| nonlocal value_counts | |
| role = input.role() | |
| topics =input.cate() | |
| qs = input.question() | |
| try: | |
| univ_region = input.univ_region() | |
| except: | |
| univ_region = " " | |
| try: | |
| lea = input.lea_region() | |
| except: | |
| lea = " " | |
| v_count_df,display_text,total_size =get_v_counts(role,univ_region,lea,qs,qlist_qcontent_inverse_dict_edu,qlist_qcontent_inverse_dict_prn,edu_df,prn_df,"a") | |
| question_code = v_count_df.columns[1] | |
| #new_title = ["Answers","Question code: "+question_code] | |
| #v_count_df.columns = new_title | |
| values = list(v_count_df.iloc[:,1]) | |
| total_counts = sum(values) | |
| percent_list = [round(x/total_counts*100,2) for x in values] | |
| new_title = ["Each Response","Counts"] | |
| v_count_df.columns = new_title | |
| v_count_df["Percentage"] = percent_list | |
| return v_count_df | |
| def save_fig(): | |
| if total_status["authlevel"] == 1 or total_status["authlevel"] ==2: | |
| #print("The role of the current log in is :", total_status["authlevel"]) | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| if correct_or_not ==2: | |
| lea = input.username() | |
| univ_region = lea_univ_dict[lea] | |
| if(role=="educator"): | |
| df_curr = edu_df.copy() | |
| reg_locator = "Q43" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_edu | |
| elif(role=="principal"): | |
| df_curr = prn_df.copy() | |
| reg_locator = "Q7" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_prn | |
| if qlist_qcontent_inverse_dict[qs] in table_only: | |
| print("Dont save") | |
| return | |
| df_region = df_curr[df_curr[reg_locator]==lea] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| sz1,sz2 = df_region.shape | |
| if (sz1 >=10): | |
| #lea_or_univ =0 | |
| total_size = sz1 | |
| if (sz1<= 10): | |
| lea_set = univ_reg_dict[univ_region] | |
| df_region = df_curr[df_curr[reg_locator].isin(lea_set)] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| display_text = "Due to the privacy, the result of that LEA region will be hidden, instead, results of the University Region will be displayed" | |
| sz1,sz2 = df_region.shape | |
| total_size = sz1 | |
| v_count_df = pd.DataFrame(df_region_qs.value_counts(sort=True)).reset_index() | |
| print(v_count_df) | |
| question_code = v_count_df.columns[0] | |
| values = list(v_count_df.iloc[:,1]) | |
| total_counts = sum(values) | |
| percent_list = [round(x/total_counts*100,2) for x in values] | |
| new_title_1 = ["Each Response","Percentage"] | |
| v_count_df.columns = new_title_1 | |
| v_count_df["Percentage"] = percent_list | |
| v_labels = list(v_count_df.iloc[:,0]) | |
| fig,ax = plt.subplots() | |
| ax.pie(values,labels = v_labels,autopct = '%2.2f%%') | |
| q_details = qlist_qcontent_dict[question_code] | |
| #ax.set_title("Question "+str(question_code)+": "+q_details+" .") | |
| else: | |
| #print("logged out") | |
| fig,ax = plt.subplots() | |
| ax.set_title("LEA results will be shown after logged in!!!") | |
| try: | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| topics =input.cate() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| except: | |
| pass | |
| if login_status ==1: | |
| with io.BytesIO() as buf: | |
| fig.savefig(buf, format="png") | |
| yield buf.getvalue() | |
| async def save_result(): | |
| global lea_or_univ | |
| nonlocal total_size | |
| nonlocal value_counts | |
| nonlocal login_status | |
| role = input.role() | |
| univ_region = input.univ_region() | |
| lea = input.lea_region() | |
| qs = input.question() | |
| if(role=="educator"): | |
| df_curr = edu_df.copy() | |
| reg_locator = "Q43" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_edu | |
| elif(role=="principal"): | |
| df_curr = prn_df.copy() | |
| reg_locator = "Q7" | |
| qlist_qcontent_inverse_dict = qlist_qcontent_inverse_dict_prn | |
| df_region = df_curr[df_curr[reg_locator]==lea] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| sz1,sz2 = df_region.shape | |
| if (sz1 >=10): | |
| lea_or_univ =0 | |
| total_size = sz1 | |
| if (sz1<= 10): | |
| lea_set = univ_reg_dict[univ_region] | |
| df_region = df_curr[df_curr[reg_locator].isin(lea_set)] | |
| df_region_qs = df_region[qlist_qcontent_inverse_dict[qs]] | |
| display_text = "Due to the privacy, the result of that LEA region will be hidden, instead, results of the University Region will be displayed" | |
| sz1,sz2 = df_region.shape | |
| lea_or_univ = 1 | |
| total_size = sz1 | |
| v_count_df = pd.DataFrame(df_region_qs.value_counts(sort=True)).reset_index() | |
| question_code = v_count_df.columns[1] | |
| values = list(v_count_df.iloc[:,1]) | |
| total_counts = sum(values) | |
| percent_list = [round(x/total_counts*100,2) for x in values] | |
| new_title = ["Each Response","Percentage"] | |
| v_count_df.columns = new_title | |
| v_count_df["Percentage"] = percent_list | |
| #v_count_df.iloc[1,:] = percent_list | |
| #new_title_pre = ["Answers","Question code: "+question_code] | |
| #v_count_df.columns = new_title_pre | |
| #v_count_df["Percentage"] = percent_list | |
| new_title = v_count_df.columns | |
| firstline = "" | |
| secondline = "" | |
| for i in range(2): # fix here | |
| firstline += (new_title[i]+",") | |
| secondline+= (str(v_count_df.iloc[1,i])+",") | |
| firstline+="\n" | |
| secondline+="\n" | |
| sz_r1,sz_r2 = v_count_df.shape | |
| if login_status ==1: | |
| await asyncio.sleep(0.5) | |
| yield new_title[0]+",Percentage"+"\n" | |
| for i in range(sz_r1): | |
| yield str(v_count_df.iloc[i,0])+","+str(v_count_df.iloc[i,1])+"\n" | |
| def save_fig_st(): | |
| role = input.role() | |
| univ_region = " " | |
| lea = " " | |
| qs = input.question() | |
| if qlist_qcontent_inverse_dict_sp[input.role()][input.question()] in table_only: | |
| print("Dont save") | |
| return | |
| v_count_df,display_text,total_size =get_v_counts(role,univ_region,lea,qs,qlist_qcontent_inverse_dict_edu,qlist_qcontent_inverse_dict_prn,edu_df,prn_df,"a") | |
| v_labels = list(v_count_df.iloc[:,0]) | |
| values = list(v_count_df.iloc[:,1]) | |
| displayed_table = v_count_df | |
| #print(displayed_table) | |
| from matplotlib import pyplot as plt | |
| fig,ax = plt.subplots() | |
| ax.pie(values,labels = v_labels,autopct = '%2.2f%%') | |
| question_code = v_count_df.columns[1] | |
| q_details = qlist_qcontent_dict[question_code] | |
| #ax.set_title("Question "+str(question_code)+": "+q_details+" .") | |
| with io.BytesIO() as buf: | |
| fig.savefig(buf, format="png") | |
| yield buf.getvalue() | |
| async def save_result_st(): | |
| role = input.role() | |
| univ_region = " " | |
| lea = " " | |
| qs = input.question() | |
| v_count_df,display_text,total_size =get_v_counts(role,univ_region,lea,qs,qlist_qcontent_inverse_dict_edu,qlist_qcontent_inverse_dict_prn,edu_df,prn_df,"a") | |
| #v_count_df = pd.DataFrame(df_region_qs.value_counts(sort=True)).reset_index() | |
| question_code = v_count_df.columns[1] | |
| values = list(v_count_df.iloc[:,1]) | |
| total_counts = sum(values) | |
| percent_list = [round(x/total_counts*100,2) for x in values] | |
| new_title_pre = ["Response","Counts"] | |
| v_count_df.columns = new_title_pre | |
| v_count_df["Percentage"] = percent_list | |
| new_title = v_count_df.columns | |
| firstline = "" | |
| secondline = "" | |
| for i in range(3): | |
| firstline += (new_title[i]+",") | |
| secondline+= (str(v_count_df.iloc[1,i])+",") | |
| firstline+="\n" | |
| secondline+="\n" | |
| """ | |
| if login_status ==1: | |
| buffer = io.BytesIO() | |
| v_count_df.to_csv(buffer, sep=",", index=False, mode="wb", encoding="UTF-8") | |
| """ | |
| #yield firstline | |
| #yield secondline | |
| sz_r1,sz_r2 = v_count_df.shape | |
| await asyncio.sleep(0.5) | |
| yield new_title[0]+","+new_title[1]+",Percentage"+"\n" | |
| for i in range(sz_r1): | |
| yield str(v_count_df.iloc[i,0])+","+str(v_count_df.iloc[i,1])+","+str(v_count_df.iloc[i,2])+"\n" | |
| app = App(app_ui, server) | |