 Alors, la librairie Immunio, elle réside à l'intérieur de l'application web. Cette application sert à accumuler du metadata à propos des requêtes, et puis ensuite, nous, on prend ce metadata et puis on l'envoie à nos serveurs pour en faire de l'analyse. Alors, le défi pour nous, c'est qu'en étant dans vos applications web, la performance est très importante. Donc, si on prend beaucoup de temps, on ralentit vos utilisateurs et c'est inacceptable. Un autre défi, c'est que toutes les requêtes de tous nos clients sont envoyées à nos serveurs. Donc, dans le jargon des TI, il faut être web scale. Donc, pour ce faire, c'est très important de mesurer la performance de notre client qui réside dans l'application et de notre serveur qui réside chez nous. Alors pour ce faire, on a besoin d'outils. Le plus fort du temps, je ne sais pas de quoi je parle et je ne sais pas de quoi je cherche non plus. Et puis, c'est bon d'avoir un outil justement interactif qui me permet d'essayer d'explorer et de finalement trouver c'est quoi que je recherche, c'est quoi les pépins de performance qu'on a, c'est quoi les bâtonnecks. On ne sait pas souvent à l'avance. Alors, il faut explorer et c'est là que vient air, justement. Alors, comme vous pouvez voir par le curseur, ceci sera une présentation interactive. Alors, plus que je tape super vite. En fait, non, j'ai écrit un petit problème pour aller un peu plus vite encore. Bref, mais c'est du cas de live quand même. Et puis ici, on voit vraiment l'interface air. Alors, lorsque j'ai parlé de cette présentation pour la première fois à un de mes collègues, Marc Labé qui est justement là. Il m'a dit, oui, c'est bien beau. Air comme environnement interactif. Sauf qu'il y a aussi Hi Python. Et puis avec NumPy, comme nous a montré, Marcin, on peut aussi faire beaucoup de choses. Alors, ce que j'ai décidé de faire, c'est de comparer les deux. Alors, première chose que je vais montrer. Donc, il y a beaucoup de similitudes, en fait. Ce n'est pas vraiment deux mondes séparés, c'est encore des stats. Par exemple, en haut, on a data qui est un data frame. Et puis un data frame, c'est comme un spreadsheet. Donc, ça a des rangées pour les observations et puis des colonnes pour nos variables. Vous trouverez les mêmes choses dans NumPy. NumPy ou NumArray ou d'autres choses. Pardon? NumPandas. NumPandas. Mais NumArray, c'est pas mal semblable. À moins que ce soit pas mal plus une matrice. Bref, c'est des concepts que vous allez revoir souvent dans les stats. Là, j'ai aussi en profité pour donner des petits conseils pour les développeurs Python qui vont regarder R pour la première fois. Et puis, une chose que j'ai réalisé bien tard, c'est que, par exemple, dans ReadPoint CSV, qui est assez explicite que ça veut dire, le point veut rien dire en R. Ça n'a pas de signification. C'est pas comme un séparateur entre un objet et ses méthodes et ainsi de suite. Ça veut rien dire. C'est juste la syntaxe. Donc, c'est fait pour aider la lisibilité. Aussi, comme dans Python, les variables sont déclarées automatiquement lorsqu'on les assigne et puis pas mal de doc typing qui se fait en R aussi. Alors, une autre chose, un autre avantage avec R par rapport à Python, c'est que R a un peu une longueur d'avance. Et puis, R, ça fait longtemps qu'il y a là, il y a une librairie qui s'appelle CRAN Comprehensive R Archive Network. Et puis, ça, c'est une riche librairie de modules qui viennent surtout d'une communauté forte en statistiques. Alors, avec NumPy, en plus, on vous trouvait plus une communauté forte en développeur, mais en R, c'est surtout des statistiens. C'est un peu dense pour certains d'entre nous, mais les choses sont là. Donc, par exemple, ici, j'utilise la librairie reshape, qui est une librairie qui sert à transformer les données. Et puis, ça, c'est une grosse partie d'ailleurs des statistiques ou de l'exploration parce que quand on explore nos données, on doit souvent transformer nos données pour qu'elles soient plus utilisables. Pour qu'on puisse, par exemple, les mettre dans un graphique. Avant que la fonction graphique, que ce soit dans NumPy ou en R, elle s'attend à des données structurées d'une certaine manière. Alors, on passe beaucoup de temps en fait à manipuler les données. Alors, ça, c'est une manière de le faire. Et puis, il y en aura tant d'autres parmi dans la présentation. Ah oui, un autre petit détail. L'assignation en R se fait avec des plus petits quels égales. Elle peut aussi se faire avec des égales. C'est juste qu'il y a une raison subtile. C'est que, des fois, R peut avoir des scopes comme des contextes. Et puis, si on veut que la variable que l'on assigne dans un scope soit disponible à l'extérieur du scope, on peut faire double le plus petit qu'égale. Mais je n'ai jamais vraiment vu ça utiliser en pratique. Alors, la prochaine chose. Ah oui, en passant un petit détail le fun pour ma présentation. Ça, c'est en fait une fonction que j'ai écrite en R pour faire un logo qui ressemblait à celui de Piton. Alors, ça, en fait, c'est du R. Ce n'est pas une image que j'ai gossée dans game. Bon, là, on commence finalement avec les statistiques. Je vais vous décrire ce que j'ai décidé de préparer pour ce soir. Alors, ce n'est pas grand-chose. J'ai pris des codes-figures qui me sont venus à l'esprit. Je n'ai pas eu le temps vraiment de les manigancer pour qu'elles reflètent ce que je veux vous démontrer ce soir. Donc, c'est bien heureux. Donc, j'ai pris des choses aléatoirement. Premièrement, comme somme, qui est la somme cumulative. Dans mon cas, je l'ai faite la somme cumulative d'un vecteur de 1 à 1 million. Donc, 1, 3, etc. Alors, j'en pourrais fêter une des deux couleurs de Piton qui en mauve pour la couleur du logo de R. Alors, voici le temps. Voici MT. Donc, ça, c'est pour un fichier vide. Je voulais comparer un peu aussi la base, parce qu'une fois qu'on est interactif, une fois qu'on est dans le fichier, c'est à partir de ce moment-là que ça compte vraiment la performance. Alors, ça, je m'y attendais un petit peu. R est un peu plus lent que Piton à LOD. C'est pour très grave. Indexing. Donc, ça, c'est pour indexer dans une matrice de, je pense, 5 par 1000 à plusieurs reprises. Donc, c'est en utilisant un num array en Piton. Donc, une structure de données procurée par NumPy. Kendall, ça, c'est co-efficient de corrélation. Oui, c'est bien ça. Entre deux matrices de 50 par 50. Donc, Spierman, c'est aussi un autre co-efficient de corrélation. La différence, c'est que c'est le order of growth. Lui, n exposé en deux. Lui, je pense que Spierman, c'est n. Donc, on voit que c'est quand même comparable. Et puis, read. Lui, c'est celui qui sera le plus intéressant. Ça, c'est pour lire des données. Donc, quand on a des données qui viennent de plusieurs sources, que ce soit de résultats de tests, que ce soit de fichiers de logs, etc., on lit un paquet de données ou ça peut même être directement d'SQL. Et puis, des fois, on peut lire vraiment beaucoup de données. Alors, ça peut être pertinent le temps de lecture. Alors là, afin d'égaliser un peu le temps d'interaction, on va supprimer... Ah oui, je vais vous parler un peu des formules. Moi, je vais vous parler d'une matrice, mais vous savez tout, c'est quoi une matrice? Oui. Bon, alors ensuite, tout ce que j'ai fait, c'est qu'en gros aussi, la première ligne, j'ai pris le data puis j'ai supprimé le time data de MT. Alors, ça, c'est juste... Est-ce que je voulais vous montrer ici? Ecoutons, ça va faire ça. Mieux. Ce que je voulais vous montrer ici, c'est vraiment que R est assez simple. Vraiment, chaque chose que je vais vous démontrer ce soir, ça fit vraiment dans cette petite espace-là et puis on a des petites récompenses assez rapides. Alors, le code pour le plot était exactement pareil avant. Tout ce que j'ai fait, c'est que j'ai réutilisé le même data sans MT et puis maintenant, j'ai les résultats d'avant sans le temps pour loader l'application. Alors, le temps de réponse est très rapide et puis c'est le point d'en regarder. Sauf que là, le problème, c'est qu'on ne peut pas vraiment comparer une colonne avec une autre. C'est pas vraiment... Si j'avais roulé un de ces benchmarks-là avec plus de code figure, les bases seraient différentes. Alors, ce qui est cool, c'est que on peut utiliser la fonction Scale. Donc, Scale, ce que ça me permet de faire, c'est de soustraire la moyenne et puis de diviser par la Standard Deviation. C'est quoi, déjà, sans français? Des quartiers. Des quartiers. Merci. Et puis, d'habitude, ça, ça donnerait des valeurs positives et négatives, sauf que, en mettant Center-Egal-False, ce sont des valeurs positives qui sont plus facile, plus fun à comparer. Donc ici, par exemple, on peut voir que R est pas mal et plus rapide de manière consistante par rapport à Python. Surtout dans le cas de R'spearman pour une raison ou une autre. Mais que R soit plus rapide que Python, c'est pas toujours pertinent. Ça dépend vraiment des variables qu'on veut explorer. Si on a vraiment beaucoup de données, ça peut être important, mais si on n'en a pas tant que ça, la différence est négligeable. Bon, en plus de la performance, il y a aussi l'espace que ça prend en mémoire. Alors ça, c'est pertinent pour nous parce que dans les deux cas, en R ou en Python, on est limité par l'espace de mémoire que l'on a pour jouer avec nos chiffres. Là, j'ai les mêmes codes-figurés qu'avant, mais celui qui est intéressant, c'est Read. Ce qui est encore plus intéressant, c'est de voir c'est quoi la valeur dans l'axe. On parle ici d'un fichier... Ça, c'est le Read est fait sur un fichier de log que j'ai transformé en CSV qui contient seulement, je crois, 10 000 entrées. C'est pas beaucoup. En fait, vous verrez plus tard, j'ai un exemple avec un fichier de log pour une journée qui est 400 000 entrées et puis un homme paie plante. Alors ça peut être pertinent, ça peut ne pas l'être dans vos cas, mais c'est juste bon à savoir qu'il peut y avoir des surprises comme ça. C'est ce que tout à l'heure. MTI, R prend un peu plus d'espace en mémoire. Ça, c'est parce que KitchenSync est included. On sous-strait comme tout à l'heure. C'est assez simple. Et puis là, on fait le scale encore. Et puis le seul cas... Là, on verrait vraiment que c'est drastique. Mais le seul cas où R prend plus d'espace mémoire que Python, c'est pour l'indexation. Je sais pas trop pourquoi, mais dans le relatif, c'est comme si un était deux fois meilleur que l'autre, mais dans l'absolu, c'est encore très raisonnable. Alors, ça c'est un exemple. J'ai un autre exemple pour vous. L'autre exemple, c'est GitHub. Bon, un autre source de données inépuisables, c'est GitHub. Avec tous les projets qui sont sur le site, il y a beaucoup d'opportunités pour faire des stats de toutes genres. Pour ce soir, j'ai pris des stats de stats models qui étaient présentés par Marcin tout à l'heure. Et puis je voulais juste voir par curiosité de quoi avait l'air le profil du projet. Donc tout simplement, j'ai utilisé encore un autre bar plot par jour. Et puis... Ah, une chose que je voulais vous montrer aussi, c'est la fonction table. Alors beaucoup de fonctions qui sont vraiment utilisées souvent en air sont disponibles très facilement. Il y en a qui sont utilisées souvent qui ont juste une lettre. Et puis ça, ça me gosse un peu, mais c'est utilisé tellement souvent qu'ils font... tu finis par l'apprécier. Par exemple, la fonction T pour transpose. Donc, c'est utilisé régulièrement, puis on finit par s'habituer. Il y a aussi beaucoup d'abréviations qui me gosse pas mal. Comme call, c'est pour color, pas pour column. Et puis c'est ça, le problème avec les abréviations, c'est que ça peut souvent dire deux choses et puis des fois, il y a même deux façons d'abrévier le même mot. Bon, pour revenir ici, table. Table est une fonction aussi qui est utilisée assez souvent. C'est pour créer une table de contingence. Alors ça, c'est bien cool. T'as une table avec un paquet de valeurs de la frequency que chacune de ces valeurs apparaît. Donc dans ce cas-ci, ce que je veux, c'est une table qui montre la fréquence qu'un certain jour apparaît. Un jour sans les heures et les minutes et les secondes. Alors ce que ça me donne, comme gratuitement, c'est ce beau bar plot. Sauf qu'il y a trop de granularité. C'est ça le problème avec ces graphiques. Alors ce qu'on peut faire, c'est tout simplement changer ça et en faire par semaine. Donc là, c'est un peu plus fun. Puis on peut voir, ça, c'est pour l'année dernière. Alors je vais juste faire une année parce que le projet a quand même plus quelques années. Alors tout ce qu'on fait, c'est encore une table de contingence par semaine. Et puis on voit que, à ce temps-ci de l'année, on dirait que c'est pas mal autour de Python. Il y avait pas mal plus d'activités. Ça a du sens. Donc, mais la fonction demeure essentiellement la même. Je vais vous parler de quelques autres choses de R. Donc R peut être presque infiniment paramétrisable, sauf que dans plusieurs colles, certains des paramètres sont globales. Donc ce qu'il faut faire, c'est sauver les paramètres, puis ensuite en dernière ligne, les réinstaurer. Dans ce cas-ci, tout ce que je fais, c'est qu'encore une fois, il y a un paquet d'abriviations. Je fais part pour paramètres, marre pour margin. C'est pénible. Afin d'avoir une marge un peu plus large pour certains des noms. Et puis ensuite, j'utilise encore une table de contingence que cette fois-ci je sorte. Et puis je le mets dans un barplot simple et puis j'ai essayé de donner que ce sont vraiment merveilleuses. Il y a d'autres abriviations superlophones. CX, c'est Character Expansion. LAS, c'est quoi? C'est Label. Label, what? Label Style, je m'en rappelle même pas. Mais bref, c'est pas très important, ça c'est juste style. L'important, c'est que la ligne Sort Table, ça vous permet d'avoir beaucoup de données, une richesse de données, pas mal immédiates. Ensuite, maintenant qu'on a les commets, en plus des commets, il y a aussi les lignes qui ont été committées par jour. En bleu, on a celle qui a été achetée. En rouge, c'est à dire qui ont été supprimées. Il arrive souvent un problème que l'on peut inventer dans un graphique, c'est quand on a beaucoup de données, il y a un problème d'aliasing. Donc, ou ce que les données paraissent fausses parce que tu essaies d'en fourrer trop d'un peu d'espace. Alors, si on grandissait ça beaucoup plus, on verrait peut-être une autre image qui émergerait. Donc, afin de résoudre ce problème-là, ce qu'on peut faire, c'est changer plutôt que de le faire par compte, par semaine. Donc, ça, c'est encore de fois, c'est plus intéressant. Ce qui est le fun de voir ici, c'est qu'il y a un effet miroir très souvent, lorsqu'on ajoute des lignes, on en supprime. Et puis, qu'est-ce que je pourrais vous raconter de celui-ci? Ah oui. La fonction aggregate qu'on voit en haut, malheureusement, ça a coupé un petit peu. En fait, je peut smeller un peu. OK. Alors, aggregate, c'est une de mes fonctions préférées. Ce que ça fait, c'est que ça agrège en appliquant une fonction. Donc, par exemple, dans ce cas-ci, ce qu'on voulait, c'est qu'on a un paquet de stats pour les lignes de code qui ont été committées. Ce qu'on veut, c'est en faire la somme par semaine. Et puis, c'est aussi simple deux fois pour les lignes qui ont été ajoutées, les lignes qui ont été supprimées. J'ai utilisé A et B parce que c'est les préfixes par défaut. Quand on fait un git, on voit A, Slash, le nom du fichier, B, Slash, je sais pas d'où ça vient, peut-être première lettre de l'alphabet. Et puis, c'est pas mal ça. Et très rapidement, on a du bonbon à regarder. Next. Ah! Là, la question qui vient après, ici on faisait la somme des deux. Et puis, c'est aussi simple que ça. Vraiment, ça fait pas très souvent que j'utilise R. Et pourtant, j'ai des récompenses assez rapides. Et ici, tout ce que j'ai fait, c'est que j'ai ajouté A count avec B count. Et puis, j'ai pu assigner les couleurs que je voulait. Même si c'est pas toujours pertinent d'avoir les couleurs, c'est important. Et puis, là, on a un beau graphique. Ah oui! Un autre petit tel dont je vais vous parler. Un des plaisirs que d'utiliser R. Regardez la deuxième ligne. Donc, ce que ça fait, c'est que si la somme est plus grande que 0, plus 1, donner la première couleur, donner une couleur, sinon, si la somme est plus petite que 0, donner l'autre couleur. Donc, en piton, ce serait soit 0 ou 1, bouliens, 0 ou 1. Sauf que le plaisir de R, c'est que les vecteurs ou les arrays commencent pas à 0. Ils commencent à 1. Alors, c'est pour ça qu'il faut ajouter 1. Ça, c'est toujours quelque chose de fun. Jouer avec R, mais on s'habitue à la longue. Mais c'est vraiment pas drôle au début avec ça. Ah, next. Ah, OK. Ça prend un petit peu de temps. Là, on est en train de l'OD, le fichier de... au-delà de 400 000 entrées. Et puis... Ah, ce qui est cool aussi, c'est la fonction String P-Time, je sais pas que le P, à quoi il veut dire, peut-être print. Je sais pas si piton fait ça, mais je sais que la manipulation de joe, de date en piton, c'est toujours en n'importe quelle langue, c'est toujours pénible. Mais bref. Ah oui, un autre petit détail. Ah oui, pour comparer un peu de piton et R encore. Alors, R ici, on vient de read CSV comme au tout début. Alors on read un fichier CSV. Et puis R fait un effort pour découvrir c'est quoi le type de tes colonnes. Donc ici, il y a une colonne qui ressemble à du texte, il lui assigne du texte. Si ça ressemble à des chiffres, il va assigner, il va en faire des integers ou des floats. Ici dans ce cas-ci, par exemple, ça, c'est un fichier d'access log d'un serveur Web. Donc, le status, le status code qui est 200, 400, 500, R a pensé que c'était un integer, un chiffre, et puis là, je le caste à un factor, qui soit une valeur nominale, bref. Et puis en NumPy, quand j'ai utilisé une version, load texte dans NumPy que j'ai su d'utiliser, je vois des grimaces, avec raison. Faites attention avec load texte. Il se peut que ce soit, que j'ai utilisé, non, je n'ai pas pu l'utiliser dans mon exemple du début, de mon benchmark, parce que quand j'essaye de loader du texte, il y a des données qui sont un peu pas tout à fait comme NumPy veut. Il crash, sans même te dire, c'est quelle ligne, c'est quelle colonne, il dit juste, cette empty string, c'est pas ce que je m'attendais. Socks to be you. Alors, je me suis vite tanné et puis je l'ai fait autrement avec NumPy en le visant avec Python CSV, et puis après ça, le passant à un NumPy NumPy. Alors, c'est ça mon benchmark. Mais là, pour revenir à ceci, alors ça, NumPy a fait du bon travail pour essayer de rendre des colonnes consistentes. Sauf que dans certains cas, il ne pouvait pas savoir que status, c'était un valeur nominal. Là, voici une autre librairie. Alors là, j'attendais à la fin de la présentation, mon dernier code figure pour introduire Djplot. Quelqu'un est allé au Mont-Sinaï et il a parlé à Dieu et puis Dieu lui a dit comment écrire NumPy. Djplot, c'est absolument magique. Si vous pensez que pour l'instant, j'ai de la pas mal plus bruyant que je suis avec Djplot, je suis comme exponentiellement. Ça fait des super beaux graphiques et puis souvent, it does the right thing. Ça fonctionne malgré moi. Donc, par exemple, ici, ce qu'on fait, c'est que je fais juste montrer les requêtes par heure pour le site web de mon ami. Et puis, autour de midi. Par accident, j'ai pris des logs du jour de l'an. Alors, ici, on voit que le monde était bien occupé à mes nuits à jouer à son petit jeu. Alors là, Djplot, ce qui est cool, c'est aussi ici, je voulais montrer, représenter par heure. Alors, c'est tout ce que j'ai fait, c'est BinWidth 3600, donc ça, c'est 60x60. Et puis, si j'avais eu besoin de le faire autrement, j'ai été obligé de, tu sais, aggreger encore pour faire la somme de toutes les choses par jour, etc. C'est tout fait comme magiquement pour moi. C'est vraiment merveilleux. Sauf que là, je me demandais hum, est-ce qu'il y a un moyen de voir les requêtes par jour avec les status codes dedans? Voilà. Voici. Alors j'ai assiné des codes qui n'aient pas des colonnes, c'est des couleurs avec en utilisant Rainbow. Rainbow, c'est pas mal magique, c'est comme les Vincamp. Et puis, ce que ça donne, c'est un paquet de couleurs dans un certain autre. Et puis, là, l'ingrédit magique ici, c'est Phil. Donc Phil, égal status, utilise cette variable-là, dans le data pour dire quelles couleurs utiliser. Et puis c'est pas très beau, malheureusement. Et puis, une des raisons c'est parce que c'est pas en ordre. C'est en ordre de chiffres. Mais ce qu'on voudrait en fait, c'est être en ordre du plus commun au moins commun pour qu'on puisse voir ce qui est plus commun ici, ensuite le deuxième moins commun etc. Donc comment faire ça? Alors, ce que j'ai fait, c'est que j'ai converti le status, plutôt que d'être dans une valeur strictement nominale, j'ai transformé une valeur ordinale. Je sais pas si ça dit en français, mais bref c'est comme lui donner un ordre. Et puis, l'ordre est en fonction d'une nombre de fois que le statut apparaît. Donc on a encore table, qui est une table de contingence. Donc on peut voir combien de fois chacun des statuts apparaît et puis après ça on met cette table en ordre, et puis après ça on met le statut dans cet ordre-là. Là ça nous donne ceci. Alors on voit que le status 200 apparaît plus souvent 304 ensuite, et ainsi de suite. C'est merveilleux. Et puis ça apparaît un peu plus beau aussi. Où suis-je? Ok. Là, on peut voir les mêmes données avec un Instagram. Donc on utilise encore djiplot, on utilise encore fil et gaz status, et puis en plus plutôt que de l'additionner avec un geom barplot, on fait un geom histogram. Et puis ça, ça demande encore un Instagram avec les mêmes couleurs qu'avant. On reste consistant. Le problème avec ce genre de graphique-là, c'est que ça arrive souvent qu'on a une donnée qui fait disparaître toutes les autres. Alors ce qu'on peut faire, c'est juste status n'est pas égal 200. Et puis là, on a les mêmes couleurs, même tout, sauf que là on peut au moins faire un peu plus de choses sur les axes. Encore fois, les autres disparaissent pas mal, mais on peut juste continuer et puis faire le même exercice. Là, on arrive près de la fin. Ça, ça devient des choses plus corsées. Qu'est-ce que je peux vous dire de ceci qui pourrait vous exciter? C'est que ben, air vient avec toutes sortes d'outils, comme deftime, que je trouve aussi bien pratique. La manipulation de temps, donc on parlait de la manipulation de données au début, c'est des frustrations d'utiliser air ou d'utiliser python ou n'importe quelle langue. C'est manipuler le temps et puis air, c'est quand même pas si pire que ça. C'est moins bon que deftime, je suis d'accord. Mais il y a quand même des choses comme pour se débrouiller. Alors ici, ce que je fais, c'est juste, je suis en train de calculer la bande passante. Une fois la bande passante calculée, puis ce que je manque de temps, je peux faire un petit plat de faune. Et puis ça, encore une fois, ça me fait pareil bien et puis ça me permet de finir la présentation sur une note forte ou est-ce que ça montre la variation, la courbe moyenne, et puis les points, ça, c'est en fait la bande passante utilisée à différentes heures.