Jeu de main Python (calcul du descripteur: version sérieuse)

Quel est cet article?

Il était une fois, quand j'ai commencé à écrire Python, j'ai écrit un calcul pour un descripteur composé. Mais, eh bien, "Qu'est-ce que Pnadas?" "Est-ce que je peux répondre?" Cela fait longtemps depuis, alors je l'ai réécrit.

Ensuite, il continue les E / S vers la base de données pour être lancé en continu.

Eh bien, il y a beaucoup de choses à faire, mais je vais le décomposer ici parce qu'il dit "Terminé est mieux que parfait".

Aperçu

Préparez un fichier SDF sous forme d'informations composées. Donc, en utilisant RDKit, faites-en une variable comme celle-ci.

# Acquisition de composés
sdfpath = 'xxx.sdf'
mols = get_mols(sdfpath)

Alors, créez une "ligne" pour chaque composé et créez des fonctions qui renvoient des sortes de "colonnes". Puisque les choses à faire sont les mêmes, j'ai essayé d'arranger les formes des fonctions. À propos, la valeur de retour est de type Pandas DataFrame. Je l'ai finalement remarqué récemment, mais c'est pratique.

Donc, sortie en csv collectivement.

code

import os
import pandas as pd


# Renvoie le composé
# I: chemin SDF
# O: liste d'objets composés
def get_mols(sdfpath):
    from rdkit import Chem
    mols = [mol for mol in Chem.SDMolSupplier(sdfpath) if mol is not None]
    return mols


# Renvoie des informations de base sur le composé [nom du composé, informations structurelles, nombre d'atomes, nombre de liaisons, SMILES, InChI]
# I: Liste d'objets composés
# O: données de résultat
def get_values_base(mols):
    from rdkit import Chem
    columns = ['Name', 'Structure', 'Atoms', 'Bonds', 'SMILES', 'InChI']
    values = list()
    for mol in mols:
        tmp = list()
        tmp.append(mol.GetProp('_Name'))
        tmp.append(Chem.MolToMolBlock(mol))
        tmp.append(mol.GetNumAtoms())
        tmp.append(mol.GetNumBonds())
        tmp.append(Chem.MolToSmiles(mol))
        tmp.append(Chem.MolToInchi(mol))
        values.append(tmp)
    index = [i for i in range(len(mols))]
    df = pd.DataFrame(values, columns=columns, index=index)
    return df


# Renvoie les paramètres externes du composé
# I: Liste d'objets composés
# O: données de résultat
def get_values_external(mols):
    from rdkit import Chem
    columns = ['ID', 'NAME', 'SOL', 'SMILES', 'SOL_classification']
    values = list()
    for mol in mols:
        tmp = list()
        for column in columns:
            tmp.append(mol.GetProp(column))
        values.append(tmp)
    columns = ['ext_' + column for column in columns]
    index = [i for i in range(len(mols))]
    df = pd.DataFrame(values, columns=columns, index=index)
    return df


# Calculer le descripteur: RDKit
# I: Liste d'objets composés
# O: données de résultat
def get_rdkit_descriptors(mols):
    from rdkit.Chem import AllChem, Descriptors
    from rdkit.ML.Descriptors import MoleculeDescriptors
 # Calcul du descripteur RDKit
    # names = [mol.GetProp('_Name') for mol in mols]
    descLists = [desc_name[0] for desc_name in Descriptors._descList]
    calcs = MoleculeDescriptors.MolecularDescriptorCalculator(descLists)
    values = [calcs.CalcDescriptors(mol) for mol in mols]
 Convertir en #DataFrame
    index = [i for i in range(len(mols))]
    df = pd.DataFrame(values, columns=descLists, index=index)
    return df


# Calculer le descripteur: mordred
# I: Liste d'objets composés
# O: données de résultat
def get_mordred_descriptors(mols):
 Calcul du # descripteur mordred
    from mordred import Calculator, descriptors
    calcs = Calculator(descriptors, ignore_3D=False)
    df = calcs.pandas(mols)
    df['index'] = [i for i in range(len(mols))]
    df.set_index('index', inplace=True)
    return df


# Calculer le descripteur: CDK
# I: fichier SDF
# chemin du fichier d'exécution java
# Chemin du fichier jar CDK
# O: données de résultat
def get_cdk_descriptors(sdfpath, workfolderpath, java_path, cdk_jar_path):
    filepath = os.path.join(workfolderpath, 'tmp.csv')
    import subprocess
    command = f'{java_path} -jar {cdk_jar_path} -b {sdfpath} -t all -o {filepath}'
    print(command)
    subprocess.run(command, shell=False)
    df = pd.read_table(filepath)
    os.remove(filepath)
    return df


# Traitement principal
def main():
    data_folderpath = 'D:\\data\\python_data\\chem'
    sdfpath = os.path.join(data_folderpath, 'sdf\\solubility.test.20.sdf')
    csvpath = 'solubility.test.csv'

    java_path = 'C:\\Program Files\\Java\\jdk-14.0.1\\bin\\java.exe'
    workfolderpath = os.path.dirname(os.path.abspath(__file__))
    cdk_jar_path = os.path.join(data_folderpath, 'jar\\CDKDescUI-1.4.6.jar')

 # Acquisition de composés
    mols = get_mols(sdfpath)

 # Obtenez chaque valeur
 # (bibliothèque python)
    dfs = list()
    for calcs in [get_values_base, get_values_external, get_rdkit_descriptors, get_mordred_descriptors]:
        dfs.append(calcs(mols))

 # (calcul du fichier jar)
    dfs.append(get_cdk_descriptors(sdfpath, workfolderpath, java_path, cdk_jar_path))

 # Tout combiner
    df = pd.concat(dfs, axis=1)
    df.to_csv('all_parameters.csv')
    print(df)


