Shoot a knarrow
to the knee ;)
(The lib is better than this pun, I swear.)
Detect knee points in various scenarios using a plethora of methods
Just plug in your values in a list
, tuple
or an np.ndarray
and watch knarrow
hit the knee:
>>> from knarrow import find_knee
>>> find_knee([1, 2, 3, 4, 6]) # use a list
3
>>> find_knee((1, 2, 3, 4, 6)) # or a tuple
3
>>> import numpy as np
>>> y = np.array([1.0, 1.05, 1.15, 1.28, 1.30, 2.5, 3.6, 4.9])
>>> find_knee(y) # provide just the values
4
>>> x = np.arange(8)
>>> find_knee(x, y) # or both x and y
4
>>> A = np.vstack((x, y))
>>> A
array([[0. , 1. , 2. , 3. , 4. , 5. , 6. , 7. ],
[1. , 1.05, 1.15, 1.28, 1.3 , 2.5 , 3.6 , 4.9 ]])
>>> find_knee(A) # works with x in first row, y in the second
4
>>> A.T
array([[0. , 1. ],
[1. , 1.05],
[2. , 1.15],
[3. , 1.28],
[4. , 1.3 ],
[5. , 2.5 ],
[6. , 3.6 ],
[7. , 4.9 ]])
>>> find_knee(A.T) # also works with x in the first column, y in the second column
4
>>> find_knee(x, y, smoothing=0.01) # for better results use cubic spline smoothing
4
This library can also come with a handy CLI if you install it with the cli
extra:
$ pip install "knarrow[cli]"
$ cat data.txt | knarrow -
<stdin> 11
$ cat data.txt | knarrow -o value -
<stdin> 59874.14171519781845532648
$ knarrow --sort -d ',' -o value shuf_delim.txt
shuf_delim.txt 20
(the -
for stdin is, unfortunately, mandatory)
Try writing knarrow --help
for more info.
While I've come up with most of these methods by myself, I am not the only one. Here is a (non-comprehensive) list of projects I've found that implement a similar functionality and may have been an inspiration for me:
Note: this project was bootstrapped by python-blueprint. Since then, it has been heavily modified, though.