python - 值错误 : BitVects must be same length (rdkit)

标签 python python-3.x fingerprint rdkit

我正在使用 rdkit 计算 2 个摩尔之间的结构相似性概况。当我在 google colab (rdkit=2020.09.2 python=3.7) 中运行该程序时,该程序运行正常。

我在 PC 上运行时遇到错误 (rdkit=2021.03.2 python=3.8.5)。错误有点奇怪。数据框包含 500 行,代码仅适用于前 10 行 (0-9),对于后面的行,我收到错误

 s = DataStructs.BulkTanimotoSimilarity(fps_2[n], fps_2[n+1:]) 
    ValueError: BitVects must be same length

代码块如下所示

  data = pd.read_csv(os.path.join(os.path.join(os.getcwd(), "dataset"), "test_ssp.csv"), index_col=None)
 
  
  #Proff and make a list of Smiles and id
  c_smiles = []
  count = 0
  for index, row in data.iterrows():
    try:
      cs = Chem.CanonSmiles(row['SMILES'])
      c_smiles.append([row['ID_Name'], cs])
    except:
      count = count + 1
      print('Count Invalid SMILES:', count, row['ID_Name'], row['SMILES'])

  # make a list of id, smiles, and mols
  ms = []
  df = DataFrame(c_smiles,columns=['ID_Name','SMILES'])
  for index, row in df.iterrows():
    mol = Chem.MolFromSmiles(row['SMILES'])
    ms.append([row['ID_Name'], row['SMILES'], mol])

  # make a list of id, smiles, mols, and fingerprints (fp)
  fps = []
  df_fps = DataFrame(ms,columns=['ID_Name','SMILES', 'mol'])
  df_fps.head

  for index, row in df_fps.iterrows():
    fps_cal = FingerprintMols.FingerprintMol(row['mol'])
    fps.append([row['ID_Name'], fps_cal])


  fps_2 = DataFrame(fps,columns=['ID_Name','fps'])
  fps_2 = fps_2[fps_2.columns[1]]
  fps_2 = fps_2.values.tolist()


  # compare all fp pairwise without duplicates
  for n in range(len(fps_2)): 
      s = DataStructs.BulkTanimotoSimilarity(fps_2[n], fps_2[n+1:])
      for m in range(len(s)):
          qu.append(c_smiles2[n])
          ta.append(c_smiles2[n+1:][m])
          sim.append(s[m])

您能告诉我为什么当代码在 Google Colab 中运行良好时我的 PC 上会出现此错误吗?我该如何解决这个问题?有没有办法安装rdkit=2020.09.2

可重现的数据

DB00607 [H][C@]12SC(C)(C)[C@@H](N1C(=O)[C@H]2NC(=O)C1=C(OCC)C=CC2=CC=CC=C12)C(O)=O
DB01059 CCN1C=C(C(O)=O)C(=O)C2=CC(F)=C(C=C12)N1CCNCC1
DB09128 O=C1NC2=CC(OCCCCN3CCN(CC3)C3=C4C=CSC4=CC=C3)=CC=C2C=C1
DB04908 FC(F)(F)C1=CC(=CC=C1)N1CCN(CCN2C(=O)NC3=CC=CC=C23)CC1
DB09083 COC1=C(OC)C=C2[C@@H](CN(C)CCCN3CCC4=CC(OC)=C(OC)C=C4CC3=O)CC2=C1
DB08820 CC(C)(C)C1=CC(=C(O)C=C1NC(=O)C1=CNC2=CC=CC=C2C1=O)C(C)(C)C
DB08815 [H][C@@]12[C@H]3CC[C@H](C3)[C@]1([H])C(=O)N(C[C@@H]1CCCC[C@H]1CN1CCN(CC1)C1=NSC3=CC=CC=C13)C2=O
DB09143 [H][C@]1(C)CN(C[C@@]([H])(C)O1)C1=CC=C(NC(=O)C2=CC=CC(=C2C)C2=CC=C(OC(F)(F)F)C=C2)C=N1
DB06237 COC1=C(Cl)C=C(CNC2=C(C=NC(=N2)N2CCC[C@H]2CO)C(=O)NCC2=NC=CC=N2)C=C1
DB01166 O=C1CCC2=C(N1)C=CC(OCCCCC1=NN=NN1C1CCCCC1)=C2
DB00813 CCC(=O)N(C1CCN(CCC2=CC=CC=C2)CC1)C1=CC=CC=C1

最佳答案

要首先回答如何安装特定版本的 Rdkit,您可以运行此命令:

conda install -c rdkit rdkit=2020.09.2

回到原来的问题,错误是因为函数:

FingerprintMols.FingerprintMol()

无论出于何种内部原因,它将前 10 个 SMILES 转换为 2048 长度向量,而将第 11 个 SMILES 转换为 1024 长度向量。旧版本能够处理这种不匹配,但新版本不能。有两个选项可以解决此问题:

  1. 使用我上面提到的命令将 RdKit 降级到旧版本。
  2. 通过将向量作为参数传递来固定向量的长度。基本上,替换行
FingerprintMols.FingerprintMol(row['mol'])

FingerprintMols.FingerprintMol(row['mol'], minPath=1, maxPath=7, fpSize=2048,
                               bitsPerHash=2, useHs=True, tgtDensity=0.0,
                               minSize=128)

在替换中,除 fpSize 之外的所有参数都设置为其默认值,并且 fpSize 固定为 2048。请注意,您必须 传递所有参数,而不仅仅是 fpSize

关于python - 值错误 : BitVects must be same length (rdkit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67878866/

相关文章:

python - ipython:暂时转到 shell,稍后返回当前 ipython session

python - PyQt5.如何更改表的内容?

python - 无法在乘客 wsgi 上启动应用程序

java - API指纹Android

python - Rethinkdb:从查询中返回多个对象

python - 在 python 3.4.2 中,此代码抛出 TypeError : Type str doesn't support the buffer API

python - 在列表中操作对象的特定部分的有效方法

python - Python实现的简单并发

android - 指纹无法在服务中工作

ios - 将指纹与远程登录身份验证集成