Retour au catalogue
Season 20 18 Épisodes 1h 3m 2026

Biopython Fundamentals

v1.87 — Édition 2026. Un guide complet en 18 épisodes sur l'utilisation de Biopython (v1.87 - 2026) pour l'analyse de séquences, l'analyse de formats de données biologiques, l'exécution de BLAST, la manipulation de structures 3D, les arbres phylogénétiques, et bien plus encore.

Calcul scientifique Bioinformatique
Biopython Fundamentals
Lecture en cours
Click play to start
0:00
0:00
1
Introduction à Biopython et à l'objet Seq
Découvrez la base de Biopython : l'objet Seq. Nous explorons en quoi les objets de séquence diffèrent des chaînes Python standard et apprenons à effectuer des opérations biologiques telles que le complément inverse et la traduction.
3m 17s
2
Données de séquence riches : l'objet SeqRecord
Apprenez à envelopper des séquences dans des métadonnées riches à l'aide de l'objet SeqRecord. Nous couvrons la façon dont les identifiants, les noms, les descriptions et les annotations de dictionnaire sont stockés aux côtés de la séquence brute.
4m 08s
3
Lecture et écriture de fichiers avec SeqIO
Maîtrisez les conversions de fichiers de séquence et le traitement par lots avec Bio.SeqIO. Cet épisode explique la différence entre la lecture de fichiers à enregistrement unique et l'analyse de jeux de données à enregistrements multiples.
3m 36s
4
Extraction de gènes avec SeqFeature
Plongez dans le monde complexe des caractéristiques de séquence. Nous expliquons comment Biopython représente les coordonnées des gènes, les brins et les emplacements flous à l'aide de l'objet SeqFeature.
3m 03s
5
Alignement de séquences par paires
Apprenez à comparer deux séquences directement à l'aide du module Bio.Align. Nous discutons du PairwiseAligner, du score de substitution et des pénalités de brèche pour les alignements globaux et locaux.
3m 34s
6
Gestion des alignements multiples de séquences
Passez des alignements par paires aux alignements multiples de séquences. Cet épisode couvre l'analyse des fichiers d'alignement avec AlignIO et le traitement des alignements comme des tableaux 2D pour extraire des colonnes spécifiques.
3m 25s
7
Interrogation programmatique des bases de données NCBI
Automatisez vos recherches de littérature et de séquences. Découvrez comment interroger les bases de données NCBI à l'aide d'Entrez.esearch et récupérer des identifiants exacts sans utiliser de navigateur web.
3m 35s
8
Exécution de BLAST sur Internet
Déclenchez des recherches BLAST à distance directement depuis Python. Apprenez à utiliser qblast pour envoyer des séquences aux serveurs NCBI et sauvegarder en toute sécurité les résultats XML bruts.
3m 42s
9
Analyse native : décryptage du XML de BLAST
Donnez un sens aux sorties complexes de BLAST. Cet épisode explique comment analyser les fichiers XML de BLAST en objets Python natifs pour extraire les alignements, les paires de segments à score élevé (HSPs) et les E-values.
3m 43s
10
Navigation dans les structures 3D avec Bio.PDB
Passez à la troisième dimension. Nous explorons le module PDB, l'analyse des structures macromoléculaires et la compréhension de l'architecture Structure-Model-Chain-Residue-Atom (SMCRA).
3m 19s
11
Mesure de la géométrie des protéines
Calculez les relations spatiales dans les protéines. Cet épisode couvre le calcul des distances interatomiques et l'utilisation de NeighborSearch pour trouver des atomes dans un rayon spécifique.
4m 08s
12
Arbres phylogénétiques en Python
Analysez, manipulez et dessinez des arbres évolutifs avec Bio.Phylo. Nous couvrons la lecture des fichiers Newick, le parcours des arbres et l'isolement de clades spécifiques.
3m 23s
13
Analyse des motifs de séquence
Découvrez les modèles cachés dans l'ADN. Découvrez comment créer des motifs de séquence, construire des Position-Weight Matrices (PWMs) et scanner des séquences cibles pour trouver des sites de liaison de facteurs de transcription.
3m 38s
14
Intégration de Swiss-Prot et ExPASy
Accédez à la référence des bases de données de protéines. Nous détaillons comment récupérer des enregistrements via Bio.ExPASy et analyser les fichiers plats denses de Swiss-Prot pour extraire des métadonnées protéiques organisées.
3m 23s
15
Visualisation de génomes avec GenomeDiagram
Transformez des fichiers GenBank bruts en images de qualité publication. Apprenez comment GenomeDiagram construit des cartes de génomes circulaires et linéaires en superposant des pistes et des flèches de caractéristiques.
3m 18s
16
Génétique des populations avec Bio.PopGen
Analysez la variation génétique à travers les populations. Cet épisode présente Bio.PopGen pour analyser les fichiers Genepop et extraire facilement les fréquences alléliques et les métriques d'hétérozygotie.
3m 36s
17
Voies biochimiques avec KEGG
Reliez les points métaboliques. Apprenez à analyser les enregistrements d'enzymes et de voies KEGG pour tracer les réactions biochimiques et les structures de composés chimiques.
3m 40s
18
Analyse de clusters pour l'expression génique
Regroupez les gènes selon leur comportement. Dans ce dernier épisode, nous couvrons le module Bio.Cluster, en appliquant le K-means et le clustering hiérarchique aux données d'expression de puces à ADN.
3m 31s

Épisodes

1

Introduction à Biopython et à l'objet Seq

3m 17s

Découvrez la base de Biopython : l'objet Seq. Nous explorons en quoi les objets de séquence diffèrent des chaînes Python standard et apprenons à effectuer des opérations biologiques telles que le complément inverse et la traduction.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 1 sur 18. Traiter une séquence d'ADN comme une simple string de texte fonctionne bien jusqu'à ce que tu aies besoin de son brin opposé. La simple manipulation de strings en Python tombe à l'eau quand tu réalises que la transcription biologique ne consiste pas juste à remplacer des lettres, mais implique une directionnalité et des codes génétiques distincts. C'est exactement pour ça qu'on fait cette Introduction à Biopython et à l'objet Seq. À la base, une séquence biologique est une string de lettres qui représente des molécules comme l'ADN, l'ARN ou les protéines. Dans Biopython, la structure de données centrale, c'est l'objet Seq. Il encapsule le comportement standard d'une string Python, mais attache une conscience biologique directement aux données. Comme il se comporte comme une string normale, tu peux faire tout ce que tu fais d'habitude avec du texte. Tu peux vérifier la longueur d'une séquence. Tu peux compter combien de fois un pattern spécifique apparaît. Tu peux la slice pour extraire un morceau plus petit. Quand tu slice un objet Seq, le résultat n'est pas une string de texte standard. C'est un nouvel objet Seq. Ça t'assure de ne jamais perdre accidentellement les méthodes biologiques quand tu parse une séquence en fragments plus petits. C'est ça qui est important. Les strings standards ne comprennent pas la biologie. L'ADN est double brin, et les séquences sont lues dans une direction spécifique. Si tu as une séquence d'ADN codant et que tu as besoin du brin opposé, une simple inversion de texte est biologiquement incorrecte. Tu dois inverser l'ordre des lettres et échanger chaque base avec sa paire structurelle. L'objet Seq gère ça avec une seule méthode reverse complement, qui te renvoie un brin opposé biologiquement exact. Au-delà de la structure, l'objet Seq gère directement le dogme central de la biologie moléculaire. Prends une courte séquence d'ADN codant. Pour la convertir en ARN messager, tu appelles la méthode transcribe sur ta séquence. Sous le capot, ça gère les substitutions de lettres spécifiques, en remplaçant la thymine par l'uracile, et ça te renvoie une séquence d'ARN. Si tu pars de l'ARN et que tu as besoin de l'équivalent ADN, une méthode back transcribe inverse ce processus. Une fois que ta séquence est prête, tu veux généralement la protéine qui en résulte. Tu appelles la méthode translate. Ça regroupe automatiquement les lettres de la séquence en triplets, ça les évalue comme des codons, et ça renvoie un nouvel objet Seq contenant la séquence d'acides aminés. La biologie est rarement uniforme, et le code génétique standard ne s'applique pas partout. Des organismes comme certaines bactéries, ou des organites comme les mitochondries de vertébrés, lisent les codons différemment. La méthode translate prend ça en compte grâce à des tables de traduction. Au lieu d'écrire une logique custom pour une séquence mitochondriale, tu passes simplement l'argument translation table à la méthode. Tu peux fournir le numéro de table officiel du NCBI, comme la table deux pour les mitochondries de vertébrés, ou le nom de la table sous forme de texte. L'objet Seq recalcule les acides aminés en utilisant les règles spécifiques de cet organisme. La vraie puissance de l'objet Seq, c'est qu'il t'évite d'écrire des fonctions de text parsing fragiles et sujettes aux erreurs pour des processus biologiques établis. Si tu veux soutenir l'émission, tu peux chercher DevStoriesEU sur Patreon. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à développer !
2

Données de séquence riches : l'objet SeqRecord

4m 08s

