Hattie's picture
Add model files
91f863a
Raw
History Blame Contribute Delete
15.3 kB
import copy
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
## -- protatin sequence type -- ##
prot_type = ["AAS_CYP9", "UGT_TYPE", "SULTs"]
## -- chemical Compound Feature type -- ##
features_columns = ["logP", "Fup"]
features_mwlogp_columns = ["logP_rdkit", "Fup"]
rdkit_columns = ["MW_rdkit", "HBD_rdkit", "HBA_rdkit", "NRB_rdkit", "RF_rdkit", "PSA_rdkit"]
default_columns = ["SMILES", "Clint"]
rangeLabel_col = ["MW_range", "PSA_range", "NRB_range", "HBA_range", "HBD_range", "LogP_range"]
def load_protdata(file_path:str, extend_protType:bool = False):
df_protData = pd.read_csv(file_path)
if not extend_protType:
df_protData= df_protData[df_protData["type"] == prot_type[0]]
df_protData["aas"] = [' '.join(list(aas)) for aas in df_protData["aas"]]
return df_protData
def norm_dataset(df_loadData:pd.DataFrame, feature_type:str = "default", scale = True, augmentation = False):
# df_loadData = df_loadData[(df_loadData['Clint'] <= 500)]
df_loadData['Clint'] = np.log1p(df_loadData['Clint'])
if feature_type.lower() != "default":
## -- Common setting preprecessing -- ##
df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
df_loadData = df_loadData[(df_loadData['logP'] >= -2.0) & (df_loadData['logP'] <= 6.0)]
df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
df_loadData = df_loadData.drop(df_loadData[df_loadData["logP"] == "None"].index).reset_index(drop=True)
if feature_type.lower() == "default":
df_loadData = df_loadData[default_columns].dropna(axis=0).reset_index(drop=True)
elif feature_type.lower() == "features":
# df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
# df_loadData = df_loadData[(df_loadData['logP'] >= -2.0) & (df_loadData['logP'] <= 6.0)]
# df_loadData = df_loadData.drop(df_loadData[df_loadData["logP"] == "None"].index).reset_index(drop=True)
df_loadData = df_loadData[default_columns + features_columns].dropna(axis=0).reset_index(drop=True)
elif feature_type.lower() == "features_mwlogp":
# df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
df_loadData = df_loadData[(df_loadData['logP_rdkit'] >= -2.0) & (df_loadData['logP_rdkit'] <= 6.0)]
df_loadData = df_loadData.drop(df_loadData[df_loadData["logP_rdkit"] == "None"].index).reset_index(drop=True)
df_loadData = df_loadData[default_columns + features_mwlogp_columns].dropna(axis=0).reset_index(drop=True)
elif feature_type.lower() == "rdkit":
# df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
# df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
# df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
df_loadData = df_loadData[default_columns + rdkit_columns].dropna(axis=0).reset_index(drop=True)
elif feature_type.lower() == "all_mwlogp":
# df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
# df_loadData = df_loadData[(df_loadData['logP_rdkit'] >= -2.0) & (df_loadData['logP_rdkit'] <= 6.0)]
# df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
# df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
# df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
# df_loadData = df_loadData.drop(df_loadData[df_loadData["logP_rdkit"] == "None"].index).reset_index(drop=True)
df_loadData = df_loadData[default_columns + features_mwlogp_columns + rdkit_columns].dropna(axis=0).reset_index(drop=True)
else:
# df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
# df_loadData = df_loadData[(df_loadData['logP'] >= -2.0) & (df_loadData['logP'] <= 6.0)]
# df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
# df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
# df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
# df_loadData = df_loadData.drop(df_loadData[df_loadData["logP"] == "None"].index).reset_index(drop=True)
df_loadData = df_loadData[default_columns + features_columns + rdkit_columns].dropna(axis=0).reset_index(drop=True)
## -- log scaled dataset augmentation-- ##
df_sampledData = copy.deepcopy(df_loadData)
data_scaler = None
if augmentation is True:
df_augmentedData = df_loadData[(df_loadData['Clint'] >= 4.5)]
df_loadData = pd.concat([df_loadData, df_augmentedData], axis=0).reset_index(drop = True)
if scale:
datacols = list(df_loadData.columns[1:])
data_scaler = MinMaxScaler()
df_loadData[datacols] = df_loadData[datacols].astype('float')
scaled_data = data_scaler.fit_transform(df_loadData[datacols])
df_loadData[datacols] = scaled_data
return df_loadData, data_scaler, df_sampledData
def norm_func(df_dataset:pd.DataFrame, scale:bool):
# Select features (columns) to be involved intro training and predictions
column_Length = df_dataset.shape[1]
cols = list(df_dataset)[1:column_Length]
# To Numpy and Delete TimeStep
features = df_dataset[cols]
# features = features.astype(float)
data_mean, data_std = 0, 1
# To Scaling
if scale:
data_mean = features.mean(axis=0)
data_std = features.std(axis=0)
features = (features-data_mean)/data_std
# dataset_train = features.values
df_dataset[cols] = features
return df_dataset, data_mean, data_std
def get_affinitydata(df_loadData:pd.DataFrame, train_affinity:pd.DataFrame, augmentation = False):
df_affinityData = train_affinity[train_affinity["SMILES"].isin(list(df_loadData["SMILES"]))].reset_index(drop = True)
## -- log scaled dataset augmentation-- ##
if augmentation is True:
df_augmentedData = df_loadData[(df_loadData['Clint'] >= 4.5)]
df_augmentedFeature = df_affinityData[df_affinityData["SMILES"].isin(list(df_augmentedData["SMILES"]))]
df_affinityData = pd.concat([df_affinityData, df_augmentedFeature], axis=0).reset_index(drop = True)
return df_affinityData
def get_rdkitlabel(df_loadData:pd.DataFrame, augmentation = False):
df_rdkitLabel = rdkit_rangeLabel(df_loadData)
if augmentation is True:
df_augmentedData = df_loadData[(df_loadData['Clint'] >= 4.5)]
df_augmentedrdkitLabel = df_rdkitLabel[df_rdkitLabel["SMILES"].isin(list(df_augmentedData["SMILES"]))]
df_rdkitLabel = pd.concat([df_rdkitLabel, df_augmentedrdkitLabel], axis=0).reset_index(drop = True)
return df_rdkitLabel
def load_chemdata(df_loadData:pd.DataFrame, train_affinity:pd.DataFrame, feature_type:str = "default", scale = True, augmentation = False):
df_loadData = df_loadData[(df_loadData['Clint'] <= 500)]
df_loadData['Clint'] = np.log1p(df_loadData['Clint'])
df_rdkitLabel = rdkit_rangeLabel(df_loadData)
if feature_type.lower() == "default":
df_loadData = df_loadData[default_columns].dropna(axis=0).reset_index(drop=True)
elif feature_type.lower() == "features":
df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
df_loadData = df_loadData[(df_loadData['logP'] >= -2.0) & (df_loadData['logP'] <= 6.0)]
df_loadData = df_loadData[default_columns + features_columns].dropna(axis=0)
df_loadData = df_loadData.drop(df_loadData[df_loadData["logP"] == "None"].index).reset_index(drop=True)
elif feature_type.lower() == "features_mwlogp":
df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
df_loadData = df_loadData[(df_loadData['logP_rdkit'] >= -2.0) & (df_loadData['logP_rdkit'] <= 6.0)]
df_loadData = df_loadData[default_columns + features_mwlogp_columns].dropna(axis=0)
df_loadData = df_loadData.drop(df_loadData[df_loadData["logP_rdkit"] == "None"].index).reset_index(drop=True)
elif feature_type.lower() == "rdkit":
df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
df_loadData = df_loadData[default_columns + rdkit_columns].dropna(axis=0).reset_index(drop=True)
elif feature_type.lower() == "all_mwlogp":
df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
df_loadData = df_loadData[(df_loadData['logP_rdkit'] >= -2.0) & (df_loadData['logP_rdkit'] <= 6.0)]
df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
df_loadData = df_loadData[default_columns + features_mwlogp_columns + rdkit_columns].dropna(axis=0)
df_loadData = df_loadData.drop(df_loadData[df_loadData["logP_rdkit"] == "None"].index).reset_index(drop=True)
else:
df_loadData = df_loadData[(df_loadData['Fup'] >= 0.01) & (df_loadData['Fup'] <= 0.99)]
df_loadData = df_loadData[(df_loadData['logP'] >= -2.0) & (df_loadData['logP'] <= 6.0)]
df_loadData = df_loadData[(df_loadData['MW_rdkit'] < 1000.0)]
df_loadData = df_loadData[(df_loadData['HBA_rdkit'] <= 10.0)]
df_loadData = df_loadData[(df_loadData['HBD_rdkit'] <= 5.0)]
df_loadData = df_loadData[default_columns + features_columns + rdkit_columns].dropna(axis=0)
df_loadData = df_loadData.drop(df_loadData[df_loadData["logP"] == "None"].index).reset_index(drop=True)
df_affinityData = train_affinity[train_affinity["SMILES"].isin(list(df_loadData["SMILES"]))].reset_index(drop = True)
df_rdkitLabel = df_rdkitLabel[df_rdkitLabel["SMILES"].isin(list(df_loadData["SMILES"]))].reset_index(drop = True)
## -- log scaled dataset augmentation-- ##
if augmentation is True:
df_augmentedData = df_loadData[(df_loadData['Clint'] >= 4.5)]
df_loadData = pd.concat([df_loadData, df_augmentedData], axis=0).reset_index(drop = True)
df_augmentedrdkitLabel = df_rdkitLabel[df_rdkitLabel["SMILES"].isin(list(df_augmentedData["SMILES"]))]
df_rdkitLabel = pd.concat([df_rdkitLabel, df_augmentedrdkitLabel], axis=0).reset_index(drop = True)
df_augmentedFeature = df_affinityData[df_affinityData["SMILES"].isin(list(df_augmentedData["SMILES"]))]
df_affinityData = pd.concat([df_affinityData, df_augmentedFeature], axis=0).reset_index(drop = True)
if scale:
datacols = list(df_loadData.columns[1:])
data_scaler = MinMaxScaler()
df_loadData[datacols] = df_loadData[datacols].astype('float')
scaled_data = data_scaler.fit_transform(df_loadData[datacols])
df_loadData[datacols] = scaled_data
return df_loadData, data_scaler, df_affinityData, df_rdkitLabel
def rdkit_rangeLabel(df_data:pd.DataFrame):
df_feature = pd.DataFrame(data = df_data["SMILES"], columns=["SMILES"])
df_feature[rangeLabel_col] = np.NaN
MW_range = range(200, 601, 100)
PSA_range = [50, 75, 100, 150]
NRB_range = [3,5,7,10]
HBA_range = [1,3,5,7,10]
HBD_range = [1,3,5,7,10]
LogP_range = range(0, 5)
MW_label = ["<200", "200-300", "300-400", "400-500", "500-600",">=600"]
PSA_label = ["<50", "50-75", "75-100", "100-150", ">=150"]
NRB_label = ["<3", "3-5", "5-7", "7-10", ">=10"]
HBA_label = ["<1", "1-3", "3-5", "5-7", "7-10", ">=10"]
HBD_label = ["<1", "1-3", "3-5", "5-7", "7-10", ">=10"]
LogP_label = ["<0", "0-1", "1-2", "2-3", "3-4",">=4"]
## -- make MW_rdkit range dataset -- ##
for idx, _ in enumerate(MW_range):
if idx == 0:
df_feature["MW_range"][df_data[df_data["MW_rdkit"] < MW_range[idx]].index] = MW_label[idx]
else:
df_feature["MW_range"][df_data[(df_data["MW_rdkit"] >= MW_range[idx-1]) & (df_data["MW_rdkit"] < MW_range[idx])].index] = MW_label[idx]
if idx == (len(MW_range)-1):
df_feature["MW_range"][df_data[df_data["MW_rdkit"] >= MW_range[idx]].index] = MW_label[idx+1]
for idx, _ in enumerate(PSA_range):
if idx == 0:
df_feature["PSA_range"][df_data[df_data["PSA_rdkit"] < PSA_range[idx]].index] = PSA_label[idx]
else:
df_feature["PSA_range"][df_data[(df_data["PSA_rdkit"] >= PSA_range[idx-1]) & (df_data["PSA_rdkit"] < PSA_range[idx])].index] = PSA_label[idx]
if idx == (len(PSA_range)-1):
df_feature["PSA_range"][df_data[df_data["PSA_rdkit"] >= PSA_range[idx]].index] = PSA_label[idx+1]
for idx, _ in enumerate(NRB_range):
if idx == 0:
df_feature["NRB_range"][df_data[df_data["NRB_rdkit"] < NRB_range[idx]].index] = NRB_label[idx]
else:
df_feature["NRB_range"][df_data[(df_data["NRB_rdkit"] >= NRB_range[idx-1]) & (df_data["NRB_rdkit"] < NRB_range[idx])].index] = NRB_label[idx]
if idx == (len(NRB_range)-1):
df_feature["NRB_range"][df_data[df_data["NRB_rdkit"] >= NRB_range[idx]].index] = NRB_label[idx+1]
for idx, _ in enumerate(HBA_range):
if idx == 0:
df_feature["HBA_range"][df_data[df_data["HBA_rdkit"] < HBA_range[idx]].index] = HBA_label[idx]
else:
df_feature["HBA_range"][df_data[(df_data["HBA_rdkit"] >= HBA_range[idx-1]) & (df_data["HBA_rdkit"] < HBA_range[idx])].index] = HBA_label[idx]
if idx == (len(HBA_range)-1):
df_feature["HBA_range"][df_data[df_data["HBA_rdkit"] >= HBA_range[idx]].index] = HBA_label[idx+1]
for idx, _ in enumerate(HBD_range):
if idx == 0:
df_feature["HBD_range"][df_data[df_data["HBD_rdkit"] < HBD_range[idx]].index] = HBD_label[idx]
else:
df_feature["HBD_range"][df_data[(df_data["HBD_rdkit"] >= HBD_range[idx-1]) & (df_data["HBD_rdkit"] < HBD_range[idx])].index] = HBD_label[idx]
if idx == (len(HBD_range)-1):
df_feature["HBD_range"][df_data[df_data["HBD_rdkit"] >= HBD_range[idx]].index] = HBD_label[idx+1]
for idx, _ in enumerate(LogP_range):
if idx == 0:
df_feature["LogP_range"][df_data[df_data["logP"] < LogP_range[idx]].index] = LogP_label[idx]
else:
df_feature["LogP_range"][df_data[(df_data["logP"] >= LogP_range[idx-1]) & (df_data["logP"] < LogP_range[idx])].index] = LogP_label[idx]
if idx == (len(LogP_range)-1):
df_feature["LogP_range"][df_data[df_data["logP"] >= LogP_range[idx]].index] = LogP_label[idx+1]
return df_feature
def inverse_data(df_data:pd.DataFrame, scaler:MinMaxScaler):
inverted_data = scaler.inverse_transform(df_data)
df_data[:] = inverted_data
return df_data