screen script
This commit is contained in:
105
scripts/admet_screen.py
Normal file
105
scripts/admet_screen.py
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
import os, sys
|
||||||
|
|
||||||
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
|
# === 配置 ===
|
||||||
|
csv_path = "data/trpe_preds.csv"
|
||||||
|
props_with_thresholds = {
|
||||||
|
"AMES": 0.5,
|
||||||
|
"Carcinogens_Lagunin": 0.5,
|
||||||
|
"ClinTox": 0.5,
|
||||||
|
"DILI": 0.5,
|
||||||
|
"hERG": 0.5,
|
||||||
|
"Bioavailability_Ma": 0.5,
|
||||||
|
"HIA_Hou": 0.5,
|
||||||
|
}
|
||||||
|
|
||||||
|
# 判定符号:含等号可切换成 <= / >=
|
||||||
|
toxic_op_le = "<" # 或 "<="
|
||||||
|
adme_op_ge = ">" # 或 ">="
|
||||||
|
|
||||||
|
df = pd.read_csv(csv_path)
|
||||||
|
total = len(df)
|
||||||
|
|
||||||
|
toxic_cols = ["AMES","Carcinogens_Lagunin","ClinTox","DILI","hERG"]
|
||||||
|
adme_cols = ["Bioavailability_Ma","HIA_Hou"]
|
||||||
|
|
||||||
|
# 统一转数值(非数值转为 NaN)
|
||||||
|
for col in toxic_cols + adme_cols:
|
||||||
|
if col in df.columns:
|
||||||
|
df[col] = pd.to_numeric(df[col], errors="coerce")
|
||||||
|
|
||||||
|
results = []
|
||||||
|
os.makedirs("failed_by_rule", exist_ok=True)
|
||||||
|
|
||||||
|
def apply_rule(series, thr, op):
|
||||||
|
if op == "<": return series < thr
|
||||||
|
if op == "<=": return series <= thr
|
||||||
|
if op == ">": return series > thr
|
||||||
|
if op == ">=": return series >= thr
|
||||||
|
raise ValueError("Unsupported op")
|
||||||
|
|
||||||
|
for col, thr in props_with_thresholds.items():
|
||||||
|
if col not in df.columns:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 打印该属性的范围,方便 sanity check
|
||||||
|
col_min = float(np.nanmin(df[col].values)) if df[col].notna().any() else np.nan
|
||||||
|
col_max = float(np.nanmax(df[col].values)) if df[col].notna().any() else np.nan
|
||||||
|
|
||||||
|
if col in toxic_cols:
|
||||||
|
mask = apply_rule(df[col], thr, toxic_op_le)
|
||||||
|
rule = f"{col} {toxic_op_le} {thr}"
|
||||||
|
else:
|
||||||
|
mask = apply_rule(df[col], thr, adme_op_ge)
|
||||||
|
rule = f"{col} {adme_op_ge} {thr}"
|
||||||
|
|
||||||
|
passed = int(mask.sum())
|
||||||
|
failed = int(total - passed)
|
||||||
|
|
||||||
|
# 导出未通过的分子(含该列原值)
|
||||||
|
failed_df = df.loc[~mask, [col]].copy()
|
||||||
|
failed_df.to_csv(f"failed_by_rule/{col}_failed.csv", index=False)
|
||||||
|
|
||||||
|
results.append({
|
||||||
|
"属性": col,
|
||||||
|
"阈值": thr,
|
||||||
|
"规则": rule,
|
||||||
|
"最小值": col_min,
|
||||||
|
"最大值": col_max,
|
||||||
|
"通过数": passed,
|
||||||
|
"淘汰数": failed,
|
||||||
|
"是否全部淘汰": failed == total
|
||||||
|
})
|
||||||
|
|
||||||
|
res_df = pd.DataFrame(results).sort_values("淘汰数", ascending=False)
|
||||||
|
print(res_df)
|
||||||
|
res_df.to_csv("trpe_filter_diagnostics.csv", index=False)
|
||||||
|
|
||||||
|
# === 最终整体过滤(交集) ===
|
||||||
|
mask_all = pd.Series(True, index=df.index)
|
||||||
|
|
||||||
|
for col, thr in props_with_thresholds.items():
|
||||||
|
if col not in df.columns:
|
||||||
|
continue
|
||||||
|
if col in toxic_cols:
|
||||||
|
mask_all &= df[col] < thr # 毒理类必须 < 阈值
|
||||||
|
else:
|
||||||
|
mask_all &= df[col] > thr # 吸收类必须 > 阈值
|
||||||
|
|
||||||
|
final_candidates = df[mask_all].copy()
|
||||||
|
|
||||||
|
print("\n=== 最终筛选结果 ===")
|
||||||
|
print(f"总数: {total}")
|
||||||
|
print(f"符合所有标准的分子数: {len(final_candidates)}")
|
||||||
|
|
||||||
|
if len(final_candidates) > 0:
|
||||||
|
print("符合条件的分子索引(行号):")
|
||||||
|
print(final_candidates.index.tolist())
|
||||||
|
final_candidates.to_csv("trpe_final_candidates.csv", index=False)
|
||||||
|
|
||||||
|
print("✅ 已保存到 trpe_final_candidates.csv")
|
||||||
|
else:
|
||||||
|
print("⚠️ 没有分子同时满足所有条件。")
|
||||||
105
scripts/admet_screen2.py
Normal file
105
scripts/admet_screen2.py
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
import os, sys
|
||||||
|
|
||||||
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
|
# === 配置 ===
|
||||||
|
csv_path = "data/trpe_preds.csv"
|
||||||
|
props_with_thresholds = {
|
||||||
|
"AMES": 0.5,
|
||||||
|
"Carcinogens_Lagunin": 0.5,
|
||||||
|
"ClinTox": 0.5,
|
||||||
|
"DILI": 0.5,
|
||||||
|
"hERG": 0.5,
|
||||||
|
"Bioavailability_Ma": 0,
|
||||||
|
"HIA_Hou": 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
# 判定符号:含等号可切换成 <= / >=
|
||||||
|
toxic_op_le = "<" # 或 "<="
|
||||||
|
adme_op_ge = ">" # 或 ">="
|
||||||
|
|
||||||
|
df = pd.read_csv(csv_path)
|
||||||
|
total = len(df)
|
||||||
|
|
||||||
|
toxic_cols = ["AMES","Carcinogens_Lagunin","ClinTox","DILI","hERG"]
|
||||||
|
adme_cols = ["Bioavailability_Ma","HIA_Hou"]
|
||||||
|
|
||||||
|
# 统一转数值(非数值转为 NaN)
|
||||||
|
for col in toxic_cols + adme_cols:
|
||||||
|
if col in df.columns:
|
||||||
|
df[col] = pd.to_numeric(df[col], errors="coerce")
|
||||||
|
|
||||||
|
results = []
|
||||||
|
os.makedirs("failed_by_rule", exist_ok=True)
|
||||||
|
|
||||||
|
def apply_rule(series, thr, op):
|
||||||
|
if op == "<": return series < thr
|
||||||
|
if op == "<=": return series <= thr
|
||||||
|
if op == ">": return series > thr
|
||||||
|
if op == ">=": return series >= thr
|
||||||
|
raise ValueError("Unsupported op")
|
||||||
|
|
||||||
|
for col, thr in props_with_thresholds.items():
|
||||||
|
if col not in df.columns:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 打印该属性的范围,方便 sanity check
|
||||||
|
col_min = float(np.nanmin(df[col].values)) if df[col].notna().any() else np.nan
|
||||||
|
col_max = float(np.nanmax(df[col].values)) if df[col].notna().any() else np.nan
|
||||||
|
|
||||||
|
if col in toxic_cols:
|
||||||
|
mask = apply_rule(df[col], thr, toxic_op_le)
|
||||||
|
rule = f"{col} {toxic_op_le} {thr}"
|
||||||
|
else:
|
||||||
|
mask = apply_rule(df[col], thr, adme_op_ge)
|
||||||
|
rule = f"{col} {adme_op_ge} {thr}"
|
||||||
|
|
||||||
|
passed = int(mask.sum())
|
||||||
|
failed = int(total - passed)
|
||||||
|
|
||||||
|
# 导出未通过的分子(含该列原值)
|
||||||
|
failed_df = df.loc[~mask, [col]].copy()
|
||||||
|
failed_df.to_csv(f"failed_by_rule/{col}_failed.csv", index=False)
|
||||||
|
|
||||||
|
results.append({
|
||||||
|
"属性": col,
|
||||||
|
"阈值": thr,
|
||||||
|
"规则": rule,
|
||||||
|
"最小值": col_min,
|
||||||
|
"最大值": col_max,
|
||||||
|
"通过数": passed,
|
||||||
|
"淘汰数": failed,
|
||||||
|
"是否全部淘汰": failed == total
|
||||||
|
})
|
||||||
|
|
||||||
|
res_df = pd.DataFrame(results).sort_values("淘汰数", ascending=False)
|
||||||
|
print(res_df)
|
||||||
|
res_df.to_csv("trpe_filter_diagnostics.csv", index=False)
|
||||||
|
|
||||||
|
# === 最终整体过滤(交集) ===
|
||||||
|
mask_all = pd.Series(True, index=df.index)
|
||||||
|
|
||||||
|
for col, thr in props_with_thresholds.items():
|
||||||
|
if col not in df.columns:
|
||||||
|
continue
|
||||||
|
if col in toxic_cols:
|
||||||
|
mask_all &= df[col] < thr # 毒理类必须 < 阈值
|
||||||
|
else:
|
||||||
|
mask_all &= df[col] > thr # 吸收类必须 > 阈值
|
||||||
|
|
||||||
|
final_candidates = df[mask_all].copy()
|
||||||
|
|
||||||
|
print("\n=== 最终筛选结果 ===")
|
||||||
|
print(f"总数: {total}")
|
||||||
|
print(f"符合所有标准的分子数: {len(final_candidates)}")
|
||||||
|
|
||||||
|
if len(final_candidates) > 0:
|
||||||
|
print("符合条件的分子索引(行号):")
|
||||||
|
print(final_candidates.index.tolist())
|
||||||
|
final_candidates.to_csv("trpe_final_candidates.csv", index=False)
|
||||||
|
|
||||||
|
print("✅ 已保存到 trpe_final_candidates.csv")
|
||||||
|
else:
|
||||||
|
print("⚠️ 没有分子同时满足所有条件。")
|
||||||
Reference in New Issue
Block a user