Apprenez à envelopper des séquences dans des métadonnées riches à l'aide de l'objet SeqRecord. Nous couvrons la façon dont les identifiants, les noms, les descriptions et les annotations de dictionnaire sont stockés aux côtés de la séquence brute.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Les fondamentaux de Biopython, épisode 2 sur 18. Une string de dix mille lettres d'ADN est techniquement une séquence, mais analytiquement, ça ne sert à rien. Sans connaître l'espèce d'origine, le type de molécule ou la qualité de lecture, tu as juste du texte brut. Lier ces métadonnées cruciales à la séquence brute, c'est le rôle des données de séquence enrichies : l'objet SeqRecord. Le SeqRecord est un conteneur. Il prend une séquence de base et l'encapsule avec les identifiants et les infos descriptives nécessaires pour vraiment l'utiliser dans un pipeline de bioinformatique. Chaque SeqRecord repose sur quelques attributs de base. Le premier, c'est point seq, qui contient les données de la séquence elle-même. Autour de ça, on trouve trois attributs de type string standards. Point id contient l'identifiant principal, généralement un numéro d'accès d'une base de données publique. Point name contient un nom commun plus court ou un identifiant de clone. Point description contient du texte lisible par un humain qui explique ce que la séquence représente vraiment. Parfois, trois attributs de type string ne suffisent pas. Quand tu as besoin de stocker des métadonnées complexes ou personnalisées, tu utilises l'attribut point annotations. C'est un dictionnaire Python standard. Il gère les métadonnées au niveau du record. Tu peux y stocker n'importe quoi. Si tu veux garder une trace de la façon dont une séquence a été vérifiée, tu ajoutes simplement une nouvelle clé appelée evidence au dictionnaire, et tu définis sa valeur sur experimental. Voici le point essentiel. Les métadonnées ne s'appliquent pas toutes à la séquence dans son ensemble. Parfois, tu as besoin d'assigner des données à chaque lettre individuelle. C'est à ça que sert point letter annotations. C'est un autre dictionnaire, mais il a une règle stricte. Toute liste, array ou string que tu assignes comme valeur dans ce dictionnaire doit faire exactement la même longueur que la séquence elle-même. Le cas d'usage classique, c'est de stocker les scores de qualité Phred d'une machine de séquençage. Si ta séquence d'ADN factice fait exactement vingt lettres de long, tu peux assigner une liste de vingt entiers au dictionnaire point letter annotations sous la clé phred quality. Si tu essaies d'en assigner dix-neuf ou vingt-et-un, Biopython va immédiatement lever une erreur. Tu peux facilement construire un SeqRecord from scratch. D'abord, tu définis un objet séquence. Ensuite, tu passes cette séquence au constructeur SeqRecord. Tu peux passer l'identifiant, le nom et la description directement ici comme arguments. Une fois que l'objet existe, tu peux accéder à ses dictionnaires pour injecter manuellement tes strings evidence personnalisées ou tes listes de scores de qualité par lettre. En pratique, tu les construis rarement entièrement à la main. Tu les obtiens généralement en parsant des fichiers, et Biopython gère les différents formats de fichiers en mappant les données aux attributs du SeqRecord de manières spécifiques. Prends l'exemple d'un fichier FASTA standard. FASTA est un format très basique. Quand Biopython le lit, il récupère le premier mot après le symbole supérieur à sur la ligne d'en-tête et l'assigne à l'attribut point id. L'attribut point name reçoit simplement exactement la même valeur que l'identifiant. Le reste de la ligne d'en-tête est déversé directement dans l'attribut point description. Comme FASTA n'a pas de métadonnées structurées, le dictionnaire point annotations reste complètement vide. Les fichiers GenBank offrent un contraste saisissant. Ils contiennent des données riches et structurées. Lors du parsing de GenBank, Biopython assigne le locus et le numéro de version à point id. Le nom du locus va dans l'attribut point name. La ligne de définition est mappée vers point description. Fait crucial, Biopython remplit activement le dictionnaire point annotations. Il extrait les détails de la taxonomie, le type de molécule, la division du fichier de données et la liste des références publiées, en les plaçant tous proprement dans le dictionnaire sous des clés standardisées. La séquence t'indique le code biologique sous-jacent, mais c'est l'objet SeqRecord qui donne finalement son contexte à ce code. Merci d'avoir passé quelques minutes avec moi. À la prochaine, porte-toi bien.
3

Lecture et écriture de fichiers avec SeqIO

3m 36s

Maîtrisez les conversions de fichiers de séquence et le traitement par lots avec Bio.SeqIO. Cet épisode explique la différence entre la lecture de fichiers à enregistrement unique et l'analyse de jeux de données à enregistrements multiples.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Principes fondamentaux de Biopython, épisode 3 sur 18. Ton pipeline bioinformatique plante au beau milieu d'un run. Tu checkes les logs et tu réalises qu'un script en aval attendait un fichier FASTA, mais que l'outil en amont lui a passé un fichier GenBank. Tu dois maintenant réécrire un parser de zéro juste pour extraire les données de séquence. Ou alors, tu pourrais utiliser Bio dot SeqIO. SeqIO est le module Biopython standard pour l'input et l'output de séquences. Il gère le parsing de divers formats de fichiers biologiques pour que tu n'aies pas à écrire des expressions régulières custom ou des fonctions de manipulation de strings. Tu fournis le chemin du fichier et le format string, et SeqIO gère la structure du fichier sous-jacent. Quand tu lis des fichiers, SeqIO te donne deux fonctions distinctes, et se tromper de fonction est une source fréquente de bugs. La première, c'est read. Tu utilises la fonction read quand tu es absolument certain que ton fichier contient exactement un sequence record. Tu lui passes le chemin du fichier et le format, comme fasta, et elle te retourne un seul objet sequence record. Si le fichier est vide, ou s'il contient deux records ou plus, la fonction read va immédiatement lever une exception et stopper ton script. C'est strictement pour du mapping un-à-un. Le plus souvent, tu gères des fichiers qui contiennent plein de séquences. Pour ça, tu utilises la fonction parse. Contrairement à read, parse ne charge pas tout en mémoire d'un coup. À la place, elle retourne un itérateur. C'est ça qui est important. Un itérateur yield un sequence record à la fois, ce qui garde ton empreinte mémoire basse même si tu traites des datasets génomiques massifs de plusieurs gigaoctets. Prenons un scénario spécifique. Tu as un fichier GenBank contenant des données pour plusieurs espèces d'orchidées. Tu veux extraire ces records, mais tu ne t'intéresses qu'aux séquences qui font plus de cent paires de bases. En plus, l'outil suivant dans ton pipeline a besoin du format FASTA, pas de GenBank. Tu peux gérer la lecture, le filtrage et la conversion de format de manière séquentielle. D'abord, tu crées une liste vide pour stocker tes séquences filtrées. Ensuite, tu mets en place une boucle en utilisant la fonction parse, en la pointant vers ton fichier GenBank d'orchidées et en spécifiant genbank comme input format string. À l'intérieur de la boucle, la fonction parse te passe un objet sequence record à chaque passage. Tu vérifies la longueur de la séquence attachée à ce record. Si la longueur est supérieure à cent, tu append le record à ta liste. Si elle est plus courte, tu l'ignores simplement et tu passes à l'itération suivante. Maintenant, tu as une liste de records valides et filtrés en mémoire. Pour les sauvegarder, tu utilises la fonction write. La fonction write a besoin de trois paramètres : la séquence de records que tu veux sauvegarder, le output file path, et le output format string. Tu lui passes ta liste de records d'orchidées filtrés, tu spécifies un nouveau nom de fichier, et tu fournis fasta comme format string. C'est tout ce qu'il faut. SeqIO extrait automatiquement les identifiants et les séquences pertinents de tes records GenBank et les formate correctement en texte FASTA. Tu n'as pas besoin de construire manuellement les lignes de header ou de formater les blocs de séquence. En associant parse avec write, tu traduis entre les formats de fichiers sans effort. Le point à retenir le plus utile ici, c'est que SeqIO agit comme un pont standardisé. En forçant tous les formats de fichiers dans une structure de sequence record universelle pendant l'étape de parse, il découple complètement le format que tu lis du format que tu finis par écrire. C'est tout pour cette fois. Merci d'avoir écouté, et continue de coder !
4

Extraction de gènes avec SeqFeature

3m 03s

Plongez dans le monde complexe des caractéristiques de séquence. Nous expliquons comment Biopython représente les coordonnées des gènes, les brins et les emplacements flous à l'aide de l'objet SeqFeature.

