分子数据前期清洗流程

11 篇文章 0 订阅

分子数据前期清洗流程

import pandas as pd
import rdkit
from rdkit import Chem
from standardiser import standardise
import logging
from rdkit.Chem import Descriptors

## 金属元素列表
METAL_ELEMENTS = ['Li', 'Be', 'Na', 'Mg', 'Al', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co',
                  'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh',
                  'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Cs', 'Ba', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os',
                  'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'Fr', 'Ra', 'Lr', 'Ho']

# 加载数据
df = pd.read_csv('tubulin.csv')
# 当前路径为/home/hdpaii01
# df = pd.read_csv('/home/hdpaii01/Day3/1data_extract/tubulin.csv')
# df = pd.read_csv('./Day3/1data_extract/tubulin.csv')

# 删除Smiles为空值的行
df.dropna(axis=0, subset=["Smiles"], inplace=True)

#去金属离子
for metal in METAL_ELEMENTS:
    df = df[~df['Smiles'].str.contains(metal)] # df['Smiles'].str.contains(metal)取出包含这个离子的
    print("no {}".format(metal),df.shape)

# 分子标准化
for i in df.index:
    try:
        smi = df.loc[i, 'Smiles']
        # print(smi)
        mol = Chem.MolFromSmiles(smi)
        mol = Chem.AddHs(mol)
        parent = standardise.run(mol)
        mol_ok_smi = Chem.MolToSmiles(parent)
        df.loc[i, 'Smiles'] = mol_ok_smi
        # print(i, 'done')
    except standardise.StandardiseException as e:
        logging.warning(e.message)

#删除重复值
df.drop_duplicates(keep='first', inplace=True)
print('删除重复值df:', df.shape)

#删除Standard type中非'IC50 EC50 Ki Kd'的数据
df1=df[df['Standard Type'].isin(["IC50"])]

# df2=df[df['Standard Type'].isin(["EC50"])]
df3=df[df['Standard Type'].isin(["Ki"])]
df4=df[df['Standard Type'].isin(["Kd"])]
# result = df1.append(df2).append(df3).append(df4)
# frames = [df1, df2, df3, df4]
frames = [df1, df3, df4]
df = pd.concat(frames)
# print('删除Standard type中非IC50 EC50 Ki Kd的数据:', df.shape)
# print('删除Standard type中非IC50 Ki Kd的数据:', df.shape)

#删除Standard Relation中非'='的数据
df=df[df['Standard Relation'].isin(["'='"])]
print('删除非=的df:', df.shape)

#删除assay_type中非"B"的数据
df=df[df['Assay Type'].isin(["B"])]
print('删除非B的df:', df.shape)

# 计算分子MW
molweight = []
for smi in list(df['Smiles']):
    molweight.append(Descriptors.MolWt(Chem.MolFromSmiles(smi)))
df['molecular_weight'] = molweight

# 删除分子量大于1000的
df = df[ df['molecular_weight']<=1000 ]

# 计算分子logP
logP = []
for smi in list(df['Smiles']):
    logP.append(Descriptors.MolLogP(Chem.MolFromSmiles(smi)))
df['logP'] = logP

df2 = df[df['Standard Units'].isin(["nM"])]
print('单位为nM的df:', df2.shape)

df3 = df[df['Standard Units'].isin(["ug.mL-1"])]
print('单位为ug/ml的df:', df3.shape)

list(df3['Standard Value'])

df3['Standard Value'] = df3['Standard Value']/df3['molecular_weight']*1000000    #g*e-6/L*e-3  /  (g/mol)   = e-9*mol/L   Molecular Weight是M分子质量
df3['Standard Units'] = "nM"

#根据相同smiles的取Standard Value的平均值
df_mean = df.groupby('Molecule ChEMBL ID')['Standard Value'].mean()
print('df',df_mean.shape)

#将df_mean转换成表
# df_mean = pd.DataFrame({'standard_value':df_mean})
df_mean_dict = df_mean.to_dict()

# print(df_mean)
df['standard_value_mean'] = df['Molecule ChEMBL ID'].apply(lambda x:df_mean_dict[x])#添加 每个化合物的平均值

df.drop('Standard Value', axis=1, inplace=True)  #未平均的值已经求完,可舍弃

df.drop_duplicates(subset=['Molecule ChEMBL ID'], 
                   inplace=True)   #对BDB_ID去重,因为现在有很多求过平均没删掉的数
df.reset_index(inplace=True)
print('取平均值后的df:',df.shape)

# 标签转换
df.loc[df['standard_value_mean']<=10000,'standard_value_mean']=1
df.loc[df['standard_value_mean']>10000,'standard_value_mean']=0
print('转换平均值后的df:',df.shape)
df = pd.DataFrame(df,columns = ['Smiles','standard_value_mean'])
# df = pd.DataFrame(df,columns = ['Smiles','standard_value_mean','molecular_weight','logp'])
# 修改列名
df.columns = ['SMILES','LABEL']
# 保存清洗后的数据
df.to_csv('data.csv', index=None)

from rdkit.Chem import Descriptors
import numpy as np

def get_rdkit_des(mol):
    features = []
    for desc_name, function in Descriptors.descList:
      if desc_name == 'Ipc':
        feature = function(mol, avg=True)
      else:
        feature = function(mol)
      features.append(feature)
    return np.asarray(features)

# 生成分子对应的指纹
# X = np.array(
#     [AllChem.GetMorganFingerprintAsBitVect(Chem.MolFromSmiles(smi), 2, nBits=1024) for smi in list(df.iloc[:, 1])])
# from rdkit.Chem import MACCSkeys
# X = np.array([MACCSkeys.GenMACCSKeys(Chem.MolFromSmiles(smi)) for smi in list(df.iloc[:, 1])])
# 生成分子对应的描述
X = np.array([get_rdkit_des(Chem.MolFromSmiles(smi)) for smi in list(df.iloc[:, 0])])
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发呆的比目鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值