Volver al catálogo
Season 20 18 Episodios 1h 16m 2026

Biopython Fundamentals

v1.87 — Edición 2026. Una guía completa de 18 episodios sobre el uso de Biopython (v1.87 - 2026) para el análisis de secuencias, el parseo de formatos de datos biológicos, la ejecución de BLAST, el manejo de estructuras 3D, árboles filogenéticos y mucho más.

Computación científica Bioinformática
Biopython Fundamentals
Reproduciendo ahora
Click play to start
0:00
0:00
1
Introducción a Biopython y el objeto Seq
Descubre la base de Biopython: el objeto Seq. Exploramos cómo los objetos de secuencia se diferencian de las cadenas estándar de Python y aprendemos a realizar operaciones biológicas como el reverso complementario y la traducción.
3m 52s
2
Datos de secuencias enriquecidos: El objeto SeqRecord
Aprende a envolver secuencias en metadatos enriquecidos utilizando el objeto SeqRecord. Cubrimos cómo se almacenan los identificadores, nombres, descripciones y anotaciones de diccionario junto a la secuencia en bruto.
4m 57s
3
Lectura y escritura de archivos con SeqIO
Domina las conversiones de archivos de secuencias y el procesamiento por lotes con Bio.SeqIO. Este episodio explica la diferencia entre leer archivos de un solo registro y parsear conjuntos de datos de múltiples registros.
4m 11s
4
Extracción de genes con SeqFeature
Sumérgete en el complejo mundo de las características de las secuencias. Explicamos cómo Biopython representa las coordenadas de los genes, las cadenas y las ubicaciones difusas utilizando el objeto SeqFeature.
3m 52s
5
Alineamiento de secuencias por pares
Aprende a comparar dos secuencias directamente utilizando el módulo Bio.Align. Hablamos sobre PairwiseAligner, la puntuación de sustitución y las penalizaciones por huecos para alineamientos globales y locales.
4m 24s
6
Manejo de alineamientos múltiples de secuencias
Pasa de los alineamientos por pares a los alineamientos múltiples de secuencias. Este episodio cubre el parseo de archivos de alineamiento con AlignIO y el tratamiento de los alineamientos como matrices 2D para extraer columnas específicas.
4m 23s
7
Consultas programáticas a bases de datos del NCBI
Automatiza tus búsquedas de literatura y secuencias. Descubre cómo consultar las bases de datos del NCBI utilizando Entrez.esearch y recuperar IDs exactos sin usar un navegador web.
4m 30s
8
Ejecución de BLAST a través de Internet
Lanza búsquedas remotas en BLAST directamente desde Python. Aprende a usar qblast para enviar secuencias a los servidores del NCBI y guardar de forma segura los resultados en bruto en formato XML.
3m 55s
9
Parseo nativo: Desempaquetando el XML de BLAST
Dale sentido a las complejas salidas de BLAST. Este episodio te guía a través del parseo de archivos XML de BLAST en objetos nativos de Python para extraer alineamientos, pares de segmentos de alta puntuación (HSPs) y valores E (E-values).
4m 09s
10
Navegando por estructuras 3D con Bio.PDB
Adéntrate en las tres dimensiones. Exploramos el módulo PDB, el parseo de estructuras macromoleculares y la comprensión de la arquitectura Structure-Model-Chain-Residue-Atom (SMCRA).
4m 00s
11
Midiendo la geometría de las proteínas
Calcula relaciones espaciales en proteínas. Este episodio cubre el cálculo de distancias interatómicas y el uso de NeighborSearch para encontrar átomos dentro de un radio específico.
4m 32s
12
Árboles filogenéticos en Python
Parsea, manipula y dibuja árboles evolutivos con Bio.Phylo. Cubrimos la lectura de archivos Newick, el recorrido de árboles y el aislamiento de clados específicos.
4m 18s
13
Análisis de motivos de secuencias
Descubre patrones ocultos en el ADN. Descubre cómo crear motivos de secuencias, construir Position-Weight Matrices (PWMs) y escanear secuencias objetivo en busca de sitios de unión de factores de transcripción.
4m 30s
14
Integración de Swiss-Prot y ExPASy
Accede al estándar de oro de las bases de datos de proteínas. Detallamos cómo obtener registros a través de Bio.ExPASy y parsear los densos archivos planos de Swiss-Prot para extraer metadatos de proteínas curados.
3m 40s
15
Visualización de genomas con GenomeDiagram
Convierte archivos GenBank en bruto en imágenes con calidad de publicación. Aprende cómo GenomeDiagram construye mapas de genomas circulares y lineales superponiendo pistas y flechas de características.
4m 05s
16
Genética de poblaciones con Bio.PopGen
Analiza la variación genética entre poblaciones. Este episodio presenta Bio.PopGen para parsear archivos Genepop y extraer fácilmente frecuencias alélicas y métricas de heterocigosidad.
4m 13s
17
Rutas bioquímicas con KEGG
Conecta los puntos metabólicos. Aprende a parsear registros de enzimas y rutas de KEGG para rastrear reacciones bioquímicas y estructuras de compuestos químicos.
4m 38s
18
Análisis de clústeres para la expresión génica
Agrupa los genes por su comportamiento. En este episodio final, cubrimos el módulo Bio.Cluster, aplicando K-means y clustering jerárquico a datos de expresión de microarrays.
4m 32s

Episodios

1

Introducción a Biopython y el objeto Seq

3m 52s

Descubre la base de Biopython: el objeto Seq. Exploramos cómo los objetos de secuencia se diferencian de las cadenas estándar de Python y aprendemos a realizar operaciones biológicas como el reverso complementario y la traducción.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 1 de 18. Tratar una secuencia de ADN como un string de texto estándar funciona bien hasta que necesitas su hebra opuesta. La manipulación simple de strings en Python falla cuando te das cuenta de que la transcripción biológica no trata solo de reemplazar letras, sino de direccionalidad y códigos genéticos distintos. Precisamente por eso usamos Introducción a Biopython y el objeto Seq. En esencia, una secuencia biológica es un string de letras que representa moléculas como ADN, ARN o proteínas. En Biopython, la estructura de datos central es el objeto Seq. Este objeto encapsula el comportamiento estándar de los strings de Python, pero le añade conocimiento biológico directamente a los datos. Como se comporta como un string normal, puedes hacer todo lo que normalmente haces con texto. Puedes comprobar la longitud de una secuencia. Puedes contar cuántas veces aparece un patrón específico. Puedes hacerle un slice para extraer un fragmento más pequeño. Cuando haces un slice de un objeto Seq, el resultado no es un string de texto estándar. Es un nuevo objeto Seq. Esto garantiza que nunca elimines accidentalmente los métodos biológicos cuando parseas una secuencia en fragmentos más pequeños. Esta es la parte que importa. Los strings estándar no entienden de biología. El ADN es de doble cadena y las secuencias se leen en una dirección específica. Si tienes una secuencia de ADN codificante y necesitas la hebra opuesta, una simple inversión de texto es biológicamente incorrecta. Tienes que invertir el orden de las letras e intercambiar cada base por su par estructural. El objeto Seq gestiona esto con un único método reverse complement, devolviendo una hebra opuesta biológicamente precisa. Más allá de la estructura, el objeto Seq maneja directamente el dogma central de la biología molecular. Considera una secuencia corta de ADN codificante. Para convertirla en ARN mensajero, llamas al método transcribe en tu secuencia. Por debajo, esto gestiona las sustituciones de letras específicas, reemplazando la timina por uracilo, y te devuelve una secuencia de ARN. Si empiezas con ARN y necesitas el equivalente en ADN, un método back transcribe revierte ese proceso. Una vez que tienes tu secuencia lista, por lo general quieres la proteína resultante. Llamas al método translate. Esto agrupa automáticamente las letras de la secuencia en tripletes, las evalúa como codones y devuelve un nuevo objeto Seq que contiene la secuencia de aminoácidos. La biología rara vez es uniforme, y el código genético estándar no se aplica en todas partes. Organismos como ciertas bacterias, u orgánulos como las mitocondrias de vertebrados, leen los codones de manera diferente. El método translate tiene esto en cuenta mediante tablas de traducción. En lugar de escribir lógica personalizada para una secuencia mitocondrial, simplemente le pasas el argumento translation table al método. Puedes proporcionar el número de tabla oficial del NCBI, como la tabla dos para las mitocondrias de vertebrados, o el nombre de la tabla como texto. El objeto Seq recalcula los aminoácidos utilizando las reglas específicas de ese organismo. El verdadero poder del objeto Seq es que te evita escribir funciones de parseo de texto frágiles y propensas a errores para procesos biológicos establecidos. Si quieres apoyar el programa, puedes buscar DevStoriesEU en Patreon. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue construyendo!
2

Datos de secuencias enriquecidos: El objeto SeqRecord

4m 57s