Télécharger
Bonjour, ici Alex de DEV STORIES DOT EU. Les fondamentaux de Biopython, épisode 4 sur 18. Tu fais un slice manuel sur une string de séquence pour extraire un gène sur le brin inverse. Tu calcules les coordonnées, tu inverses la string, tu complémentes les bases et tu lances ton script. La moitié du temps, tu te retrouves avec une erreur off-by-one ou des données qui ne veulent rien dire. Essayer de faire ces calculs de séquence à la main est un piège classique. À la place, tu devrais laisser le parser faire le travail en extrayant les gènes avec SeqFeature. Un objet SeqFeature décrit une région ou un point de repère spécifique sur une séquence parente. Quand tu parses un format de fichier riche, Biopython remplit ton record de séquence avec une liste de ces objets feature. Chaque feature possède trois attributs principaux que tu vas utiliser constamment. Le premier est l'attribut type. C'est tout simplement une string qui te dit ce que la feature représente, comme gène, CDS ou ARNm. Le deuxième est l'attribut qualifiers. C'est un dictionary qui contient toutes les métadonnées attachées à cette feature spécifique. Si tu as besoin du nom du gène, du locus tag ou d'une note sur le produit de traduction, tu le récupères dans le dictionary qualifiers. Troisièmement, et c'est le plus important, l'attribut location. C'est lui qui dicte exactement où la feature se trouve mathématiquement sur la séquence parente. Il se présente sous deux formes principales. Un SimpleLocation gère des segments de séquence continus et ininterrompus. Il contient une position de début exacte, une position de fin exacte et le brin. Le brin est représenté par un integer. C'est 1 pour le brin direct, et -1 pour le brin inverse. La biologie refuse souvent d'être simple. Chez les eucaryotes, les gènes épissés sont fragmentés en plusieurs exons à travers le génome. Pour gérer ça, l'attribut location sera plutôt un CompoundLocation. Un CompoundLocation est essentiellement une collection de SimpleLocations joints ensemble. Il regroupe les coordonnées de ces exons fragmentés et les traite comme une seule unité logique. Voici le point clé. Tu n'as pas besoin de regarder ces coordonnées de location et d'écrire ta propre notation de slice Python pour extraire les données de séquence du record parent. Tu utilises la méthode extract attachée à la feature elle-même. Pour l'utiliser, tu prends ton objet SeqFeature, tu appelles la méthode extract, et tu passes la séquence parente complète en argument. La feature regarde ses propres données de location et fait le gros du travail pour toi. Si la feature est un SimpleLocation sur le brin direct, elle slice la séquence exactement comme tu t'y attends. Si la feature est sur le brin inverse, extract gère automatiquement le slice, génère le reverse complement de cette séquence, et renvoie le résultat biologiquement précis. Tu n'as pas besoin d'inverser les strings ou de te rappeler de complémenter les bases. Elle fait encore plus de travail pour toi quand tu as affaire à un CompoundLocation. Si tu appelles extract sur un gène épissé, Biopython va sur la séquence parente, extrait chaque exon individuellement en se basant sur leurs SimpleLocations respectifs, fait automatiquement un reverse complement si le gène est sur le brin inverse, et les assemble tous ensemble dans le bon ordre. Elle te renvoie un morceau de séquence continu et propre, prêt pour la traduction ou l'analyse en aval. S'appuyer sur la méthode extract élimine les calculs d'index manuels qui causent des erreurs de données silencieuses dans les pipelines bioinformatiques. Je voudrais prendre un moment pour te remercier de ton écoute, ça nous aide beaucoup. Passe une excellente journée !
5

Alignement de séquences par paires

3m 34s

Apprenez à comparer deux séquences directement à l'aide du module Bio.Align. Nous discutons du PairwiseAligner, du score de substitution et des pénalités de brèche pour les alignements globaux et locaux.

Télécharger
Bonjour, c'est Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 5 sur 18. Les algorithmes d'alignement par programmation dynamique classiques sont réputés pour leur lenteur quand ils sont écrits en pur Python. Si tu essaies de traiter des milliers de paires de séquences, ton script va bloquer pendant des heures. Biopython résout ce problème en passant au C pour le gros du travail, ce qui te donne des performances de l'ordre de la milliseconde. Cet épisode parle du Pairwise Sequence Alignment en utilisant l'objet PairwiseAligner. Pour comparer exactement deux séquences, tu instancies un PairwiseAligner. Cet objet unique sert de moteur de configuration pour tout le processus. Par défaut, il fait un alignement global, ce qui veut dire qu'il force un match de bout en bout entre les deux séquences. Si tu veux juste trouver la meilleure sous-séquence qui matche, cachée quelque part dans une string plus longue, tu changes l'attribut mode de l'aligner de global à local. L'aligner a besoin de règles pour décider ce qui constitue un bon match. Tu définis ces règles directement comme attributs sur l'objet aligner. Tu assignes un nombre positif à l'attribut match score, et un nombre négatif à l'attribut mismatch score. Mais les séquences biologiques mutent aussi en insérant ou en supprimant des blocs entiers de lettres, ce qui crée des gaps dans l'alignement. Voici l'idée clé. La biologie préfère largement une seule longue délétion plutôt que plusieurs petites délétions dispersées. Pour modéliser cette réalité physique, tu configures deux pénalités de gap séparées. Tu assignes une grande valeur négative au open gap score pour pénaliser la création d'un nouveau gap. Ensuite, tu assignes une valeur négative beaucoup plus petite au extend gap score. Ce déséquilibre mathématique force l'aligner à regrouper les gaps ensemble dès que possible. Une fois ton aligner configuré, tu appelles sa méthode align et tu lui passes tes deux séquences. La méthode ne renvoie pas juste une seule string ou un nombre final. Elle renvoie un itérateur d'objets d'alignement. Plusieurs chemins à travers une matrice de programmation dynamique peuvent donner exactement le même score maximum. L'aligner te donne accès à tous ces alignements mathématiquement optimaux. Comme il renvoie un itérateur, il s'évalue de façon lazy. Il calcule le prochain chemin optimal uniquement quand tu le demandes, ce qui protège ton système des surcharges mémoire si des séquences très répétitives génèrent des milliers d'alignements tout aussi valides. Prenons un exemple concret avec deux courtes séquences d'ADN. La séquence un est A C C G T. La séquence deux est A C G, ce qui veut dire qu'il lui manque le deuxième C et le T final. D'abord, tu crées l'objet aligner. Tu règles le match score sur deux, et le mismatch score sur moins un. Tu règles le open gap score sur moins cinq, et le extend gap score sur moins un. Ensuite, tu passes les deux séquences à la méthode align. Quand tu boucles sur l'itérateur renvoyé et que tu fais un print des résultats, Biopython formate automatiquement l'output. Il empile visuellement les séquences, en traçant des lignes verticales entre les bases qui matchent et des tirets là où une lettre manque. Tu verras exactement comment l'aligner a placé les caractères de gap dans la deuxième séquence pour aligner les lettres qui matchent, en maximisant le score total basé sur la sévère pénalité de open gap que tu as définie. N'oublie pas que configurer un aligner, c'est essentiellement ajuster un modèle mathématique ; l'output n'a de sens biologique que si tes scores de match, de mismatch et de gap reflètent fidèlement la relation évolutive spécifique entre tes séquences en input. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à développer !
6

Gestion des alignements multiples de séquences

3m 25s

Passez des alignements par paires aux alignements multiples de séquences. Cet épisode couvre l'analyse des fichiers d'alignement avec AlignIO et le traitement des alignements comme des tableaux 2D pour extraire des colonnes spécifiques.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 6 sur 18. Tu ouvres un fichier d'alignement dans un éditeur de texte et il a l'air parfaitement structuré, comme une simple grille. Mais essaie de parser juste la troisième position sur cinquante espèces différentes, et d'un coup tu te retrouves à écrire des boucles imbriquées et à gérer des index de strings. Gérer les alignements de séquences multiples n'a pas à être aussi frustrant. Pour importer un alignement dans ton code, tu utilises le module Bio AlignIO. En partant du principe que ton fichier d'alignement est déjà généré, tu utilises la fonction read. Tu passes à cette fonction le chemin du fichier et une string qui indique le format, comme phylip ou stockholm. La fonction read traite le fichier texte et te renvoie un objet MultipleSeqAlignment. Voici l'astuce. L'objet MultipleSeqAlignment se comporte exactement comme un array en deux dimensions. Si tu as déjà bossé avec une matrice NumPy, la logique est identique. Les lignes de cette grille sont tes séquences individuelles, qui représentent généralement différents organismes ou gènes. Les colonnes sont les positions spécifiques des nucléotides ou des acides aminés alignés sur toutes ces séquences. Vu qu'il agit comme un array 2D, tu utilises la syntaxe de slicing standard de Python pour manipuler les deux dimensions en même temps. Si tu as juste besoin de récupérer une séquence spécifique, tu slices les lignes. Accéder à l'index zéro de ton alignement te renvoie la toute première séquence du fichier. Cette ligne est renvoyée sous la forme d'un objet SeqRecord standard, avec l'ID de la séquence, la description et les données de la séquence biologique elles-mêmes. Tu peux aussi boucler directement sur l'objet d'alignement, et il te donnera chaque SeqRecord ligne par ligne. Voilà pour les séquences. Passons maintenant aux colonnes, c'est là que la logique 2D te fait vraiment gagner du temps. Supposons que tu aies chargé un alignement Stockholm et que tu veuilles isoler une région de début hautement conservée. Tu ne t'intéresses qu'aux dix premières positions sur absolument toutes les espèces. Au lieu d'itérer sur cinquante séquences et de slicer cinquante strings individuelles, tu appliques un slice 2D directement sur l'objet d'alignement. Tu demandes toutes les lignes en utilisant un simple deux-points pour la première dimension, suivi d'une virgule, puis le slice zéro à dix pour la deuxième dimension. La syntaxe est simplement crochet ouvrant, deux-points, virgule, deux-points dix, crochet fermant. Cette seule opération te renvoie un tout nouvel objet MultipleSeqAlignment qui contient uniquement ces dix premières colonnes pour chaque séquence. Tous les ID de séquence et les métadonnées d'origine sont automatiquement conservés dans la nouvelle grille plus petite. Il y a une légère différence de comportement selon la largeur de ton slice. Quand tu slices une plage de colonnes, Biopython maintient la structure de la grille et renvoie un objet d'alignement. Mais si tu extrais exactement une seule colonne, disons toutes les lignes à l'index de colonne cinq, l'objet renvoie une simple string en texte brut contenant juste ces caractères de haut en bas. Cette string rend le calcul des scores de conservation ou l'identification des polymorphismes d'un seul nucléotide à un site spécifique super facile, sans avoir à unpack d'objets. Tu peux combiner ces slices de lignes et de colonnes pour extraire n'importe quel sous-bloc dont tu as besoin. Tu pourrais demander les lignes deux à cinq, et les colonnes cinquante à soixante, pour isoler un domaine spécifique sur un sous-ensemble d'espèces. Traite tes alignements comme des matrices, laisse l'objet MultipleSeqAlignment gérer le suivi des strings, et ton code d'extraction de données va se réduire à presque rien. C'est tout pour cet épisode. À la prochaine !
7

