Bioinformática Práctica con Biopython
Explora cómo usar Biopython para manipular secuencias biológicas y acceder programáticamente a bases de datos online como GenBank para automatizar la recolección de datos.
Biopython es un conjunto de herramientas de código abierto para biología computacional y bioinformática, escrito en Python. Su objetivo es hacer que las tareas de bioinformática sean más fáciles y rápidas de realizar, proporcionando módulos de alta calidad y fáciles de usar. Es una biblioteca inmensa que cubre desde el análisis de secuencias y alineamientos hasta el modelado 3D de proteínas y la filogenia.
Una de sus funcionalidades más básicas y potentes es el manejo de secuencias biológicas. Biopython proporciona un objeto Seq que no solo almacena la secuencia (de ADN, ARN o proteína), sino que también "entiende" la biología detrás de ella. Este objeto ofrece métodos para tareas biológicas fundamentales como la transcripción, la traducción, o la obtención de la secuencia complementaria inversa, encapsulando la lógica biológica en funciones sencillas.
# Nota: Este código está listo para ser copiado y ejecutado en un notebook de Google Colab.
# Para que funcione, primero debes instalar Biopython en tu entorno de Colab.
# Simplemente ejecuta esta celda en Colab: !pip install biopython
# Para usar Biopython, primero necesitamos importar las clases que vamos a utilizar.
# Aquí, importamos la clase 'Seq' del módulo 'Bio.Seq'.
from Bio.Seq import Seq
# Creamos un objeto 'Seq' a partir de una cadena de texto que representa el inicio del gen de la beta-globina humana.
# Este objeto 'dna_seq' es más que una simple cadena; tiene métodos biológicos incorporados.
dna_seq = Seq("ATGGTGCATCTGACTCCTGAGGAGAAGTCTGCCGTTACTGCCCTGTGGGGCAAGGTGAACGTGGATGAAGTTGGTGGTGAGGCCCTGGGCAGG")
print("Secuencia de ADN original:", dna_seq)
# >> Salida: Secuencia de ADN original: ATGGTGCATCTGACTCCTGAGGAGAAGTCTGCCGTTACTGCCCTGTGGGGCAAGGTGAACGTGGATGAAGTTGGTGGTGAGGCCCTGGGCAGG
# El método .complement() devuelve la hebra complementaria (A<->T, G<->C).
complement_seq = dna_seq.complement()
print("\nSecuencia Complementaria:", complement_seq)
# >> Salida: Secuencia Complementaria: TACCACGTAGACTGAGGACTCCTCTTCAGACGGCAATGACGGGACACCCCGTTCCACTTGCACCTACTTCAACCACCACUCCGGGACCCGTCC
# El método .reverse_complement() es fundamental en biología molecular.
# Devuelve la hebra complementaria en la dirección opuesta (5' a 3').
rev_comp_seq = dna_seq.reverse_complement()
print("\nSecuencia Complementaria Inversa:", rev_comp_seq)
# >> Salida: Secuencia Complementaria Inversa: CCTGCCAGGGCCTCACCACCAACTTCATCCACGTTCACCTTGCCCCACAGGGCAGTAACGGCAGACTTCTCCTCAGGAGTCAGATGCACCAT
# El método .transcribe() simula el proceso biológico de transcripción de ADN a ARNm.
# Reemplaza cada base de Timina (T) por Uracilo (U).
rna_seq = dna_seq.transcribe()
print("\nSecuencia de ARN Transcrita:", rna_seq)
# >> Salida: Secuencia de ARN Transcrita: AUGGUGCACUGACUCCUGAGGAGAAGUCUGCCGUUACUGCCCUGUGGGGCAAGGUGAACUGGAUGAAGUUGGUGGUAGGCCCUGGGCAGG
# El método .translate() simula el proceso de traducción de ARNm a proteína.
# Lee la secuencia en codones (grupos de 3 bases) y la convierte en una secuencia de aminoácidos.
# Por defecto, se detiene al encontrar un codón de parada, representado por un asterisco (*).
protein_seq = rna_seq.translate()
print("\nSecuencia de Proteína Traducida:", protein_seq)
# >> Salida: Secuencia de Proteína Traducida: MVHLTPEEKSAVTALWGKVNVDEVGGEALG*
Una tarea extremadamente común en bioinformática es buscar y descargar datos de grandes bases de datos públicas como las del NCBI (National Center for Biotechnology Information), que incluyen GenBank (secuencias de ADN), PubMed (publicaciones científicas), y muchas otras.
Biopython simplifica enormemente este proceso con su módulo Bio.Entrez. Este módulo actúa como una interfaz para el sistema de búsqueda Entrez de NCBI, permitiéndonos buscar, descargar (fetch) y parsear datos directamente desde nuestro código en Python. Esto es la clave para la automatización y la reproducibilidad en la ciencia de datos biológicos, permitiendo la creación de flujos de trabajo (pipelines) que pueden buscar miles de secuencias o artículos sin intervención manual.
# Nota: Este código está listo para ser copiado y ejecutado en un notebook de Google Colab.
# Para que funcione, primero debes instalar Biopython: !pip install biopython
# El módulo Entrez de Biopython nos permite interactuar con las bases de datos de NCBI.
from Bio import Entrez
from Bio import SeqIO # SeqIO nos ayudará a parsear los datos descargados.
# --- Paso 1: Identificación ---
# Es una política de NCBI (y una buena práctica) que siempre te identifiques con tu correo.
# Si haces demasiadas peticiones sin identificarte, NCBI podría bloquear tu IP.
Entrez.email = "tu.correo@ejemplo.com" # Reemplaza esto con tu correo real.
# --- Paso 2: Búsqueda (E-Search) ---
# Supongamos que queremos buscar genes relacionados con la resistencia al tizón tardío en la papa (Solanum tuberosum).
# Usamos Entrez.esearch() para buscar en la base de datos de nucleótidos ('nuccore').
# El 'term' es nuestra consulta de búsqueda. Podemos usar operadores booleanos como AND, OR, NOT.
search_term = "Solanum tuberosum[Orgn] AND (late blight OR resistance)"
print(f"Buscando en NCBI con el término: '{search_term}'")
handle = Entrez.esearch(db="nuccore", term=search_term, retmax="5") # retmax limita el número de resultados.
# Entrez.read() procesa el resultado de la búsqueda (que está en formato XML) en un diccionario de Python.
record = Entrez.read(handle)
handle.close() # Siempre es buena práctica cerrar el handle.
# El resultado contiene una lista de IDs de las secuencias que coincidieron con nuestra búsqueda.
id_list = record["IdList"]
print(f"Se encontraron {record['Count']} resultados. Mostrando los primeros {len(id_list)} IDs.")
print("IDs de GenBank encontrados:", id_list)
# >> Salida: (La salida puede variar)
# Buscando en NCBI con el término: 'Solanum tuberosum[Orgn] AND (late blight OR resistance)'
# Se encontraron 20387 resultados. Mostrando los primeros 5 IDs.
# IDs de GenBank encontrados: ['2699201538', '2699201536', '2699201534', '2699201532', '2699201530']
# --- Paso 3: Descarga (E-Fetch) ---
# Ahora, usamos los IDs encontrados para descargar los registros completos en formato GenBank.
print("\nDescargando registros completos...")
handle = Entrez.efetch(db="nuccore", id=id_list, rettype="gb", retmode="text")
# 'rettype="gb"' especifica el formato GenBank, que es rico en anotaciones.
# --- Paso 4: Parseo ---
# Usamos SeqIO.parse() para leer los registros uno por uno desde el handle.
# Esto es más eficiente en memoria que leer todo el archivo de una vez.
for seq_record in SeqIO.parse(handle, "genbank"):
# seq_record es un objeto rico en información.
print("-" * 50)
print("ID:", seq_record.id)
print("Descripción:", seq_record.description)
print("Longitud de la secuencia:", len(seq_record.seq))
# Las anotaciones contienen metadatos valiosos.
if 'source' in seq_record.annotations:
print("Fuente:", seq_record.annotations['source'])
handle.close()
# >> Salida: (Resumida para un registro)
# --------------------------------------------------
# ID: OR637989.1
# Descripción: Solanum tuberosum isolate J16-2-2 Rpi-j16-2-2 gene for late blight resistance protein, complete cds
# Longitud de la secuencia: 3963
# Fuente: Solanum tuberosum (potato)
# ... (y así para los otros 4 registros)