Aprende a envolver secuencias en metadatos enriquecidos utilizando el objeto SeqRecord. Cubrimos cómo se almacenan los identificadores, nombres, descripciones y anotaciones de diccionario junto a la secuencia en bruto.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 2 de 18. Un string de diez mil letras de ADN es técnicamente una secuencia, pero analíticamente, es inútil. Sin conocer la especie de la que proviene, el tipo de molécula o la calidad de lectura, solo tienes texto raw. Vincular esos metadatos cruciales a la secuencia raw es el trabajo de Rich Sequence Data: el objeto SeqRecord. El SeqRecord es un contenedor. Toma una secuencia básica y la envuelve con los identificadores y la información descriptiva necesarios para usarla realmente en un pipeline bioinformático. Cada SeqRecord depende de unos pocos atributos core. El primero es punto seq, que contiene los datos de la secuencia en sí. Rodeando a este hay tres atributos de string estándar. Punto id contiene el identificador principal, normalmente un número de acceso de una base de datos pública. Punto name contiene un nombre común más corto o un identificador de clon. Punto description contiene texto legible por humanos que explica qué representa realmente la secuencia. A veces, tres atributos de string no son suficientes. Cuando necesitas almacenar metadatos complejos o personalizados, usas el atributo punto annotations. Este es un diccionario estándar de Python. Gestiona metadatos a nivel de registro. Puedes almacenar cualquier cosa aquí. Si quieres registrar cómo se verificó una secuencia, simplemente añades una nueva key llamada evidence al diccionario y estableces su valor en experimental. Aquí está la clave. No todos los metadatos se aplican a toda la secuencia en su conjunto. A veces necesitas datos asignados a cada letra individual. Esto es lo que hace punto letter annotations. Es otro diccionario, pero viene con una regla estricta. Cualquier lista, array o string que asignes como valor en este diccionario debe tener exactamente la misma longitud que la propia secuencia. El caso de uso clásico es almacenar puntuaciones de calidad Phred de una máquina de secuenciación. Si tu secuencia de ADN dummy tiene exactamente veinte letras de longitud, puedes asignar una lista de veinte enteros al diccionario punto letter annotations bajo la key phred quality. Si intentas asignar diecinueve o veintiún enteros, Biopython lanzará un error inmediatamente. Puedes construir fácilmente un SeqRecord desde cero. Primero, defines un objeto sequence. A continuación, pasas esa secuencia al constructor de SeqRecord. Puedes pasar el identificador, el nombre y la descripción allí mismo como argumentos. Una vez que el objeto existe, puedes acceder a sus diccionarios para inyectar manualmente tus strings de evidence personalizados o tus listas de puntuaciones de calidad por letra. En la práctica, rara vez los construyes completamente a mano. Normalmente los obtienes parseando archivos, y Biopython maneja diferentes formatos de archivo mapeando los datos a los atributos del SeqRecord de maneras específicas. Considera un archivo FASTA estándar. FASTA es un formato muy básico. Cuando Biopython lo lee, coge la primera palabra después del símbolo de mayor que en la línea del header y la asigna al atributo punto id. Al atributo punto name simplemente se le da exactamente el mismo valor que al identificador. El resto de la línea del header se vuelca directamente en el atributo punto description. Como FASTA no tiene metadatos estructurados, el diccionario punto annotations permanece completamente vacío. Los archivos GenBank ofrecen un fuerte contraste. Contienen datos ricos y estructurados. Al parsear GenBank, Biopython asigna el locus y el número de versión al punto id. El nombre del locus va al atributo punto name. La línea de definición se mapea al punto description. De manera crucial, Biopython rellena activamente el diccionario punto annotations. Extrae los detalles de taxonomía, el tipo de molécula, la división del archivo de datos y la lista de referencias publicadas, colocándolos todos ordenadamente en el diccionario bajo keys estandarizadas. La secuencia te dice el código biológico subyacente, pero el objeto SeqRecord es lo que en última instancia le da a ese código su contexto. Gracias por pasar unos minutos conmigo. Hasta la próxima, cuídate.
3

Lectura y escritura de archivos con SeqIO

4m 11s

Domina las conversiones de archivos de secuencias y el procesamiento por lotes con Bio.SeqIO. Este episodio explica la diferencia entre leer archivos de un solo registro y parsear conjuntos de datos de múltiples registros.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 3 de 18. Tu pipeline bioinformático falla a mitad de una ejecución. Revisas los logs y te das cuenta de que un script posterior esperaba un fichero FASTA, pero la herramienta anterior le pasó un fichero GenBank. Ahora tienes que reescribir un parser desde cero solo para extraer los datos de la secuencia. O podrías usar Bio dot SeqIO. SeqIO es el módulo estándar de Biopython para la entrada y salida de secuencias. Se encarga del parsing de varios formatos de ficheros biológicos, para que no tengas que escribir expresiones regulares ni funciones de manipulación de strings personalizadas. Tú le pasas la ruta del fichero y el format string, y SeqIO se encarga de la estructura subyacente del fichero. Al leer ficheros, SeqIO te da dos funciones distintas, y elegir la equivocada es una fuente común de bugs. La primera es read. Usas la función read cuando estás completamente seguro de que tu fichero contiene exactamente un sequence record. Le pasas la ruta del fichero y el formato, como fasta, y te devuelve un único objeto sequence record. Si el fichero está vacío, o si contiene dos o más registros, la función read lanzará una excepción inmediatamente y detendrá tu script. Es estrictamente para un mapeo uno a uno. Pero lo más normal es que trabajes con ficheros que contienen muchas secuencias. Para esto, usas la función parse. A diferencia de read, parse no carga todo en memoria a la vez. En su lugar, devuelve un iterador. Esta es la parte que importa. Un iterador te da un sequence record a la vez, lo que mantiene bajo tu consumo de memoria incluso si estás procesando datasets genómicos masivos de varios gigabytes. Imagina un escenario específico. Tienes un fichero GenBank con datos de varias especies de orquídeas. Quieres extraer estos registros, pero solo te interesan las secuencias de más de cien pares de bases. Además, la siguiente herramienta de tu pipeline requiere formato FASTA, no GenBank. Puedes gestionar la lectura, el filtrado y la conversión de formato de forma secuencial. Primero, creas una lista vacía para guardar tus secuencias filtradas. Luego, montas un bucle usando la función parse, apuntando a tu fichero GenBank de orquídeas y especificando genbank como el format string de entrada. Dentro del bucle, la función parse te entrega un objeto sequence record en cada pasada. Compruebas la longitud de la secuencia asociada a ese registro. Si la longitud es mayor que cien, añades el registro a tu lista. Si es menor, simplemente lo ignoras y pasas a la siguiente iteración. Ahora tienes una lista de registros válidos y filtrados en memoria. Para guardarlos, usas la función write. La función write requiere tres parámetros: la secuencia de registros que quieres guardar, la ruta del fichero de salida y el format string de salida. Le pasas tu lista de registros de orquídeas filtrados, especificas un nuevo nombre de fichero y proporcionas fasta como el format string. Eso es todo. SeqIO extrae automáticamente los identificadores y secuencias relevantes de tus registros GenBank y los formatea correctamente como texto FASTA. No necesitas crear manualmente las líneas de encabezado ni formatear los bloques de secuencia. Al combinar parse con write, traduces entre formatos de ficheros sin esfuerzo. La lección más útil aquí es que SeqIO actúa como un puente estandarizado. Al forzar que todos los formatos de fichero se ajusten a una estructura universal de sequence record durante el paso de parse, desacopla por completo el formato que lees del formato que finalmente escribes. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue programando!
4

Extracción de genes con SeqFeature

3m 52s