Interrogation programmatique des bases de données NCBI

3m 35s

Automatisez vos recherches de littérature et de séquences. Découvrez comment interroger les bases de données NCBI à l'aide d'Entrez.esearch et récupérer des identifiants exacts sans utiliser de navigateur web.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 7 sur 18. Tu dois télécharger dix mille enregistrements de séquences. Si tu écris un web scraper standard pour requêter le site du NCBI, ton adresse IP sera bloquée avant même que tu finisses les cent premières. Le National Center for Biotechnology Information interdit formellement le scraping automatisé. Pour extraire des données légalement et de manière fiable, tu dois requêter les databases du NCBI de façon programmatique en utilisant Bio point Entrez. Avant de faire des requêtes réseau, tu dois suivre les guidelines de l'API du NCBI. D'abord, tu dois leur dire qui tu es. Tu fais ça en configurant la variable Entrez point email avec ta vraie adresse e-mail. Si ton script devient incontrôlable et surcharge leurs serveurs, ils utiliseront cet e-mail pour te contacter avant de couper définitivement ton accès. Deuxièmement, tu dois respecter leurs rate limits. Le NCBI limite les utilisateurs non authentifiés à trois requêtes par seconde. Biopython gère ça automatiquement en forçant un délai en background. Cependant, si tu essaies de lancer plusieurs scripts en parallèle pour contourner ce délai, le NCBI détectera l'abus et bannira ton IP. Respecte les règles. Le workflow pour extraire des données depuis Entrez nécessite généralement un processus en deux étapes : trouver les identifiants uniques, puis télécharger les fichiers réels. Tu commences par chercher avec la fonction Entrez point esearch. Supposons que tu veuilles trouver le gène matK chez les orchidées. Tu appelles esearch et tu lui passes le nom de la database, qui est nucleotide, avec ton terme de recherche, comme orchid organism AND matK gene. Cette fonction de recherche ne retourne pas de données de séquences biologiques. Elle retourne une réponse HTTP qui agit comme un fichier texte ouvert contenant un document XML. Voici le point clé. Tu n'as pas besoin d'écrire un parser XML custom ou d'extraire les strings manuellement. Tu prends ce file handle réseau et tu le passes directement à la fonction Entrez point read. Ça parse le XML et le traduit en un dictionnaire Python standard. À l'intérieur de ce dictionnaire, tu cherches simplement la clé appelée IdList. Ça te donne une liste Python contenant les identifiants GenBank exacts qui correspondent à ta requête sur les orchidées. Une fois que tu as cette liste d'identifiants, tu passes à la deuxième étape : télécharger les records complets. Pour ça, tu utilises la fonction Entrez point efetch. Tu lui passes le même nom de database nucleotide, avec un identifiant de tes résultats de recherche. Tu dois aussi spécifier le format des données que tu veux récupérer. Pour obtenir un fichier texte GenBank standard, tu définis l'argument retrieval type sur gb et l'argument retrieval mode sur text. Tout comme la fonction de recherche, efetch retourne un stream réseau, et pas une raw string. Parce que ce stream imite un fichier local, tu n'as pas besoin de sauvegarder les données téléchargées sur ton disque dur en premier. Tu peux passer le handle réseau directement à SeqIO point read, spécifier que le format est genbank, et il parse immédiatement le stream en un objet SeqRecord de Biopython. Tu as maintenant la séquence et toutes ses annotations biologiques chargées en mémoire. Quand tu as fini, ferme le handle pour libérer les ressources réseau. L'habitude la plus importante quand tu requêtes le NCBI, c'est de traiter tes réponses d'API comme des file streams plutôt que comme des text strings. Passer ces streams directement dans Entrez point read ou SeqIO point read évite un memory overhead inutile et garde tes pipelines d'automatisation parfaitement propres. Si tu trouves ces épisodes utiles, tu peux soutenir l'émission en cherchant DevStoriesEU sur Patreon. Merci d'avoir écouté, et happy coding tout le monde !
8

Exécution de BLAST sur Internet

3m 42s

Déclenchez des recherches BLAST à distance directement depuis Python. Apprenez à utiliser qblast pour envoyer des séquences aux serveurs NCBI et sauvegarder en toute sécurité les résultats XML bruts.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 8 sur 18. Regarder une page web s'auto-refresh pendant qu'une séquence s'aligne sur une base de données globale est une très mauvaise façon de passer ton après-midi. Automatiser cette recherche en background te permet de faire un truc utile pendant que Python attend. Aujourd'hui, nous allons voir comment exécuter BLAST sur Internet avec Biopython. La fonction dont tu as besoin s'appelle qblast, située dans le module Bio dot Blast dot NCBIWWW. Elle agit comme un wrapper autour de l'API BLAST du NCBI, te permettant de soumettre des queries directement depuis ton script exactement comme tu le ferais via leur portail web. Pour déclencher une recherche, qblast requiert trois arguments obligatoires. Le premier est le programme BLAST que tu veux exécuter. Par exemple, si tu compares une séquence nucléotidique à une base de données de nucléotides, tu passes la string blastn. Si tu travailles avec des protéines, tu passes blastp. Le deuxième argument est la base de données spécifique dans laquelle tu fais ta recherche. Le choix le plus courant pour les nucléotides est la string nt, qui correspond à la base de données de nucléotides non redondante. Si tu cherchais des protéines, tu utiliserais nr. Le troisième argument est la query de la séquence elle-même. Biopython rend cet input très flexible. Tu peux fournir une simple string de la séquence brute, une string multiligne formatée comme un record FASTA, un objet SeqRecord de Biopython, ou un identifiant de séquence exact comme un numéro d'accession NCBI. Si tu veux lancer une recherche basique, tu appelles qblast, tu lui donnes blastn comme programme, nt comme base de données, et ta string FASTA comme query. Python va mettre l'exécution en pause ici pendant qu'il négocie avec les serveurs du NCBI, en attendant le temps qu'il faudra pour que l'alignement distant se termine. Quand le serveur distant a terminé le job, qblast retourne un objet file-like contenant tes résultats. Sous le capot, la fonction demande ces résultats au format XML par défaut. Tu dois t'assurer que ça reste comme ça, car XML est le format standard sur lequel Biopython s'appuie pour le processing en aval. Voici le point clé. Ne passe pas immédiatement ce web handle retourné à une fonction de parsing. Lancer une recherche BLAST distante coûte cher en ressources de calcul pour les serveurs du NCBI et prend beaucoup de temps pour toi. Si tu parses le stream de données en direct directement depuis le web handle et que ton script rencontre une erreur quelques lignes plus bas, ces données de séquence sont perdues de la mémoire. Pour corriger ton code et réessayer, tu devrais exécuter exactement la même recherche distante depuis le début, en gaspillant leur bande passante et ton temps. Le bon workflow est de sauvegarder de façon permanente l'output brut immédiatement. Au moment où qblast retourne le web handle, utilise les opérations de fichiers standard de Python pour ouvrir un nouveau fichier local en mode write. Lis tout le contenu du web handle, écris-le directement dans ton nouveau fichier XML local, puis ferme le web handle. Tu as maintenant une copie statique et sûre de ta recherche BLAST stockée sur ton disque dur. Tu peux ouvrir ce fichier XML local demain, la semaine prochaine, ou cinquante fois de suite pendant le debugging de ton application, sans jamais ping l'API du NCBI une seconde fois. Découple toujours ta récupération réseau de ton data processing en écrivant d'abord les réponses web sur le disque. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
9

Analyse native : décryptage du XML de BLAST

3m 43s

