protpy 1.4.2__tar.gz → 1.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. protpy-1.6.0/PKG-INFO +832 -0
  2. protpy-1.6.0/README.md +784 -0
  3. {protpy-1.4.2 → protpy-1.6.0}/docs/conf.py +20 -1
  4. protpy-1.6.0/protpy/__init__.py +37 -0
  5. {protpy-1.4.2 → protpy-1.6.0}/protpy/_constants.py +39 -0
  6. protpy-1.6.0/protpy/_helpers.py +388 -0
  7. protpy-1.6.0/protpy/autocorrelation.py +197 -0
  8. protpy-1.6.0/protpy/complexity.py +244 -0
  9. protpy-1.6.0/protpy/composition.py +1943 -0
  10. protpy-1.6.0/protpy/conjoint_triad.py +108 -0
  11. {protpy-1.4.2 → protpy-1.6.0}/protpy/ctd.py +116 -113
  12. protpy-1.6.0/protpy/data/README.md +16 -0
  13. protpy-1.6.0/protpy/data/aa_scales.json +1934 -0
  14. protpy-1.6.0/protpy/data/reduced_alphabets.json +151 -0
  15. protpy-1.6.0/protpy/data/residue_tables.json +759 -0
  16. protpy-1.6.0/protpy/data/structural_params.json +107 -0
  17. protpy-1.6.0/protpy/encode.py +733 -0
  18. protpy-1.6.0/protpy/physicochemical.py +685 -0
  19. protpy-1.6.0/protpy/scales.py +632 -0
  20. protpy-1.6.0/protpy/sequence_order.py +284 -0
  21. protpy-1.6.0/protpy/spectral.py +183 -0
  22. protpy-1.6.0/protpy/structural.py +727 -0
  23. protpy-1.6.0/protpy/utils.py +996 -0
  24. protpy-1.6.0/protpy.egg-info/PKG-INFO +832 -0
  25. {protpy-1.4.2 → protpy-1.6.0}/protpy.egg-info/SOURCES.txt +23 -0
  26. {protpy-1.4.2 → protpy-1.6.0}/protpy.egg-info/requires.txt +0 -1
  27. {protpy-1.4.2 → protpy-1.6.0}/protpy.egg-info/top_level.txt +1 -0
  28. {protpy-1.4.2 → protpy-1.6.0}/pyproject.toml +3 -3
  29. protpy-1.6.0/tests/_compare.py +9 -0
  30. {protpy-1.4.2 → protpy-1.6.0}/tests/test_autocorrelation.py +5 -4
  31. protpy-1.6.0/tests/test_backwards_compat.py +83 -0
  32. protpy-1.6.0/tests/test_complexity.py +70 -0
  33. {protpy-1.4.2 → protpy-1.6.0}/tests/test_composition.py +162 -139
  34. protpy-1.6.0/tests/test_composition_extended.py +183 -0
  35. {protpy-1.4.2 → protpy-1.6.0}/tests/test_conjoint_triad.py +18 -9
  36. protpy-1.6.0/tests/test_descriptor_sets.py +154 -0
  37. {protpy-1.4.2 → protpy-1.6.0}/tests/test_encode.py +12 -12
  38. protpy-1.6.0/tests/test_helpers.py +117 -0
  39. protpy-1.6.0/tests/test_performance.py +25 -0
  40. protpy-1.6.0/tests/test_physicochemical.py +227 -0
  41. protpy-1.6.0/tests/test_protpy.py +91 -0
  42. protpy-1.6.0/tests/test_reference_values.py +77 -0
  43. protpy-1.6.0/tests/test_regressions.py +171 -0
  44. protpy-1.6.0/tests/test_scales.py +103 -0
  45. {protpy-1.4.2 → protpy-1.6.0}/tests/test_sequence_order.py +62 -66
  46. protpy-1.6.0/tests/test_spectral.py +79 -0
  47. protpy-1.6.0/tests/test_structural.py +142 -0
  48. {protpy-1.4.2 → protpy-1.6.0}/tests/test_utils.py +2 -1
  49. protpy-1.4.2/PKG-INFO +0 -558
  50. protpy-1.4.2/README.md +0 -509
  51. protpy-1.4.2/protpy/__init__.py +0 -43
  52. protpy-1.4.2/protpy/autocorrelation.py +0 -381
  53. protpy-1.4.2/protpy/composition.py +0 -1475
  54. protpy-1.4.2/protpy/conjoint_triad.py +0 -76
  55. protpy-1.4.2/protpy/data/README.md +0 -9
  56. protpy-1.4.2/protpy/encode.py +0 -631
  57. protpy-1.4.2/protpy/sequence_order.py +0 -363
  58. protpy-1.4.2/protpy/utils.py +0 -740
  59. protpy-1.4.2/protpy.egg-info/PKG-INFO +0 -558
  60. protpy-1.4.2/tests/test_protpy.py +0 -130
  61. {protpy-1.4.2 → protpy-1.6.0}/LICENSE +0 -0
  62. {protpy-1.4.2 → protpy-1.6.0}/MANIFEST.in +0 -0
  63. {protpy-1.4.2 → protpy-1.6.0}/protpy/data/grantham-physicochemical-distance-matrix.json +0 -0
  64. {protpy-1.4.2 → protpy-1.6.0}/protpy/data/schneider-wrede-physicochemical-distance-matrix.json +0 -0
  65. {protpy-1.4.2 → protpy-1.6.0}/protpy.egg-info/dependency_links.txt +0 -0
  66. {protpy-1.4.2 → protpy-1.6.0}/setup.cfg +0 -0
  67. {protpy-1.4.2 → protpy-1.6.0}/tests/__init__.py +0 -0
  68. {protpy-1.4.2 → protpy-1.6.0}/tests/test_ctd.py +0 -0
