我有一个 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)
您能帮我解决这个错误吗?提前非常感谢您。
您的方法和/或代码存在几个问题:
您可以通过一个解决方案来解决所有这些问题 - 将您的数据转换为 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。
* 我认为谷本相似度可以扩展到整数向量,但我不知道如何扩展。