Donnez un sens aux sorties complexes de BLAST. Cet épisode explique comment analyser les fichiers XML de BLAST en objets Python natifs pour extraire les alignements, les paires de segments à score élevé (HSPs) et les E-values.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Fondamentaux de Biopython, épisode 9 sur 18. Écrire des expressions régulières pour scraper des fichiers d'output en plain-text est un rite de passage en bioinformatique. C'est aussi un anti-pattern. Dès qu'un outil de recherche met à jour son formatage visuel, ton script plante. Pour avoir des garanties structurelles, tu dois t'appuyer sur des données structurées. Cet épisode parle de parser nativement : unpacker le XML BLAST. Biopython gère ça en utilisant le module NCBIXML dans le package Bio dot Blast. Au lieu de sauvegarder tes résultats de recherche sous forme de bloc de texte lisible par un humain, tu les sauvegardes dans un fichier XML. Quand tu ouvres ce fichier et que tu passes le handle à la fonction parse du module NCBIXML, ça ne charge pas un énorme blob de texte en mémoire. À la place, ça retourne un itérateur. Cet itérateur yield des objets structurés un par un, ce qui garde ton empreinte mémoire très basse même si ta recherche a retourné des quantités massives de données. Pour utiliser ça efficacement, tu dois comprendre la hiérarchie à trois niveaux que Biopython utilise pour modéliser les résultats. Le niveau supérieur, c'est le BLAST Record. Un record correspond à exactement une séquence que tu as soumise comme query. Si tu as soumis une seule séquence, l'itérateur yield un record. Si tu as soumis cinquante séquences, il yield cinquante records. À l'intérieur de chaque BLAST Record, tu vas trouver une liste d'Alignments. Un alignment représente un seul hit dans la database. Il t'indique qu'une séquence spécifique dans la database a matché ta query, avec des métadonnées sur cette entrée. À l'intérieur de chaque Alignment se trouve le troisième niveau : les High-scoring Segment Pairs, universellement connus sous le nom de HSPs. C'est la partie qui compte. Un alignment indique simplement que deux séquences sont liées. Le HSP contient la preuve mathématique et structurelle de cette relation. Un seul alignment peut contenir plusieurs HSPs si les séquences partagent plusieurs régions de similarité distinctes séparées par des gaps non alignés. Extraire les données implique d'écrire trois boucles imbriquées. Premièrement, tu itères sur les records dans le XML parsé. Deuxièmement, tu itères sur les alignments à l'intérieur de chaque record. Troisièmement, tu itères sur les HSPs à l'intérieur de chaque alignment. Une fois que tu es dans cette boucle la plus interne, tu as accès aux données de match réelles. C'est là que tu appliques tes filtres statistiques. Le filtre le plus courant est la e-value, qui représente le nombre de hits de qualité similaire que tu t'attendrais à voir par hasard. Tu y accèdes via l'attribut expect sur l'objet HSP. Tu écris une condition : si le HSP dot expect est inférieur à ton seuil, disons zéro virgule zéro quatre, tu traites le match. S'il est supérieur, le match est trop faible, et tu l'ignores. Pour les hits qui passent ton filtre, l'objet HSP contient les strings d'alignment exactes. L'attribut query contient ta séquence d'input avec tous les gaps introduits par l'algorithme. L'attribut sbjct contient la séquence de la database qui a matché. L'attribut match se situe conceptuellement entre les deux, contenant la représentation de l'alignment, et mappant les matches exacts, les substitutions positives ou les gaps. Le vrai avantage ici, c'est la stabilité. En laissant le module NCBIXML unpacker le fichier, tu arrêtes de t'appuyer sur du scraping de texte fragile et tu commences à interagir avec des objets de données définis qui mappent parfaitement à la réalité biologique des records, des alignments et des segment pairs. Merci d'avoir écouté, happy coding tout le monde !
10

Navigation dans les structures 3D avec Bio.PDB

3m 19s

Passez à la troisième dimension. Nous explorons le module PDB, l'analyse des structures macromoléculaires et la compréhension de l'architecture Structure-Model-Chain-Residue-Atom (SMCRA).

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Les fondamentaux de Biopython, épisode 10 sur 18. Les protéines sont souvent stockées sous forme de string de lettres plate et unidimensionnelle, mais elles fonctionnent dans une réalité tridimensionnelle complexe. Mapper une séquence 1D vers un espace de coordonnées 3D nécessite une hiérarchie stricte et prévisible. Naviguer dans les structures 3D avec Bio.PDB t'offre exactement cette carte. Quand tu télécharges un fichier depuis la Protein Data Bank, il arrive sous la forme d'un énorme bloc de texte. Historiquement, c'était le format point pdb. Aujourd'hui, le standard, c'est le format point cif. Écrire ton propre code pour lire ces blocs de texte ligne par ligne, c'est un exercice de gestion des edge cases. Bio.PDB résout ça en convertissant le texte en un arbre orienté objet. Pour faire ça, tu utilises soit PDBParser, soit MMCIFParser. Tu crées une instance du parser, tu appelles sa méthode get structure, tu fournis un nom arbitraire pour ta structure, et tu passes le path de ton fichier. Ce que tu récupères, c'est un objet Structure. Cet objet Structure suit une architecture de données stricte connue sous le nom de SMCRA. Ça veut dire Structure, Model, Chain, Residue, Atom. Chaque fichier 3D parsé par Biopython est organisé dans ces cinq niveaux imbriqués. Le niveau racine, c'est la Structure. Une Structure contient un ou plusieurs Models. Si la protéine a été résolue par cristallographie aux rayons X, il n'y a généralement qu'un seul model. Si elle a été résolue par RMN, il peut y avoir des dizaines de models représentant différentes fluctuations structurelles. En général, tu prends juste le premier, qui se trouve à l'index zéro. À l'intérieur d'un Model, tu as des Chains. Beaucoup de protéines sont des complexes formés de plusieurs chaînes polypeptidiques qui interagissent. Elles sont généralement identifiées par une seule lettre majuscule, comme chain A et chain B. À l'intérieur d'une Chain, tu trouves des Residues. Ce sont les acides aminés individuels qui composent la séquence. Ce niveau contient aussi les ligands et les molécules d'eau attachés à cette chain spécifique. Enfin, à l'intérieur d'un Residue, tu as des Atoms. Voici le point clé. Tu peux naviguer dans tout cet arbre en utilisant une simple itération ou un accès de type dictionnaire. Si tu écris une boucle for sur une chain, ça te retourne des residues. Si tu itères sur un residue, ça te retourne des atoms. Si tu sais exactement ce que tu cherches, tu peux descendre directement sans faire de boucle. Si tu as besoin des coordonnées spatiales du carbone alpha dans le centième residue de la chain A, il te suffit d'empiler tes lookups. Tu prends ton objet Structure, tu demandes le model zéro, puis la chain A, puis le residue cent, et enfin l'atom nommé CA. Prenons un scénario pratique : extraire les coordonnées 3D de tous les atoms dans un residue spécifique. D'abord, tu initialises ton parser et tu charges le fichier dans une variable. Ensuite, tu isoles le residue cible. Tu crées une variable et tu lui assignes le résultat de la recherche du model zéro, de la chain A et du residue cinquante à partir de ta structure. Maintenant, tu écris une boucle for standard. Pour chaque atom dans le residue cible, tu demandes ses coordonnées. Biopython te les retourne sous forme d'array NumPy représentant les positions exactes X, Y et Z dans l'espace. Tu print le nom de l'atom et son array de coordonnées. En quelques lignes de code seulement, tu as contourné des milliers de lignes de texte brut et extrait les données spatiales exactes dont tu as besoin. La hiérarchie SMCRA garantit que chaque atom dans chaque fichier de structure est trouvé en utilisant exactement la même logique. C'est tout pour cet épisode. À la prochaine !
11

Mesure de la géométrie des protéines

4m 08s

Calculez les relations spatiales dans les protéines. Cet épisode couvre le calcul des distances interatomiques et l'utilisation de NeighborSearch pour trouver des atomes dans un rayon spécifique.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 11 sur 18. Si tu écris une nested loop naïve pour calculer la distance entre chaque atome d'une protéine et chaque atome d'un ligand, ton script va freeze. L'indexation spatiale résout ça instantanément, et c'est ce qu'on aborde aujourd'hui avec Measuring Protein Geometry. L'opération géométrique la plus fondamentale dans Bio dot PDB, c'est de trouver la distance entre deux points dans l'espace en trois dimensions. Biopython override l'opérateur de soustraction standard pour les objets Atom. Si tu prends un objet Atom et que tu lui soustrais un deuxième objet Atom, le résultat est un float qui représente la distance euclidienne entre eux. L'unité est toujours l'angström. Tu n'as pas besoin d'extraire les coordonnées, de les mettre au carré ou de calculer la racine carrée toi-même. Soustrais juste un atome de l'autre, et tu as ta distance exacte. Cette astuce de soustraction est parfaite pour vérifier une interaction spécifique et connue, comme une seule liaison hydrogène suspectée. Mais ça ne marche plus quand tu dois explorer une proximité inconnue. Supposons que tu aies un petit ligand moléculaire lié à un grand récepteur, et que tu doives identifier chaque résidu de la protéine dans un rayon de cinq angströms autour de ce ligand. Une protéine typique contient des milliers d'atomes. Vérifier chaque atome du ligand avec chaque atome de la protéine, c'est super lourd à calculer. La complexité temporelle augmente géométriquement, et ton script s'arrête complètement. Pour résoudre ça, Bio dot PDB propose le module Neighbor Search. Au lieu de comparer les paires une par une, Neighbor Search construit un index spatial. Sous le capot, il construit un KD-tree qui cartographie où se trouve chaque élément dans l'espace en trois dimensions, ce qui permet de faire des queries de proximité extrêmement rapides. Tu construis un objet Neighbor Search en lui passant une flat list de tous les atomes sur lesquels tu veux faire ta query. Généralement, tu extrais chaque atome de ta structure cible, tu cast ce generator en une list standard, et tu la passes au constructor de Neighbor Search. Cette étape d'initialisation prend une fraction de seconde, mais elle fait tout le gros du travail de calcul en organisant les données spatiales à l'avance. Une fois que l'index est construit, tu peux le query. La méthode search principale demande deux arguments : une coordonnée cible et un rayon en angströms. Quand tu lances la recherche, elle parcourt rapidement l'arbre spatial et ne return que les entités situées à l'intérieur de cette limite sphérique. Voici le point clé. La recherche ne return pas juste des atomes. Parce que Bio dot PDB repose sur l'architecture SMCRA, Neighbor Search comprend la hiérarchie structurelle. Tu peux passer un paramètre level optionnel à ta query de recherche. Si tu spécifies la lettre R pour residue, l'index va regarder tous les atomes dans ton rayon de cinq angströms, déterminer à quels residues parents ces atomes appartiennent, et return une list propre d'objets Residue uniques. Tu bypasses complètement le niveau atome dans tes résultats. Pour cartographier notre poche de liaison du ligand, tu suis un flow très simple. D'abord, initialise le Neighbor Search avec tous les atomes de la chaîne protéique. Ensuite, itère uniquement sur les atomes de ton ligand. Pour chaque atome du ligand, appelle la méthode search avec un rayon de cinq angströms et demande le level residue. Enfin, collecte ces residues retournés dans un set Python pour supprimer automatiquement les doublons. Tu viens de cartographier le site de liaison en quelques millisecondes. Si tu as besoin de trouver des conflits internes au sein d'une seule chaîne repliée, Neighbor Search inclut aussi une méthode search all. Tu fournis simplement un rayon, et elle return chaque paire d'atomes de la structure entière qui sont plus proches l'un de l'autre que cette distance spécifiée, en évitant complètement le problème de la nested loop. Traiter tes données moléculaires comme un index géographique searchable plutôt que comme une nested list transforme ton code, qui passe de lent et structurel à rapide et spatial. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de build !
12

