The package's name pk4adi is short for "PK for anesthetic depth indicators". The PK (Prediction probability) was first proposed by Dr. Warren D. Smith in the paper Measuring the Performance of Anesthetic Depth Indicators in 1996. Dr. Warren D. Smith and his team provide a tool to calculate PK written using the MS Excel macro language.
Our team provide a reimplementation of the PK tools developed using the Python language with easy-to-use APIs in this package. The project is fully open source on github. The latest released version could be found here.
A GUI version of pk4adi called pk4adi_gui is also under development. This project is also open source on github.
Please feel free to contact us ([email protected]). Any kind of feedback is welcome. You could report any bugs or issues when using pk4adi on github project.
Please refer the changelog.md for details.
Python 3.8 or greater.
pandas>=0.18.0
numpy>=1.21.6
scipy>=1.9.0
tabulate
To install pk4adi, run the following in the command prompt.
pip install pk4adi
- calculate_pk of module pk.py.
calculate_pk(x_in , y_in , auto_print = True):
Compute the pk value to Measure the Performance of Anesthetic Depth Indicators.
print_pk() will be called before returning ans by default.
Parameters
----------
x_in : a list or a pandas series (pandas.Series()).
Indicator.
y_in : a list or a pandas series (pandas.Series()).
State.
auto_print : bool.
Whether to print the ans before returning it or not.
Returns
-------
ans : a dict.
A dict containing all the matrix and variables involved.
Use the script 'print(ans.keys())' to get the details.
The most important variables have already been printed.
- print_pk of module pk.py.
print_pk(result, floatfmt=".3f", tablefmt='simple'):
Pretty display of a pk calculation result.
Parameters
----------
result : a dict.
Must be the return value of function calculate_pk().
floatfmt : string.
Decimal number formatting.
tablefmt : string.
Table format (e.g. 'simple', 'plain', 'html', 'latex', 'grid', 'rst').
For a full list of available formats, please refer to
https://pypi.org/project/tabulate/
Returns
-------
Nothing will be returned.
- compare_pks of module pkc.py.
compare_pks(pk1, pk2 , auto_print = True):
Compare two answers of the pk values, which is the output of the function calculate_pk().
print_pks() will be called before returning ans by default.
Parameters
----------
pk1 : a dict.
The output of the function calculate_pk().
pk2 : a dict.
The output of the function calculate_pk().
auto_print : bool.
Whether to print the ans before returning it or not.
Returns
-------
ans : a dict.
A dict containing all the matrix and variables involved.
Use the script 'print(ans.keys())' to get the details.
Specially, the P values and the interval it located will be
calculated using the scipy.stats packages.
The most important variables have already been printed.
- print_pks of module pkc.py.
print_pks(result, floatfmt=".3f", tablefmt='simple'):
Pretty display of two pk calculation result comparison.
Parameters
----------
result : a dict.
Must be the return value of function compare_pks().
floatfmt : string.
Decimal number formatting.
tablefmt : string.
Table format (e.g. 'simple', 'plain', 'html', 'latex', 'grid', 'rst').
For a full list of available formats, please refer to
https://pypi.org/project/tabulate/
Returns
-------
Nothing will be returned.
The best way to use this package is to use Python scripts.
from pk4adi.pk import calculate_pk
x = [ 0, 0, 0, 0, 0, 0]
y = [ 1, 1, 1, 1, 1, 2]
calculate_pk(x, y)
x = [0, 0, 0, 0, 0, 0, 1, 1, 2]
y = [1, 1, 1, 1, 1, 2, 3, 3, 4]
calculate_pk(x, y)
You will get the following output.
==============
PK calculation
==============
PK SE0 SE1 jack_ok PKj SEj
----- ----- ----- --------- ----- -----
0.500 0.000 0.000 False nan nan
==============
PK calculation
==============
PK SE0 SE1 jack_ok PKj SEj
----- ----- ----- --------- ----- -----
0.900 0.124 0.085 True 0.901 0.117
from pk4adi.pk import calculate_pk
from pk4adi.pkc import compare_pks
x1 = [ 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6 ]
y1 = [ 1, 1, 1, 1, 1, 2, 1, 1, 3, 3, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3 ]
pk1 = calculate_pk(x_in = x1, y_in = y1 , auto_print = False)
x2 = [ 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6 ]
y2 = [ 1, 1, 2, 1, 1, 2, 1, 2, 3, 3, 2, 2, 1, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 2 ]
pk2 = calculate_pk(x_in = x2, y_in = y2 , auto_print = False)
ans = compare_pks(pk1, pk2)
You will get the following output.
==============
PKs comparison
==============
=================
For Group (z-test)
=================
PKD SED ZD P value Comment
----- ----- ----- --------- ---------
0.068 0.101 0.669 0.504 P > 0.05
=================
For Pair (t-test)
=================
PKDJ SEDJ DF TD P value Comment
------ ------ ---- ----- --------- ---------
0.030 0.066 23 0.453 0.327 P > 0.05
You could get the all the matrix and variables in the returned dicts of the function calculate_pk() and compare_pks().
print(pk1.keys())
print(ans.keys())
You will get the following output.
dict_keys(['type', 'A', 'S', 'C', 'D', 'T', 'SA', 'CA', 'DA', 'TA', 'jack_ok', 'n_case', 'n', 'Qc', 'Qd', 'Qtx', 'Qcdt', 'dyx', 'PK', 'Qcc', 'Qdd', 'Qcd', 'Term1', 'Term2', 'Term3', 'SE1', 'SE0', 'PKm', 'SPKm', 'SSPKm', 'PKj', 'SEj'])
dict_keys(['type', 'n_case', 'PKD', 'SED', 'ZD', 'ZP', 'ZJ', 'PKmD', 'SumD', 'SSD', 'DF', 'PKDJ', 'SEDJ', 'TD', 'TP', 'TJ'])
Then just get the value with the key of the dict!
Please feel free to contact us ([email protected]). Any kind of feedback is welcome and appreciated.