ref_Molecule = Chem.MolFromSmiles('CC1=C(C(O)=O)C2=CC(=CC=C2N=C1C3=CC=C(C=C3)C4=CC=CC=C4F)F')

merged_data['Molecule_Tan'] = DataStructs.TanimotoSimilarity(Chem.RDKFingerprint(ref_Brequinar), Chem.RDKFingerprint(Chem.MolFromSmiles(merged_data.SMILES)))

У меня примерно 1500 структур SMILES, хранящихся в моем df, merged_data ['SMILES'].

Я пытаюсь создать новый столбец merged_data с именем «Molecule_Tan», который я хочу заполнить индексом сходства Танимото для улыбок кадра данных по сравнению с эталонной последовательностью, хранящейся в, ref_Molecule.

Я пытался быть эффективным, передавая значения SMILE непосредственно из фрейма данных во вложенные функции RDKit в одной строке, используя merged_data.SMILES или merged_data['SMILES'], но когда я пытаюсь запустить это, я получаю эту ошибку ..

Traceback (most recent call last):
  File "filepath", line 69, in <module>
    strasd = Chem.MolFromSmiles(merged_data['SMILES'].astype('object'))

TypeError: No registered converter was able to produce a C++ rvalue of type class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > from this Python object of type Series

Эта ошибка также возникает, если я пытаюсь передать фрейм данных только Chem.MolFromSmiles ().

Хотя я не на 100% ясен в этом, я думаю , что ошибка связана с фреймом данных pandas, который пытается дать функции MolFromSmiles () серию вместо отдельных объектов.

Я пытаюсь выяснить, есть ли способ управлять тем, что я пытаюсь сделать в пандах, без написания цикла для итерации по всему фрейму данных.

Спасибо всем, кто может дать мне какую-то информацию о том, возможно ли то, что я пытаюсь сделать !!!

==============

Если это поможет, то примерно так выглядят важные части моего фрейма данных ...

      Title  ...                                             SMILES
0    236254  ...           Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1
1     79582  ...                        [O-][n+]1nc2ccccc2c2ccccc21
2     26744  ...                     O=c1cc(-c2ccccc2)oc2ccc(O)cc12
3     38007  ...                     Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12
4    109747  ...                  Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1
..      ...  ...                                                ...
2
Paul 22 Фев 2021 в 02:37

1 ответ

Лучший ответ

Вы правы, что pandas дает целую серию вместо отдельных объектов, поэтому вам нужно повторять.

Но тогда отпечатки пальцев можно сразу сравнить с BulkTanimotoSimilarity().

Вы можете попробовать этот код:

from rdkit import Chem
from rdkit import DataStructs
import pandas as pd

target = Chem.RDKFingerprint(Chem.MolFromSmiles('CC1=C(C(O)=O)C2=CC(=CC=C2N=C1C3=CC=C(C=C3)C4=CC=CC=C4F)F'))

d = {'SMILES': ['Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1',
                '[O-][n+]1nc2ccccc2c2ccccc21',
                'O=c1cc(-c2ccccc2)oc2ccc(O)cc12',
                'Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12',
                'Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1']}

df = pd.DataFrame(data=d)

df['Tanimoto'] = DataStructs.BulkTanimotoSimilarity(target, [Chem.RDKFingerprint(Chem.MolFromSmiles(s)) for s in df['SMILES']])

print(df)

Выход:

                                     SMILES  Tanimoto
0  Cc1c(-c2ccccc2)n(O)[n+]([O-])c1-c1ccccc1  0.287625
1               [O-][n+]1nc2ccccc2c2ccccc21  0.178967
2            O=c1cc(-c2ccccc2)oc2ccc(O)cc12  0.273179
3            Oc1cc(-c2ccc(Cl)cc2)nc2ccccc12  0.387127
4         Cc1cc(O)c2cc(C(=O)c3ccccc3)ccc2n1  0.319298
1
rapelpy 22 Фев 2021 в 17:39