Sumérgete en el complejo mundo de las características de las secuencias. Explicamos cómo Biopython representa las coordenadas de los genes, las cadenas y las ubicaciones difusas utilizando el objeto SeqFeature.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 4 de 18. Estás haciendo un slice manual de un string de secuencia para extraer un gen en la hebra inversa. Calculas las coordenadas, inviertes el string, complementas las bases y ejecutas tu script. La mitad de las veces, terminas con un error off by one o con datos sin sentido. Intentar hacer estos cálculos de secuencia a mano es una trampa clásica. En su lugar, deberías dejar que el parser haga el trabajo extrayendo genes con SeqFeature. Un objeto SeqFeature describe una región o punto de referencia específico en una secuencia padre. Cuando parseas un formato de archivo enriquecido, Biopython rellena tu record de secuencia con una lista de estos objetos feature. Cada feature tiene tres atributos principales que usarás constantemente. El primero es el atributo type. Es simplemente un string que te dice qué representa la feature, como gen, CDS o ARNm. El segundo es el atributo qualifiers. Es un diccionario que contiene todos los metadatos asociados a esa feature específica. Si necesitas el nombre del gen, el locus tag o una nota sobre el producto de traducción, lo recuperas del diccionario qualifiers. En tercer lugar, y lo más importante, está el atributo location. Este dicta exactamente dónde vive la feature matemáticamente en la secuencia padre. Viene en dos formas principales. Un SimpleLocation maneja tramos continuos e ininterrumpidos de secuencia. Contiene una posición de inicio exacta, una posición de fin exacta y la hebra. La hebra se representa como un integer. Es un uno para la hebra directa, y un menos uno para la hebra inversa. La biología a menudo se resiste a ser simple. Los genes con splicing en eucariotas se dividen en múltiples exones a lo largo del genoma. Para manejar esto, el atributo location será en su lugar un CompoundLocation. Un CompoundLocation es esencialmente una colección de SimpleLocations unidos. Agrupa las coordenadas de esos exones fragmentados y los trata como una sola unidad lógica. Aquí está la clave. No necesitas mirar estas coordenadas de location ni escribir tu propia notación de slice en Python para sacar los datos de la secuencia del record padre. Usas el método extract asociado a la propia feature. Para usarlo, coges tu objeto SeqFeature, llamas al método extract y le pasas la secuencia padre completa como argumento. La feature mira sus propios datos de location y hace el trabajo duro por ti. Si la feature es un SimpleLocation en la hebra directa, hace un slice de la secuencia exactamente como esperarías. Si la feature está en la hebra inversa, extract gestiona automáticamente el slice, genera el reverse complement de esa secuencia y devuelve el resultado biológicamente preciso. No tienes que invertir strings ni acordarte de complementar las bases. Hace incluso más trabajo por ti cuando tratas con un CompoundLocation. Si llamas a extract en un gen con splicing, Biopython va a la secuencia padre, extrae cada exón individual basándose en sus respectivos SimpleLocations, les hace el reverse complement automáticamente si el gen está en la hebra negativa, y los une todos en el orden correcto. Te devuelve un trozo de secuencia continuo y limpio, listo para su traducción o análisis downstream. Depender del método extract elimina los cálculos manuales de índices que causan errores silenciosos de datos en las pipelines de bioinformática. Me gustaría tomarme un momento para darte las gracias por escuchar, nos ayuda muchísimo. ¡Que tengas un buen día!
5

Alineamiento de secuencias por pares

4m 24s

Aprende a comparar dos secuencias directamente utilizando el módulo Bio.Align. Hablamos sobre PairwiseAligner, la puntuación de sustitución y las penalizaciones por huecos para alineamientos globales y locales.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 5 de 18. Los algoritmos clásicos de alineamiento por programación dinámica son notoriamente lentos cuando se escriben en Python puro. Si intentas procesar miles de pares de secuencias, tu script se quedará colgado durante horas. Biopython resuelve esto usando C para el trabajo pesado, dándote un rendimiento de milisegundos. Este episodio trata sobre el alineamiento de secuencias por pares usando el objeto PairwiseAligner. Para comparar exactamente dos secuencias, instancias un PairwiseAligner. Este único objeto actúa como el motor de configuración de todo el proceso. Por defecto, realiza un alineamiento global, lo que significa que fuerza un match de extremo a extremo entre las dos secuencias. Si solo quieres encontrar la subsecuencia con el mejor match escondida en algún lugar dentro de un string más largo, cambias el atributo mode del alineador de global a local. El alineador necesita reglas para decidir qué constituye un buen match. Configuras estas reglas directamente como atributos en el objeto alineador. Le asignas un número positivo al atributo match score, y un número negativo al atributo mismatch score. Pero las secuencias biológicas también mutan insertando o borrando bloques enteros de letras, lo que crea gaps en el alineamiento. Aquí está la clave. La biología favorece mucho una sola deleción larga en lugar de varias deleciones pequeñas y dispersas. Para modelar esta realidad física, configuras dos penalizaciones de gap distintas. Le asignas un valor negativo grande al open gap score para penalizar la creación de un nuevo gap. Luego, le asignas un valor negativo mucho menor al extend gap score. Este desequilibrio matemático obliga al alineador a agrupar los gaps siempre que sea posible. Una vez que tu alineador está configurado, llamas a su método align y le pasas tus dos secuencias. El método no devuelve simplemente un solo string o un número final. Devuelve un iterator de objetos de alineamiento. Múltiples caminos a través de una matriz de programación dinámica pueden dar exactamente el mismo score más alto. El alineador te da acceso a todos estos alineamientos matemáticamente óptimos. Como devuelve un iterator, evalúa de forma lazy. Solo calcula el siguiente camino óptimo cuando se lo pides, lo que protege a tu sistema de sobrecargas de memoria si secuencias muy repetitivas generan miles de alineamientos igualmente válidos. Imagina un ejemplo concreto usando dos secuencias cortas de ADN. La secuencia uno es A C C G T. La secuencia dos es A C G, lo que significa que le falta la segunda C y la T final. Primero, creas el objeto alineador. Pones el match score a dos, y el mismatch score a menos uno. Pones el open gap score a menos cinco, y el extend gap score a menos uno. Luego, le pasas ambas secuencias al método align. Cuando haces un loop sobre el iterator devuelto e imprimes los resultados, Biopython formatea automáticamente el output. Apila las secuencias visualmente, dibujando líneas verticales entre las bases que hacen match y guiones donde falta una letra. Verás exactamente cómo el alineador colocó caracteres de gap en la segunda secuencia para alinear las letras que hacen match, maximizando el score total basándose en la severa penalización de open gap que definiste. Recuerda que configurar un alineador es, en esencia, ajustar un modelo matemático; el output solo tiene sentido biológico si tus scores de match, mismatch y gap reflejan con precisión la relación evolutiva específica entre tus secuencias de entrada. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue creando!
6

Manejo de alineamientos múltiples de secuencias

4m 23s

Pasa de los alineamientos por pares a los alineamientos múltiples de secuencias. Este episodio cubre el parseo de archivos de alineamiento con AlignIO y el tratamiento de los alineamientos como matrices 2D para extraer columnas específicas.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 6 de 18. Abres un archivo de alineación en un editor de texto y parece perfectamente estructurado, como una cuadrícula simple. Pero intenta parsear solo la tercera posición en cincuenta especies diferentes, y de repente te encuentras escribiendo loops anidados y llevando un registro de los índices de los strings. Manejar alineaciones de secuencias múltiples no tiene por qué ser tan frustrante. Para incorporar una alineación a tu código, usas el módulo Bio AlignIO. Suponiendo que tu archivo de alineación ya esté generado, utilizas la función read. Le pasas a esta función la ruta del archivo y un string que indica el formato, como phylip o stockholm. La función read procesa el archivo de texto y te devuelve un objeto MultipleSeqAlignment. Aquí está la clave. El objeto MultipleSeqAlignment se comporta exactamente como un array bidimensional. Si alguna vez has trabajado con una matriz NumPy, la lógica es idéntica. Las filas de esta cuadrícula son tus secuencias individuales, que generalmente representan diferentes organismos o genes. Las columnas son las posiciones específicas de nucleótidos o aminoácidos alineadas en todas esas secuencias. Como funciona como un array 2D, usas la sintaxis estándar de slicing de Python para manipular ambas dimensiones simultáneamente. Si solo necesitas obtener una secuencia específica, haces un slice de las filas. Al acceder al index cero de tu alineación, obtienes la primera secuencia del archivo. Esta fila se devuelve como un objeto SeqRecord estándar, con el ID de la secuencia, la descripción y los datos biológicos de la secuencia. También puedes hacer un loop directamente sobre el objeto de alineación, y te entregará cada SeqRecord fila por fila. Eso cubre las secuencias. Ahora veamos las columnas, donde la lógica 2D realmente te ahorra tiempo. Supongamos que cargaste una alineación stockholm y quieres aislar una región de inicio altamente conservada. Solo te interesan las primeras diez posiciones en cada especie. En lugar de iterar por cincuenta secuencias y hacer slicing de cincuenta strings individuales, aplicas un slice 2D directamente al objeto de alineación. Pides todas las filas usando un solo signo de dos puntos para la primera dimensión, seguido de una coma, y luego el slice cero a diez para la segunda dimensión. La sintaxis es simplemente corchete de apertura, dos puntos, coma, dos puntos diez, corchete de cierre. Esta única operación devuelve un nuevo objeto MultipleSeqAlignment que contiene solo las primeras diez columnas de cada secuencia. Todos los IDs de secuencia y metadatos originales se conservan automáticamente en la nueva cuadrícula más pequeña. Hay una ligera diferencia de comportamiento dependiendo de lo ancho que sea tu slice. Cuando haces un slice de un rango de columnas, Biopython mantiene la estructura de la cuadrícula y devuelve un objeto de alineación. Pero si extraes exactamente una sola columna (por ejemplo, todas las filas en el index cinco), el objeto devuelve un único string de texto plano que contiene solo esos caracteres de arriba a abajo. Este string de texto facilita enormemente calcular puntuaciones de conservación o identificar polimorfismos de un solo nucleótido en un sitio específico sin desempaquetar ningún objeto. Puedes combinar estos slices de filas y columnas para extraer cualquier subbloque que necesites. Podrías solicitar las filas dos a cinco y las columnas cincuenta a sesenta, aislando un dominio específico para un subconjunto de especies. Trata tus alineaciones como matrices, deja que el objeto MultipleSeqAlignment se encargue del tracking de los strings, y tu código de extracción de datos se reducirá a casi nada. Eso es todo por este episodio. ¡Hasta la próxima!
7

