From 9a2a71cf6afbc5a0c1920aab79b941a303d930f1 Mon Sep 17 00:00:00 2001 From: pde-bakk Date: Mon, 10 Oct 2022 15:28:41 +0200 Subject: [PATCH] quartile --- module00/ex01/TinyStatistician.py | 43 +++---------------------------- module00/ex01/test.py | 36 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 39 deletions(-) create mode 100644 module00/ex01/test.py diff --git a/module00/ex01/TinyStatistician.py b/module00/ex01/TinyStatistician.py index 9335db0..5d5ff09 100644 --- a/module00/ex01/TinyStatistician.py +++ b/module00/ex01/TinyStatistician.py @@ -38,7 +38,7 @@ def median(x: np.ndarray) -> float | None: @staticmethod @accepts(np.ndarray) - def quartiles(x: np.ndarray) -> list[float] | None: + def quartile(x: np.ndarray) -> list[float] | None: arr = np.sort(x) middle_index = arr.shape[0] // 2 if arr.shape[0] % 2 == 1: @@ -51,12 +51,11 @@ def quartiles(x: np.ndarray) -> list[float] | None: @accepts(np.ndarray, (int, float)) def percentile(x: np.ndarray, p: float | int) -> float | None: arr = np.sort(x) - idx = (arr.shape[0] - 1) * p / 100 + idx = (arr.shape[0] - 1) * (p / 100) if idx.is_integer(): return arr[idx] - f, c = int(idx), int(idx + 1.0) - f_diff, c_diff = idx - f, c - idx - return c_diff * arr[f] + f_diff * arr[c] + floor, ceiling = int(idx), int(idx + 1.0) + return arr[floor] + (idx - floor) * (arr[ceiling] - arr[floor]) @staticmethod @accepts(np.ndarray) @@ -68,37 +67,3 @@ def var(x: np.ndarray) -> float | None: @accepts(np.ndarray) def std(x: np.ndarray) -> float | None: return sqrt(TinyStatistician.var(x)) - - -def main() -> None: - tstat = TinyStatistician() - a = np.array([1, 42, 300, 10, 59]) - mean = tstat.mean(a) - print(f'{mean = }') - assert mean == 82.4 - median = tstat.median(a) - print(f'{median = }') - assert median == 42.0 - quartiles = tstat.quartiles(a) - print(f'{quartiles = }') - assert quartiles == [10.0, 59.0] - variance = tstat.var(a) - print(f'{variance = }') - assert variance == 15349.3 - std_deviation = tstat.std(a) - print(f'{std_deviation = }') - assert std_deviation == 123.89229193133849 - - percentiles: dict = { - 10: tstat.percentile(a, 10), - 15: tstat.percentile(a, 15), - 20: tstat.percentile(a, 20) - } - print(f'{percentiles = }') - assert percentiles[10] == 4.6, f'I came up with {percentiles[10]}' - assert percentiles[15] == 6.4, f'I came up with {percentiles[15]}' - assert percentiles[20] == 8.2, f'I came up with {percentiles[20]}' - - -if __name__ == '__main__': - main() diff --git a/module00/ex01/test.py b/module00/ex01/test.py new file mode 100644 index 0000000..d7ae51b --- /dev/null +++ b/module00/ex01/test.py @@ -0,0 +1,36 @@ +from TinyStatistician import TinyStatistician +import numpy as np + + +def main() -> None: + tstat = TinyStatistician() + a = np.array([1, 42, 300, 10, 59]) + mean = tstat.mean(a) + print(f'{mean = }') + assert mean == 82.4 + median = tstat.median(a) + print(f'{median = }') + assert median == 42.0 + quartiles = tstat.quartile(a) + print(f'{quartiles = }') + assert quartiles == [10.0, 59.0] + variance = tstat.var(a) + print(f'{variance = }') + assert variance == 15349.3 + std_deviation = tstat.std(a) + print(f'{std_deviation = }') + assert std_deviation == 123.89229193133849 + + percentiles: dict = { + 10: tstat.percentile(a, 10), + 15: tstat.percentile(a, 15), + 20: tstat.percentile(a, 20) + } + print(f'{percentiles = }') + assert abs(percentiles[10] - 4.6) < 1e-5, f'I came up with {percentiles[10]}' + assert abs(percentiles[15] - 6.4) < 1e-5, f'I came up with {percentiles[15]}' + assert abs(percentiles[20] - 8.2) < 1e-5, f'I came up with {percentiles[20]}' + + +if __name__ == '__main__': + main()