Arbres phylogénétiques en Python

3m 23s

Analysez, manipulez et dessinez des arbres évolutifs avec Bio.Phylo. Nous couvrons la lecture des fichiers Newick, le parcours des arbres et l'isolement de clades spécifiques.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 12 sur 18. Si tu as déjà regardé un fichier Newick brut, tu sais que c'est un vrai cauchemar dense de parenthèses et de virgules imbriquées. Écrire ton propre string parser pour déterminer quelle espèce est liée à laquelle est une vraie galère. Ce qu'il te faut, c'est un moyen de charger ce texte directement dans une data structure traversable. C'est exactement ce que Bio dot Phylo propose pour les arbres phylogénétiques en Python. Bio dot Phylo gère le parsing, la manipulation et le dessin des arbres évolutifs. Le point d'entrée principal est la fonction read. Tu lui passes un file path et une format string, comme newick ou phyloxml. La fonction read consomme ce fichier et retourne un seul objet Tree. Si ton fichier contient plusieurs arbres, tu utilises plutôt la fonction parse pour obtenir une séquence itérable d'arbres. Une fois que tu as chargé le fichier, tu travailles avec deux composants distincts : l'objet Tree et l'objet Clade. L'objet Tree représente la structure entière dans son ensemble. Il contient les metadata globales, comme le nom de l'arbre et s'il est rooted ou unrooted. Mais les données de ramification réelles ne vivent pas directement dans l'objet Tree. Elles vivent dans des objets Clade. Un Clade représente un node spécifique et chaque descendant qui en part. L'objet Tree possède un attribut root, qui est tout simplement le Clade de départ pour toute la hiérarchie. Chaque branche qui part de ce root est un autre Clade, qui contient ses propres sub-clades, en cascade jusqu'aux extrémités. C'est dans la navigation de cette hiérarchie que le module brille. Tu n'écris pas de boucles récursives manuellement. Pour chercher dans la structure, tu appelles la méthode find clades sur ton arbre. Cette méthode cherche à travers toutes les branches imbriquées et retourne un itérable de clades qui correspondent aux propriétés que tu spécifies. Tu peux chercher par nom, par longueur de branche, ou même avec une fonction d'évaluation custom. Si tu ne t'intéresses qu'aux extrémités absolues des branches, qui représentent les espèces vivantes actuelles, tu utilises la méthode get terminals. Ça retourne immédiatement une flat list des clades feuilles. Tu peux aussi calculer des métriques structurelles instantanément. Appeler la méthode total branch length sur l'arbre additionne les longueurs de chaque branche dans toute la structure, te donnant la distance évolutive totale. Imagine un scénario où tu charges un arbre évolutif massif de mammifères. Tu veux isoler juste la branche contenant les primates pour lancer une analyse localisée. Tu appelles find clades et tu cherches le nom cible Primates. Ça retourne l'objet Clade spécifique qui représente l'ancêtre commun de tous les primates. Parce qu'un Clade contient naturellement tous ses descendants, tu as maintenant un subtree complet et isolé. Tu peux passer ce clade de primates à d'autres fonctions d'analyse exactement comme tu le ferais pour un arbre complet. Parfois, tu as juste besoin de regarder la structure pour vérifier que ton extraction a fonctionné. Bio dot Phylo inclut une fonction draw ascii. Tu passes ton arbre ou ton clade isolé à cette fonction, et elle print une représentation en plain text directement dans ton terminal. Ce n'est pas fait pour être publié, mais ça te donne un feedback visuel immédiat sur la topologie sans te demander de configurer des plotting libraries externes. Voici l'idée clé. Traduire des crochets imbriqués en objets natifs signifie que la topologie devient une API, ce qui te permet de découper les historiques d'évolution avec des appels de méthodes standards. Si tu as trouvé cet épisode utile et que tu veux soutenir l'émission, tu peux chercher DevStoriesEU sur Patreon. C'est tout pour celui-ci. Merci d'avoir écouté, et continue de développer !
13

Analyse des motifs de séquence

3m 38s

Découvrez les modèles cachés dans l'ADN. Découvrez comment créer des motifs de séquence, construire des Position-Weight Matrices (PWMs) et scanner des séquences cibles pour trouver des sites de liaison de facteurs de transcription.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 13 sur 18. Si tu essaies de trouver un site de liaison de facteur de transcription en utilisant un string match strict, tu vas rater la grande majorité des vrais signaux biologiques. Les sites de liaison à l'ADN fluctuent, et les protéines tolèrent des variations à des positions spécifiques de la séquence. Pour les trouver de manière fiable, tu dois arrêter de chercher des strings fixes et commencer à chercher des profils de probabilité, ce qui est exactement ce que l'analyse de motifs de séquence te permet de faire. Dans Biopython, tu gères ça avec le module motifs. Tu commences avec un set connu de séquences alignées qui représentent ton site de liaison. Prenons l'exemple classique de la boîte TATA. Tu pourrais avoir une poignée de courtes séquences connues comme T A T A A A, T A T A A T, et T A T A A C. Tu les définis comme des objets Seq standards et tu les passes sous forme d'une seule list à la fonction create du module motifs. Biopython prend cette list d'instances et les regroupe dans un seul objet motif. Le résultat immédiat de la création de cet objet motif est une count matrix. À chaque position le long de ta séquence, Biopython compte le nombre total d'occurrences de A, C, G et T. Si tu regardes la première position de nos exemples de boîte TATA, le count pour T est de trois, et le count pour les trois autres lettres est de zéro. Cette matrice est la fondation littérale de toute l'analyse downstream, mais les raw counts ont une sévère limitation mathématique. Si un nucléotide n'apparaît jamais à une certaine position dans ton petit échantillon de référence, sa probabilité devient un zéro absolu. Plus tard, quand tu multiplies les probabilités pour scorer une séquence, un seul zéro anéantit tout le score. Pour corriger cette vulnérabilité, tu convertis la count matrix en une Position-Weight Matrix, ou PWM. Voici l'idée clé. Tu génères la PWM en appliquant des pseudocounts. Un pseudocount ajoute une infime fraction de base à chaque nucléotide possible, à chaque position. Ça reconnaît mathématiquement que ce n'est pas parce que tu n'as pas encore vu de cytosine à la position deux, qu'une substitution à cet endroit est biologiquement impossible. En lissant les zéros, la Position-Weight Matrix transforme tes raw counts en distributions de probabilité robustes. Les probabilités seules restent difficiles à utiliser pour le sequence scanning. Tu as besoin de savoir si un segment d'ADN matche ton motif mieux qu'il ne matche une background sequence aléatoire. Tu gères ça en convertissant ta PWM en une Position-Specific Scoring Matrix, ou PSSM. La PSSM calcule des scores log-odds basés sur une distribution de nucléotides de background. Elle compare la probabilité qu'une lettre apparaisse parce qu'elle fait partie de ton motif, avec la probabilité qu'elle apparaisse par pur hasard. Un score positif signifie que la séquence ressemble activement à ton motif. Un score négatif signifie qu'elle ressemble à du background noise. Une fois que tu as ta PSSM, tu peux rechercher les sites de liaison non annotés dans une longue séquence cible. Tu appelles la méthode calculate sur la PSSM et tu lui passes ta séquence d'ADN cible. Cette méthode fait glisser ton motif sur toute la cible, en scorant chaque window possible de cette longueur. Elle retourne un array de scores numériques représentant la valeur log-odds à chaque position de la séquence. Tu itères sur ces scores et tu cherches les valeurs qui dépassent un threshold strict défini. Si le score est assez haut, tu as probablement trouvé une boîte TATA fonctionnelle. Un string match strict exige la perfection, mais les systèmes biologiques fonctionnent sur des probabilités, et passer des raw counts aux scoring matrices capture cette réalité. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à développer !
14

Intégration de Swiss-Prot et ExPASy

3m 23s