Consultas programáticas a bases de datos del NCBI

4m 30s

Automatiza tus búsquedas de literatura y secuencias. Descubre cómo consultar las bases de datos del NCBI utilizando Entrez.esearch y recuperar IDs exactos sin usar un navegador web.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 7 de 18. Necesitas descargar diez mil registros de secuencias. Si escribes un web scraper estándar para acceder a la web del NCBI, te bloquearán la dirección IP antes de que termines los primeros cien. El National Center for Biotechnology Information prohíbe explícitamente el scraping automatizado. Para extraer datos de forma legal y fiable, necesitas consultar las bases de datos del NCBI programáticamente usando Bio punto Entrez. Antes de hacer cualquier network request, debes seguir las directrices de la API del NCBI. Primero, debes decirles quién eres. Esto lo haces configurando la variable Entrez punto email con tu dirección de email real. Si tu script se descontrola y sobrecarga sus servidores, usarán este email para contactarte antes de cortarte el acceso permanentemente. Segundo, debes respetar sus rate limits. El NCBI restringe a los usuarios no autenticados a tres requests por segundo. Biopython gestiona esto automáticamente forzando un delay en background. Sin embargo, si intentas lanzar múltiples scripts en paralelo para saltarte este delay, el NCBI detectará el abuso y baneará tu IP. Sigue las reglas. El workflow para extraer datos de Entrez normalmente requiere un proceso de dos pasos: encontrar los identificadores únicos, y luego descargar los archivos reales. Empiezas buscando con la función Entrez punto esearch. Supón que quieres encontrar el gen matK en orquídeas. Llamas a esearch y le pasas el nombre de la base de datos, que es nucleotide, junto con tu término de búsqueda, como orchid organism AND matK gene. Esta función de búsqueda no devuelve datos de secuencias biológicas. Devuelve una respuesta HTTP que actúa como un archivo de texto abierto que contiene un documento XML. Aquí está la clave. No necesitas escribir un parser XML custom ni extraer strings manualmente. Coges ese file handle de red y lo pasas directamente a la función Entrez punto read. Esto parsea el XML y lo traduce a un diccionario estándar de Python. Dentro de ese diccionario, simplemente buscas la key llamada IdList. Esto te da una lista de Python que contiene los identificadores exactos de GenBank que coinciden con tu query de orquídeas. Una vez que tienes esa lista de identificadores, pasas al segundo paso: descargar los registros completos. Para esto, usas la función Entrez punto efetch. Le pasas el mismo nombre de base de datos, nucleotide, junto con un identificador de tus resultados de búsqueda. También necesitas especificar el formato de los datos que quieres de vuelta. Para obtener un archivo de texto estándar de GenBank, configuras el argumento retrieval type a gb y el argumento retrieval mode a text. Al igual que la función de búsqueda, efetch devuelve un network stream, no un raw string. Como este stream imita a un archivo local, no necesitas guardar primero los datos descargados en tu disco duro. Puedes pasarle el network handle directamente a SeqIO punto read, especificar que el formato es genbank, e inmediatamente parsea el stream en un objeto SeqRecord de Biopython. Ahora tienes la secuencia y todas sus anotaciones biológicas cargadas en memoria. Cuando termines, cierra el handle para liberar recursos de red. El hábito más importante al consultar el NCBI es tratar tus respuestas de la API como file streams en lugar de text strings. Pasar esos streams directamente a Entrez punto read o SeqIO punto read evita un overhead de memoria innecesario y mantiene tus pipelines de automatización perfectamente limpios. Si estos episodios te resultan útiles, puedes apoyar el programa buscando DevStoriesEU en Patreon. ¡Gracias por escuchar, happy coding a todos!
8

Ejecución de BLAST a través de Internet

3m 55s

Lanza búsquedas remotas en BLAST directamente desde Python. Aprende a usar qblast para enviar secuencias a los servidores del NCBI y guardar de forma segura los resultados en bruto en formato XML.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 8 de 18. Quedarte mirando una página web que se actualiza automáticamente mientras una secuencia se alinea contra una base de datos global es una pésima forma de pasar la tarde. Automatizar esa búsqueda en segundo plano te permite hacer algo útil mientras Python espera. Hoy veremos cómo ejecutar BLAST a través de internet usando Biopython. La función que necesitas se llama qblast, situada en el módulo Bio punto Blast punto NCBIWWW. Actúa como un wrapper para la API de BLAST del NCBI, permitiéndote enviar queries directamente desde tu script exactamente igual que lo harías a través de su portal web. Para lanzar una búsqueda, qblast requiere tres argumentos obligatorios. El primero es el programa blast que quieres ejecutar. Por ejemplo, si estás comparando una secuencia de nucleótidos contra una base de datos de nucleótidos, le pasas el string blastn. Si estás trabajando con proteínas, le pasas blastp. El segundo argumento es la base de datos específica contra la que estás buscando. La opción más común para nucleótidos es el string nt, que significa base de datos de nucleótidos no redundante. Si estuvieras buscando proteínas, usarías nr. El tercer argumento es la query de la secuencia en sí. Biopython hace que este input sea muy flexible. Puedes pasarle un string normal con la secuencia raw, un string multilínea formateado como un registro FASTA, un objeto SeqRecord de Biopython, o un identificador de secuencia exacto, como un número de acceso del NCBI. Si quieres ejecutar una búsqueda básica, llamas a qblast, le pasas blastn como programa, nt como base de datos, y tu string FASTA como query. Python pausará la ejecución aquí mientras negocia con los servidores del NCBI, esperando el tiempo que haga falta hasta que termine el alineamiento remoto. Cuando el servidor remoto termina el trabajo, qblast devuelve un objeto file-like que contiene tus resultados. Por debajo, la función pide estos resultados en formato XML por defecto. Deberías asegurarte de que se quede así, porque XML es el formato estándar del que depende Biopython para el procesamiento posterior. Aquí está la clave. No le pases inmediatamente este web handle devuelto a una función de parsing. Ejecutar una búsqueda remota de BLAST es computacionalmente costoso para los servidores del NCBI y te hace perder mucho tiempo a ti. Si parseas el live data stream directamente desde el web handle y tu script encuentra un error unas líneas más abajo, esos datos de la secuencia se pierden de la memoria. Para arreglar tu código y volver a intentarlo, tendrías que ejecutar exactamente la misma búsqueda remota desde cero, desperdiciando su ancho de banda y tu tiempo. El workflow correcto es guardar permanentemente el output raw de inmediato. En el momento en que qblast devuelve el web handle, usa las operaciones de archivo estándar de Python para abrir un nuevo archivo local en modo escritura. Lee todo del web handle, escríbelo directamente en tu nuevo archivo XML local, y luego cierra el web handle. Ahora tienes una copia segura y estática de tu búsqueda BLAST en tu disco duro. Puedes abrir ese archivo XML local mañana, la semana que viene, o cincuenta veces seguidas mientras haces debug de tu aplicación, sin hacer ping a la API del NCBI ni una sola vez más. Siempre separa la recuperación de red de tu procesamiento de datos escribiendo primero las respuestas web en el disco. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue programando!
9

Parseo nativo: Desempaquetando el XML de BLAST

4m 09s

