Tema 10 · Pipeline de Descobriment de Fàrmacs
Introducció
En aquest projecte integrador aplicaràs totes les eines de Python per construir un pipeline que, partint d'una biblioteca de molècules, filtri, analitzi i seleccioni els millors candidats a fàrmacs per a una malaltia concreta. Utilitzaràs NumPy, Pandas, Matplotlib, la regla de Lipinski i resultats de docking molecular.
Objectiu
Simular el procés real de cribratge virtual (virtual screening) utilitzat en la indústria farmacèutica.
Requisits del Projecte
- Carregar un dataset de molècules (CSV) amb SMILES, pesos moleculars, LogP, etc.
- Calcular descriptors moleculars (si no existeixen, utilitzar RDKit o dades precalculades)
- Aplicar la regla de Lipinski per filtrar compostos "drug-like"
- Analitzar scores de docking (AutoDock Vina) i ordenar els candidats
- Visualitzar amb Matplotlib distribucions de propietats i resultats
- Exportar un informe final (PDF o CSV) amb els top candidats
Arquitectura del Projecte
Organitza el codi en scripts independents que s'executen seqüencialment:
| Script | Descripció |
|---|---|
| 01_load_data.py | Carrega el CSV amb Pandas i neteja dades |
| 02_descriptors.py | Calcula (o importa) pes molecular, LogP, H-bond donors/acceptors |
| 03_lipinski.py | Aplica filtre Lipinski (≤5 violacions permeses) |
| 04_docking.py | Llegeix scores de docking i els fusiona amb la llista filtrada |
| 05_analysis.py | Ordena candidats, genera gràfiques (distribució de scores, propietats) |
| 06_report.py | Exporta informe CSV i opcionalment PDF amb els 10 millors |
Fragments clau del codi
Càrrega i filtrat amb Pandas + Lipinski:
import pandas as pd
# Carregar dades
df = pd.read_csv("molecules.csv")
# Aplicar regla de Lipinski
df['lipinski_ok'] = (
(df['MW'] <= 500) &
(df['LogP'] <= 5) &
(df['HBD'] <= 5) &
(df['HBA'] <= 10)
)
df_filtrat = df[df['lipinski_ok']]
print(f"Compostos després de Lipinski: {len(df_filtrat)}/{len(df)}")
Visualització de resultats amb Matplotlib:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.hist(df['MW'], bins=30, color='teal', alpha=0.7)
plt.xlabel('Pes molecular (Da)')
plt.ylabel('Freqüència')
plt.title('Distribució de pesos moleculars')
plt.subplot(1,2,2)
plt.scatter(df['LogP'], df['docking_score'], c='coral', alpha=0.6)
plt.xlabel('LogP')
plt.ylabel('Docking score (kcal/mol)')
plt.title('LogP vs Afinitat')
plt.tight_layout()
plt.savefig('informe_grafic.png', dpi=150)
plt.show()
Llistat de lliuraments
Projecte Individual – Tria una malaltia
Cada alumne treballarà amb un dataset associat a una malaltia diferent:
Cerca una base de dades de molècules bioactivas (ChEMBL, ZINC, etc.) i prepara un dataset de almenys 100 compostos amb descriptors i scores de docking (reals o simulats).