Accédez à la référence des bases de données de protéines. Nous détaillons comment récupérer des enregistrements via Bio.ExPASy et analyser les fichiers plats denses de Swiss-Prot pour extraire des métadonnées protéiques organisées.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 14 sur 18. GenBank, c'est super quand tu travailles avec des acides nucléiques. Mais quand tu as besoin de données sur une protéine qui sont curées par des experts et revues à la main — comme ses sites actifs exacts ou l'endroit où elle traverse une membrane cellulaire — les bases de données de séquences standards ne suffisent plus. Tu as besoin d'une base de données de protéines spécialisée, et c'est là qu'intervient l'intégration de Swiss-Prot et ExPASy. Swiss-Prot est une base de données de séquences de protéines de haute qualité, annotée manuellement. ExPASy est le portail serveur qui permet d'y accéder. Biopython connecte ces deux éléments. Il utilise le module ExPASy pour télécharger les données sur internet, et le module SwissProt pour les parser en un objet structuré. D'abord, tu dois récupérer le record brut sur internet. Tu fais ça en utilisant le module ExPASy, et plus précisément une fonction appelée get_sprot_raw. Tu lui passes un accession ID Swiss-Prot. Par exemple, si tu veux le record pour la sous-unité alpha de l'hémoglobine humaine, tu passes son accession ID, qui est P69905. Appeler get_sprot_raw avec cet ID ouvre une connexion réseau vers le serveur et retourne un handle vers les données texte brutes. Une fois que tu as ce handle de texte brut, tu le passes au module SwissProt. Tu appelles la fonction read et tu lui passes ton handle. Ça parse le flat file et retourne un objet record Swiss-Prot. Voici le point clé. Cet objet record n'est pas juste une string de séquence. C'est un conteneur profondément structuré de métadonnées d'experts. Comme Swiss-Prot est curée manuellement, les champs de cet objet sont exceptionnellement riches. Tu peux accéder à l'attribut organism pour confirmer exactement à quelle espèce appartient la protéine. Tu peux vérifier l'attribut sequence_length pour obtenir instantanément le nombre d'acides aminés, sans avoir besoin de mesurer la string de séquence toi-même. La partie la plus précieuse du record, c'est l'attribut features. C'est une liste imbriquée contenant les domaines structurels et fonctionnels connus de la protéine. Quand tu itères sur ces features, tu vas trouver des annotations spécifiques. Tu verras des features détaillant les coordonnées exactes des acides aminés pour les sites actifs, les régions de liaison aux métaux ou les domaines transmembranaires. Au lieu de faire tourner un algorithme de prédiction, tu lis des coordonnées définitives, confirmées en laboratoire, directement depuis une base de données curée. En pratique, ton flow de code ressemble à ça. Tu appelles la fonction get_sprot_raw d'ExPASy avec ton accession ID. Tu prends le handle qui en résulte et tu le passes à la fonction read de SwissProt. Ça te donne ton objet record. À partir de là, tu peux lire l'organism, vérifier la sequence_length, ou boucler sur la liste de features pour extraire les sites fonctionnels. N'oublie pas de toujours fermer le handle réseau une fois que tu as fini de lire les données pour libérer les ressources système. Quand tu construis des pipelines qui reposent sur la fonction biologique plutôt que juste sur la similarité de séquence, cibler Swiss-Prot te garantit de baser ta logique sur des données vérifiées et curées par des humains. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à développer !
15

Visualisation de génomes avec GenomeDiagram

3m 18s

Transformez des fichiers GenBank bruts en images de qualité publication. Apprenez comment GenomeDiagram construit des cartes de génomes circulaires et linéaires en superposant des pistes et des flèches de caractéristiques.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Les fondamentaux de Biopython, épisode 15 sur 18. Quand tu soumets un article décrivant un plasmide bactérien nouvellement séquencé, les relecteurs ont rarement envie de lire un simple tableau de coordonnées de gènes en plain text. Ils s'attendent à une carte circulaire, colorée et proprement annotée, qui rend la structure génomique évidente en un coup d'œil. Visualiser les génomes avec GenomeDiagram, c'est comme ça que tu génères ces cartes directement à partir de tes données de séquence. Avant de commencer à dessiner, tu dois t'assurer que la library externe ReportLab est installée. GenomeDiagram repose entièrement sur ReportLab sous le capot pour calculer la géométrie et faire le render des images finales. Sans ça, l'export graphique va échouer. L'architecture de GenomeDiagram est strictement hiérarchique. Tu construis ta visualisation en imbriquant des objets de haut en bas. Tout en haut, il y a l'objet Diagram. C'est ton canvas vierge. À l'intérieur du Diagram, tu ajoutes un ou plusieurs Tracks. Un Track représente une zone de tracé spécifique. Sur une carte linéaire, un Track est une ligne horizontale. Sur une carte circulaire de plasmide, un Track est un simple anneau concentrique. À l'intérieur d'un Track, tu ajoutes des FeatureSets. Un FeatureSet est un regroupement logique de données de séquence. Tu pourrais utiliser un FeatureSet pour les séquences codantes et un FeatureSet différent pour les régions régulatrices sur exactement le même anneau. Enfin, à l'intérieur des FeatureSets, tu places les features de séquence individuelles elles-mêmes. Voici le point clé. Tu n'as pas besoin de calculer manuellement les angles ou les coordonnées en pixels pour placer tes gènes. GenomeDiagram lit nativement la position start, la position stop et l'orientation du brin à partir des objets feature standards de Biopython. Pour mettre ça en pratique, suppose que tu as un record GenBank parsé pour un petit plasmide. D'abord, tu initialises un Diagram vide. Ensuite, tu crées un nouveau Track à l'intérieur, et un nouveau FeatureSet dans ce Track. Après, tu itères sur les features de ton record GenBank parsé. Tu vérifies si le type de la feature actuelle est un CDS, c'est-à-dire une séquence codante. Quand tu trouves un CDS, tu le passes à ton FeatureSet pour l'ajouter à la visualisation. Pendant cette étape, tu assignes le styling visuel. Tu peux indiquer à la feature de faire un render sous forme de flèche, qui pointe automatiquement dans le sens horaire ou antihoraire selon le brin du gène. Tu peux aussi assigner des couleurs distinctes ici. Une astuce courante, c'est d'utiliser un simple compteur de boucle pour alterner entre deux couleurs, pour que les gènes adjacents ne se fondent pas visuellement en un seul bloc massif. Une fois que ta hiérarchie est complètement remplie de données, tu indiques au Diagram de se dessiner. Tu appelles la méthode draw et tu mets le format sur circulaire. Tu peux définir les dimensions de la page, la couleur de fond et le scaling du Track. Une fois que le dessin est construit en mémoire, tu appelles simplement la méthode write, en passant un nom de fichier qui se termine par PDF ou PNG. ReportLab calcule instantanément les bonnes longueurs d'arc, positionne les flèches colorées le long du Track circulaire, et exporte un fichier prêt pour la publication. L'avantage principal de cette structure en niveaux, c'est la reproductibilité. Parce que les règles de layout sont strictement séparées du parsing de ta séquence brute, tu peux écrire un seul script pour styler uniformément une base de données entière de plasmides sans jamais toucher à un outil de design graphique. Merci d'avoir écouté. À la prochaine !
16

Génétique des populations avec Bio.PopGen

3m 36s

Analysez la variation génétique à travers les populations. Cet épisode présente Bio.PopGen pour analyser les fichiers Genepop et extraire facilement les fréquences alléliques et les métriques d'hétérozygotie.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Les fondamentaux de Biopython, épisode 16 sur 18. Tu as des données brutes de génotypage de terrain et tu as besoin de métriques statistiques, mais pour faire le lien, tu dois écrire encore un autre script custom pour parser des fichiers texte. Convertir ces données de terrain dans un format prêt pour l'analyse, c'est fastidieux, à moins d'utiliser un parser conçu exactement pour le format standard Genepop. C'est là qu'intervient la génétique des populations avec Bio.PopGen. Genepop est un package logiciel et un format de fichier standard utilisés pour calculer des métriques comme l'équilibre de Hardy-Weinberg, les statistiques F et le déséquilibre de liaison. Son format d'input textuel, généralement sauvegardé sous forme de fichier point gen, est rigide. Il repose sur des sauts de ligne stricts, des keywords spécifiques et des codes entiers collés ensemble pour les allèles. Écrire ta propre logique pour extraire les fréquences alléliques sur plusieurs loci et populations, c'est la porte ouverte aux erreurs off-by-one. Le module Bio.PopGen évite complètement ça en lisant directement le format Genepop dans un objet Python structuré. Prends un scénario concret. Tu étudies deux populations isolées de poissons. Tu as typé chaque poisson sur trois loci microsatellites. Tes données brutes se trouvent dans un fichier point gen standard. Le haut du fichier contient un titre, suivi des noms de tes trois marqueurs sur des lignes séparées. Ensuite vient le keyword Pop, qui marque le début de la première population de poissons. En dessous, chaque ligne représente un poisson, avec un identifiant suivi de ses allèles pour les trois loci. Après le dernier poisson de ce groupe, un autre keyword Pop apparaît, marquant le début de la deuxième population. Pour traiter ça, tu importes le module GenePop depuis Bio.PopGen. Tu ouvres ton fichier texte et tu passes le file handle ouvert à la fonction GenePop point read. Cette fonction traite le texte et retourne un seul objet Record. C'est la partie qui compte. L'objet Record reflète la hiérarchie biologique de ton étude. Si tu vérifies l'attribut loci list sur le Record, il retourne une simple séquence contenant les noms de tes trois marqueurs microsatellites. Ça confirme que le parser a bien lu le header. Ensuite, tu peux regarder l'attribut populations. Cet attribut contient une liste où chaque élément représente une population entière de ton fichier. Puisque tu as deux keywords Pop dans ton fichier, cette liste contient exactement deux éléments. Si tu regardes de plus près l'une de ces populations, tu trouves une liste des individus qu'elle contient. Chaque individu est stocké sous la forme d'une paire contenant son identifiant string et une liste de ses génotypes. Pour un organisme diploïde, un génotype sur un seul locus est parsé comme une paire d'allèles. Le fichier texte Genepop stocke souvent ces allèles sous la forme d'une seule string combinée de chiffres, comme zéro un zéro deux. Le parser sépare ça automatiquement en allèles distincts, représentant zéro un et zéro deux comme des entités séparées. Tu n'as pas besoin d'écrire de logique de string slicing pour séparer les allèles maternels et paternels. Une fois le fichier parsé, tu as un accès immédiat aux noms des marqueurs, aux comptes de population et aux données alléliques individuelles. Tu peux itérer sur les populations pour compter des fréquences alléliques spécifiques, ou passer l'objet Record directement aux routines Biopython qui interagissent avec le logiciel Genepop. Tu peux déclencher des calculs pour l'hétérozygotie attendue ou mesurer la différenciation génétique entre tes deux groupes isolés. La valeur du parser Bio.PopGen n'est pas juste de lire un fichier texte, mais de transformer une liste plate de strings en une hiérarchie biologique stricte de loci, de populations et d'individus, comme l'exigent les algorithmes statistiques. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
17

