19 Module Biopython¶
Nous allons aborder dans ce chapitre un module incontournable en bioinformatique. En effet, le module Biopython permet de manipuler des données biologiques, comme des séquences (nucléiques et protéiques) ou des structures (fichiers PDB), et d'interroger des bases de données comme PubMed. Le tutoriel est particulièrement bien fait, n'hésitez pas à le consulter.
19.1 Installation et convention¶
Contrairement aux autres modules vus précédemment, Biopython n'est pas fourni avec la distribution Python de base. Avec la distribution Miniconda que nous vous conseillons d'utiliser (consultez pour cela la documentation en ligne), vous pouvez rapidement l'installer avec la commande :
Dans ce chapitre, nous vous montrerons quelques exemples d’utilisation du module Biopython pour vous convaincre de sa pertinence. Ces exemples seront exécutés dans un notebook Jupyter.
Les cellules de code apparaitront de cette manière
dans un notebook Jupyter, avec des numéros de lignes à gauche.
19.2 Chargement du module¶
On charge le module Biopython avec la commande :
Le nom du module Biopython n'est pas biopython
, mais Bio
(avec un B majuscule).
19.3 Manipulation de séquences¶
Voici quelques exemples de manipulation de séquences avec Biopython.
19.3.1 Définition d'une séquence¶
- Ligne 1. Le module Biopython s'appelle
Bio
. - Ligne 2. On charge la classe
Seq
du sous-moduleBio.Seq
. - Ligne 3. La variable
ADN
est de typeSeq
, comme affiché dans le résultat.
19.3.2 Obtention de la séquence complémentaire et de la séquence complémentaire inverse¶
19.3.3 Traduction en séquence protéique¶
Dans l'annexe A Quelques formats de données en biologie, vous trouverez de nombreux exemples d'utilisation de Biopython pour manipuler des données aux formats FASTA, GenBank et PDB.
19.4 Interrogation de la base de données PubMed¶
Le sous-module Entrez de Biopython permet d’utiliser les ressources du NCBI et notamment d'interroger la base de données PubMed. Nous allons par exemple utiliser PubMed pour chercher des articles scientifiques relatifs à la transferrine (transferrin en anglais):
from Bio import Entrez
Entrez.email = "votremail@provider.fr"
req_esearch = Entrez.esearch(db="pubmed", term="transferrin")
res_esearch = Entrez.read(req_esearch)
- Ligne 1. On charge directement le sous-module Entrez.
- Ligne 2. Lors d'une requête sur le site du NCBI, il est important de définir correctement
la variable
Entrez.email
, qui sera transmise au NCBI lors de la requête et qui pourra être utilisée pour vous contacter en cas de difficulté avec le serveur. - Ligne 3. On lance la requête (
transferrin
) sur le moteur de recherchepubmed
. La requête est stockée dans la variablereq_esearch
. - Ligne 4. Le résultat est lu et stocké dans la variable
res_esearch
.
Sans être un vrai dictionnaire, la variable res_esearch
en a cependant plusieurs propriétés.
Voici ses clés :
dict_keys(['Count', 'RetMax', 'RetStart', 'IdList', 'TranslationSet',
'TranslationStack', 'QueryTranslation'])
La valeur associée à la clé IdList
est une liste qui contient les identifiants
(PMID) des articles scientifiques associés à la requête (ici transferrin
) :
['30411489', '30409795', '30405884', '30405827', '30402883', '30401570',
'30399508', '30397276', '30395963', '30394734', '30394728', '30394123',
'30393423', '30392910', '30392664', '30391706', '30391651', '30391537',
'30391296', '30390672']
Cette liste ne contient les identifiants que de 20 publications, alors que, si nous faisons cette même requête directement sur le site de PubMed depuis un navigateur web, nous obtenons plus de 45 700 résultats.
En réalité, le nombre exact de publications (en janvier 2024) est connu :
Pour ne pas saturer les serveurs du NCBI, seulement 20 PMID sont renvoyés par défaut.
Mais vous pouvez augmenter cette limite en utilisant le paramètre retmax
dans la fonction Entrez.esearch()
.
Nous pouvons maintenant récupérer des informations sur une publication précise en connaissant son PMID, par exemple, l'article avec le PMID 22294463, dont un aperçu est sur la figure 1.
Nous allons pour cela utiliser la fonction Entrez.esummary()
La variable res_esummary
n'est pas réellement une liste (son type exacte est Bio.Entrez.Parser.ListElement
),
mais elle est indexable (voir chapitre 14 Conteneurs).
Cette pseudo-liste n'a qu'un seul élément, qui est lui-même un dictionnaire dont voici les clés :
dict_keys(['Item', 'Id', 'PubDate', 'EPubDate', 'Source', 'AuthorList',
'LastAuthor', 'Title', 'Volume', 'Issue', 'Pages', 'LangList',
'NlmUniqueID', 'ISSN', 'ESSN', 'PubTypeList', 'RecordStatus', 'PubStatus',
'ArticleIds', 'DOI', 'History', 'References', 'HasAbstract', 'PmcRefCount',
'FullJournalName', 'ELocationID', 'SO'])
Nous pouvons alors facilement obtenir le titre, le DOI et la date de publication
(PubDate
) de cet article, ainsi que le journal (Source
) dans lequel il a été
publié :
Enfin, pour récupérer le résumé de la publication précédente, nous allons
utiliser la fonction Entrez.efetch()
:
req_efetch = Entrez.efetch(
db="pubmed", id="22294463",
rettype="abstract", retmode="text")
req_efetch.read()
'1. Biometals. 2012 Aug;25(4):677-86. doi: 10.1007/s10534-012-9520-3.
\n\nKnown and potential roles of transferrin in iron biology.\n\nBart
nikas TB(1).\n\nAuthor information:\n(1)Department of Pathology, Chil
dren’s Hospital, Enders 1110, 300 Longwood \nAvenue, Boston, MA 02115
, USA. mas.Bartnikas@childrens.harvard.edu\n\nTransferrin is an abund
ant serum metal-binding protein best known for its role \nin iron del
[...]
Le résultat n'est pas très lisible, car il apparait comme un seul bloc. Le caractère \n
désigne un retour à la ligne. L'instruction print()
affichera
le résultat de manière plus lisible :
req_efetch = Entrez.efetch(
db="pubmed", id="22294463",
rettype="abstract", retmode="text")
print(req_efetch.read())
1. Biometals. 2012 Aug;25(4):677-86. doi: 10.1007/s10534-012-9520-3.
Known and potential roles of transferrin in iron biology.
Bartnikas TB(1).
Author information:
(1)Department of Pathology, Children’s Hospital, Enders 1110, 300 Longwood
Avenue, Boston, MA 02115, USA. mas.Bartnikas@childrens.harvard.edu
Transferrin is an abundant serum metal-binding protein best known for its role
in iron delivery. The human disease congenital atransferrinemia and animal
models of this disease highlight the essential role of transferrin in
erythropoiesis and iron metabolism. Patients and mice deficient in transferrin
exhibit anemia and a paradoxical iron overload attributed to deficiency in
hepcidin, a peptide hormone synthesized largely by the liver that inhibits
dietary iron absorption and macrophage iron efflux. Studies of inherited human
disease and model organisms indicate that transferrin is an essential regulator
of hepcidin expression. In this paper, we review current literature on
transferrin deficiency and present our recent findings, including potential
overlaps between transferrin, iron and manganese in the regulation of hepcidin
expression.
DOI: 10.1007/s10534-012-9520-3
PMCID: PMC3595092
PMID: 22294463 [Indexed for MEDLINE]
Le résultat contient bien le résumé de la figure 1, mais aussi d'autres informations comme le titre, le DOI, la date de publication...
19.5 Exercices¶
Pour ces exercices, utilisez des notebooks Jupyter.
19.5.1 Pourcentage de GC de gènes de Plasmodium falciparum¶
Plasmodium falciparum (P. falciparum) est un des parasites responsables du paludisme chez les êtres humains. Le fichier p_falciparum_500.fasta
contient 500 gènes du génome de P. falciparum.
Écrivez un code Python qui calcule le pourcentage de GC de chaque gène. Les valeurs seront stockées dans un dictionnaire, avec comme clés les identifiants des gènes et comme valeurs le pourcentage de GC.
On rappelle que le pourcentage de GC d'une séquence est calculé avec la formule suivante :
Affichez ensuite :
- Le nombre total de gènes.
- L'identifiant de la séquence qui a le pourcentage de GC le plus élevé, avec la valeur du pourcentage affichée avec deux chiffres après la virgule.
- L'identifiant de la séquence qui a le pourcentage de GC le plus faible, avec la valeur du pourcentage affichée avec deux chiffres après la virgule.
Pour cet exercice, n'hésitez pas à consulter :
- Le chapitre 14 Conteneurs pour trier un dictionnaire.
- L'annexe A Quelques formats de données en biologie pour lire un fichier FASTA avec Biopython.
19.5.2 Années de publication des articles relatifs à la barstar¶
L'objectif de cet exercice est d'interroger automatiquement la base de données bibliographique PubMed pour déterminer le nombre d'articles relatifs à la protéine barstar publiés chaque année.
Vous utiliserez le module Biopython et le module matplotlib, qui sera vu un peu plus loin (les principales instructions vous seront fournies).
Requête avec un mot-clé¶
Sur le site de PubMed, cherchez combien d'articles scientifiques sont relatifs à la barstar.
Effectuez la même chose avec Python et la méthode Entrez.esearch()
de Biopython.
Choisissez un des PMID renvoyé et vérifiez dans PubMed que l'article associé est bien à propos de la barstar. Pour cela, indiquez le PMID choisi dans la barre de recherche de PubMed et cliquez sur Search. Attention, l'association n'est pas toujours évidente. Cherchez éventuellement dans le résumé de l'article si besoin.
Est-ce que le nombre total d'articles trouvés est cohérent avec celui obtenu sur le site de PubMed ?
Récupération des informations d'une publication¶
Récupérez les informations de la publication dont le PMID est 29701945. Vous utiliserez la méthode Entrez.esummary()
.
Affichez le titre, le DOI, le nom du journal (Source
) et la date de publication (PubDate
) de cet article. Vérifiez que cela correspond bien à ce que vous avez lu sur PubMed.
Récupération du résumé d'une publication¶
Récupérez le résumé de la publication dont le PMID est 29701945. Vous utiliserez la méthode Entrez.efetch()
.
Affichez ce résumé.
Distribution des années de publication des articles relatifs à la barstar¶
En utilisant la méthode Entrez.esearch()
, récupérez tous les PMID relatifs à la barstar. Pour cela, pensez à augmenter le paramètre retmax
. Vos PMID seront stockés dans la liste pmids
sous forme de chaînes de caractères. Vérifiez sur PubMed que vous avez récupéré le bon nombre d'articles.
En utilisant maintenant la méthode Entrez.esummary()
dans une boucle, récupérez la date de publication de chaque article. Stockez l'année sous forme d'un nombre entier dans la liste years
. Cette étape peut prendre une dizaine de minutes, soyez patient. Vous pouvez afficher dans votre boucle un message qui indique où vous en êtes dans la récupération des articles.
Vérifiez que votre liste years
contient bien autant d'éléments que la liste pmids
.
Calculez maintenant le nombre de publications par année. Vous créerez pour cela un dictionnaire freq
qui aura pour clé les années (oui, une clé de dictionnaire peut aussi être un entier) et pour valeur le nombre de publications associées à une année donnée.
Créez une liste x
qui contient les clés du dictionnaire freq
. Ordonnez les valeurs dans x
avec la méthode .sort()
. Créez maintenant une seconde liste y
qui contient, dans l'ordre, le nombre de publications associées à chaque année. Bien évidemment, les listes x
et y
doivent avoir la même taille. Au fait, en quelle année la barstar apparaît pour la première fois dans une publication scientifique ?
Ensuite, avec le module matplotlib (que nous aborderons prochainement), vous allez pouvoir afficher la distribution des publications en fonction des années :
Vous pouvez également ajouter un peu de cosmétique et enregistrer le graphique sur votre disque dur :
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.bar(x, y)
# Étiquetage des axes.
ax.set_xlabel("Années")
ax.set_ylabel("Nombre de publications")
# Ajout du titre du graphique.
ax.set_title("Distribution des publications qui mentionnent la barstar")
# Enregistrement sur le disque.
fig.savefig("distribution_barstar_annee.png")