Python-Handspiel (Deskriptorberechnung: seriöse Version)

Was ist dieser Artikel?

Als ich anfing, Python zu schreiben, schrieb ich einmal eine Berechnung für einen zusammengesetzten Deskriptor. Aber nun, "Was ist Pnadas?" "Ist es in Ordnung zu antworten?" Seitdem ist es lange her, also habe ich es umgeschrieben.

Anschließend wird die E / A an die Datenbank weitergeleitet, um kontinuierlich ausgelöst zu werden.

Nun, es gibt eine Menge zu tun, aber ich werde sagen "Fertig ist besser als perfekt", also werde ich es hier aufschlüsseln.

Überblick

Bereiten Sie eine SDF-Datei als zusammengesetzte Information vor. Machen Sie es mit RDKit zu einer Variablen wie dieser.

# Compound-Akquisition
sdfpath = 'xxx.sdf'
mols = get_mols(sdfpath)

Erstellen Sie also für jede Verbindung eine "Zeile" und einige Funktionen, die einige Arten von "Spalten" zurückgeben. Da die zu erledigenden Aufgaben dieselben sind, habe ich versucht, die Formen der Funktionen anzuordnen. Der Rückgabewert ist übrigens vom Typ Pandas DataFrame. Ich habe es kürzlich endlich bemerkt, aber das ist praktisch.

Also gemeinsam als CSV ausgeben.

Code

import os
import pandas as pd


# Gibt die Verbindung zurück
# I: SDF-Pfad
# O: Zusammengesetzte Objektliste
def get_mols(sdfpath):
    from rdkit import Chem
    mols = [mol for mol in Chem.SDMolSupplier(sdfpath) if mol is not None]
    return mols


# Gibt grundlegende Informationen über die Verbindung zurück [Name der Verbindung, Strukturinformationen, Anzahl der Atome, Anzahl der Bindungen, SMILES, InChI]
# I: Zusammengesetzte Objektliste
# O: Ergebnisdaten
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


# Gibt die externen Parameter der Verbindung zurück
# I: Zusammengesetzte Objektliste
# O: Ergebnisdaten
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


# Deskriptor berechnen: RDKit
# I: Zusammengesetzte Objektliste
# O: Ergebnisdaten
def get_rdkit_descriptors(mols):
    from rdkit.Chem import AllChem, Descriptors
    from rdkit.ML.Descriptors import MoleculeDescriptors
 # Berechnung des RDKit-Deskriptors
    # 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]
 In #DataFrame konvertieren
    index = [i for i in range(len(mols))]
    df = pd.DataFrame(values, columns=descLists, index=index)
    return df


# Deskriptor berechnen: mordred
# I: Zusammengesetzte Objektliste
# O: Ergebnisdaten
def get_mordred_descriptors(mols):
 Berechnung des # mordred Deskriptors
    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


# Deskriptor berechnen: CDK
# I: SDF-Datei
# Pfad der Java-Ausführungsdatei
# CDK-JAR-Dateipfad
# O: Ergebnisdaten
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


# Hauptverarbeitung
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')

 # Zusammengesetzte Akquisition
    mols = get_mols(sdfpath)

 # Holen Sie sich jeden Wert
 # (Python-Bibliothek)
    dfs = list()
    for calcs in [get_values_base, get_values_external, get_rdkit_descriptors, get_mordred_descriptors]:
        dfs.append(calcs(mols))

 # (Berechnung der JAR-Datei)
    dfs.append(get_cdk_descriptors(sdfpath, workfolderpath, java_path, cdk_jar_path))

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


# Prozess starten
if __name__ == '__main__':
    main()

(Ausgabe: weggelassen)

>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, ich habe angenommen, dass die SDF-Datei 5 externe Parameter enthält ... Lass es uns bald beheben. .. ..

Einschließlich der 6 aus den zusammengesetzten Informationen von RDKit, 5 aus den obigen externen Parametern, 200 aus RDKit, 286 aus CDK, 1824 aus mordred wurden insgesamt 2322 Werte erhalten. ·· Hmm? Ist es um eins anders? Oh, Index? Das war's.

Impressionen

Na ja, vielleicht nicht schlecht. Es gibt viele andere Dinge, die ich machen möchte, also werde ich ernsthaft über die Funktionen nachdenken, nachdem ich ein bisschen mehr habe.

Also denke ich, ich werde mit dem nächsten Beitrag fortfahren.

Recommended Posts

Python-Handspiel (Deskriptorberechnung: seriöse Version)
Python-Handspiel (RDKit-Deskriptorberechnung: SDF zu CSV mit Pandas)
Python Handspiel (Division)
Python-Handspiel (zweidimensionale Liste)
Python-Handspiel (Pandas / DataFrame-Beginn)
Python-Deskriptor
Python-Handspiel (berechnet voller Mordred)
Python-Handspiel (einzeilige Notation von if)
Spielen Sie Python async
Spielen Sie mit 2016-Python
Python-Handspiel (Interoperation zwischen CSV und PostgreSQL)
PYTHON2.7 64-Bit-Version
Python-Handspiel (Spaltennamen aus CSV-Datei abrufen)
Spielen Sie YouTube in Python
Berechnung des Python-Numpy-Arrays
Altersberechnung mit Python
Berechnen Sie das Datum mit Python
Berechnen Sie Daten in Python
Numerische Berechnung mit Python
Überprüfen Sie die Version mit Python