# Démarrez le processus
if __name__ == '__main__':
    main()

(Sortie: omis)

>python CalculateDescriptors.py
 100%|██████████████████████████████████████████████████████████████████████████████████| 20/20 [00:01<00:00, 17.22it/s]

...

   Name                                          Structure  Atoms  Bonds  ...   ALogP     ALogp2      AMR nAcid
0     1  1\n     RDKit          2D\n\n  6  5  0  0  0  ...      6      5  ... -0.3400   0.115600  26.1559     0
1     2  2\n     RDKit          2D\n\n  7  6  0  0  0  ...      7      6  ...  1.2082   1.459747  33.4010     0
2     3  3\n     RDKit          2D\n\n  5  4  0  0  0  ...      5      4  ...  0.7264   0.527657  23.4093     0
3     4  4\n     RDKit          2D\n\n  6  6  0  0  0  ...      6      6  ...  0.4030   0.162409  25.0454     0
4     5  5\n     RDKit          2D\n\n  5  4  0  0  0  ...      5      4  ...  1.4774   2.182711  25.1598     0
5     6  6\n     RDKit          2D\n\n  7  7  0  0  0  ...      7      7  ...  1.4658   2.148570  35.8212     0
6     7  7\n     RDKit          2D\n\n  8  7  0  0  0  ...      8      7  ... -0.2734   0.074748  30.1747     0
7     8  8\n     RDKit          2D\n\n  8  8  0  0  0  ...      8      8  ...  1.5147   2.294316  40.0862     0
8     9  9\n     RDKit          2D\n\n  9  9  0  0  0  ...      9      9  ...  2.7426   7.521855  43.8018     0
9    10  10\n     RDKit          2D\n\n  9 10  0  0  0 ...      9     10  ...  0.8490   0.720801  41.1580     0
10   11  11\n     RDKit          2D\n\n 10 10  0  0  0 ...     10     10  ...  2.1019   4.417984  48.7581     0
11   12  12\n     RDKit          2D\n\n 12 12  0  0  0 ...     12     12  ...  0.1695   0.028730  52.1462     0
12   13  13\n     RDKit          2D\n\n 14 15  0  0  0 ...     14     15  ...  2.5404   6.453632  69.2022     0
13   14  14\n     RDKit          2D\n\n 12 13  0  0  0 ...     12     13  ...  2.0591   4.239893  58.2832     0
14   15  15\n     RDKit          2D\n\n 12 13  0  0  0 ...     12     13  ...  2.8406   8.069008  57.7168     0
15   16  16\n     RDKit          2D\n\n 14 16  0  0  0 ...     14     16  ...  2.4922   6.211061  67.3498     0
16   17  17\n     RDKit          2D\n\n 16 18  0  0  0 ...     16     18  ...  3.3850  11.458225  75.9138     0
17   18  18\n     RDKit          2D\n\n 18 21  0  0  0 ...     18     21  ...  3.0366   9.220940  85.5468     0
18   19  19\n     RDKit          2D\n\n 18 21  0  0  0 ...     18     21  ...  3.0366   9.220940  85.5468     0
19   20  20\n     RDKit          2D\n\n 14 16  0  0  0 ...     14     16  ... -0.5223   0.272797  60.8303     0

[20 rows x 2322 columns]


Oh, j'ai supposé qu'il y avait 5 paramètres externes dans le fichier SDF ... Fixons-le bientôt. .. ..

Y compris que, 6 à partir des informations composées de RDKit, 5 à partir des paramètres externes ci-dessus, 200 à partir de RDKit, 286 à partir de CDK, 1824 à partir de mordred, un total de 2322 valeurs a été obtenu. ·· Hmm? Est-ce différent d'un? Oh, Index? Je vois.

Impressions

Eh bien, peut-être pas mal. Il y a beaucoup d'autres choses que je veux faire, donc je penserai sérieusement aux fonctions après j'en aurai un peu plus.

Donc, je pense que je vais continuer avec le prochain post.

Recommended Posts

Jeu de main Python (calcul du descripteur: version sérieuse)
Jeu manuel Python (calcul du descripteur RDKit: SDF en CSV à l'aide de Pandas)
Jeu de main Python (division)
Jeu de main Python (liste à deux dimensions)
Jeu à la main Python (Pandas / DataFrame début)
descripteur python
Jeu de main Python (calculé plein de mordred)
Jeu à la main en Python (notation sur une ligne de if)
Jouer Python async
Jouez avec 2016-Python
Jeu manuel Python (interopérabilité entre CSV et PostgreSQL)
Version 64 bits de PYTHON2.7
Python hand play (obtenir les noms de colonnes à partir du fichier CSV)
Jouez à YouTube en Python
calcul de tableau numpy python
Calcul de l'âge à l'aide de python
Calculer la date avec python
Calculer les dates en Python
Calcul numérique avec Python
Vérifier la version avec python