/knarrow

Shoot a knarrow to the knee

Primary LanguagePythonApache License 2.0Apache-2.0

knarrow

PyPI - Python Version PyPI - Downloads PyPI - License PyPI PyPI - Format GitHub tag (latest by date) GitHub Workflow Status Read the Docs Website Code style: black

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

Usage

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

CLI

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.

Similar projects

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.