aboutsummaryrefslogtreecommitdiff
path: root/src/dslr_stat.py
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-01-25 13:06:10 +0100
committerCharles <sircharlesaze@gmail.com>2020-01-25 13:06:10 +0100
commitdea0f4cdec5bdf24962c8ab3ab2a6473e202259a (patch)
treea2a703a50b2d744e103a657d50ea793743ce1ff5 /src/dslr_stat.py
parentd5e51613d3582e18e858055cf4874507a0df452f (diff)
downloaddslr-dea0f4cdec5bdf24962c8ab3ab2a6473e202259a.tar.gz
dslr-dea0f4cdec5bdf24962c8ab3ab2a6473e202259a.tar.bz2
dslr-dea0f4cdec5bdf24962c8ab3ab2a6473e202259a.zip
Custom statistics modulde, describe program
Diffstat (limited to 'src/dslr_stat.py')
-rw-r--r--src/dslr_stat.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/dslr_stat.py b/src/dslr_stat.py
new file mode 100644
index 0000000..91ad744
--- /dev/null
+++ b/src/dslr_stat.py
@@ -0,0 +1,62 @@
+import math
+
+
+def _none_if_null_len(func):
+ def tmp(xs, *args, **kwargs):
+ if len(xs) == 0:
+ return None
+ return func(xs, *args, **kwargs)
+ return tmp
+
+
+@_none_if_null_len
+def mean(xs):
+ return sum(xs) / len(xs)
+
+@_none_if_null_len
+def std(xs):
+ xs_mean = mean(xs)
+ return math.sqrt(sum(
+ [(x - xs_mean) ** 2 for x in xs]) / (len(xs) - 1))
+
+@_none_if_null_len
+def _pick(xs, compar):
+ m = xs[0]
+ for t in xs[1:]:
+ if compar(t, m):
+ m = t
+ return m
+
+def min(xs):
+ return _pick(xs, lambda x, y: x < y)
+
+def max(xs):
+ return _pick(xs, lambda x, y: x > y)
+
+def _qsort(xs):
+ if len(xs) < 2:
+ return xs
+ xs = list(xs)
+ pivot = xs[0]
+ body = xs[1:]
+ return (_qsort([x for x in body if x < pivot])
+ + [pivot]
+ + _qsort([x for x in body if x >= pivot]))
+
+def _need_sorted(func):
+ return lambda xs, *args, **kwargs: func(_qsort(xs), *args, **kwargs)
+
+@_none_if_null_len
+@_need_sorted
+def q25(xs):
+ return xs[len(xs) // 4]
+
+@_none_if_null_len
+@_need_sorted
+def median(xs):
+ return xs[len(xs) // 2 ]
+
+@_none_if_null_len
+@_need_sorted
+def q75(xs):
+ return xs[3 * (len(xs) // 4)]