def set_pract_high_z_score_attr(handler_input, player_obj: object) -> None:
        """Sets attributes for high z-score practice."""
        attr = handler_input.attributes_manager.session_attributes

        CP_Attr.set_tbl_mean_err_list_attr(handler_input, player_obj)
        tbl_list_mean_errs = attr['tbl_list_mean_errs']
        

        tbl_means_only = [val[1] for val in tbl_list_mean_errs]
        total_err_mean = mean(tbl_means_only)
        total_err_stdev = stdev(tbl_means_only, xbar= total_err_mean)

        practice_tables = []
        for i in range(3):
            table, mean_err = tbl_list_mean_errs[i]

            tbl_z_score = calc_z_score(
                data_point= mean_err,
                data_mean= total_err_mean,
                data_stdev= total_err_stdev,
            )

            if tbl_z_score > custom_practice.data.HIGH_Z_SCORE_ERR:
                practice_tables.append( table)
        
        attr['times_tables'] = practice_tables
        return None
    def get_top_z_score_err_tables(handler_input) -> list:
        """Returns list of the top 3 z-score error tables."""
        attr = handler_input.attributes_manager.session_attributes

        tbl_list_mean_errs = attr['tbl_list_mean_errs']
        tbl_means = [ num[1] for num in tbl_list_mean_errs]
        tables_to_practice = []

        tbl_mean_err = mean(tbl_means)
        tbl_mean_stdev = stdev(tbl_means, xbar = tbl_mean_err)

        for i in range(3):
            table, table_err = tbl_list_mean_errs[i]

            tbl_z_score = calc_z_score(
                data_point = table_err,
                data_mean= tbl_mean_err,
                data_stdev= tbl_mean_stdev,
            )

            if tbl_z_score > custom_practice.data.HIGH_Z_SCORE_ERR:
                tables_to_practice.append( table )
        
        tables_to_practice.sort()
        logger.debug( tbl_list_mean_errs)
        logger.debug( tables_to_practice)
        return tables_to_practice
    def get_higher_table_difficulty(
        handler_input, 
        player_obj: object = None,
        tables: tuple = None,
        answered_tables: list = None
        ) -> float:
        """Returns z_score for the table with the highest difficulty.
        
        Difficulty is a constructed measure dependent on greatness of tables, 
        e.g., 6 > 5."""
        if not player_obj:
            player_obj = PlayerDict.load_player_obj(handler_input)
        if tables is None:
            tables = QuestionAttr.get_question_tables(handler_input, integers=True)
        if answered_tables is None:
            answered_tables = player_obj.get_answered_tables(integers = True)
            
        inflated_mean_table = mean(answered_tables) + 1
        higher_table = max( [int(table) for table in tables])

        z_score = calc_z_score(
            data_point= higher_table,
            data_mean = inflated_mean_table,
            data=  answered_tables,
            required_data_length= stats.data.SUF_ANSWERED_TABLES
        )
        return z_score
 def get_sm_z_score(handler_input, sm_score: int, player_obj: object = None) -> bool:
     """Returns z_score for the Survival mode score."""
     if not player_obj:
         player_obj = PlayerDict.load_player_obj(handler_input)
     
     sm_average_records = [int(num) for num in player_obj._sm_average_records]
     
     z_score = calc_z_score(
         data_point= sm_score,
         data = sm_average_records
     )
     return z_score
Example #5
0
    def get_sc_performance_z_score(player_obj: object, sc_difficulty: str,
                                   sc_score_time: int) -> float:
        """Returns z_score for the user's relative performance in speed challenge."""
        sc_average_records = player_obj.get_sc_average_records(sc_difficulty)

        if len(sc_average_records) < 2:
            return 0

        z_score = calc_z_score(
            data_point=sc_score_time,
            data=sc_average_records,
        )

        z_score *= -1  # inversed for time records.
        logger.debug(z_score)
        return z_score
    def check_high_err_z_score(handler_input) -> bool:
        """Returns if high error z-score table is present.
        
        NOTE: Should probably save tbl error means list as session attr."""
        attr = handler_input.attributes_manager.session_attributes
        tbl_list_mean_errs = attr['tbl_list_mean_errs']

        tbl_means_only = [val[1] for val in tbl_list_mean_errs]
        total_err_mean = mean(tbl_means_only)
        total_err_stdev = stdev(tbl_means_only, xbar= total_err_mean)
        total_err_stdev = total_err_stdev if total_err_stdev else 1

        first_z_score = calc_z_score( 
            data_point = tbl_list_mean_errs[0][1], 
            data_mean = total_err_mean,
            data_stdev = total_err_stdev,
            )

        if first_z_score > custom_practice.data.HIGH_Z_SCORE_ERR:
            return True
        return False
    def get_higher_table_error_freq(
        handler_input, 
        player_obj: object = None,
        tables: tuple = None
        ) -> float:
        """Returns z_score for the highest error tables."""
        if not player_obj:
            player_obj = PlayerDict.load_player_obj(handler_input)
        if tables is None:
            tables = QuestionAttr.get_question_tables(handler_input, integers=False)
        
        times_tables_info = player_obj.get_times_table_info()
        times_tables_mean_err_list = []
        
        for table in times_tables_info.keys():
            table_mean = float(times_tables_info[table]['mean'])
            table_data = times_tables_info[table]['table_data']

            if len(table_data) > stats.data.SUF_TABLE_DATA:
                times_tables_mean_err_list.append(1 - table_mean)   # inversed, so errors are higher.
        
        ## Exit if not enough data.
        if len(times_tables_mean_err_list) <= stats.data.SUF_ERR_LIST:
            return 0
        
        question_tables_err =  []
        for table in tables:
            table = str(table)
            table_info = float( times_tables_info[table]['mean'])
            table_info = (1 - table_info)   # inverse mean.
            question_tables_err.append( table_info)
        
        max_table_err = max(question_tables_err)
        z_score = calc_z_score(
            data_point= max_table_err,
            data= times_tables_mean_err_list,
        )

        return ( z_score)