Voies biochimiques avec KEGG

3m 40s

Reliez les points métaboliques. Apprenez à analyser les enregistrements d'enzymes et de voies KEGG pour tracer les réactions biochimiques et les structures de composés chimiques.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Les fondamentaux de Biopython, épisode 17 sur 18. Tu as séquencé un gène et trouvé un variant. Connaître la séquence est rarement suffisant. Pour comprendre les vrais dégâts biologiques, tu dois savoir exactement quels réseaux métaboliques l'enzyme qui en résulte perturbe. Biochemical Pathways avec KEGG te fournit exactement cette carte. La Kyoto Encyclopedia of Genes and Genomes maintient d'énormes bases de données qui détaillent les systèmes biologiques, les composés et les réactions. Ils distribuent ces données sous forme de flat files en plain text standard. Ces fichiers utilisent une structure spécifique où un mot-clé se trouve sur la marge de gauche, et les données associées sur la droite. Le problème, c'est que les valeurs des données, comme de longues listes de synonymes ou des noms de pathways complexes, font souvent des retours à la ligne de façon imprévisible. Écrire de la manipulation de string custom pour gérer ce wrap est fragile. Le module Bio dot KEGG est là pour gérer ces bizarreries de formatage et traduire ces fichiers texte directement en objets Python prévisibles. Pour extraire les données moléculaires de base, tu utilises la fonction Compound dot parse dans le module KEGG. Tu lui passes un file handle ouvert qui pointe vers un fichier texte compound de KEGG. Au lieu de charger un dump massif de base de données en mémoire d'un seul coup, le parser te renvoie un iterator. À chaque fois que tu avances l'iterator, il fait un yield d'un seul objet Python qui représente un compound. À partir de cet objet, tu peux accéder à l'attribut entry pour récupérer l'identifiant unique, qui ressemble généralement à un C majuscule suivi de chiffres. Comme les compounds ont souvent plusieurs noms courants dans la littérature, l'attribut name renvoie une liste de strings contenant tous les synonymes reconnus. Tu as aussi un accès direct à la structure moléculaire exacte via l'attribut formula. Les compounds sont juste les matériaux statiques de ton système. Les enzymes sont ce qui pilote vraiment les réactions. Pour les analyser, tu passes à la fonction Enzyme dot parse, en lui passant un flat file enzyme de KEGG. Tout comme le parser de compound, elle fait un yield d'objets distincts un par un. Tu vérifies l'attribut entry pour obtenir le numéro EC standard, et l'attribut name pour la désignation de l'enzyme. C'est la partie qui compte. Une enzyme n'opère pas dans le vide, et l'objet enzyme reflète ça à travers son attribut pathway. Le parser lit le bloc de texte sur plusieurs lignes qui détaille les interactions de l'enzyme et le structure en une liste propre. Chaque élément de cette liste est un tuple contenant deux données. Le premier élément du tuple est l'identifiant pathway de KEGG, et le deuxième est le nom human-readable de ce pathway métabolique. Tu peux scripter un processus de mapping complet en juste quelques étapes. D'abord, tu ouvres ton fichier de données enzyme téléchargé et tu le passes à la fonction Enzyme dot parse. Tu crées une boucle pour parcourir les records renvoyés. Quand tu tombes sur un record où l'attribut entry correspond au numéro EC de ton enzyme mutée, tu récupères son attribut pathway. Tu peux ensuite itérer sur cette liste de tuples, en extrayant les noms des pathways pour voir immédiatement si la mutation affecte la glycolyse, le cycle du citrate, ou complètement autre chose. La vraie puissance des parsers KEGG n'est pas juste de lire du texte, mais de convertir des composants biologiques isolés en coordonnées de réseau interconnectées, te permettant de tracer un variant génétique localisé jusqu'à une défaillance métabolique systémique. Si tu trouves ces épisodes utiles et que tu veux soutenir l'émission, tu peux chercher DevStoriesEU sur Patreon. C'est tout pour celui-ci. Merci d'avoir écouté, et continue de builder !
18

Analyse de clusters pour l'expression génique

3m 31s

Regroupez les gènes selon leur comportement. Dans ce dernier épisode, nous couvrons le module Bio.Cluster, en appliquant le K-means et le clustering hiérarchique aux données d'expression de puces à ADN.

Télécharger
Bonjour, ici Alex de DEV STORIES DOT EU. Biopython Fundamentals, épisode 18 sur 18. Tu viens de lancer une expérience RNA-seq et tu te retrouves à fixer une expression matrix de dix mille lignes. Trouver du sens dans ces raw data est impossible tant que tu ne regroupes pas ces gènes en quelques réponses biologiques distinctes. C'est exactement ce que fait la Cluster Analysis pour l'expression des gènes, en utilisant le module Bio dot Cluster. Quand tu analyses des données de microarray ou de RNA-seq, tu suis l'activité des gènes à travers différentes conditions. Prends un scénario concret. Tu as des données d'expression pour mille gènes, mesurées sur quatre time points de choc thermique. Tu veux identifier quels gènes se comportent de la même façon. Peut-être qu'une cinquantaine d'entre eux font un pic à la deuxième heure et chutent à la quatrième. Les gènes qui ont les mêmes patterns de up and down regulation partagent souvent des pathways biologiques ou des mécanismes de régulation. Trouver ces cohortes à la main sur des milliers de lignes, c'est peine perdue. Le module Bio dot Cluster contient un core en C conçu spécifiquement pour traiter ce type de matrix data efficacement. Ta première étape, c'est d'importer les données dans Biopython. Au lieu d'écrire une logique de parsing custom, tu passes ton fichier texte tab-separated à la fonction read du module. Ça te retourne un objet Record spécialisé. Cet objet contient ton expression matrix numérique, mais il garde aussi une trace de tes identifiants de gènes et des noms de tes conditions expérimentales. Une fois les données chargées, tu appliques un algorithme de clustering. L'approche la plus courante, c'est le K-means, exécuté avec la fonction kcluster. Le K-means partitionne tes éléments en un nombre prédéterminé de groupes, représenté par la variable k. Tu passes la data matrix et la valeur de k que tu as choisie à la fonction kcluster. La fonction retourne ensuite un array qui assigne chaque gène à un cluster ID spécifique, avec une valeur d'erreur qui mesure à quel point ces clusters sont denses. Comme l'algorithme commence avec des assignations random, tu le run généralement plusieurs fois et tu gardes l'itération qui donne l'erreur la plus basse. Voici le point clé. L'algorithme regroupe les gènes en se basant sur une distance metric, et tu dois choisir cette métrique avec soin. Si tu utilises la distance euclidienne standard, l'algorithme regroupe les gènes qui ont des niveaux d'expression absolus similaires. Mais si tu veux regrouper les gènes par la forme de leur courbe d'expression dans le temps, peu importe leur baseline de départ, tu dois dire à la fonction kcluster d'utiliser plutôt une distance metric basée sur la corrélation. Le K-means t'oblige à deviner le nombre de clusters à l'avance. Si tu ne sais pas combien de réponses distinctes existent dans tes données de choc thermique, tu peux utiliser le hierarchical clustering à la place, via la fonction treecluster. Plutôt que de forcer les gènes dans des buckets plats, treecluster construit une hiérarchie. Il trouve les deux gènes avec les patterns d'expression les plus identiques et les relie. Ensuite, il trouve le gène ou la paire la plus proche et les relie, construisant une structure en arbre ramifiée appelée un dendrogramme. Une fois que l'arbre connecte les mille gènes, tu peux observer la structure globale de la data et couper les branches au niveau qui a le plus de sens biologiquement. Comme c'est le dernier épisode de notre série Biopython Fundamentals, je te recommande vivement d'ouvrir la documentation officielle de Biopython et de tester ces fonctions de clustering sur un vrai dataset. Tu peux aussi visiter devstories dot eu pour suggérer des sujets que tu aimerais voir dans les futures séries. Le but ultime quand tu run ces algorithmes, ce n'est pas juste de trier des nombres dans des buckets, mais de découvrir la logique biologique partagée qui force ces gènes à s'activer ensemble. C'est tout pour cet épisode. Merci d'avoir écouté, et keep building !