从位串的 csv 文件计算 Tanimoto 相似度

问题描述 投票:0回答:1

我有一个 csv 文件(“file.csv”),其中包含 1000 个分子的位串(结构指纹),例如:

0,0,1,0,1,0,0,1,0,...

1,0,3,1,0,1,1,0,0,...

0,1,0,0,1,0,0,3,2,...

2,1,1,3,0,0,0,1,0,...

...

1,0,0,0,1,0,0,0,2,...

(1000行,每行对应一个分子的结构指纹,每个指纹包含2048位)

通过这个 csv 文件,我尝试使用以下代码计算这 1000 个分子的成对 Tanimoto 相似度:

input_data = pd.read_csv("file.csv", delimiter=',', header=None)
def tanimoto_distance_matrix(fp_list):
    dissimilarity_matrix = []
    for i in range(1, len(fp_list)):
        similarities = DataStructs.BulkTanimotoSimilarity(fp_list[i], fp_list[:i])
        dissimilarity_matrix.extend([1 - x for x in similarities])
    return dissimilarity_matrix
dist_matrix_raw = tanimoto_distance_matrix(input_data)

但是,我收到以下消息错误:

ArgumentError: Python argument types in
    rdkit.DataStructs.cDataStructs.BulkTanimotoSimilarity(str, Series)
did not match C++ signature:
    BulkTanimotoSimilarity(RDKit::SparseIntVect<unsigned long> v1, boost::python::list v2, bool returnDistance=False)
    BulkTanimotoSimilarity(RDKit::SparseIntVect<unsigned int> v1, boost::python::list v2, bool returnDistance=False)
    BulkTanimotoSimilarity(RDKit::SparseIntVect<long> v1, boost::python::list v2, bool returnDistance=False)
    BulkTanimotoSimilarity(RDKit::SparseIntVect<int> v1, boost::python::list v2, bool returnDistance=False)
    BulkTanimotoSimilarity(ExplicitBitVect const* bv1, boost::python::api::object bvList, bool returnDistance=0)
    BulkTanimotoSimilarity(SparseBitVect const* bv1, boost::python::api::object bvList, bool returnDistance=0)

您能帮我解决这个错误吗?提前非常感谢您。

similarity rdkit
1个回答
0
投票

您的方法和/或代码存在几个问题:

  1. 您的“位”向量实际上并不是位(至少在您提供的示例中) - 它们只需要包含零和一*
  2. 您正在迭代 Pandas 数据框,就像迭代列表或 Numpy 数组一样,但这并不会像您想象的那样。
  3. RDKit 对这些函数使用特定的数据类型 - 这有点烦人(而且有点不符合 Python 风格),但事实就是如此。

您可以通过一个解决方案来解决所有这些问题 - 将您的数据转换为 RDKit 的列表

ExplicitBitVect
:

def to_bit_vector(arr):
    # Convert list to ExplicitBitVect
    rdkit_fp = ExplicitBitVect(len(arr))
    for i, bit in enumerate(arr):
        if bit:  # Only set bits with value 1
            rdkit_fp.SetBit(i)
    return rdkit_fp

# Convert dataframe to list of bit vectors
fp_list = input_data.apply(to_bit_vector, axis=1).to_list()

# Now your function will work unchanged
dist_matrix_raw = tanimoto_distance_matrix(fp_list)

请注意,

to_bit_vector
函数将 0 以外的任何值视为 1。

* 我认为谷本相似度可以扩展到整数向量,但我不知道如何扩展。

© www.soinside.com 2019 - 2024. All rights reserved.