THR_DIR_BOTH = "both" THR_DIR_UP = "upper" THR_DIR_LO = "lower" THR_DIR_AUTO = "auto" HIGH_THRESHOLD_ZSCORE_MULTIPLIER = 1.2 CRITICAL_THRESHOLD_ZSCORE_MULTIPLIER = 1.4 NO_RECOMMEND_NOT_ENOUGH_DATA = "NO_RECOMMEND_NOT_ENOUGH_DATA" def cascade_thresholds(threshold): """ Simple cascading thresholds for the initial release """ medium = threshold high = medium * HIGH_THRESHOLD_ZSCORE_MULTIPLIER critical = medium * CRITICAL_THRESHOLD_ZSCORE_MULTIPLIER return (critical, high, medium) def output_thresholds_dict( threshold, threshold_rounding, threshold_direction, static_params=None ): def transform(value): if static_params: return round(value * stdev + mean, threshold_rounding) else: return round(value, threshold_rounding) critical, high, medium = cascade_thresholds(threshold) if static_params: mean = static_params[0] stdev = static_params[1] if threshold_direction == THR_DIR_BOTH: critical_final = transform(critical) high_final = [transform(high), transform(-critical)] medium_final = [transform(medium), transform(-high)] normal_final = transform(-1 * medium) return f"{{'critical': {critical_final}, 'high': {high_final}, 'medium': {medium_final}, 'normal': {normal_final}}}" elif threshold_direction == THR_DIR_UP: critical_final = transform(critical) high_final = transform(high) medium_final = transform(medium) return f"{{'critical': {critical_final}, 'high': {high_final}, 'medium': {medium_final}}}" else: critical_final = transform(-critical) high_final = transform(-high) medium_final = transform(-medium) return f"{{'high': {critical_final}, 'medium': {high_final}, 'normal': {medium_final}}}" def confidence_description(score): if score > 0.6: return "High" elif score > 0.4: return "Medium" elif score > 0.1: return "Low" else: return "No Pattern"