Dale sentido a las complejas salidas de BLAST. Este episodio te guía a través del parseo de archivos XML de BLAST en objetos nativos de Python para extraer alineamientos, pares de segmentos de alta puntuación (HSPs) y valores E (E-values).

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 9 de 18. Escribir expresiones regulares para hacer scraping de archivos de salida en texto plano es un rito de iniciación en bioinformática. También es un anti-pattern. En el momento en que una herramienta de búsqueda actualiza su formato visual, tu script se rompe. Para obtener garantías estructurales, necesitas basarte en datos estructurados. Este episodio trata sobre Parsing nativo: desempaquetar XML de BLAST. Biopython gestiona esto usando el módulo NCBIXML dentro del paquete Bio dot Blast. En lugar de guardar los resultados de tu búsqueda como un bloque de texto legible por humanos, los guardas como un archivo XML. Cuando abres este archivo y le pasas el handle a la función parse del módulo NCBIXML, no carga un blob de texto enorme en memoria. En su lugar, devuelve un iterator. Este iterator hace yield de objetos estructurados uno a uno, manteniendo tu consumo de memoria bajo incluso si tu búsqueda devolvió cantidades masivas de datos. Para usar esto de manera eficiente, tienes que entender la jerarquía de tres niveles que usa Biopython para modelar los resultados. El nivel superior es el Record de BLAST. Un record corresponde exactamente a una secuencia que enviaste como query. Si enviaste una sola secuencia, el iterator hace yield de un record. Si enviaste cincuenta secuencias, hace yield de cincuenta records. Dentro de cada Record de BLAST, encontrarás una lista de Alignments. Un alignment representa un único hit en la base de datos. Te indica que una secuencia específica en la base de datos hizo match con tu query, junto con metadatos sobre esa entrada de la base de datos. Dentro de cada Alignment está el tercer nivel: High-scoring Segment Pairs, conocidos universalmente como HSPs. Esta es la parte que importa. Un alignment simplemente indica que dos secuencias están relacionadas. El HSP contiene la prueba matemática y estructural de esa relación. Un solo alignment puede contener múltiples HSPs si las secuencias comparten varias regiones distintas de similitud separadas por gaps no alineados. Extraer los datos implica escribir tres bucles anidados. Primero, iteras sobre los records en el XML parseado. Segundo, iteras sobre los alignments dentro de cada record. Tercero, iteras sobre los HSPs dentro de cada alignment. Una vez que estás dentro de ese bucle más interno, tienes acceso a los datos reales del match. Aquí es donde aplicas tus filtros estadísticos. El filtro más común es el e-value, que representa el número de hits de calidad similar que esperarías ver por casualidad. Accedes a esto a través del atributo expect en el objeto HSP. Escribes una comprobación condicional: si el HSP dot expect es menor que tu umbral, digamos cero coma cero cuatro, procesas el match. Si es mayor, el match es demasiado débil y lo ignoras. Para los hits que pasan tu filtro, el objeto HSP contiene los strings de alignment exactos. El atributo query contiene tu secuencia de entrada con cualquier gap introducido por el algoritmo. El atributo sbjct contiene la secuencia de la base de datos que hizo match. El atributo match se sitúa conceptualmente entre ellos, conteniendo la representación del alignment, mapeando los matches exactos, las sustituciones positivas o los gaps. La verdadera ventaja aquí es la estabilidad. Al dejar que el módulo NCBIXML desempaquete el archivo, dejas de depender del scraping de texto frágil y empiezas a interactuar con objetos de datos definidos que se mapean perfectamente a la realidad biológica de los records, alignments y pares de segmentos. ¡Gracias por escuchar, happy coding a todos!
10

Navegando por estructuras 3D con Bio.PDB

4m 00s

Adéntrate en las tres dimensiones. Exploramos el módulo PDB, el parseo de estructuras macromoleculares y la comprensión de la arquitectura Structure-Model-Chain-Residue-Atom (SMCRA).

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 10 de 18. Las proteínas suelen almacenarse como un string plano y unidimensional de letras, pero funcionan en una compleja realidad tridimensional. Mapear una secuencia 1D a un espacio de coordenadas 3D requiere una jerarquía estricta y predecible. Navegar por estructuras 3D con Bio.PDB proporciona precisamente ese mapa. Cuando descargas un archivo del Protein Data Bank, te llega como un enorme bloque de texto. Históricamente, este era el formato punto pdb. Hoy en día, el estándar es el formato punto cif. Escribir tu propio código para leer estos bloques de texto línea por línea es un ejercicio de gestión de edge cases. Bio.PDB resuelve esto convirtiendo el texto en un árbol orientado a objetos. Para ello, utilizas PDBParser o MMCIFParser. Creas una instancia del parser, llamas a su método get structure, proporcionas un nombre arbitrario para tu estructura y le pasas el path de tu archivo. Lo que obtienes a cambio es un objeto Structure. Este objeto Structure sigue una arquitectura de datos estricta conocida como SMCRA. Que son las siglas en inglés de Structure, Model, Chain, Residue y Atom. Cada archivo 3D parseado por Biopython se organiza en estos cinco niveles anidados. El nivel root es el Structure. Un Structure contiene uno o más Models. Si la proteína se resolvió mediante cristalografía de rayos X, por lo general solo hay un model. Si se resolvió mediante RMN, puede haber docenas de models que representan diferentes fluctuaciones estructurales. Normalmente, simplemente coges el primero, que está en el index cero. Dentro de un Model, tienes Chains. Muchas proteínas son complejos formados por múltiples cadenas polipeptídicas que interactúan entre sí. Estas suelen etiquetarse con una sola letra mayúscula, como chain A y chain B. Dentro de un Chain, encuentras Residues. Estos son los aminoácidos individuales que componen la secuencia. Este nivel también contiene los ligandos y las moléculas de agua unidas a ese chain específico. Finalmente, dentro de un Residue, tienes Atoms. Aquí está la clave. Puedes navegar por todo este árbol mediante iteración simple o acceso tipo diccionario. Si escribes un bucle for sobre un chain, te devuelve residues. Si iteras sobre un residue, te devuelve atoms. Si sabes exactamente lo que buscas, puedes profundizar directamente sin hacer bucles. Si necesitas las coordenadas espaciales del carbono alfa en el residuo cien del chain A, simplemente encadenas tus búsquedas. Coges tu objeto Structure, pides el model cero, luego el chain A, luego el residue cien, y luego el atom llamado CA. Piensa en un caso práctico: extraer las coordenadas 3D de todos los atoms en un residue específico. Primero, inicializas tu parser y cargas el archivo en una variable. A continuación, aíslas el residue objetivo. Creas una variable y le asignas el resultado de buscar el model cero, el chain A y el residue cincuenta en tu Structure. Ahora, escribes un bucle for estándar. Para cada atom en el residue objetivo, pides sus coordenadas. Biopython te los devuelve como un array de NumPy que representa las posiciones exactas X, Y y Z en el espacio. Haces un print del nombre del atom y su array de coordenadas. Con solo unas pocas líneas de código, te has saltado miles de líneas de texto plano y has extraído los datos espaciales exactos que necesitas. La jerarquía SMCRA asegura que cada atom en cada archivo de estructura se encuentre usando exactamente la misma lógica. Eso es todo por este episodio. ¡Nos vemos en la próxima!
11

Midiendo la geometría de las proteínas

4m 32s

Calcula relaciones espaciales en proteínas. Este episodio cubre el cálculo de distancias interatómicas y el uso de NeighborSearch para encontrar átomos dentro de un radio específico.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 11 de 18. Si escribes un nested loop simple para calcular la distancia entre cada átomo de una proteína y cada átomo de un ligando, tu script se quedará colgado. La indexación espacial resuelve esto al instante, y eso es lo que veremos hoy con la medición de la geometría de las proteínas. La operación geométrica más fundamental en Bio dot PDB es encontrar la distancia entre dos puntos en el espacio tridimensional. Biopython sobreescribe el operador de resta estándar para los objetos Atom. Si tomas un objeto Atom y le restas un segundo objeto Atom, el resultado es un float que representa la distancia euclidiana entre ellos. La unidad siempre son Angstroms. No necesitas extraer las coordenadas, elevarlas al cuadrado ni calcular la raíz cuadrada tú mismo. Simplemente resta un átomo del otro y tienes tu distancia exacta. Este truco de la resta es perfecto para comprobar una interacción específica y conocida, como un único posible puente de hidrógeno. Pero se queda corto cuando necesitas explorar una proximidad desconocida. Supón que tienes un ligando de molécula pequeña unido a un receptor grande, y necesitas identificar cada residuo de la proteína dentro de un radio de cinco Angstroms de ese ligando. Una proteína típica contiene miles de átomos. Comprobar cada átomo del ligando contra cada átomo de la proteína es computacionalmente muy costoso. La complejidad temporal crece geométricamente, y tu script se queda colgado. Para resolver esto, Bio dot PDB proporciona el módulo Neighbor Search. En lugar de comparar pares uno por uno, Neighbor Search construye un índice espacial. Por debajo, construye un KD-tree que mapea dónde está todo en el espacio tridimensional, permitiendo queries de proximidad extremadamente rápidas. Construyes un objeto Neighbor Search pasándole una flat list de todos los átomos contra los que quieres hacer la query. Normalmente, extraes cada átomo de tu estructura objetivo, haces un cast de ese generator a una list estándar, y se lo pasas al constructor de Neighbor Search. Este paso de inicialización tarda una fracción de segundo, pero hace todo el trabajo computacional pesado de organizar los datos espaciales por adelantado. Una vez construido el índice, puedes hacerle queries. El método search principal requiere dos argumentos: una coordenada objetivo, y un radio en Angstroms. Cuando ejecutas el search, recorre rápidamente el árbol espacial y devuelve solo las entidades situadas dentro de ese límite esférico. Aquí está la clave. El search no solo devuelve átomos. Como Bio dot PDB se basa en la arquitectura SMCRA, Neighbor Search entiende la jerarquía estructural. Puedes pasar un parámetro level opcional a tu query de search. Si especificas la letra R para residue, el índice mirará todos los átomos dentro de tu radio de cinco Angstroms, determinará a qué residuos padre pertenecen esos átomos, y devolverá una list limpia de objetos Residue únicos. Omites por completo el nivel de átomo en tus resultados. Para mapear el sitio de unión de nuestro ligando, sigues un flujo sencillo. Primero, inicializas el Neighbor Search con todos los átomos de la cadena de la proteína. Segundo, iteras solo por los átomos de tu ligando. Por cada átomo del ligando, llamas al método search con un radio de cinco Angstroms y pides el level de residue. Finalmente, recopilas esos residuos devueltos en un set de Python para eliminar automáticamente cualquier duplicado. Acabas de mapear el sitio de unión en milisegundos. Si necesitas encontrar colisiones internas dentro de una sola cadena plegada, Neighbor Search también incluye un método search all. Simplemente proporcionas un radio, y te devuelve cada par de átomos en toda la estructura que están más cerca que esa distancia especificada, evitando por completo el problema del nested loop. Tratar tus datos moleculares como un índice geográfico consultable en lugar de una nested list cambia tu código de lento y estructural a rápido y espacial. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue programando!
12