protpy-1.6.0/PKG-INFO ADDED
@@ -0,0 +1,832 @@
1
+ Metadata-Version: 2.4
2
+ Name: protpy
3
+ Version: 1.6.0
4
+ Summary: Python package for generating various biochemical, physicochemical and structural descriptors/features of protein sequences.
5
+ Author-email: AJ McKenna <amckenna41@qub.ac.uk>
6
+ Maintainer-email: AJ McKenna <amckenna41@qub.ac.uk>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/amckenna41/protPy
9
+ Project-URL: Repository, https://github.com/amckenna41/protPy
10
+ Project-URL: Bug Tracker, https://github.com/amckenna41/protpy/issues
11
+ Project-URL: Download, https://github.com/amckenna41/protPy/archive/refs/heads/main.zip
12
+ Keywords: bioinformatics,protein engineering,python,pypi,machine learning,aaindex,protein descriptors,physicochemical descriptors,biochemical descriptors,structural descriptors,pySAR
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Intended Audience :: Healthcare Industry
18
+ Classifier: Intended Audience :: Information Technology
19
+ Classifier: License :: OSI Approved :: MIT License
20
+ Classifier: Natural Language :: English
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
27
+ Classifier: Programming Language :: Python :: 3 :: Only
28
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
29
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
30
+ Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
31
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
+ Requires-Python: >=3.9
33
+ Description-Content-Type: text/markdown
34
+ License-File: LICENSE
35
+ Requires-Dist: aaindex>=1.3.1
36
+ Requires-Dist: numpy>=2.0.0
37
+ Requires-Dist: pandas>=2.0.2
38
+ Requires-Dist: tqdm>=4.0.0
39
+ Provides-Extra: test
40
+ Requires-Dist: pytest; extra == "test"
41
+ Requires-Dist: pytest-cov; extra == "test"
42
+ Requires-Dist: pytest-flake8; extra == "test"
43
+ Requires-Dist: pytest-timeout; extra == "test"
44
+ Requires-Dist: biopython>=1.87; extra == "test"
45
+ Provides-Extra: docs
46
+ Requires-Dist: sphinx; extra == "docs"
47
+ Dynamic: license-file
48
+
49
+
50
+ <a id="TOP"></a>
51
+
52
+ # protpy - Package for generating protein physicochemical, biochemical and structural descriptors using their constituent amino acids. #
53
+ [![PyPI](https://img.shields.io/pypi/v/protpy)](https://pypi.org/project/protpy/)
54
+ [![pytest](https://github.com/amckenna41/protpy/workflows/Building%20and%20Testing/badge.svg)](https://github.com/amckenna41/protpy/actions?query=workflowBuilding%20and%20Testing)
55
+ [![Platforms](https://img.shields.io/badge/platforms-linux%2C%20macOS%2C%20Windows-green)](https://pypi.org/project/protpy/)
56
+ [![PythonV](https://img.shields.io/pypi/pyversions/protpy?logo=2)](https://pypi.org/project/protpy/)
57
+ [![Documentation Status](https://readthedocs.org/projects/protpy/badge/?version=latest)](https://protpy.readthedocs.io/en/latest/?badge=latest)
58
+ [![codecov](https://codecov.io/gh/amckenna41/protPy/graph/badge.svg?token=H508M9J13W)](https://codecov.io/gh/amckenna41/protPy)
59
+ [![License: MIT](https://img.shields.io/badge/License-MIT-red.svg)](https://opensource.org/licenses/MIT)
60
+ [![Issues](https://img.shields.io/github/issues/amckenna41/protpy)](https://github.com/amckenna41/protpy/issues)
61
+ <!-- [![Size](https://img.shields.io/github/repo-size/amckenna41/protpy)](https://github.com/amckenna41/protpy)
62
+ [![Commits](https://img.shields.io/github/commit-activity/w/amckenna41/protpy)](https://github.com/amckenna41/protpy) -->
63
+ <!-- <p align="center">
64
+ <img src="https://images.newscientist.com/wp-content/uploads/2021/07/22155326/22-july_deepmind-proteome.jpg?width=300" alt="protpyLogo" height="200"/>
65
+ </p> -->
66
+
67
+ * 🧬 A <b>demo</b> of the software is available [here][demo]
68
+ * 📝 A <b>Medium</b> article about `protPy` and its background is available [here][article]
69
+
70
+ <p align="center">
71
+ <img src="https://raw.githubusercontent.com/amckenna41/protpy/main/images/protpy.png" alt="protpy" width="500"/>
72
+ </p>
73
+
74
+ Table of Contents
75
+ -----------------
76
+
77
+ * [Introduction](#introduction)
78
+ * [Requirements](#requirements)
79
+ * [Installation](#installation)
80
+ * [Usage](#usage)
81
+ * [Documentation](#documentation)
82
+ * [Directories](#directories)
83
+ * [Tests](#tests)
84
+ * [Issues](#Issues)
85
+ * [Contact](#contact)
86
+ * [References](#references)
87
+
88
+ Introduction
89
+ ------------
90
+ `protpy` is a Python software package for generating a variety of physicochemical, biochemical and structural descriptors for proteins. All of these descriptors are calculated using sequence-derived or physicochemical features of the amino acids that make up the proteins. These descriptors have been highly studied and used in a series of Bioinformatic applications including protein engineering, SAR (sequence-activity-relationships), predicting protein structure & function, subcellular localization, protein-protein interactions, drug-target interactions etc.
91
+
92
+ This software is aimed at any researcher or developer using protein sequence/structural data, and was mainly created to use in my own project [`pySAR`](https://github.com/amckenna41/pySAR) which uses protein sequence data to identify Sequence Activity Relationships (SAR) using Machine Learning [[1]](#references). `protpy` is built and developed in Python 3.10.
93
+
94
+ The descriptors available in `protpy` include:
95
+
96
+ <details>
97
+ <summary><b>Composition Descriptors (24)</b></summary>
98
+
99
+ * **amino_acid_composition** (AAComp)
100
+ * **dipeptide_composition** (DPComp)
101
+ * **gravy** (GRAVY)
102
+ * **aromaticity** (Aromaticity)
103
+ * **instability_index** (II)
104
+ * **isoelectric_point** (pI)
105
+ * **molecular_weight** (MW)
106
+ * **aliphatic_index** (AI)
107
+ * **extinction_coefficient** (ExtCoeff)
108
+ * **boman_index** (BI) — alias of `gravy`
109
+ * **charge_distribution** (ChargeDist)
110
+ * **hydrophobic_moment** (μH)
111
+ * **motif_composition** (MotifComp)
112
+ * **pseudo_amino_acid_composition** (PAAComp)
113
+ * **amphiphilic_pseudo_amino_acid_composition** (APAAComp)
114
+ * **natural_vector** (NV)
115
+ * **atomic_composition** (ATC)
116
+ * **cksaagp** (CKSAAGP) — alias of `cksaap`
117
+ * **cksaap** (CKSAAP)
118
+ * **asdc** (ASDC)
119
+ * **distance_pair** (DP) — alias of `cksaap`
120
+ * **tripeptide_composition** (TPComp) — alias of `kmer_composition`
121
+ * **kmer_composition** (kmer)
122
+ * **dde** (DDE) — alias of `dipeptide_composition`
123
+
124
+ </details>
125
+
126
+ <details>
127
+ <summary><b>Complexity Descriptors (3)</b></summary>
128
+
129
+ * **shannon_entropy** (ShannonH)
130
+ * **wootton_federhen_complexity** (WF)
131
+ * **lempel_ziv_complexity** (LZ)
132
+
133
+ </details>
134
+
135
+ <details>
136
+ <summary><b>Autocorrelation Descriptors (4)</b></summary>
137
+
138
+ * **geary_autocorrelation** (GAuto) — alias of `autocorrelation`
139
+ * **moreaubroto_autocorrelation** (MBAuto) — alias of `autocorrelation`
140
+ * **moran_autocorrelation** (MAuto) — alias of `autocorrelation`
141
+ * **autocorrelation** (Auto)
142
+
143
+ </details>
144
+
145
+ <details>
146
+ <summary><b>Conjoint Triad Descriptors (1)</b></summary>
147
+
148
+ * **conjoint_triad** (CTriad)
149
+
150
+ </details>
151
+
152
+ <details>
153
+ <summary><b>CTD Descriptors (5)</b></summary>
154
+
155
+ * **ctd** (CTD)
156
+ * **ctd_** (CTD) — alias of `ctd`
157
+ * **ctd_composition** (CTD-C) — alias of `ctd`
158
+ * **ctd_transition** (CTD-T) — alias of `ctd`
159
+ * **ctd_distribution** (CTD-D) — alias of `ctd`
160
+
161
+ </details>
162
+
163
+ <details>
164
+ <summary><b>Sequence Order Descriptors (2)</b></summary>
165
+
166
+ * **quasi_sequence_order** (QSO)
167
+ * **sequence_order_coupling_number** (SOCN)
168
+
169
+ </details>
170
+
171
+ <details>
172
+ <summary><b>Physicochemical Descriptors (5)</b></summary>
173
+
174
+ * **charge_fractions** (FCR)
175
+ * **kappa** (Kappa)
176
+ * **sequence_charge_decoration** (SCD)
177
+ * **hydrophobicity_profile** (HP)
178
+ * **thermostability_indices** (Thermo)
179
+
180
+ </details>
181
+
182
+ <details>
183
+ <summary><b>Spectral Descriptors (1)</b></summary>
184
+
185
+ * **spectral_descriptors** (Spectral)
186
+
187
+ </details>
188
+
189
+ <details>
190
+ <summary><b>Structural Descriptors (3)</b></summary>
191
+
192
+ * **aggrescan** (AGG)
193
+ * **charge_hydropathy** (CH)
194
+ * **plaac** (PLAAC)
195
+
196
+ </details>
197
+
198
+ <details>
199
+ <summary><b>Scales Descriptors (2)</b></summary>
200
+
201
+ * **auto_cross_covariance** (ACC)
202
+ * **aa_scale_descriptors** (Scale)
203
+
204
+ </details>
205
+
206
+ ### New in v1.6.0: a slimmer, corrected descriptor set
207
+
208
+ A [descriptor value audit](CHANGELOG.md#160---2026-11-08) found that about half of the 80 registered
209
+ descriptors were exact duplicates, subsets or fixed linear maps of the amino acid composition, and
210
+ that several values were wrong. v1.6.0:
211
+
212
+ * **fixes values** — the instability-index table (now matches Biopython/ExPASy), QSO composition
213
+ terms (were 100x too large), CTD distribution quartiles, FoldIndex residue assignment, kappa for
214
+ single-sign sequences, APAAC denominator guard; pI and charge default to the Bjellqvist pKa set;
215
+ conjoint triad is normalised as in Shen et al. 2007; descriptors are no longer rounded
216
+ (`decimals=` rounds on request); a lag that is too long raises instead of silently becoming 30;
217
+ * **merges duplicates into family functions** — `kmer_composition(alphabet=)`, `cksaap(alphabet=)`,
218
+ `dipeptide_composition(normalize="dde")`, `autocorrelation(method=)`, `ctd(parts=)`,
219
+ `sequence_order_coupling_number` / `quasi_sequence_order(distance_matrix="both")`,
220
+ `hydrophobicity_profile(segments=)`, `motif_composition` (PROSITE motifs), `aa_scale_descriptors(mode=)`,
221
+ `charge_hydropathy(window=)`, `thermostability_indices()` and `spectral_descriptors(transform=)`;
222
+ literature names such as `tripeptide_composition`, `dde`, `cksaagp`, `distance_pair`,
223
+ `geary_autocorrelation` and `ctd_composition` stay as permanent aliases;
224
+ * **deprecates** 37 functions (they still work with a `DeprecationWarning` and are removed in 2.0;
225
+ see the table in `DESCRIPTORS.md`);
226
+ * **shrinks the default `all_descriptors` set** from 9,957 to 1,402 columns (tripeptide composition is
227
+ now opt-in), and makes it about 8x faster.
228
+
229
+ | Category | Registered descriptors added in v1.5.0 / v1.6.0 |
230
+ |---|---|
231
+ | Composition | `cksaap`, `cksaagp`, `dde`, `asdc`, `distance_pair`, `natural_vector`, `atomic_composition` |
232
+ | Autocorrelation / CTD | `autocorrelation`, `ctd` |
233
+ | Scales | `aa_scale_descriptors`, `auto_cross_covariance` |
234
+ | Physicochemical | `charge_fractions`, `kappa`, `sequence_charge_decoration`, `hydrophobicity_profile`, `thermostability_indices` |
235
+ | Complexity | `wootton_federhen_complexity`, `lempel_ziv_complexity` (and `shannon_entropy`, moved here) |
236
+ | Spectral | `spectral_descriptors` |
237
+ | Structural | `aggrescan`, `charge_hydropathy`, `plaac` |
238
+
239
+ `all_descriptors` and `encode_dataset` take `descriptor_set="classic"` (default, 1,402 columns),
240
+ `"extended"` or `"all"`, plus `include=` / `exclude=` lists and `decimals=`:
241
+
242
+ ```python
243
+ df = protpy.all_descriptors(protein_seq, descriptor_set="extended")
244
+ df = protpy.all_descriptors(protein_seq, include=["tripeptide_composition"], decimals=3)
245
+ ```
246
+
247
+ More detail of each descriptor is listed in the markdown file: [`DESCRIPTORS.md`](https://github.com/amckenna41/protPy/blob/main/DESCRIPTORS.md)
248
+
249
+
250
+ Requirements
251
+ ------------
252
+ * [Python][python] >= 3.9
253
+ * [aaindex][aaindex] >= 1.3.1
254
+ * [numpy][numpy] >= 2.0.0
255
+ * [pandas][pandas] >= 2.0.2
256
+ * [tqdm][tqdm] >= 4.0.0
257
+ * [biopython][biopython] >= 1.87 (only required for testing)
258
+
259
+ Installation
260
+ ------------
261
+ Install the latest version of `protpy` using pip:
262
+
263
+ ```bash
264
+ pip3 install protpy --upgrade
265
+ ```
266
+
267
+ Install by cloning repository:
268
+
269
+ ```bash
270
+ git clone https://github.com/amckenna41/protpy.git
271
+ python3 setup.py install
272
+ ```
273
+
274
+ Usage
275
+ -----
276
+ ### Import `protpy` after installation:
277
+ ```python
278
+ import protpy as protpy
279
+ ```
280
+
281
+ ### Import protein sequence from fasta:
282
+ ```python
283
+ from Bio import SeqIO
284
+
285
+ with open("test_fasta.fasta") as pro:
286
+ protein_seq = str(next(SeqIO.parse(pro,'fasta')).seq)
287
+ ```
288
+
289
+
290
+ <details>
291
+ <summary><b>Composition Descriptors Usage Examples</b></summary>
292
+
293
+ Calculate Amino Acid Composition:
294
+ ```python
295
+ aac = protpy.amino_acid_composition(protein_seq)
296
+ # A C D E F ...
297
+ # 6.693 3.108 5.817 3.347 6.614 ...
298
+ # shape: 1 x 20
299
+ ```
300
+
301
+ Calculate Dipeptide Composition:
302
+ ```python
303
+ dpc = protpy.dipeptide_composition(protein_seq)
304
+ # AA AC AD AE AF ...
305
+ # 0.797 0.159 0.478 0.399 0.239 ...
306
+ # shape: 1 x 400
307
+
308
+ #dipeptide deviation from expected mean (alias: protpy.dde)
309
+ dde = protpy.dipeptide_composition(protein_seq, normalize="dde")
310
+ # DDE_AA DDE_AC DDE_AD DDE_AE DDE_AF ...
311
+ # 1.989 -0.424 2.014 1.405 0.185 ...
312
+ # shape: 1 x 400
313
+ ```
314
+
315
+ Calculate Tripeptide Composition:
316
+ ```python
317
+ #alias of kmer_composition(k=3); 8000 columns, not in any all_descriptors set
318
+ tpc = protpy.tripeptide_composition(protein_seq)
319
+ # AAA AAC AAD AAE AAF ...
320
+ # 0.080 0 0 0.160 0 ...
321
+ # shape: 1 x 8000
322
+ ```
323
+
324
+ Calculate k-mer / Reduced Alphabet Composition:
325
+ ```python
326
+ #using default parameters: k=2
327
+ kmer = protpy.kmer_composition(protein_seq)
328
+ # AA AC AD AE AF ...
329
+ # 0.797 0.159 0.478 0.399 0.239 ...
330
+ # shape: 1 x 400
331
+
332
+ #hydrophobic / polar / charged groups (formerly hydrophobic_polar_charged_composition)
333
+ hpc = protpy.kmer_composition(protein_seq, k=1, alphabet=3)
334
+ # ReducedAlphabet_1 ReducedAlphabet_2 ReducedAlphabet_3
335
+ # 44.542 32.669 22.789
336
+ # shape: 1 x 3
337
+
338
+ #grouped dipeptide composition over the iFeature 5-group alphabet (GDPC)
339
+ gdpc = protpy.kmer_composition(protein_seq, k=2, alphabet="ifeature5")
340
+ # GDPC_aliphatic.aliphatic GDPC_aliphatic.aromatic GDPC_aliphatic.positive GDPC_aliphatic.negative GDPC_aliphatic.uncharged ...
341
+ # 12.839 4.625 3.429 2.951 12.121 ...
342
+ # shape: 1 x 25
343
+
344
+ #a custom grouping: a list of residue strings covering the 20 amino acids
345
+ custom = protpy.kmer_composition(protein_seq, k=1, alphabet=["AGV", "ILFP", "YMTS", "HNQW", "RK", "DE", "C"])
346
+ # RA_custom_AGV RA_custom_ILFP RA_custom_YMTS RA_custom_HNQW RA_custom_RK ...
347
+ # 20.239 25.259 21.434 12.908 7.888 ...
348
+ # shape: 1 x 7
349
+ ```
350
+
351
+ Calculate GRAVY:
352
+ ```python
353
+ gravy = protpy.gravy(protein_seq)
354
+ # GRAVY
355
+ # -0.045
356
+ # shape: 1 x 1
357
+ ```
358
+
359
+ Calculate Aromaticity:
360
+ ```python
361
+ aromaticity = protpy.aromaticity(protein_seq)
362
+ # Aromaticity
363
+ # 0.118
364
+ # shape: 1 x 1
365
+ ```
366
+
367
+ Calculate Instability Index:
368
+ ```python
369
+ #score < 40 = stable protein; DIWV table as in Biopython / ExPASy
370
+ instability = protpy.instability_index(protein_seq)
371
+ # InstabilityIndex
372
+ # 32.419
373
+ # shape: 1 x 1
374
+ ```
375
+
376
+ Calculate Isoelectric Point:
377
+ ```python
378
+ #using default parameters: pka_scale="bjellqvist" (as ExPASy / Biopython)
379
+ pi = protpy.isoelectric_point(protein_seq)
380
+ # IsoelectricPoint
381
+ # 5.562
382
+ # shape: 1 x 1
383
+ ```
384
+
385
+ Calculate Molecular Weight:
386
+ ```python
387
+ mw = protpy.molecular_weight(protein_seq)
388
+ # MolecularWeight
389
+ # 139125.120
390
+ # shape: 1 x 1
391
+ ```
392
+
393
+ Calculate Charge Distribution:
394
+ ```python
395
+ #using default parameters: ph=7.4, pka_scale="bjellqvist"
396
+ charge = protpy.charge_distribution(protein_seq)
397
+ # PositiveCharge NegativeCharge NetCharge
398
+ # 99.398 114.920 -15.522
399
+ # shape: 1 x 3
400
+
401
+ #charge per Da (formerly charge_density)
402
+ charge = protpy.charge_distribution(protein_seq, normalize="mass")
403
+ # PositiveCharge_perDa NegativeCharge_perDa NetCharge_perDa
404
+ # 0.000714 0.000826 -0.000112
405
+ # shape: 1 x 3
406
+ ```
407
+
408
+ Calculate Motif Composition:
409
+ ```python
410
+ #using the 8 default motifs
411
+ motif = protpy.motif_composition(protein_seq)
412
+ # NxS/T_glycosylation RGD_integrin KDEL_retention CxxC_zinc_finger CAAX_prenylation ...
413
+ # 23 0 0 2 0 ...
414
+ # shape: 1 x 8
415
+
416
+ #built-in PROSITE motifs by name, with counts per 100 residues
417
+ motif = protpy.motif_composition(protein_seq, motifs=["N_glycosylation", "PTS1", "tryptic_site"], per_100=True)
418
+ # N_glycosylation PTS1 tryptic_site N_glycosylation_per100 PTS1_per100 ...
419
+ # 23 0 93 1.833 0 ...
420
+ # shape: 1 x 6
421
+ ```
422
+
423
+ Calculate Aliphatic Index:
424
+ ```python
425
+ ai = protpy.aliphatic_index(protein_seq)
426
+ # AliphaticIndex
427
+ # 82.725
428
+ # shape: 1 x 1
429
+ ```
430
+
431
+ Calculate Extinction Coefficient:
432
+ ```python
433
+ ec = protpy.extinction_coefficient(protein_seq)
434
+ # ExtCoeff_Reduced ExtCoeff_Oxidized
435
+ # 140960 143335
436
+ # shape: 1 x 2
437
+ ```
438
+
439
+ Calculate Boman Index:
440
+ ```python
441
+ bi = protpy.boman_index(protein_seq)
442
+ # BomanIndex
443
+ # 1.198
444
+ # shape: 1 x 1
445
+ ```
446
+
447
+ Calculate Hydrophobic Moment:
448
+ ```python
449
+ #using default parameters: window=11, angle=100 (alpha-helix)
450
+ hm = protpy.hydrophobic_moment(protein_seq)
451
+ # HydrophobicMoment_Mean HydrophobicMoment_Max
452
+ # 0.272 0.813
453
+ # shape: 1 x 2
454
+ ```
455
+
456
+ Calculate Pseudo Amino Acid Composition:
457
+ ```python
458
+ #using default parameters: lamda=30, weight=0.05
459
+ paac = protpy.pseudo_amino_acid_composition(protein_seq)
460
+ # PAAC_1 PAAC_2 PAAC_3 PAAC_4 PAAC_5 ...
461
+ # 1.871 0.869 1.626 0.935 1.849 ...
462
+ # shape: 1 x 50
463
+ ```
464
+
465
+ Calculate Amphiphilic Pseudo Amino Acid Composition:
466
+ ```python
467
+ #using default parameters: lamda=30, weight=0.5
468
+ apaac = protpy.amphiphilic_pseudo_amino_acid_composition(protein_seq)
469
+ # APAAC_1 APAAC_2 APAAC_3 APAAC_4 APAAC_5 ...
470
+ # 6.049 2.809 5.257 3.025 5.977 ...
471
+ # shape: 1 x 80
472
+ ```
473
+
474
+ Calculate CKSAAP / CKSAAGP / ASDC / Distance Pair:
475
+ ```python
476
+ #using default parameters: gap=5
477
+ cksaap = protpy.cksaap(protein_seq)
478
+ # CKSAAP_AA_gap0 CKSAAP_AC_gap0 CKSAAP_AD_gap0 CKSAAP_AE_gap0 CKSAAP_AF_gap0 ...
479
+ # 0.797 0.159 0.478 0.399 0.239 ...
480
+ # shape: 1 x 2400
481
+
482
+ #grouped pairs (alias: protpy.cksaagp)
483
+ cksaagp = protpy.cksaap(protein_seq, alphabet="ifeature5")
484
+ # CKSAAGP_aliphatic.aliphatic_gap0 CKSAAGP_aliphatic.aromatic_gap0 CKSAAGP_aliphatic.positive_gap0 CKSAAGP_aliphatic.negative_gap0 CKSAAGP_aliphatic.uncharged_gap0 ...
485
+ # 12.839 4.625 3.429 2.951 12.121 ...
486
+ # shape: 1 x 150
487
+
488
+ asdc = protpy.asdc(protein_seq)
489
+ # ASDC_AA ASDC_AC ASDC_AD ASDC_AE ASDC_AF ...
490
+ # 0.443 0.218 0.329 0.252 0.329 ...
491
+ # shape: 1 x 400
492
+
493
+ dp = protpy.distance_pair(protein_seq)
494
+ # DP_IMV DP_L DP_F DP_WY DP_G ...
495
+ # 15.060 7.888 6.614 5.179 6.295 ...
496
+ # shape: 1 x 602
497
+ ```
498
+
499
+ Calculate Natural Vector / Atomic Composition:
500
+ ```python
501
+ nv = protpy.natural_vector(protein_seq, normalize=True)
502
+ # NV_n_A NV_n_C NV_n_D NV_n_E NV_n_F ...
503
+ # 0.067 0.031 0.058 0.033 0.066 ...
504
+ # shape: 1 x 60
505
+
506
+ atc = protpy.atomic_composition(protein_seq)
507
+ # ATC_C ATC_H ATC_N ATC_O ATC_S
508
+ # 27.011 52.281 6.952 13.501 0.255
509
+ # shape: 1 x 5
510
+ ```
511
+
512
+ </details>
513
+
514
+ <details>
515
+ <summary><b>Autocorrelation Descriptors Usage Examples</b></summary>
516
+
517
+ Calculate Autocorrelation:
518
+ ```python
519
+ #Moreau-Broto, Moran or Geary; the three names below are aliases
520
+ auto = protpy.autocorrelation(protein_seq, method="moran", lag=10)
521
+ # MAuto_CIDH920105_1 MAuto_CIDH920105_2 MAuto_CIDH920105_3 MAuto_CIDH920105_4 MAuto_CIDH920105_5 ...
522
+ # -0.058 -0.078 -0.042 -0.021 -0.054 ...
523
+ # shape: 1 x 80
524
+
525
+ #using default parameters: lag=30, the 8 default AAindex properties, normalize=True
526
+ mb = protpy.moreaubroto_autocorrelation(protein_seq)
527
+ # MBAuto_CIDH920105_1 MBAuto_CIDH920105_2 MBAuto_CIDH920105_3 MBAuto_CIDH920105_4 MBAuto_CIDH920105_5 ...
528
+ # -0.052 -0.072 -0.036 -0.015 -0.048 ...
529
+ # shape: 1 x 240
530
+
531
+ moran = protpy.moran_autocorrelation(protein_seq)
532
+ # MAuto_CIDH920105_1 MAuto_CIDH920105_2 MAuto_CIDH920105_3 MAuto_CIDH920105_4 MAuto_CIDH920105_5 ...
533
+ # -0.058 -0.078 -0.042 -0.021 -0.054 ...
534
+ # shape: 1 x 240
535
+
536
+ #Geary is the autocorrelation in the classic all_descriptors set
537
+ geary = protpy.geary_autocorrelation(protein_seq)
538
+ # GAuto_CIDH920105_1 GAuto_CIDH920105_2 GAuto_CIDH920105_3 GAuto_CIDH920105_4 GAuto_CIDH920105_5 ...
539
+ # 1.057 1.077 1.040 1.020 1.052 ...
540
+ # shape: 1 x 240
541
+ ```
542
+
543
+ </details>
544
+
545
+ <details>
546
+ <summary><b>Conjoint Triad Descriptors Usage Examples</b></summary>
547
+
548
+ Calculate Conjoint Triad:
549
+ ```python
550
+ #normalised (f - min) / max as in Shen et al. 2007
551
+ ctriad = protpy.conjoint_triad(protein_seq)
552
+ # conj_triad_111 conj_triad_112 conj_triad_113 conj_triad_114 conj_triad_115 ...
553
+ # 0.409 0.773 0.500 0.136 0.273 ...
554
+ # shape: 1 x 343
555
+
556
+ #raw triad counts
557
+ ctriad = protpy.conjoint_triad(protein_seq, normalize=False)
558
+ # conj_triad_111 conj_triad_112 conj_triad_113 conj_triad_114 conj_triad_115 ...
559
+ # 9 17 11 3 6 ...
560
+ # shape: 1 x 343
561
+ ```
562
+
563
+ </details>
564
+
565
+ <details>
566
+ <summary><b>CTD Descriptors Usage Examples</b></summary>
567
+
568
+ Calculate CTD:
569
+ ```python
570
+ #using default parameters: all 7 properties, parts="CTD" (ctd_ is an alias)
571
+ ctd = protpy.ctd(protein_seq)
572
+ # CTD_C_01_hydrophobicity CTD_C_02_hydrophobicity CTD_C_03_hydrophobicity CTD_C_01_normalized_vdwv CTD_C_02_normalized_vdwv ...
573
+ # 0.279 0.386 0.335 0.420 0.355 ...
574
+ # shape: 1 x 147
575
+
576
+ #transition only, for one property (same as ctd_transition)
577
+ ctd_t = protpy.ctd(protein_seq, property="charge", all_ctd=False, parts="T")
578
+ # CTD_T_12_charge CTD_T_13_charge CTD_T_23_charge
579
+ # 0.131 0.019 0.147
580
+ # shape: 1 x 3
581
+ ```
582
+
583
+ </details>
584
+
585
+ <details>
586
+ <summary><b>Sequence Order Descriptors Usage Examples</b></summary>
587
+
588
+ Calculate Sequence Order Coupling Number:
589
+ ```python
590
+ #using default parameters: lag=30, distance_matrix="schneider-wrede"
591
+ socn = protpy.sequence_order_coupling_number(protein_seq)
592
+ # SOCN_SW1 SOCN_SW2 SOCN_SW3 SOCN_SW4 SOCN_SW5 ...
593
+ # 401.387 409.243 376.946 393.042 396.196 ...
594
+ # shape: 1 x 30
595
+
596
+ #both matrices, divided by the number of pairs (removes the length dependence)
597
+ socn = protpy.sequence_order_coupling_number(protein_seq, lag=10, distance_matrix="both", normalize=True)
598
+ # SOCN_SW1 SOCN_SW2 SOCN_SW3 SOCN_SW4 SOCN_SW5 ...
599
+ # 0.320 0.327 0.301 0.314 0.317 ...
600
+ # shape: 1 x 20
601
+ ```
602
+
603
+ Calculate Quasi Sequence Order:
604
+ ```python
605
+ #using default parameters: lag=30, weight=0.1, distance_matrix="schneider-wrede"; the 50 values sum to 1
606
+ qso = protpy.quasi_sequence_order(protein_seq)
607
+ # QSO_SW1 QSO_SW2 QSO_SW3 QSO_SW4 QSO_SW5 ...
608
+ # 0.000057 0.000026 0.000049 0.000028 0.000056 ...
609
+ # shape: 1 x 50
610
+
611
+ #both matrices (as in all_descriptors)
612
+ qso = protpy.quasi_sequence_order(protein_seq, distance_matrix="both")
613
+ # QSO_SW1 QSO_SW2 QSO_SW3 QSO_SW4 QSO_SW5 ...
614
+ # 0.000057 0.000026 0.000049 0.000028 0.000056 ...
615
+ # shape: 1 x 100
616
+ ```
617
+
618
+ </details>
619
+
620
+ <details>
621
+ <summary><b>Physicochemical, Complexity, Spectral and Structural Descriptors Usage Examples</b></summary>
622
+
623
+ Calculate Charge:
624
+ ```python
625
+ fcr = protpy.charge_fractions(protein_seq)
626
+ # Charge_FCR Charge_FPlus Charge_FMinus Charge_NCPR Charge_Sigma
627
+ # 0.171 0.079 0.092 -0.013 0.000953
628
+ # shape: 1 x 5
629
+
630
+ kappa = protpy.kappa(protein_seq)
631
+ # Kappa
632
+ # 0.153
633
+ # shape: 1 x 1
634
+
635
+ scd = protpy.sequence_charge_decoration(protein_seq)
636
+ # Charge_SCD
637
+ # 1.392
638
+ # shape: 1 x 1
639
+ ```
640
+
641
+ Calculate Hydrophobicity Profile:
642
+ ```python
643
+ hp = protpy.hydrophobicity_profile(protein_seq)
644
+ # HP_kyte_doolittle_w9_mean HP_kyte_doolittle_w9_max HP_kyte_doolittle_w9_min HP_kyte_doolittle_w9_std
645
+ # -0.053 3.189 -2.822 0.876
646
+ # shape: 1 x 4
647
+
648
+ #hydropathy transmembrane segments (formerly transmembrane_features)
649
+ tm = protpy.hydrophobicity_profile(protein_seq, window=19, threshold=1.6, segments=True)
650
+ # HP_kyte_doolittle_w19_mean HP_kyte_doolittle_w19_max HP_kyte_doolittle_w19_min HP_kyte_doolittle_w19_std HP_kyte_doolittle_w19_frac_above ...
651
+ # -0.058 2.811 -1.911 0.631 0.015 ...
652
+ # shape: 1 x 8
653
+
654
+ #Vihinen flexibility profile (formerly flexibility)
655
+ flex = protpy.hydrophobicity_profile(protein_seq, scale="vihinen_flexibility", window=9, edge=0.25)
656
+ # HP_vihinen_flexibility_w9_mean HP_vihinen_flexibility_w9_max HP_vihinen_flexibility_w9_min HP_vihinen_flexibility_w9_std
657
+ # 0.995 1.060 0.931 0.019
658
+ # shape: 1 x 4
659
+ ```
660
+
661
+ Calculate Thermostability Indices:
662
+ ```python
663
+ thermo = protpy.thermostability_indices(protein_seq)
664
+ # IVYWREL CvP_Bias
665
+ # 0.330 -9.323
666
+ # shape: 1 x 2
667
+ ```
668
+
669
+ Calculate Complexity:
670
+ ```python
671
+ h = protpy.shannon_entropy(protein_seq)
672
+ # ShannonEntropy
673
+ # 4.163
674
+ # shape: 1 x 1
675
+
676
+ wf = protpy.wootton_federhen_complexity(protein_seq)
677
+ # WF_K2_mean WF_K2_min WF_LowComplexity_frac
678
+ # 3.001 2.055 0.030
679
+ # shape: 1 x 3
680
+
681
+ lz = protpy.lempel_ziv_complexity(protein_seq)
682
+ # LZ_Normalized
683
+ # 0.860
684
+ # shape: 1 x 1
685
+ ```
686
+
687
+ Calculate Spectral Descriptors:
688
+ ```python
689
+ fft = protpy.spectral_descriptors(protein_seq)
690
+ # FFT_eiip_bin1 FFT_eiip_bin2 FFT_eiip_bin3 FFT_eiip_bin4 FFT_eiip_bin5 ...
691
+ # 0.001361 0.001641 0.001838 0.001610 0.001683 ...
692
+ # shape: 1 x 10
693
+
694
+ dct = protpy.spectral_descriptors(protein_seq, transform="dct")
695
+ # DCT_kyte_doolittle_1 DCT_kyte_doolittle_2 DCT_kyte_doolittle_3 DCT_kyte_doolittle_4 DCT_kyte_doolittle_5 ...
696
+ # -1.812 1.051 2.011 1.613 -3.117 ...
697
+ # shape: 1 x 10
698
+ ```
699
+
700
+ Calculate Factor Scales:
701
+ ```python
702
+ #sequence mean of a factor scale
703
+ scales = protpy.aa_scale_descriptors(protein_seq, "atchley_factors")
704
+ # AF_1 AF_2 AF_3 AF_4 AF_5
705
+ # -0.095 0.080 -0.141 0.337 -0.122
706
+ # shape: 1 x 5
707
+
708
+ #auto/cross covariance of the 5 z-scales
709
+ acc = protpy.auto_cross_covariance(protein_seq)
710
+ # ACC_1_1_lag1 ACC_1_2_lag1 ACC_1_3_lag1 ACC_1_4_lag1 ACC_1_5_lag1 ...
711
+ # -0.494 -0.181 0.021 -0.101 -0.119 ...
712
+ # shape: 1 x 125
713
+ ```
714
+
715
+ Calculate Structural:
716
+ ```python
717
+ agg = protpy.aggrescan(protein_seq)
718
+ # AGG_a3vSA AGG_NnHS AGG_AATr AGG_THSAr AGG_a4vAHS
719
+ # 0.072 4.701 0.230 0.155 0.409
720
+ # shape: 1 x 5
721
+
722
+ #Uversky charge-hydropathy score of the whole sequence
723
+ ch = protpy.charge_hydropathy(protein_seq)
724
+ # CH_HQ
725
+ # 0.215
726
+ # shape: 1 x 1
727
+
728
+ #FoldIndex profile
729
+ fi = protpy.charge_hydropathy(protein_seq, window=51)
730
+ # CH_w51_mean CH_w51_max CH_w51_min CH_w51_std
731
+ # 0.186 0.582 -0.190 0.132
732
+ # shape: 1 x 4
733
+
734
+ plaac = protpy.plaac(protein_seq, fill_value=0.0)
735
+ # PLAAC_LLR PLAAC_COREscore PLAAC_PrD_length PLAAC_has_PrD
736
+ # -1.578 0 0 0
737
+ # shape: 1 x 4
738
+ ```
739
+
740
+ </details>
741
+ ### Scaling features for machine learning
742
+
743
+ protpy returns each descriptor on its natural scale (percentages, counts, indices, pH, Da, ...). If your classifier needs features on a common scale such as [0, 1], fit a scaler on your **training** data and reuse it for test and new sequences. This scales every column to the range seen in your data without leaking information from the test set:
744
+
745
+ ```python
746
+ from sklearn.preprocessing import MinMaxScaler
747
+
748
+ X_train = protpy.encode_dataset(train_seqs, output_file=None, verbose=False).set_index("sequence_id")
749
+ X_test = protpy.encode_dataset(test_seqs, output_file=None, verbose=False).set_index("sequence_id")
750
+
751
+ scaler = MinMaxScaler(clip=True).fit(X_train) # fit on training data only
752
+ X_train_scaled = scaler.transform(X_train) # every column in [0, 1]
753
+ X_test_scaled = scaler.transform(X_test) # clip=True keeps unseen extremes in [0, 1]
754
+ ```
755
+
756
+ `StandardScaler` is a common alternative, and tree-based models don't need scaling. When cross-validating, put the scaler in a scikit-learn `Pipeline` so it is re-fitted on each training fold. Impute the few `NaN` values that `descriptor_set="extended"` can produce (e.g. with `SimpleImputer`) before scaling.
757
+
758
+ Documentation
759
+ -------------
760
+ The documentation for `protpy` is hosted on **ReadTheDocs** and is available [here][readthedocs].
761
+
762
+ Directories
763
+ -----------
764
+ * `/tests` - unit and integration tests for `protpy` package.
765
+ * `/protpy` - source code and all required external data files for package.
766
+ * `/docs` - `protpy` documentation.
767
+ * `/examples` - example notebook for protpy
768
+
769
+ Tests
770
+ -----
771
+ Install the test requirements (these include Biopython, which the reference-value tests compare against), then run all tests from the main `protpy` folder:
772
+ ```
773
+ pip install -r tests/requirements.txt
774
+ python3 -m unittest discover tests -v
775
+ ```
776
+ `python -m pytest` runs the same suite, and the CI uses it. Set `PROTPY_PERF=1` to include the timing test. See [`tests/README.md`](tests/README.md) for what each test file covers.
777
+
778
+ Contact
779
+ -------
780
+ If you have any questions or comments, please contact amckenna41@qub.ac.uk or raise an issue on the [Issues][Issues] tab.
781
+
782
+ References
783
+ ----------
784
+ \[1\]: Mckenna, A., & Dubey, S. (2022). Machine learning based predictive model for the analysis of sequence activity relationships using protein spectra and protein descriptors. Journal of Biomedical Informatics, 128(104016), 104016. https://doi.org/10.1016/j.jbi.2022.104016 <br>
785
+ \[2\]: Shuichi Kawashima, Minoru Kanehisa, AAindex: Amino Acid index database, Nucleic Acids Research, Volume 28, Issue 1, 1 January 2000, Page 374, https://doi.org/10.1093/nar/28.1.374 <br>
786
+ \[3\]: Dong, J., Yao, ZJ., Zhang, L. et al. PyBioMed: a python library for various molecular representations of chemicals, proteins and DNAs and their interactions. J Cheminform 10, 16 (2018). https://doi.org/10.1186/s13321-018-0270-2 <br>
787
+ \[4\]: Reczko, M. and Bohr, H. (1994) The DEF data base of sequence based protein
788
+ fold class predictions. Nucleic Acids Res, 22, 3616-3619. <br>
789
+ \[5\]: Hua, S. and Sun, Z. (2001) Support vector machine approach for protein
790
+ subcellular localization prediction. Bioinformatics, 17, 721-728. <br>
791
+ \[6\]: Broto P, Moreau G, Vandicke C: Molecular structures: perception,
792
+ autocorrelation descriptor and SAR studies. Eur J Med Chem 1984, 19: 71–78. <br>
793
+ \[7\]: Ong, S.A., Lin, H.H., Chen, Y.Z. et al. Efficacy of different protein
794
+ descriptors in predicting protein functional families. BMC Bioinformatics
795
+ 8, 300 (2007). https://doi.org/10.1186/1471-2105-8-300 <br>
796
+ \[8\]: Inna Dubchak, Ilya Muchink, Stephen R.Holbrook and Sung-Hou Kim. Prediction
797
+ of protein folding class using global description of amino acid sequence.
798
+ Proc.Natl. Acad.Sci.USA, 1995, 92, 8700-8704. <br>
799
+ \[9\]: Juwen Shen, Jian Zhang, Xiaomin Luo, Weiliang Zhu, Kunqian Yu, Kaixian Chen,
800
+ Yixue Li, Huanliang Jiang. Predicting proten-protein interactions based only
801
+ on sequences inforamtion. PNAS. 2007 (104) 4337-4341. <br>
802
+ \[10\]: Kuo-Chen Chou. Prediction of Protein Subcellar Locations by Incorporating
803
+ Quasi-Sequence-Order Effect. Biochemical and Biophysical Research
804
+ Communications 2000, 278, 477-483. <br>
805
+ \[11\]: Kuo-Chen Chou. Prediction of Protein Cellular Attributes Using
806
+ Pseudo-Amino Acid Composition. PROTEINS: Structure, Function, and
807
+ Genetics, 2001, 43: 246-255. <br>
808
+ \[12\]: Kuo-Chen Chou. Using amphiphilic pseudo amino acid composition to predict enzyme
809
+ subfamily classes. Bioinformatics, 2005,21,10-19.
810
+
811
+ Support
812
+ -------
813
+ [<img src="https://img.shields.io/github/stars/amckenna41/protpy?color=green&label=star%20it%20on%20GitHub" width="132" height="20" alt="Star it on GitHub">](https://github.com/amckenna41/protpy)
814
+
815
+
816
+ <a href="https://www.buymeacoffee.com/amckenna41" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
817
+
818
+ [Back to top](#TOP)
819
+
820
+ <!-- Links -->
821
+ [python]: https://www.python.org/downloads/release/python-360/
822
+ [protpy]: https://github.com/amckenna41/protpy
823
+ [aaindex]: https://github.com/amckenna41/aaindex
824
+ [biopython]: https://biopython.org/
825
+ [numpy]: https://numpy.org/
826
+ [tqdm]: https://pypi.org/project/tqdm/
827
+ [pandas]: https://pandas.pydata.org/
828
+ [PyPi]: https://pypi.org/project/protpy/
829
+ [demo]: https://colab.research.google.com/drive/12E3ayovpZOf6Gv-8ILwkN1zReKslEksB?usp=sharing
830
+ [article]: https://medium.com/@ajmckenna69/protpy-05f02f821baa
831
+ [Issues]: https://github.com/amckenna41/protpy/issues
832
+ [readthedocs]: https://protpy.readthedocs.io/en/latest