Top AI Repos — open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Descriptor computation(chemistry) and (optional) storage for machine learning
| Date | Stars |
|---|---|
| 2026-07-31 | 280 |
| 2026-08-06 | 280 |
Today
— stars today
This week
— stars this week
This month
— stars this month
Momentum
0.0
growth rate 0.00%/day
DescriptaStorus
===============
The descriptastorus provides
1. fast random access to rows of properties suitable for
machine learning and
2. fast random access to indexed molecule files
3. A mechanism for generating new descriptors for new molecules
4. A mechanism for validating that you can recreate the same storage in different software/hardware environments
5. An easy script for making your own descriptor files from raw data.
[n.b.] kyotocabinet is required to read/write the inchiKey and name indices
This should be installed in your environment.
There are three basic ways to use DescriptaStorus:
1. Make a DescriptaStore using a script
2. Append new data to the store
3. Use a DescriptaStore to access properties
Installing
==========
```
1. install rdkit
2. install scikit-learn
pip install git+https://github.com/bp-kelley/descriptastorus
```
Requirements are in the setup.py file, but essentially:
1. python2/3
2. rdkit
3. [optional but highly recommended] kyotocabinet
Using RDKit descriptors
=======================
Grab a descriptor generator from the registry.
Currently registered descriptors:
* atompaircounts
* morgan3counts
* morganchiral3counts
* morganfeature3counts
* rdkit2d
* rdkit2dnormalized
* rdkit2dhistogramnormalized - much faster version of rdkit2dnormalized
* rdkitfpbits
Descriptors are input as a tuple or list to the generator.
```
from descriptastorus.descriptors.DescriptorGenerator import MakeGenerator
generator = MakeGenerator(("RDKit2D",))
for name, numpy_type in generator.GetColumns():
print("name: {} data type: {}".format(name, numpy_type))
```
The resulting columns and datatypes look like:
```
name: RDKit2D_calculated data type: <class 'bool'>
name: BalabanJ data type: <class 'numpy.float64'>
name: BertzCT data type: <class 'numpy.float64'>
name: Chi0 data type: <class 'numpy.float64'>
name: Chi0n data type: <class 'numpy.float64'>
name: Chi0v data type: <class 'numpy.float64'>
name: Chi1 data type: <class 'numpy.float64'>
```
Note: RDKit2D_calculated is just a flag for the store to indicate that the
RDKit2D features were successfully calculated.
To get combine multiple generators simply add them to the list
of desired datatypes:
```
from descriptastorus.descriptors.DescriptorGenerator import MakeGenerator
generator = MakeGenerator(("RDKit2D", "Morgan3Counts"))
smiles = "c1ccccc1"
data = generator.process(smiles)
assert data[0] is True
```
The first element is True if the molecule was successfully processed, this is used
in the descriptastor to indicate that the row is valid.
If a molecule is unsuccessfully processed, None is returned
```
data = generator.process("not a smiles")
assert data is None
```
Individual descriptor sets can also be used outside of the
generator.
```
from descriptastorus.descriptors import rdNormalizedDescriptors
from rdkit import Chem
import logging
# make the normalized descriptor generator
generator = rdNormalizedDescriptors.RDKit2DNormalized()
generator.columns # list of tuples: (descriptor_name, numpytype) ...
# features = generator.process(smiles)
# features[0] is True/False if the smiles could be processed correcty
# features[1:] are the normalized descriptors as described in generator.columns
# example for converting a smiles string into the values
def rdkit_2d_normalized_features(smiles: str):
# n.b. the first element is true/false if the descriptors were properly computed
results = generator.process(smiles)[
processed, features = results[0], results[1:]
if processed is None:
logging.warning("Unable to process smiles %s", smiles)
# if processed is None, the features are are default values for the type
return features
```
Making a DescriptaStore
=======================
see scripts/storus.py for more details:
```
usage: storus.py [-h] [--hasHeader] [--index-inchikey]
[--smilesColumn SMILESCOLUMN] [--nameColumn NAMECOLUMN]
[--seperator SEExcerpt of 9,272 characters
Read on GitHubWould you bet a product on this? Bounded 0–100 and slow moving.
matched fp:d3a0666e01c0923d, llm:description: 'Descriptor computation(chemistry) and (optional) storage for machine learning'
matched fp:d3a0666e01c0923d, llm:description: 'Descriptor computation(chemistry) and (optional) storage for machine learning'