Árboles filogenéticos en Python

4m 18s

Parsea, manipula y dibuja árboles evolutivos con Bio.Phylo. Cubrimos la lectura de archivos Newick, el recorrido de árboles y el aislamiento de clados específicos.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 12 de 18. Si alguna vez has visto un archivo Newick raw, sabes que es una pesadilla densa y anidada de paréntesis y comas. Escribir tu propio string parser para averiguar qué especie está relacionada con cuál es un suplicio. Lo que necesitas es una forma de cargar ese texto directamente en una estructura de datos que puedas recorrer. Eso es precisamente lo que Bio dot Phylo proporciona para árboles filogenéticos en Python. Bio dot Phylo se encarga de parsear, manipular y dibujar árboles evolutivos. El punto de entrada principal es la función read. Le pasas la ruta del archivo y un format string, como newick o phyloxml. La función read consume ese archivo y devuelve un único objeto Tree. Si tu archivo contiene varios árboles, usas la función parse en su lugar para obtener una secuencia iterable de árboles. Una vez que cargas el archivo, trabajas con dos componentes distintos: el objeto Tree y el objeto Clade. El objeto Tree representa la estructura completa en su conjunto. Contiene metadatos globales, como el nombre del árbol y si está enraizado o no. Pero los datos reales de ramificación no viven directamente en el objeto Tree. Viven en los objetos Clade. Un Clade representa un nodo específico y todos los descendientes que se ramifican de él. El objeto Tree tiene un atributo root, que es simplemente el Clade inicial de toda la jerarquía. Cada rama que sale de ese root es otro Clade, que contiene sus propios sub-clades, cayendo en cascada hasta las puntas. Navegar por esta jerarquía es donde el módulo brilla. No tienes que escribir bucles recursivos a mano. Para buscar en la estructura, llamas al método find clades en tu árbol. Este método busca por todas las ramas anidadas y devuelve un iterable de clades que coinciden con las propiedades que especifiques. Puedes buscar por nombre, por longitud de rama, o incluso mediante una función de evaluación personalizada. Si solo te importan los extremos absolutos de las ramas, que representan las especies vivas actuales, usas el método get terminals. Esto devuelve inmediatamente una lista plana de los leaf clades. También puedes calcular métricas estructurales al instante. Llamar al método total branch length en el árbol suma las longitudes de cada una de las ramas de toda la estructura, dándote la distancia evolutiva total. Imagina un escenario en el que cargas un árbol evolutivo de mamíferos enorme. Quieres aislar solo la rama que contiene a los primates para realizar un análisis localizado. Llamas a find clades y buscas el nombre objetivo Primates. Esto devuelve el objeto Clade específico que representa al ancestro común de todos los primates. Como un Clade contiene naturalmente a todos sus descendientes, ahora tienes un subárbol completo y aislado. Puedes pasar ese Clade de primates a otras funciones de análisis exactamente igual que harías con un árbol completo. A veces solo necesitas echar un vistazo a la estructura para verificar que tu extracción ha funcionado. Bio dot Phylo incluye una función draw ascii. Le pasas tu árbol o tu Clade aislado a esta función, y te imprime una representación en texto plano directamente en tu terminal. No está pensado para publicarlo, pero te da un feedback visual inmediato sobre la topología sin obligarte a configurar librerías de plotting externas. Esta es la clave. Traducir corchetes anidados a objetos nativos significa que la topología se convierte en una API, permitiéndote segmentar historiales evolutivos con llamadas a métodos estándar. Si este episodio te ha resultado útil y quieres apoyar el programa, puedes buscar DevStoriesEU en Patreon. Eso es todo por este episodio. ¡Gracias por escuchar, y a seguir creando!
13

Análisis de motivos de secuencias

4m 30s

Descubre patrones ocultos en el ADN. Descubre cómo crear motivos de secuencias, construir Position-Weight Matrices (PWMs) y escanear secuencias objetivo en busca de sitios de unión de factores de transcripción.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 13 de 18. Si intentas encontrar un sitio de unión de un factor de transcripción usando un string match estricto, te perderás la gran mayoría de las señales biológicas reales. Los sitios de unión del ADN tienen cierta flexibilidad, y las proteínas toleran variaciones en posiciones específicas de la secuencia. Para encontrarlos de forma fiable, tienes que dejar de buscar strings fijos y empezar a buscar perfiles de probabilidad, que es exactamente lo que te permite hacer el análisis de motifs de secuencia. En Biopython, esto lo gestionas con el módulo motifs. Empiezas con un conjunto conocido de secuencias alineadas que representan tu sitio de unión. Vamos a usar la clásica caja TATA como ejemplo. Podrías tener un puñado de secuencias cortas conocidas como T A T A A A, T A T A A T y T A T A A C. Las defines como objetos Seq estándar y las pasas como una única lista a la función create del módulo motifs. Biopython coge esta lista de instancias y las empaqueta en un único objeto motif. El resultado inmediato de crear este objeto motif es una count matrix. En cada posición a lo largo de la longitud de tu secuencia, Biopython contabiliza las apariciones totales de A, C, G y T. Si miras la primera posición de nuestros ejemplos de la caja TATA, el recuento de T es tres, y el recuento de las otras tres letras es cero. Esta matriz es la base literal de todo el análisis posterior, pero los recuentos brutos tienen una limitación matemática severa. Si un nucleótido nunca aparece en una posición determinada en tu pequeña muestra de referencia, su probabilidad se convierte en un cero absoluto. Más tarde, cuando multiplicas las probabilidades para calcular el score de una secuencia, un solo cero anula todo el score. Para solucionar esta vulnerabilidad, conviertes la count matrix en una Position-Weight Matrix, o PWM. Aquí está la clave. Generas la PWM aplicando pseudocounts. Un pseudocount añade una pequeña fracción base a cada posible nucleótido en cada posición. Reconoce matemáticamente que solo porque no hayas visto una citosina en la posición dos todavía, eso no significa que una sustitución ahí sea biológicamente imposible. Al suavizar los ceros, la Position-Weight Matrix convierte tus recuentos brutos en distribuciones de probabilidad robustas. Las probabilidades por sí solas siguen siendo difíciles de usar para escanear secuencias. Necesitas saber si un tramo de ADN hace match con tu motif mejor de lo que lo hace con una secuencia de fondo aleatoria. Esto lo gestionas convirtiendo tu PWM en una Position-Specific Scoring Matrix, o PSSM. La PSSM calcula scores de log-odds basándose en una distribución de nucleótidos de fondo. Compara la probabilidad de que una letra aparezca porque es parte de tu motif frente a la probabilidad de que aparezca por puro azar. Un score positivo significa que la secuencia se parece activamente a tu motif. Un score negativo significa que parece ruido de fondo. Una vez que tienes tu PSSM, puedes buscar sitios de unión no anotados en una secuencia objetivo larga. Llamas al método calculate en la PSSM y le pasas tu secuencia de ADN objetivo. Este método básicamente desliza tu motif por todo el objetivo, calculando el score de cada ventana posible de esa longitud. Devuelve un array de scores numéricos que representan el valor log-odds en cada posición de la secuencia. Iteras sobre estos scores y buscas valores que superen un umbral estricto definido. Si el score es lo suficientemente alto, es probable que hayas encontrado una caja TATA funcional. Un string match estricto exige perfección, pero los sistemas biológicos operan con probabilidad, y pasar de recuentos brutos a scoring matrices captura esa realidad. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue construyendo!
14

Integración de Swiss-Prot y ExPASy

3m 40s

