是否可以将存储在 Pandas 数据帧中的 SMILE 结构直接输入 RDKit 以计算分子指纹和相似性?

问题描述

ref_Molecule

我的 df 中存储了大约 1500 个 SMILES 结构,merged_data['SMILES']。

我正在尝试创建一个名为“Molecule_Tan”的合并数据的新列,我想用数据框微笑的 Tanimoto 相似性指数与存储在 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 将 SMILE 值直接从数据帧传递到嵌套的 RDKit 函数中来提高效率,但是当我尝试运行它时,我收到此错误..

      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
..      ...  ...                                                ...

如果我尝试仅提供 Chem.MolFromSmiles() 数据框,也会发生此错误

虽然我不是 100% 清楚,但我认为错误与 Pandas 数据框试图给 MolFromSmiles() 函数一个系列而不是单个对象有关。

我想弄清楚的是,是否有一种方法可以管理我在 Pandas 中要做的事情,而无需编写循环来遍历整个数据框。 >

感谢任何可以给我一些关于我正在尝试做的事情是否可行的意见的人!!!

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

如果有帮助,这大概就是我的数据框的重要部分的样子...

SaveScreenshot(this.userControl11.myMap,"MapScreenshot.png"); // code in menu item click handler

private async void SaveScreenshot(FrameworkElement captureSource,string suggestedname)
{
    //Create a FileSavePicker.
    var savePicker = new Windows.Storage.Pickers.FileSavePicker()
    {
        DefaultFileExtension = ".png",SuggestedFileName = suggestedname,SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary
    };

    savePicker.FileTypeChoices.Add(".png",new System.Collections.Generic.List<string> { ".png" });

    //Prompt the user to select a file.
    var saveFile = await savePicker.PickSaveFileAsync();

    //Verify the user selected a file.
    if (saveFile != null)
    {                
        using (var fileStream = await saveFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
        {
            //Capture the screenshot and save it to the file stream.
            await ScreenshottoStreamAsync(captureSource,fileStream);
        }
    }
}

private async Task ScreenshottoStreamAsync(FrameworkElement element,IRandomAccessstream stream)
{
    var rendertargetBitmap = new Windows.UI.Xaml.Media.Imaging.rendertargetBitmap();
    await rendertargetBitmap.RenderAsync(element);

    var pixelBuffer = await rendertargetBitmap.GetPixelsAsync();

    var dpi = Windows.Graphics.display.display@R_316_404[email protected]().LogicalDpi;

    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,stream);
    encoder.SetPixelData(
        BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore,(uint)rendertargetBitmap.PixelWidth,(uint)rendertargetBitmap.PixelHeight,dpi,pixelBuffer.ToArray());

    await encoder.FlushAsync();
}

解决方法

你是对的,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