{"id":3515,"date":"2017-06-26T13:10:54","date_gmt":"2017-06-26T17:10:54","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=3515\/"},"modified":"2018-08-28T10:20:03","modified_gmt":"2018-08-28T14:20:03","slug":"r-ou-python-a-vous-de-choisir","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/r-ou-python-a-vous-de-choisir\/","title":{"rendered":"R ou Python, \u00e0 vous de choisir!"},"content":{"rendered":"<p><em>Mise \u00e0 jour 27\/08\/2018<\/em><\/p>\n<p>J&rsquo;ai <a href=\"https:\/\/bioinfo.iric.ca\/fr\/python-et-pandas\/\">d\u00e9j\u00e0<\/a> introduit la librairie Python pandas en comparant certaines de ses fonctions \u00e0 leurs fonctions \u00e9quivalentes en R. Pandas est une librairie qui rend Python beaucoup plus facile \u00e0 utiliser pour faire de l&rsquo;exploration et de la visualisation de donn\u00e9es (presque autant que R). La librairie permet de manipuler des <em>dataframes<\/em> tr\u00e8s facilement (elle est construite par-dessus numpy). Elle a beaucoup \u00e9volu\u00e9 ces derni\u00e8res ann\u00e9es et la communaut\u00e9 d&rsquo;utilisateurs a aussi beaucoup grossie. R offre certainement plus de modules statistiques sp\u00e9cialis\u00e9s, mais pandas est int\u00e9ressant car il est maintenant int\u00e9gr\u00e9 dans un bon nombre de <em>packages,<\/em> notamment dans le <em>package<\/em> de ch\u00e9moinformatique, rdkit. Utiliser pandas pour analyser des donn\u00e9es en Python rend l&rsquo;exp\u00e9rience plus agr\u00e9able, comparativement \u00e0 utiliser Python seul.<\/p>\n<p>R et Python sont deux langages int\u00e9ressants, capables d&rsquo;effectuer les m\u00eames t\u00e2ches. Dans les deux cas, plusieurs libraries sont disponibles et viennent ajouter des \u00ab\u00a0fonctionnalit\u00e9s\u00a0\u00bb. Par exemple, charger les donn\u00e9es de deux fichiers textes contenant 176241 rang\u00e9es et, respectivement, 151 et 574 colonnes prend significativement moins de temps avec Python : environ 1 \u00e0 2 minutes versus 19 minutes en R en utilisant la fonction de base <\/p>\n<pre>read.delim<\/pre>\n<p>.  Toutefois, il existe des librairies qui permettent de charger des donn\u00e9es en R beaucoup plus rapidement, en 30 secondes ou moins pour ce cas sp\u00e9cifique. Les deux langages sont donc des options appropri\u00e9es pour manipuler de larges jeux de donn\u00e9es. <\/p>\n<p>Ci-dessous, je revisite l&rsquo;exercice de \u00ab\u00a0traduction\u00a0\u00bb entre R et Python\/pandas.<\/p>\n<h3>Extraits d&rsquo;un exemple r\u00e9el<\/h3>\n<p>Mon but est de comparer directement les profils d&rsquo;expression de g\u00e8nes de patient provenant de TCGA et de Leucegene; tous les r\u00e9sultats de s\u00e9quen\u00e7age ayant \u00e9t\u00e9 trait\u00e9s de la m\u00eame fa\u00e7on. Les niveaux d&rsquo;expression sont des tpm d\u00e9riv\u00e9s du programme kallisto pour le fichier d&rsquo;annotation GRCh38.84. Les fichiers d&rsquo;entr\u00e9es contiennent les expressions des transcrits des g\u00e8nes qui sont identifi\u00e9s par leur Ensembl ID. J&rsquo;ai fait la comparison entre les deux ensembles de donn\u00e9es en R et Python\/pandas (je testais le kernel R de Jupyter Notebook). Par souci de simplicit\u00e9, j&rsquo;ai s\u00e9lectionn\u00e9 de petites sections de code parmi l&rsquo;analyse compl\u00e8te.<\/p>\n<h4>1. Lecture des fichiers d&rsquo;entr\u00e9es<\/h4>\n<div style=\"font-size: 0.8em;\">\n<p>R :<\/p>\n<pre><code class=\"R\">tcga &lt;- read.delim('TCGA_LAML_kallisto.txt', header=TRUE)\r\nleuc &lt;- read.delim('Leucegene_GRCh38.84.txt', header=TRUE) <\/code><\/pre>\n<p>Python :<\/p>\n<pre><code class=\"python\">tcga = pandas.read_csv('TCGA_LAML_kallisto.txt', sep='\\t', index_col=0,low_memory=False)\r\nleuc = pandas.read_csv('Leucegene_GRCh38.84.txt', sep='\\t', index_col=0,low_memory=False) <\/code><\/pre>\n<\/div>\n<h4>2. D\u00e9finition d&rsquo;une fonction<\/h4>\n<p>La fonction head2 retourne les n premi\u00e8re(s) rang\u00e9e(s) et n premi\u00e8re(s) colonne(s).<\/p>\n<div style=\"font-size: 0.8em;\">\n<p>R :<\/p>\n<pre><code class=\"R\"># En R, la premi\u00e8re position est 1.\r\nhead2 &lt;- function(mx, n=3) { return (mx[1:n, 1:n]) }<\/code><\/pre>\n<p>Python :<\/p>\n<pre><code class=\"python\"># En Python, la premi\u00e8re position est 0.\r\ndef head2 (mx, n=3) : \r\n    return mx.iloc[0:n,0:n]<\/code><\/pre>\n<\/div>\n<h4>3. V\u00e9rifier la taille du jeu de donn\u00e9es<\/h4>\n<div style=\"font-size: 0.8em;\">\n<p>R :<\/p>\n<pre><code class=\"R\">print(dim(tcga))\r\nprint(dim(leuc))<\/code><\/pre>\n<p>Python :<\/p>\n<pre><code class=\"python\">print tcga.shape\r\nprint leuc.shape<\/code><\/pre>\n<\/div>\n<h4>4. Reformatage du nom des colonnes<\/h4>\n<p>Les noms des colonnes ont \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9s par le <em>pipeline<\/em> et contiennent le chemin vers le r\u00e9pertoire o\u00f9 se trouvaient les diff\u00e9rents fichiers trait\u00e9s. Pour le jeu de donn\u00e9es de Leuc\u00e9g\u00e8ne, les noms de colonnes ressemblent \u00e0<br \/>\n<code>\/data\/DSP001\/02H053\/transcriptome\/kallisto\/GRCh38.84\/abundance.tsv<\/code>. Pas tr\u00e8s convivial. Pour modifier ces noms de colonnes, nous utilisons des m\u00e9thodes sp\u00e9cifiques aux cha\u00eenes de caract\u00e8res.<\/p>\n<div style=\"font-size: 0.8em;\">\n<p>R :<\/p>\n<pre><code class=\"R\"># La fonction colnames() est utilis\u00e9e pour r\u00e9cup\u00e9rer les noms des colonnes d'une matrice ou d'un <em>dataframe<\/em>.\r\n# En R, les barres sont remplac\u00e9es par un '.' et un 'X' est ajout\u00e9 au d\u00e9but des noms \r\n# de colonnes qui ne commencent pas par une lettre.\r\n# Nous rempla\u00e7ons d'abord les parties communes \u00e0 tous les noms.\r\n\r\ncolnames(leuc) &lt;- gsub('X.data.', '', colnames(leuc))\r\ncolnames(leuc) &lt;- gsub('transcriptome.kallisto.GRCh38.84.abundance.tsv', '', colnames(leuc))\r\n\r\n# La partie DSP001\/02H053 change entre les \u00e9chantillons. Nous voulons r\u00e9cup\u00e9rer le\r\n# id de l'\u00e9chantillon, dans ce cas-ci, 02H053 (DSP001 \u00e9tant le id du projet)\r\n# Pour cela, nous s\u00e9parons la cha\u00eene de caract\u00e8res et retournons le deuxi\u00e8me \u00e9l\u00e9ment,\r\n# qui deviendra le nom de la colonne.\r\n\r\ncolnames(leuc) &lt;-  apply(as.matrix(colnames(leuc)), c(1,2), function(x) {return(strsplit(x, split='\\\\.')[[1]][2])})<\/code><\/pre>\n<p>Python :<\/p>\n<pre><code class=\"python\">\r\n# .columns est utilis\u00e9 pour obtenir les noms des colonnes d'un <em>dataframe<\/em>.\r\n# En Python, nous pouvons utiliser ce qu'on appelle une <em>list comprehension<\/em> au lieu \r\n# d'utiliser une boucle <code>for<\/code> pour it\u00e9rer parmi les \u00e9l\u00e9ments d'une liste.\r\n# Par exemple, [x+1 for [1,2,3,4]]  ajoutera 1 \u00e0 tous les \u00e9lements de la liste donn\u00e9e.\r\n# Ici, nous rempla\u00e7ons la partie commune des noms et s\u00e9parons la cha\u00eene de caract\u00e8res \r\n# restante pour retourner le deuxi\u00e8me \u00e9l\u00e9ment.\r\n\r\nleuc.columns = [x.replace('\/data\/', '').replace('\/transcriptome\/kallisto\/GRCh38.84\/abundance.tsv', '') \\\r\n   .split('\/')[1] for x in leuc.columns]<\/code><\/pre>\n<\/div>\n<h4>5. G\u00e9n\u00e9rer un graphique<\/h4>\n<div style=\"font-size: 0.8em;\">\nR :<\/p>\n<pre><code class=\"R\">library(ggplot2)\r\nmx &lt;-  as.data.frame(t(tcga[105,1:10]))\r\nmx[,1] &lt;- as.numeric(as.vector(mx[,1]))\r\nmx$Samples &lt;- as.factor(rownames(mx))\r\nggplot(mx, aes(x=Samples, y=`ENST00000631835.1`))+geom_point()+theme(axis.text.x = element_text(angle = 90))\r\n<\/code><\/pre>\n<p>Python :<\/p>\n<pre><code class=\"python\">## Il existe un module ggplot2 pour Python, mais ici \r\n## nous utilisons les fonctions de matplotlib qui sont int\u00e9gr\u00e9es dans pandas\r\n## Nous utilisons le style graphique de ggplot2 par contre.\r\nimport matplotlib\r\nmatplotlib.style.use('ggplot')\r\ntcga.ix[[\"ENST00000631835.1\"], 0:10].astype('float').T.plot(marker='o', rot=90)\r\n<\/code><\/pre>\n<\/div>\n<p>Voici ce que \u00e7a donne :<br \/>\n<center><\/p>\n<table cellpadding=\"20\">\n<thead>\n<tr>\n<th><strong>R\/ggplot2<\/strong><\/th>\n<th><strong>Python\/Pandas<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" class=\"aligncenter size-medium wp-image-3529\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot-66x66.png 66w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot-150x150.png 150w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot-200x200.png 200w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot-300x300.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot-400x400.png 400w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/r_plot.png 480w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/td>\n<td><img decoding=\"async\" class=\"aligncenter size-medium wp-image-3523\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/pandas_plot-1-247x300.png\" alt=\"\" width=\"247\" height=\"300\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/pandas_plot-1-200x242.png 200w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/pandas_plot-1-247x300.png 247w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/pandas_plot-1.png 377w\" sizes=\"(max-width: 247px) 100vw, 247px\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/center><\/p>\n<p>Choisir un langage de programmation plut\u00f4t qu&rsquo;un autre d\u00e9pend de la t\u00e2che \u00e0 accomplir, mais est aussi li\u00e9 \u00e0 un choix personnel. Toutefois, en ma\u00eetrisant plus d&rsquo;un langage, on se donne n\u00e9cessairement plus de flexibilit\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise \u00e0 jour 27\/08\/2018 J&rsquo;ai d\u00e9j\u00e0 introduit la librairie Python pandas en comparant certaines de ses fonctions \u00e0 leurs fonctions \u00e9quivalentes en R. Pandas est une librairie qui rend Python beaucoup plus facile \u00e0 utiliser pour faire de l&rsquo;exploration et de la visualisation de donn\u00e9es (presque autant que R). La librairie permet de manipuler des dataframes tr\u00e8s facilement (elle est construite par-dessus numpy). Elle a beaucoup \u00e9volu\u00e9 ces derni\u00e8res ann\u00e9es et la communaut\u00e9 d&rsquo;utilisateurs a aussi beaucoup grossie. R offre <a href=\"https:\/\/bioinfo.iric.ca\/fr\/r-ou-python-a-vous-de-choisir\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":3,"featured_media":3543,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[161,26,24],"tags":[129,144],"class_list":["post-3515","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analyse-de-donnees-fr","category-langage-python","category-langage-r","tag-analyse-de-donnees","tag-debutant"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2017\/06\/panda_plot-1-e1498499175720.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/3515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=3515"}],"version-history":[{"count":23,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/3515\/revisions"}],"predecessor-version":[{"id":4146,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/3515\/revisions\/4146"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media\/3543"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=3515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=3515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=3515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}