Accede al estándar de oro de las bases de datos de proteínas. Detallamos cómo obtener registros a través de Bio.ExPASy y parsear los densos archivos planos de Swiss-Prot para extraer metadatos de proteínas curados.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 14 de 18. GenBank es genial cuando trabajas con ácidos nucleicos. Pero cuando necesitas datos de una proteína curados por expertos y revisados a mano —como sus sitios activos exactos o por dónde atraviesa una membrana celular— las bases de datos de secuencias estándar se quedan cortas. Necesitas una base de datos de proteínas especializada, y eso nos lleva a la integración de Swiss-Prot y ExPASy. Swiss-Prot es una base de datos de secuencias de proteínas de alta calidad, anotada manualmente. ExPASy es el portal del servidor que te da acceso a ella. Biopython conecta estas dos piezas. Utiliza el módulo ExPASy para descargar los datos de internet, y el módulo SwissProt para parsearlos en un objeto estructurado. Primero, necesitas descargar el raw record de internet. Esto lo haces usando el módulo ExPASy, en concreto una función llamada get_sprot_raw. Le pasas un accession ID de Swiss-Prot. Por ejemplo, si quieres el record de la subunidad alfa de la hemoglobina humana, le pasas su accession ID, que es P69905. Llamar a get_sprot_raw con este ID abre una conexión de red con el servidor y devuelve un handle a los datos de texto raw. Una vez que tienes ese handle de texto raw, se lo pasas al módulo SwissProt. Llamas a la función read y le pasas tu handle. Esto parsea el flat file y devuelve un objeto record de Swiss-Prot. Aquí está la clave. Este objeto record no es solo un string de secuencia. Es un contenedor profundamente estructurado de metadatos de expertos. Como Swiss-Prot está curada manualmente, los campos de este objeto son excepcionalmente ricos. Puedes acceder al atributo organism para confirmar exactamente a qué especie pertenece la proteína. Puedes comprobar el atributo sequence_length para obtener el recuento de aminoácidos al instante, sin necesidad de medir el string de secuencia tú mismo. La parte más valiosa del record es el atributo features. Esta es una lista anidada que contiene los dominios estructurales y funcionales conocidos de la proteína. Cuando iteras por estas features, encontrarás anotaciones específicas. Verás features que detallan las coordenadas exactas de aminoácidos para sitios activos, regiones de unión a metales o dominios transmembrana. En lugar de ejecutar un algoritmo de predicción, estás leyendo coordenadas definitivas y confirmadas en laboratorio directamente de una base de datos curada. En la práctica, el flujo de tu código se ve así. Llamas a la función get_sprot_raw de ExPASy con tu accession ID. Coges el handle resultante y se lo pasas a la función read de SwissProt. Esto te da tu objeto record. A partir de ahí, puedes leer el organism, comprobar el sequence_length, o iterar por la lista de features para extraer los sitios funcionales. Recuerda siempre cerrar el handle de red una vez que hayas terminado de leer los datos para liberar recursos del sistema. Cuando construyes pipelines que dependen de la función biológica en lugar de solo la similitud de secuencias, apuntar a Swiss-Prot garantiza que estás basando tu lógica en datos verificados y curados por humanos. Eso es todo por este episodio. Gracias por escuchar, y ¡sigue programando!
15

Visualización de genomas con GenomeDiagram

4m 05s

Convierte archivos GenBank en bruto en imágenes con calidad de publicación. Aprende cómo GenomeDiagram construye mapas de genomas circulares y lineales superponiendo pistas y flechas de características.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 15 de 18. Cuando envías un artículo que describe un plásmido bacteriano recién secuenciado, los revisores rara vez quieren leer una tabla de coordenadas genéticas en texto plano. Esperan un mapa circular, anotado y coloreado, que muestre claramente la estructura genómica de un vistazo. Visualizar genomas con GenomeDiagram es la forma en que generas esos mapas directamente a partir de tus datos de secuencia. Antes de empezar a dibujar, asegúrate de que la librería externa ReportLab esté instalada. GenomeDiagram depende completamente de ReportLab por debajo para calcular la geometría y renderizar las imágenes finales. Sin ella, la exportación gráfica fallará. La arquitectura de GenomeDiagram es estrictamente jerárquica. Construyes tu visualización anidando objetos de arriba a abajo. En la parte más alta está el objeto Diagram. Este es tu lienzo en blanco. Dentro del Diagram, añades uno o más Tracks. Un Track representa un área de trazado específica. En un mapa lineal, un Track es una fila horizontal. En un mapa circular de plásmidos, un Track es un único anillo concéntrico. Dentro de un Track, añades FeatureSets. Un FeatureSet es una agrupación lógica de datos de secuencia. Puedes usar un FeatureSet para secuencias codificantes y un FeatureSet diferente para regiones reguladoras exactamente en el mismo anillo. Finalmente, dentro de los FeatureSets, colocas las features de secuencia individuales. Aquí está la clave. No tienes que calcular manualmente ángulos ni coordenadas de píxeles para colocar tus genes. GenomeDiagram lee la posición de inicio, la posición de fin y la orientación de la cadena de forma nativa a partir de los objetos feature estándar de Biopython. Para poner esto en práctica, supón que tienes un registro GenBank parseado para un plásmido pequeño. Primero, inicializas un Diagram vacío. Luego, creas un nuevo Track dentro de él, y un nuevo FeatureSet dentro de ese Track. A continuación, iteras sobre las features en tu registro GenBank parseado. Compruebas si el tipo de feature actual es un CDS, es decir, una secuencia codificante. Cuando encuentras un CDS, lo pasas a tu FeatureSet para agregarlo a la visualización. Durante este paso, asignas el estilo visual. Puedes indicarle a la feature que se renderice como una flecha, que apunta automáticamente en sentido horario o antihorario según la cadena del gen. También puedes asignar colores distintos aquí. Un truco común es usar un simple contador de bucle para alternar entre dos colores, de modo que los genes adyacentes no se mezclen visualmente en un solo bloque masivo. Una vez que tu jerarquía está completamente poblada con datos, le indicas al Diagram que se dibuje. Llamas al método draw y estableces el formato en circular. Puedes definir las dimensiones de la página, el color de fondo y el escalado del Track. Después de que el dibujo se construya en memoria, simplemente llamas al método write, pasándole un nombre de archivo que termine en PDF o PNG. ReportLab calcula instantáneamente las longitudes de arco correctas, posiciona las flechas de colores a lo largo del Track circular y exporta un archivo listo para publicar. La principal ventaja de esta estructura por niveles es la reproducibilidad. Dado que las reglas de layout están estrictamente separadas del parseo de tu secuencia en crudo, puedes escribir un script para dar un estilo uniforme a toda una base de datos de plásmidos sin tocar nunca una herramienta de diseño gráfico. Gracias por escucharnos. ¡Hasta la próxima!
16

Genética de poblaciones con Bio.PopGen

4m 13s

Analiza la variación genética entre poblaciones. Este episodio presenta Bio.PopGen para parsear archivos Genepop y extraer fácilmente frecuencias alélicas y métricas de heterocigosidad.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 16 de 18. Tienes datos de genotipos de campo sin procesar y necesitas métricas estadísticas, pero salvar esa distancia significa escribir otro script personalizado para parsear archivos de texto. Convertir esos datos de campo a un formato listo para el análisis es tedioso, a menos que uses un parser diseñado exactamente para el formato estándar de Genepop. Ahí es donde entra en juego la genética de poblaciones con Bio.PopGen. Genepop es un paquete de software y un formato de archivo estándar que se utiliza para calcular métricas como el equilibrio de Hardy-Weinberg, los estadísticos F y el desequilibrio de ligamiento. Su formato de entrada basado en texto, que normalmente se guarda como un archivo punto gen, es rígido. Depende de saltos de línea estrictos, keywords específicas y códigos integer concatenados para los alelos. Escribir tu propia lógica para extraer frecuencias alélicas en múltiples loci y poblaciones es propenso a errores off-by-one. El módulo Bio.PopGen evita esto por completo al leer el formato Genepop directamente en un objeto de Python estructurado. Pongamos un escenario concreto. Estás estudiando dos poblaciones aisladas de peces. Has genotipado cada pez en tres loci de microsatélites. Tus datos brutos están en un archivo punto gen estándar. La parte superior del archivo tiene un título, seguido de los nombres de tus tres marcadores en líneas separadas. A continuación, viene la keyword Pop, que marca el inicio de la primera población de peces. Debajo de eso, cada línea representa un pez, mostrando un identificador seguido de sus alelos en los tres loci. Después del último pez de ese grupo, aparece otra keyword Pop, que marca el inicio de la segunda población. Para procesar esto, importas el módulo GenePop de Bio.PopGen. Abres tu archivo de texto y pasas el file handle abierto a la función GenePop punto read. Esta función procesa el texto y devuelve un único objeto Record. Esta es la parte que importa. El objeto Record refleja la jerarquía biológica de tu estudio. Si revisas el atributo loci list en el Record, te devuelve una secuencia simple que contiene los nombres de tus tres marcadores microsatélite. Esto confirma que el parser leyó correctamente el header. Luego, puedes mirar el atributo populations. Este atributo contiene una lista donde cada elemento representa una población entera de tu archivo. Como tienes dos keywords Pop en tu archivo, esta lista contiene exactamente dos elementos. Si miras de cerca una de esas poblaciones, encuentras una lista de los individuos que contiene. Cada individuo se almacena como un par formado por su identificador de string y una lista de sus genotipos. Para un organismo diploide, un genotipo en un solo locus se parsea como un par de alelos. El archivo de texto de Genepop a menudo almacena estos alelos como un único string combinado de dígitos, como cero uno cero dos. El parser lo divide automáticamente en alelos distintos, representando cero uno y cero dos como entidades separadas. No tienes que escribir lógica de string slicing para separar los alelos maternos y paternos. Con el archivo parseado, tienes acceso inmediato a los nombres de los marcadores, los recuentos de población y los datos de alelos individuales. Puedes iterar a través de las poblaciones para contar frecuencias de alelos específicos, o pasar el objeto Record directamente a las rutinas de Biopython que interactúan con el software Genepop. Puedes lanzar cálculos de heterocigosidad esperada o medir la diferenciación genética entre tus dos grupos aislados. El valor del parser Bio.PopGen no es solo leer un archivo de texto, sino transformar una lista plana de strings en una jerarquía biológica estricta de loci, poblaciones e individuos que exigen los algoritmos estadísticos. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue programando!
17

