Projecte Final

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:

ScriptDescripció
01_load_data.pyCarrega el CSV amb Pandas i neteja dades
02_descriptors.pyCalcula (o importa) pes molecular, LogP, H-bond donors/acceptors
03_lipinski.pyAplica filtre Lipinski (≤5 violacions permeses)
04_docking.pyLlegeix scores de docking i els fusiona amb la llista filtrada
05_analysis.pyOrdena candidats, genera gràfiques (distribució de scores, propietats)
06_report.pyExporta 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

Codi font complet (scripts .py)
Fitxer de dades (CSV)
Informe final (CSV amb els millors candidats)
Gràfiques (mínim 2: distribució pesos, scores)
Breu memòria explicativa (README)
Repositori GitHub (opcional)

Projecte Individual – Tria una malaltia

Cada alumne treballarà amb un dataset associat a una malaltia diferent:

· Alzheimer· Parkinson· Diabetis tipus II · Càncer de mama· Càncer colorectal· Melanoma · Asma· MPOC· Artritis reumatoide · COVID-19· Tuberculosi· Malària · Hipertensió· Epilèpsia· Osteoporosi

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).