diff --git a/nise-circleguard/src/main.py b/nise-circleguard/src/main.py index a65bb3b..ffc8358 100644 --- a/nise-circleguard/src/main.py +++ b/nise-circleguard/src/main.py @@ -21,6 +21,26 @@ cg = Circleguard(os.getenv("OSU_API_KEY"), db_path="./dbs/db.db", slider_dir="./ app = Flask(__name__) +def my_filter_outliers(arr, bias=1.5): + """ + Returns ``arr`` with outliers removed. + + Parameters + ---------- + arr: list + List of numbers to filter outliers from. + bias: int + Points in ``arr`` which are more than ``IQR * bias`` away from the first + or third quartile of ``arr`` will be removed. + """ + if not arr or len(arr) <= 0: + return arr + q3, q1 = np.percentile(arr, [75, 25]) + iqr = q3 - q1 + lower_limit = q1 - (bias * iqr) + upper_limit = q3 + (bias * iqr) + arr_without_outliers = [x for x in arr if lower_limit < x < upper_limit]; return arr if not arr_without_outliers else arr_without_outliers + @dataclass class ReplayRequest: @@ -179,15 +199,15 @@ def process_replay(): keypresses_times=kp, keypresses_median=np.median(kp), - keypresses_median_adjusted=np.median(filter_outliers(kp)), + keypresses_median_adjusted=np.median(my_filter_outliers(kp)), keypresses_standard_deviation=np.std(kp, ddof=1), - keypresses_standard_deviation_adjusted=np.std(filter_outliers(kp), ddof=1), + keypresses_standard_deviation_adjusted=np.std(my_filter_outliers(kp), ddof=1), sliderend_release_times=se, sliderend_release_median=np.median(se), - sliderend_release_median_adjusted=np.median(filter_outliers(se)), + sliderend_release_median_adjusted=np.median(my_filter_outliers(se)), sliderend_release_standard_deviation=np.std(se, ddof=1), - sliderend_release_standard_deviation_adjusted=np.std(filter_outliers(se), ddof=1), + sliderend_release_standard_deviation_adjusted=np.std(my_filter_outliers(se), ddof=1), judgements=judgements )