Spaces:
Running
Running
File size: 3,614 Bytes
5530b15 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import pandas as pd
import os
import pubchempy as pcp
from tqdm import tqdm
from rdkit import Chem
def smiles_to_name(smiles):
try:
compounds = pcp.get_compounds(smiles, namespace='smiles')
if compounds and compounds[0].iupac_name:
return compounds[0].iupac_name
elif compounds and compounds[0].synonyms:
return compounds[0].synonyms[0]
return "Unknown"
except Exception as e:
print(f"Error retrieving name for SMILES {smiles}: {e}")
return "Error"
def extract_compounds_df(df: pd.DataFrame):
all_smiles = pd.unique(df.filter(like="smiles").values.ravel())
all_smiles = [s for s in all_smiles if pd.notna(s) and str(s).strip() != '']
unique_smiles = pd.Series(all_smiles).drop_duplicates().reset_index(drop=True)
compound_df = pd.DataFrame({
'compound_id': range(0, len(unique_smiles)),
'smiles': unique_smiles
})
compound_df['name'] = compound_df['smiles'].apply(smiles_to_name)
compound_df = compound_df[['compound_id', 'name', 'smiles']]
compound_df_path = os.path.abspath("./compounds.csv")
compound_df.to_csv(compound_df_path, index=False)
return compound_df
def name_processing(df: pd.DataFrame, name_to_id: dict) -> pd.DataFrame:
# df = df.rename(columns={col: col.split(",")[0].lower().replace(" ", "_") for col in df.columns})
name_columns = [col for col in df.columns if "smiles" in col]
for name_col in name_columns:
df[name_col.replace("_smiles", "_id")] = df[name_col].map({v: k for k, v in name_to_id.items()})
df = df.drop(columns=name_columns)
ids_cols = [col for col in df.columns if col.startswith('cmp')]
df['cmp_ids'] = df[ids_cols].values.tolist()
df = df.drop(columns=ids_cols)
df['cmp_ids'] = df['cmp_ids'].apply(lambda x: [int(v) for v in x if pd.notna(v)])
mole_frac_cols = [col for col in df.columns if col.startswith('Mole fraction of cmp')]
df[mole_frac_cols] = df[mole_frac_cols].apply(lambda x: x/100)
df['cmp_mole_fractions'] = df[mole_frac_cols].values.tolist()
df = df.drop(columns=mole_frac_cols)
df['cmp_mole_fractions'] = df['cmp_mole_fractions'].apply(lambda x: [v for v in x if pd.notna(v)])
return df
def canonicalize_smiles(smiles):
try:
mol = Chem.MolFromSmiles(smiles)
if mol:
return Chem.MolToSmiles(mol, canonical=True)
except:
pass
#return None
if __name__ == "__main__":
base_path = os.path.abspath("../raw_data")
raw_data_path = [os.path.join(base_path, filename) for filename in os.listdir(base_path) if ".py" not in filename]
# compound_df_path = os.path.abspath("./compounds.csv")
# compound_df = pd.read_csv(compound_df_path)
# name_to_id = compound_df['smiles'].to_dict()
for path in raw_data_path:
df = pd.read_csv(path)
smiles_cols = [col for col in df.columns if 'smiles' in col]
for col in smiles_cols:
df[col] = df[col].apply(canonicalize_smiles)
compound_df = extract_compounds_df(df)
name_to_id = compound_df['smiles'].to_dict()
# Name processing
df = name_processing(df=df, name_to_id=name_to_id)
# Removing duplicates
df = df.drop_duplicates(
subset=[
"value",
"pred_value",
"error",
"Train_Test_Label",
# "Mole fraction of cmp0"
],
keep="first"
).reset_index(drop=True)
df["property"] = "Motor octane number"
df["unit"] = None
df = df.drop(columns=["pred_value", "Label"])
df.to_csv("./processed_MON.csv", index=False)
|