Rutas bioquímicas con KEGG

4m 38s

Conecta los puntos metabólicos. Aprende a parsear registros de enzimas y rutas de KEGG para rastrear reacciones bioquímicas y estructuras de compuestos químicos.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 17 de 18. Has secuenciado un gen y has encontrado una variante. Conocer la secuencia rara vez es suficiente. Para comprender el daño biológico real, necesitas saber exactamente qué redes metabólicas interrumpe la enzima resultante. Rutas Bioquímicas con KEGG proporciona precisamente ese mapa. La Enciclopedia de Genes y Genomas de Kioto mantiene extensas bases de datos que detallan sistemas biológicos, compuestos y reacciones. Distribuyen estos datos como flat files de texto plano estándar. Estos archivos utilizan una estructura específica donde una keyword se ubica en el margen izquierdo, y los datos asociados en el derecho. El problema es que los valores de los datos, como largas listas de sinónimos o nombres de rutas complejos, a menudo hacen wrap de forma impredecible en varias líneas. Escribir manipulación de strings personalizada para manejar ese wrap es frágil. El módulo Bio dot KEGG existe para manejar las peculiaridades del formato y traducir esos archivos de texto directamente a objetos de Python predecibles. Para extraer datos moleculares básicos, utilizas la función Compound dot parse dentro del módulo KEGG. Le pasas un file handle abierto que apunta a un archivo de texto de compuestos de KEGG. En lugar de cargar un dump masivo de base de datos en memoria de una sola vez, el parser devuelve un iterator. Cada vez que avanzas el iterator, hace yield de un único objeto de Python que representa un compuesto. Desde este objeto, puedes acceder al atributo entry para obtener el identificador único, que normalmente se ve como una C mayúscula seguida de números. Dado que los compuestos suelen tener varios nombres comunes en la literatura, el atributo name devuelve una list de strings que contienen todos los sinónimos reconocidos. También obtienes acceso directo a la estructura molecular exacta a través del atributo formula. Los compuestos son solo los materiales estáticos de tu sistema. Las enzimas son las que realmente impulsan las reacciones. Para analizarlas, cambias a la función Enzyme dot parse, pasándole un flat file de enzimas de KEGG. Al igual que el parser de compuestos, hace yield de objetos discretos uno a uno. Revisas el atributo entry para obtener el número EC estándar, y el atributo name para la designación de la enzima. Esta es la parte que importa. Una enzima no opera en el vacío, y el objeto enzima refleja esto a través de su atributo pathway. El parser lee el bloque de texto multilínea que detalla las interacciones de la enzima y lo estructura en una list limpia. Cada elemento de esa list es una tuple que contiene dos datos. El primer elemento de la tuple es el identificador de la vía metabólica de KEGG, y el segundo es el nombre legible para humanos de esa vía metabólica. Puedes hacer un script de un proceso de mapeo completo en solo unos pocos pasos. Primero, abres tu archivo de datos de enzimas descargado y se lo pasas a la función Enzyme dot parse. Creas un loop para leer los registros devueltos. Cuando encuentras un registro donde el atributo entry coincide con el número EC de tu enzima mutada, extraes su atributo pathway. Luego puedes iterar sobre esa list de tuples, extrayendo los nombres de las vías metabólicas para ver inmediatamente si la mutación afecta a la glucólisis, al ciclo del citrato o a algo completamente distinto. El verdadero poder de los parsers de KEGG no es solo leer texto, sino convertir componentes biológicos aislados en coordenadas de red interconectadas, permitiéndote rastrear una variante genética localizada hasta un fallo metabólico sistémico. Si estos episodios te resultan útiles y quieres apoyar el programa, puedes buscar DevStoriesEU en Patreon. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue construyendo!
18

Análisis de clústeres para la expresión génica

4m 32s

Agrupa los genes por su comportamiento. En este episodio final, cubrimos el módulo Bio.Cluster, aplicando K-means y clustering jerárquico a datos de expresión de microarrays.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Fundamentos de Biopython, episodio 18 de 18. Acabas de realizar un experimento de RNA-seq y ahora te encuentras frente a una matriz de expresión con diez mil filas. Encontrar significado en esos datos raw es imposible hasta que agrupes esos genes en un puñado de respuestas biológicas distintas. Eso es precisamente lo que hace el Cluster Analysis para Gene Expression, utilizando el módulo Bio dot Cluster. Cuando analizas datos de microarray o RNA-seq, estás rastreando la actividad de los genes en diferentes condiciones. Consideremos un escenario concreto. Tienes datos de expresión de mil genes medidos en cuatro time points de heat-shock. Quieres identificar qué genes se comportan de manera similar. Quizás cincuenta de ellos tienen un pico a la hora dos y caen a la hora cuatro. Los genes con patrones de up y down regulation coincidentes a menudo comparten vías biológicas o mecanismos reguladores. Encontrar estos grupos manualmente entre miles de filas es inviable. El módulo Bio dot Cluster contiene un core basado en C diseñado específicamente para procesar este tipo de datos matriciales de manera eficiente. Tu primer paso es importar los datos a Biopython. En lugar de escribir lógica de parsing custom, le pasas tu archivo de texto tab-separated a la función read del módulo. Esto devuelve un objeto Record especializado. Este objeto contiene tu matriz de expresión numérica, pero también guarda los identificadores de tus genes y los nombres de tus condiciones experimentales. Una vez cargados los datos, aplicas un algoritmo de clustering. El enfoque más común es K-means, que ejecutas mediante la función kcluster. K-means divide tus elementos en un número predeterminado de grupos, representados por la variable k. Pasas la matriz de datos y tu valor de k elegido a la función kcluster. Esta función luego devuelve un array que asigna cada gen a un cluster ID específico, junto con un valor de error que mide lo compactos que son esos clusters. Dado que el algoritmo comienza con asignaciones aleatorias, normalmente lo ejecutas varias veces y te quedas con la iteración que da el menor error. Aquí está la clave. El algoritmo agrupa los genes en función de una métrica de distancia, y tienes que elegir esa métrica con cuidado. Si usas la distancia euclidiana estándar, el algoritmo agrupa los genes que tienen niveles de expresión absolutos similares. Pero si quieres agrupar los genes por la forma de su curva de expresión a lo largo del tiempo, independientemente de su baseline inicial, tienes que indicarle a la función kcluster que use una métrica de distancia basada en correlación en su lugar. K-means requiere que adivines el número de clusters de antemano. Si no sabes cuántas respuestas distintas existen en tus datos de heat-shock, puedes usar hierarchical clustering en su lugar, a través de la función treecluster. En lugar de forzar los genes en buckets planos, treecluster crea una jerarquía. Busca los dos genes con los patrones de expresión más idénticos y los enlaza. Luego encuentra el siguiente gen o par más cercano y los enlaza, creando una estructura de árbol ramificada llamada dendrograma. Una vez que el árbol conecta los mil genes, puedes observar la estructura general de los datos y hacer un slice de las ramas al nivel que tenga sentido biológico. Dado que este es el último episodio de nuestra serie Fundamentos de Biopython, te recomiendo encarecidamente abrir la documentación oficial de Biopython y probar estas funciones de clustering con un dataset real. También puedes visitar devstories dot eu para sugerir temas que te gustaría que tratemos en futuras series. El objetivo final de ejecutar estos algoritmos no es solo ordenar números en buckets, sino descubrir la lógica biológica compartida que obliga a esos genes a activarse juntos. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue construyendo!