 bonsoir tout le monde est-ce que est-ce qu'on est bien en direct, est-ce que c'est moi que ça fait longtemps que j'ai pas présenté, est-ce que on me voit bien Yannick? Oui, c'est bon, ok, c'est bon, ok, je parle, merci Ben c'est ça, je vais juste vous mettre, ok c'est bon Ben c'est ça, bonsoir tout le monde, bienvenue à Moréan-Pitton 90, Uranium Floral et Ben en anglais c'est... Ben je vais parler en anglais Hi everybody, welcome to Moréan-Pitton 90, Moréan-Pitton 90, Uranium Floral Avant de commencer, ben j'aimerais vous suéter une bonne année Ben je sais que c'est un peu en retard, on est déjà le 17 Ben on n'a pas eu d'occasion, j'aimerais quand même vous suéter une bonne année Avant de commencer, j'aimerais juste que vous suiez une bonne année Je sais que c'est un peu en retard, mais on n'a pas eu d'occasion de suier une bonne année Ok, bien, à Moréan-Pitton, nous avons notre, ben comme toujours, notre Côte de Conduit On veut que tout le monde s'amuse, mais avec une bonne Côte de Conduit Ben c'est assez simple, le Côte de Conduit c'est juste qu'on veut que tout le monde soit excellent avec tout le monde Donc si vous voyez ou si vous entendez quelque chose qui n'est pas correct vous pouvez soit mettre le commentaire dans notre channel YouTube ou vous pouvez nous écrire sous Slack Ben notre équipe est là pour vous, on va essayer de régler le problème Donc à Moréan-Pitton, nous avons une Côte de Conduit Donc le Côte est assez simple On veut que tout le monde soit bien entre l'un et l'autre Donc si vous voyez ou entendez quelque chose qui n'est pas correct vous pouvez envoyer un message sur le Slack ou sur le YouTube Ok, ça c'est fait Après ça, je vous ai mis deux liens ici c'est que le premier lien c'est pour que notre après-hours quand on va finir les présentations, on a après-hours alors si vous avez le temps ou pas trop copié, vous pouvez nous rejoindre là Et donc le premier lien que je pose ici c'est le après-hours donc si vous voulez nous rejoindre après les présentations vous pouvez nous rejoindre pour nous réunir En parlant de notre après-hours j'aimerais remercier notre partenaire, qui est FGNA qui est notre qui nous support pour le service de TTC l'application cognitise Donc après l'hours, je voudrais remercier notre partenaire FGNA qui sponsorise nous pour le service Ok, j'ai presque fini C'est ça le dernier l'annonce que je veux vous annoncer c'est qu'on cherche des bénévoles pour nous aider à organiser l'événement ce qui est important que je vous souligne ici c'est que vous n'avez pas à savoir coder un piton c'est qu'on cherche quelqu'un pour nous aider à organiser les événements ou organiser des ateliers, des trucs comme ça la programmation un piton c'est moins important ici Merci vous êtes développeur un piton, c'est sûr que vous êtes bienvenue ici Le dernier annonce que je veux vous parler c'est qu'on cherche des bénévoles pour nous aider à organiser les événements comme la programmation et on va avoir beaucoup d'événements donc nous avons besoin de plus de volontiers pour nous organiser et vous n'avez pas un skill de piton pour organiser les événements si vous n'avez pas un skill, vous êtes bienvenue mais si vous avez un skill de piton pour organiser les événements vous êtes bienvenue c'est suffisant, je vais vous parler de ceci avec Nicolas je vais voir si je peux vous donner Nicolas Bonjour Nicolas Oui, oui, je l'ai entendu Oh oui, je suis désolé, je m'ai fait un petit tour je suis désolé, je l'ai oublié Nicolas est le chef de la visualisation à Lodly et je veux souhaiter bienvenue à Nicolas Nicolas a fait la deuxième fois il n'y a pas de nouveau chez nous je pense que j'ai manqué quelque chose ça fait toujours plaisir de revoir peut-être que je n'étais pas encore là quand tu as fait les présentations bienvenue à notre... bien bienvenue je te laisse te présenter un peu Nicolas Merci beaucoup Bonjour tout le monde, je m'appelle Nicolas Christian je suis le chef de la visualisation de Lodly je l'appelle Nicolas pour l'année dernière, mais c'est là qu'on est, et merci d'avoir regardé mes pré-records. Donc, Duk, si vous voulez jouer le vidéo, je vais ouvrir ma caméra, mais je suis là, et je vais retourner à la fin. All right, see you later, Nicolas. Et merci d'avoir moi ici à Montréal-Python. Aujourd'hui, je vais parler d'un fresh look à la landscape de la visualisation de Python. Donc, comme maintien de la library de Plotly, je suis part de la communauté de Python de la visualisation de Python, et nous avons un site qui s'appelle pyviz.org, qui est un site communautaire. C'est essentiellement poweré par un YAML file, et c'est sorti de l'updater chaque jour par l'automation. Et c'est comme ça, si vous êtes part de la landscape de visualisation, soit un maintien, ou un utilisateur, c'est votre site. Et c'est la ressource pour aider les gens à trouver leur manière entre ce genre d'écosystème que nous avons pour faire de la visualisation de Python. Donc, si je regarde tous les outils ici, ça va donner une justification pour moi de dire que c'est cette merveilleuse mondiale. Il y a beaucoup de outils pour faire de la visualisation de Python. Si je scrollerai sur cette page, il y a peut-être 100. Et donc cette page, cette page de toutes les outils est un peu de registre pour tous les libraries de viz qui existent dans Python. Et c'est pocketé dans un nombre d'outils. Donc, vous avez des libraries de core ici. Plotlib.py, ici, c'est celui que j'ai maintenu. Et il y a des informations pour aider les gens à savoir comment les libraries sont populaires et à savoir comment ils sont, pour avoir de l'aide. Donc, en termes de combien de stars il y a sur GitHub, combien de contributaires il y a, comment souvent ces choses sont downloadées un mois. Et ensuite, qu'est-ce qu'ils sont construits? Donc, vous pouvez voir que certains des libraries non-core, comme les libraries de haut niveau ou les libraries de native GUI, certains sont construits sur le top des libraries core. Donc, vous pouvez voir ici que c'est construit sur le top de Matplotlib. Ce n'est pas techniquement entièrement vrai à l'époque. Parce que, si vous appelez Pandas.plot, vous pouvez targetter un nombre de différentes libraries. Mais il y a une certaine structure ici. Certaines de ces autres libraries sont construits sur le top des core. Et puis, certains de ces headings ici incluent les libraries de haut niveau pour travailler avec des données dans une sorte de perte. Les libraries de native GUI pour construire des applications desktop, les libraries scientifiques pour visualiser des données de réel monde, comme les données de 3D, les libraries géospatiaires pour faire des maps, etc. Donc, c'est une page assez utile, c'est un peu dégueulasse. Et donc, il y a une page qui s'appelle Overviews, qui donne un nombre de liens à plusieurs blogs, posts et stocks de conférence qui ont été donné, qui tentent de comparer et contraste ces différentes libraries pour vous donner un sens de ce qu'il faut utiliser. Et puis, sur le top, il y a un diagramme. Ce diagramme est une adaptation de un graphique qui a été first presented à PyCon en 2017 par Jake van der Plas. Et c'est un sort de conceptuel de l'aspect des landscapes de base Python. Il y a un nombre de catégories, comme Mapplotlib, et les libraries qui sont sortis liées à Mapplotlib. JavaScript, et les libraries qui utilisent JavaScript, incluant les libraries qui utilisent D3JS, qui est une librae de JavaScript spécifique. Et puis, il y a un nombre de systèmes qui utilisent OpenGL pour direct access à un carton de graphique. Et puis, sur le point, dans les dernières années, j'ai demandé si il y avait une façon différente pour présenter cette same information et combiner un peu de la taxonomie sur la page de tous les outils, et un peu de la visualisation de la visualisation Python. Et c'est ce que je veux parler de aujourd'hui. Je n'ai pas été complètement fait avec mon diagramme, mais c'est déjà fait que je veux partager mon travail en progrès avec la communauté de Python ici à Montréal Python. Et puis, après que ce soit sur YouTube avec la communauté de la visualisation Python et avoir des réponses pour voir si c'est peut-être un diagramme qui peut rester ici à l'arrivée, à l'arrivée de cette pièce. Alors, je vais vous montrer mon diagramme. La question que j'ai demandé est la question de la question de ce qui va entre quelques applications spécifiques de Python que peut-être vous avez évoquées et un utilisateur qui veut regarder des visualisations. Donc, le code Python va produire une visualisation que l'utilise va voir et interagir. Maintenant, cet utilisateur peut être quelqu'un d'autre, peut-être un customer, peut-être un collègue ou peut-être vous. Peut-être que vous avez écrit quelques codes Python pour visualiser vos données. Et ça, c'est tout de bien. Donc, le plus facile de faire ça, le plus facile de faire quelques codes Python pour produire une visualisation pour un utilisateur, je dirais, est pour ce code Python pour basicement évoquer un file sur le disque, dans un des formats comme un file PNG ou un file SVG et pour l'utiliseur pour ouvrir ce file dans un éditeur ou un éditeur. Donc, si je suis sur macOS ici, je peux ouvrir ça en preview et regarder. Donc, c'est probablement le plus facile à faire. Et vous verrez que ces éros ici sont unidirectionnels. Donc, quand mon code Python a produisé mon file raster et j'ai ouvert le code dans un éditeur, si je clique sur le file PNG, mon code Python ne sait rien de cela. Donc, c'est un peu un des formats. Un autre moyen que le code Python pourrait produire une visualisation est d'ouvrir une windows-native, c'est-à-dire un Windows macOS et de l'entraîner. Et puis, quand l'utiliseur voit cette windows, ils peuvent cliquer, ils peuvent panner, ils peuvent zoomer. Et ces éros sont tous bidirectionnels parce que tout ce que l'intermédiaire est utilisé pour générer cette windows peut capturer ces événements et poursuivre les événements pour les applications spécifiques de Python. Donc, vous pouvez construire un code Python très riche, interactif, plein d'applications en Python qui rendent une visualisation interactive en utilisant ces outils. Donc, pour longtemps, c'était le moyen où les choses fonctionnaient. Mais évidemment, dans les années 20, un nouveau genre de windows a été plus populaire. Vous pouvez l'avoir entendu, c'est-à-dire des browsers. Les browsers web, comme celui que j'utilise pour régler cette visualisation particulière. Le plus facile de la façon pour que Python interacte le browser est pour l'application spécifique de Python d'écrire un file html à la disc. Et puis, pour l'utiliser d'écrire un file html dans le browser. Et puis, on obtient beaucoup de les mêmes caractéristiques que quand vous ouvrez un file raster ou un vector, d'exception que le browser est assez smart, assez dynamique. Et donc, ce file html quand c'est rendu dans votre browser peut être assez interactif. Peut-être que vous pouvez panne, peut-être que vous pouvez zoom, peut-être que vous pouvez couper sur les choses avec tout dans le browser. À ce point, l'application code est de la picture parce que c'est écrit son file à la disc et c'est terminé. Si vous voulez kind of close le loop et avoir votre application en code Python pour pouvoir retirer les événements du browser, vous devez utiliser des technologies différentes. Maintenant, ici, j'ai listé des technologies spéciales sur les visualisations. Jupiter, Voila, Dash, qui est lié à la library de Plotly que j'ai maintenie. Panne, Streamlit. Évidemment, j'ai pu mettre Django ou Flask ou Fast API ici. Mais ce n'est pas des systèmes spécialisés sur les visualisations. Et donc, je les ai mis dans mon diagramme. Donc, c'est comme j'ai pensé dans le landscape technologique que les libraries de visualisation en face de Python. Vous avez des applications en code spécifique ici. Vous avez un utilisateur ici et ici, il y a un bunch de technologies qui peuvent être utilisées pour parler à cet utilisateur. Et donc, ici, maintenant, je peux mettre un nombre de les libraries de Python. Maintenant, évidemment, je ne vais pas faire une map complète ici. Ce diagramme est déjà assez très busy. Donc, j'ai choisi la plus high utilisée dans les sortes les plus représentatives pour ce diagramme particulier. Et ce que j'ai fait est que j'ai basiquement étendu qui parle à qui et comment. Donc, on commence en regardant ce sort de magnifique mapplotlib ici dans le milieu. C'est le plus downloadé et le plus utilisé dans le library de visualisation en Python. Et ce diagramme peut-être vous aidera à vous montrer pourquoi. Donc, si je regarde tous les éros qui entrent dans et de la box de mapplotlib ici, vous pouvez voir que la mapplotlib est un peu d'extrême qui parle à tout le monde. C'est-ce que ça m'a encore klaré? Aucun THIS PLEASE USE Déterve GLORIO NON PROBLEM … NON NON … NON NON NON NON NON NON NON NON NON NON NON NON NON NON NON NON NON Vous pouvez avoir une communication interactuelle entre une figure en jupiter et le processus de Matplotlib. Avec les autres frameworks comme Dash, Streamlid, et Panel, comme je le sais, et je sais que c'est pas le cas, le monde s'évolue très rapidement, c'est possible d'exprimer les figures de Matplotlib dans ces frameworks, mais je sais que ce n'est pas possible de envoyer ces événements à Matplotlib. Donc c'est Matplotlib dans le stream, il parle à presque tout le monde. La seule chose que Matplotlib ne fait pas, comme je le sais, c'est de produire des files html, des files interactives des files html, pour le rendir dans le browser. Mais ok. Au stream, il y a un peu de libraries qui sont essentiellement clients de Matplotlib. C-Born, très populaire, très bien-known, le Libre de Visualisation Statistique basically produisent les figures de Matplotlib. Plot9 est beaucoup le même, CardoPy pour faire les maps est beaucoup le même, et puis les plus génériques sortent des libres de Visualisation Statistiques comme le .plot API et Pandis, ou Hullaviews, qui peuvent aussi produire les figures de Matplotlib. L'une chose de note c'est que n'importe quoi de ces éros sont double-headed. Donc, si quelqu'un, vous savez, dans une windows native ou un browser clique sur quelque chose, Matplotlib est aware de ça, mais ça ne fait pas, ça n'a pas le moyen de envoyer ces événements à Pandis.plot. Donc, si vous pensez à votre code Python spécifique de l'application, c'est possible d'accueillir à toutes ces éros, à l'arrivée de toutes ces éros. Je n'ai pas hâte d'abandonner ces éros, ces éros de l'arrivée de votre application Python dans tous les éros, mais ça, vous savez, peut-être que vous pouvez les acheter mentallement. Et à toutes les éros qui vont vers la gauche, les libres qui ont été capturés, qui ont reçu ces éros, peuvent les envoyer vers vos applications spécifiques de Python. Donc, le moyen de lire ce diagramme est que ma code d'application peut s'améler à Seymour, et l'application de ça peut aller vers l'application de MatplotLib, et l'application de MatplotLib mantient une relation avec les widgets de Jupiter via Jupiter dans un browser. Et si un utilisateur clique sur quelque chose, alors cet éros est double-headed, et ça est celui-ci, et ça est celui-ci, et ça est celui-ci. Mais si ma application spécifique de Python code veut capturer cet événement, c'est de s'inscrire à l'application de MatplotLib. Donc, c'est MatplotLib. C'est moitié parce que c'est tout. Il y a d'autres libres là-bas. Donc, si je regarde à la sort de la troisième partie ici, il y a des libres de visualisation scientifiques comme Miami pour 3D, Napari pour image processing, Blue, qui vient de l'astronomie. Et ce sont des architectures spécialisées pour des workloads spécialisées qui parlent directement d'une carte de graphique pour procéder plus de datasets. Et ce sont des Windows native. Nous sometimes call these desktop Windows or desktop applications, but that's a bit of a misnomer because I don't actually have to be sitting at the same desk where the machine is running. I can actually be running one of these processes on a remote machine, on a a very powerful machine somewhere in the cloud and then talk to it either via remote desktop or via X forwarding. And so you can in fact use these in a sort of client server way, much like a browser. But the thing that these libraries all have in common is they're all bidirectional. Sorry, they all have a bidirectional communication with a native window that's owned and operated by the Python process. So when the Python process shuts down, this window disappears and the interaction is largely mediated by Python code that's running in one of these libraries. So what about browsers? Well, I'm not gonna go into all of these different libraries. I'll talk mostly about the one that I know best, which is plotly and it's broadly representative of the others. So if I look at what plotly connects to, plotly is a Python library. I can use it to produce graphics and I can make raster and vector files that can be open in a viewer. Plotly can export HTML files which are openable on a browser. Obviously you can use it from Jupyter. And if you use just a fig.show in plotly, you get this sort of unidirectional connection to Jupyter where the figure is pushed to the browser. But the Python process can't get any events back. If you want to write some Python code which captures user events from a plotly figure within Jupyter, you can use the Jupyter widget system, the figure widget. And within any of these more modern dashboarding systems like dash or panel or streamlet, you get the events back to plotly. Upstream, some of the same things that talk to map plotlib also talk to plotly. So HulloViews will produce plotly figures as well pandas.plot. The output of data shader can be piped into plotly as well. The same sort of observation can be made to about plotly as I made about map plotlib is that none of these arrows here are double headed. So if I wanna capture events from a user clicking on a plotly figure that's been produced by HulloViews, I gotta talk to plotly and not HulloViews about that. In some cases actually. That's not entirely true about HulloViews. So this gives you a bit of a flavor of how to use this diagram. Now I'm doing my best to sort of fill all these in. I haven't filled in all the bokeh arrows. I haven't filled in all the BQ plot arrows necessarily. But this is the basic idea behind my diagram and why I've laid it out this way. So a couple of observations and limitations about this diagram. One, as I've mentioned, not every library is here. But I hope that a cursory look at the documentation for any of these libraries would help sort of mentally position them in one of these sort of areas. You can kind of look at the docs and see, oh okay, this library is mainly oriented around producing native windows. Maybe it's down here as part of this cluster. And it's built on top of WX Python so I could have an arrow here. So that's one thing. And secondly, there are some Python modules that exist or open source projects that aren't boxes in this diagram. They're actually arrows. So these two arrows, from plotly to raster and vector, you need to install a separate dedicated Python package called collido to do that. If you want to go from pandas to hollow views, which is something that's possible, you have to install HV plot, which is fine, it's just that the HV plot package doesn't get its own box here. It sort of represents this arrow. So that's another kind of observation about this diagram. So I've spent a long time sort of showing boxes and arrows and talking about a bunch of stuff, but this is a Python meetup, so maybe it's time to actually look at some code. But let me kind of show you concretely what this looks like if maybe you're less conversant with some of these. So let's actually go back to the map plot lib connection. So what does it look like if I write a script that's over here and it calls seaborn, which calls map plot lib to kind of write a raster file to disk and open it up in a viewer editor program. So any path in this diagram is actually a Python script. You could actually write a Python script to represent any one of these paths. So let's actually take a look at what that looks like. I'm gonna be right over here in JupyterLab and here's a really simple Python script that loads up map plot lib. Actually, I don't need this, it's part of another part of the demo. Loads up map plot lib, loads up seaborn, uses seaborn to make a plot and then calls a map plot lib function to save it. So if I actually run this script, okay, thinks about it for a sec. And then I actually load up this PNG. All right, so I can click on it all I want. Not much will happen. It's a PNG file. I mean, it's being served through my browser, but in this sense, my browser is essentially operating just as a naive viewer. So far so good, that's my one path. What if I want to show the seaborn to map plot lib to a native macOS window and show some sort of interaction? I can do that too. Here's my original script. Here's a slightly augmented version of that script where I've got the same plot. I'm gonna use the MPL cursors library to add some hover labels. And I'm gonna call plt.show instead of plt.savefig. So if I run this script, again, from my command line, so I'm running this in a browser just to save on the window switches. But if I run this script, you can see here that I've actually opened up a native macOS window and this is interactive. I can resize it. My plot is resizing. I can hover. I've added these hover labels. If I want, I can pan this around. I can zoom with a zoom box. I can continue hovering. I can go back. I've got a whole bunch of different options. So this is a native GUI window that's running. And if I switch back to Chrome, somehow, if I switch back to Chrome, you can see that my script is still running. And when I actually close this window, then my script will terminate. So the window is open as long as the script is running and the script is running while it doesn't do anything after the window closes. So the script is running as long as the window is open. So that's a pretty good example of a path from Seaborn down to a native window. And actually, Matplotlib has this swappable backend system so I can do the same thing and show you the same plot through this Jupyter widgets box through Jupyter in a browser. So this is the why I'm running this stuff in JupyterLab. I open this stuff up in a notebook. If I call Matplotlib widget, I can run the exact same script. And now, PLT.show, instead of opening up a native browser window, opens up a Jupyter widget. And now, whenever I hover, I still get my hover labels. That's because this Python function is being called and this is still fully resizable. I can pan, I can zoom, but now I'm in a browser. So that's pretty nice. So so much for this sort of Matplotlib-based stuff. What about the plotlib-based flows? So I'm gonna make the same figure going through this time, the rep or HTML path in the browser. So if I pull up this plotly code, it's very similar to the Seaborn code, I am once again rendering a figure in the browser, except this time when I'm hovering, I didn't have to write any Python code to do that. And I can tell you that this hover is entirely being done in JavaScript. So I could actually kill my Python kernel here and these hovers would still work. In fact, let's do that. Let's interrupt the kernel. And these hovers still work. And I also wrote this to an HTML file, right here, fig.html. So if I open this up in a new browser tab, Python is definitely out of the loop here. There's no more Python left, but the hover still works. I can still zoom, I can still reset and double click. And so that's a pretty good example of plotly to the document HTML back to the browser view. Now, I don't have time in this talk to go through and show all of the different examples, but hopefully this is illustrative of the fact that every one of the lines on this diagram essentially represents a Python script. And my hope is that I can finish this diagram and maybe add this as a resource over here in the overviews to PyViz to basically help folks understand the paths that are available to them and how to exploit those paths, so how to write the Python code that actually corresponds to all of these different paths here. So the reason I've presented this is because I really do want feedback on this. Like, is this too complicated? Is this helpful? Are there arrows missing? Are there things that I'm not thinking about? Is there a better layout that reduces the number of crossings and so on and so forth? So this is sort of me presenting a work that I consider, a work that I consider about 80% done and I would really love some feedback on it. So if you visit here a bit.ly slash PyViz diagram, you've got the actual draw.io file that I'm using to build this, so draw.io is an open source build graphics tool. You've got the little code snippets that I've put together and you can actually view this diagram online. Right here, there's a link. And if you wanna get in touch with me after this talk, I'm available on Twitter, I'm available on GitHub. You can send me an email. I have a blog where I collect a bunch of different talks that I give. I am now a grad student studying at ETS doing research on data visualization APIs. So I am more than happy to talk to anyone about Viz anytime. And I've lost some time now for questions or comments if anyone wants to chat about this diagram. So thanks very much for listening to my talk and I'll take some questions. Okay. Yeah. Okay, let me bring back Nicolas and Yannick who will take care of the questions. Thank you guys, see you later. Thanks. Thank you Nicolas and everyone. Please, if you have any questions for Nicolas, you can ask them in the live stream chat on YouTube or on Slack. We are in channel meeting. Et on a une intervention ici qui est, thank you Nicolas. C'est pas une question. I'm pleasure. Thank you Nicolas. I have a question while people think of their question. So it's about data presentation. So you did a really good job of mapping like the data, data, data, data, data, data, data. So you did a really good job of mapping like the pipeline or that the data has to go through the code. But let's say I have some data, like the breakdown of how I spend my day and I want to present that. How do I go the other way around? Like so first deciding what the data should look like to be intuitive to my users. And do you have resources for that? So some people often recommend tough tea. I think it's a little bit difficult et I think it's a little bit dated. It's really good at telling you not to use PowerPoint. But we know that by now. So what's your take on this one? Yeah, that's a really good question. So the diagram that I've presented is very sort of technically oriented, kind of explaining how the pipes work in terms of actually sort of deciding which visualization to do before choosing a tool, which I recommend. I mean, definitely there are a whole bunch of resources out there that exist. Some really good ones that I like is our books that are written by Steven Fu, F.E.W. So he's written a number of good books. I think Show Me the Numbers is the one that comes to mind. It's quite good about a sort of very minimalistic way of presenting data. There's also an excellent book called Storytelling with Data. And there's a website with sort of a community where they kind of do challenges. And if you want to get better at sort of getting creative and thinking about how to visualize data sets, there's also a number of sort of Twitter threads like Tidy Tuesday and Makeover Monday and various groups that sort of get together and chat about how to do this stuff. But definitely, that first stage is very different and less sort of technical and more of a sort of design kind of stage in terms of thinking about how you want to visualize your data. The one thing I'll add is, it's important to not fall into the trap of thinking that there is only one way to visualize your data. The best recommendation I can give you is to sort of step even further back and say, what is it that I want to do? So it's not like you have a data set and there's only like one best way to visualize it. You basically have to think about what is it that you want someone looking at that visualization to get out of it? Do you want them to get a particular insight? Do you have a message? Do you want to enable them to notice a particular kind of pattern? Those will all kind of feed into what you choose to, how you choose to design your visualization. And then probably we'll feed into do you need something highly interactive? Do you need something that runs in a browser? Do you need something that connects back to a mainframe to do some heavy number crunching? Or is just a PNG fine, in which case you have a much bigger menu of possible libraries? Excellent, very good. Thank you so much. We have a question here from GP Brochure. Is there a way to use plot.ly-dash without an internet connection? And a follow-up that is a clarification actually as a standalone file, but with the interaction. Yeah. I think I understand the question. So it's definitely possible to run a dash application locally, much like I was running the sort of map plot lib script locally on my machine. I'm not sure I really understand the nuance of the question. So there is no sort of standalone viewer. You can't basically email someone a plot.ly-dash file and have them loaded up. There was actually a talk. I can't remember which Montreal Python, it was like 65 or something, where someone showed a way of essentially bundling a dash application into an electron app. So it sort of came with a Python back end and a browser and you could sort of distribute that. It's a little bit involved and I don't know if there's any good recipes for how to do that other than that one talk. I'm not sure if that answers the question you're asking, but those are the things that come to mind. Excellent. Et maintenant, une question de Christian Udo. Super utile diagramme. La main comment est que c'est qu'il devrait être interactif, donc cliquer sur l'un des boxeurs pour rappeler le passage. Est-ce qu'il y a d'autres plans pour que ce soit à ce niveau? Oui, c'est la partie que j'ai en train d'attendre. J'ai commencé à faire le diagramme et je me suis dit que c'est une erreur. Et donc, vous pouvez voir que durant le talk, j'étais en train de cliquer sur plusieurs tags et je ne sais même pas où est-ce qu'il y a de la meilleure chose pour pouvoir cliquer sur les boxeurs et voir les éros de la saison. Ou peut-être, juste pour mettre sur le site de PIVAS, une sorte d'hier qui s'occupe par les éros de la saison et vous pouvez poser et prendre un look. C'est vraiment le point de l'écran. Je ne peux pas juste tourner les éros parce que c'est un grand délire. Donc, j'ai vraiment essayé de penser sur comment faire ça. Le truc est que j'ai aussi voulu ne pas construire une visualisation super custom javascript ou python parce que je veux que les gens puissent contribuer à ça et simplement ajouter un éros. Donc, je ne veux pas faire quelque chose vraiment sincratique. Mais c'est certain. C'est certain où la difficulté est maintenant. Excellent, merci. Et ça semble être toutes les questions qu'on avait. L'intervalle, check on Slack. Juste un moment. Et... Oui, c'est tout. Vous avez répondu à toutes nos questions aujourd'hui. Merci beaucoup Niko. Merci beaucoup et s'il vous plaît, si vous avez des questions ou des idées ou des pensées après le facteur, je suis vraiment heureux de les discuter. Je veux faire un ressort plus utile pour tout le monde. Merci d'avoir regardé. Bonne soirée. Merci. Merci Niko. Ok, c'est bon. On va continuer avec notre prochaine présentation. C'est Marietta qui est une développeuse depuis plus que 15 ans d'expérience. Mais en ce moment, elle travaille pour Google comme développeur, senior développeur. Et c'est ça. Marietta habituellement, elle habite à Vancouver avec son mari et ses deux enfants. On va voir ce qui va se passer dans la réaction de Marietta. Elle a 15 ans d'expérience comme développeur. Et pour maintenant, elle travaille à Google avec ses husbands et ses deux enfants. Je vais vous présenter Marietta. Je vais vous prendre tout le monde. Merci Merci Merci Merci Merci Ici j'ai la礼 d'impr Skills qui est la Дж All right. OK, see you. Thank you. Hi everyone. Thank you so much Montreal Python for having me here today. I'm going to talk to you about unit testing and continuous integration. My name is Marietta and I live in Vancouver, Canada, and you can find me on Twitter and GitHub as Marietta. I currently work as Senior Developer Relations Engineer at Google for Google Cloud Database. In my free time, I contribute to and maintain open source projects. I'm one of the Python core developers, which means I'm the maintainer of one of the most popular programming language of them. So unit testing. Unit testing is important. You should do this. Pure software developer, your software engineer, your write code that will be used by other people. You have code that will go into production. Then you should write unit tests. Now, I know that you're not going to start writing tests just because I told you so. Like you've probably been told by everybody, you need to write unit tests. But let's try to understand why this is important. Especially when I was new, like I didn't understand why we need to write unit tests. In my first job as professional software developer, I got paid to do programming like a long time ago. We didn't write tests. I didn't start writing tests until my third job until I started writing Python and then I was told to start writing unit tests. So that doesn't mean that we didn't test our code. In my first and second job, we test our code, not with unit tests. We test it manually. We would run the code, run the program, deploy it, run it and try out every single functionality. We would do this big testing day, like once every six months. At that time, we actually have a big document of 100 pages that describes all the unit, all the test cases. This kind of manual testing is time consuming and it's boring. It's boring and repetitive. So we don't want to do lots of manual testing just to make sure the code works. So writing unit tests is a way to automatically test that your code works. If you write unit tests for the same reason, you do manual testing just to check that this code works. So I have this example here. Say I have a function that is super simple. It just adds two numbers. So how would you test this code if you don't have unit tests? You would run it, but you would call the functions. You would call this function, print it out. You would read the output and say, yeah, indeed, one plus two is three. So now I know the code works. So that's the manual testing. Programming language, like Python, comes with its own unit test framework for you to write automated unit tests. So the unit test module is built in in Python. You don't have to install anything. If you have Python, then you can import the unit test module. You can start writing and defining your test cases. So in your test case, first import the unit test module and you will actually import the function, the code that you wrote. You will create a test case, call that function and pass the parameters. So to actually test the function, you would make a reservation saying that assert that the result of the output of this function will be equal to the value that you expect. So in this case, one plus two should equal three. And when you execute the test, you will see a pineapple report. It would say that the test was run, that everything is okay. So this is an example of running a test where the test is passing. So this is another example of running a unit test where the test actually failed. Here, I changed my test case, saying instead of expecting that one plus two equals three, I wrote in my test that one plus two should equal 12. So when I run a test, I would see an assertion error. It is saying that the value I expect 12, does not equal the value written by the function. And that's why the test failed. So when test failed like this, I should be looking at my test and my code and figure like, was it the code that was wrong that not return the expected value or was it my expectation of the code that was wrong? So this is another reason why you wanna write unit test. You wanna test your code against various inputs and scenarios. Like maybe you wanna test whether your code handle negative numbers, decimals. You can write test photos. And the other reason why you wanna write unit test is to find bugs with your code. As you write the test and thinking about the different inputs, scenarios, educations, maybe you even discover a bug while testing. And you can therefore fix your code to be more reliable. Using this example, like what if we're adding two letters like A and B instead of numbers. So what do you expect from your code here? Should it pass? Should it return me A, B, or should this fail? Should this raise exception? So I would need to adjust the code to handle these kind of situations. And what if one of the input is a number and then the other is a letter? What is the expectation? This code the code will raise an error. So maybe you wanna go back to the code and write the logic to handle this kind of input and if the code raise an error and you can test that error is raised in this case. So for example if I go back to this function that I wrote and now I'm saying well I only want to accept numbers if the caller pass me the letters A and B that I wanna raise an error so in this case I raise a value error. So now when I write the test for this, I wanna ensure that the error is raised. If they put in letter instead of numbers so I can do this by using the assert raises. So writing unit test like this will help you discover issues like this during development and it will help you improve your code to be more reliable. Unit test also work as documentation about your code. Unit test gives information of how your code works. So if somebody else is reading the code and wanted to understand what it does they could read the unit test. They could see how to use your code how to call it how to set it up they could see your different test cases in order to understand what the constraints and limitations of your code. So writing unit test is tedious like initially I wrote very few lines of code. I have like 5 lines of code and ended up with 5 times more code in the form of unit test. But this is actually important like having unit test will help when we want to modify or to perform maintenance of the code. For example, the new Python version is out. Maybe you've been working in Python 3.6, 3.7 now that we have Python 3.10 and I wanted to know will my code work with Python 3.10? So in order to find out just I would run the test. I would run my code, my 3.6 code against the Python 3.10 environment. So if my test passed in 3.6 but fails in 3.10 if possible that means my code is not compatible and I need to go and fix it. So you can use your test to catch deprecation warnings. In Python you would see deprecation warnings to let you know when certain features will be deprecated that it could be removed in the future versions. So if you want your code to work in multiple in future Python and newer we will have 3.11 coming later on. You're going to test and you're going to have to adjust your code accordingly. Maybe you need to stop using whatever feature that's being deprecated and do something else. In your unit test when you run your unit test you can add the dash W flag to see the warnings. And when you see these kinds of warnings then you know that it's incompatible with your code with a newer Python version so you're going to go and fix it otherwise your code will not work later. And another reason why you should write unit test so that you can have continuous integration as part of your process. Continuous integration is the practice of using automation to frequently integrate and merge code changes into a single project. So that's the next part of this talk. Let's talk about continuous integration. Continuous integration on a CI is considered best practices for networks. And you should do this. You work in a team you open source your code you do open source contributions you have more than one contributor working in the project you should have CI as part of your workflow as part of your process. And again maybe you're wondering like why is this important and because integrating code merging code changes is actually costly. It takes time and effort. You could be introducing bugs by merging new code and it could break existing functionality. So instead of thinking why do we need CI you've got to think about what if we don't have CI so let's imagine you're you're in a team you're working on one feature your co-worker is working on a different feature and then one time they said they're finished on a poor request and ask you to review so that it can be merged so as a reviewer you've got to decide whether this code can be merged so how do you decide you're going to review the code read it and then you ask questions about the codes like you want to know does the code work does it do what it's supposed to do you want to read the requirements you're going to ask ok what are the constraints and limitations about this code does this handle exceptions does it cause exceptions does this break anything else is this compatible with the rest of the software and for this question you should also ask is this code documented so how do you answer all of this question you can take the code try it out by yourself run it try different things or you check if there are unit tests that cover all of this then once they have unit tests you want to actually run it and make sure the test so running unit test itself though is not straightforward you first need to get the copy of the code into your local environment you now need to set up your local environment install dependencies make sure the code is running and then you run the test wait for it to finish and then you build the result then you need to do all of this all over again for the next pull request from another team member and you have to do this though like this whole process needs to happen because you want to be certain code that meets quality standard so merging code is costly and risky in order for you to be more agile to speed up your development cycle you need to automate this so if you have a CI you can have a process that will automatically grab the copy of the code changes this process can automatically set up the necessary environment and it can even run the test automatically so all you have to do is now just to ensure that the CI run and then the test pass so now you can just simply click the merge button and there are various ways to add CI as part of your process there are lots of options and depending on your platform if you are using github you can use github actions if you are on githlab you can use githlab pipelines to support CI as part of your workflow such as circle CI traffic CI you can use Jenkins as well and there are lots of options for you so I want to just show how to do this, how to set up CI with github actions so on github you would be setting up github actions by adding a YAML file and in the same report where you want the CI to happen and it has to be added under the .github-workflows directory so the YAML file contains a set of instructions to tell the CI on how to run the test for the project so I actually have a sample repository that you can look you can go to the URL here to check out the entire setup in this report you can see that there is the github-workflows the CI YAML file and I'm putting it here just the snippet the longer version you should go to my report to see it but just to show you an idea so if you look at the steps section of this file this test where I'm telling the CI on how to run the test I'm telling it to first install the dependencies it does the tape install and then I'm telling it to run the test by calling the python-unit test which is the same command line that I would use if I'm testing it locally on my machine python-unit test and you'll notice that there is a line under the strategy the python version where I said python38 and 39 this is where I get to tell the CI that I want to test this against the different python versions if I want it to be running python p10 I should add python 310 to this to this list so this is how I can make sure that my code is compatible against the different python environments and because I'm letting the CI to set up the different versions I don't need to deal with this manually some of you might have tried installing different python versions in your machine sometimes it screws things up it's complicated right this way you get the CI to do this for you and I can do more with CI it's not just about running unit tests you can run other things for example if it's part of the measure of quality for your code if you follow certain coding style say if you use things like pilot or flake8 or black auto format and you want to make sure that any code that gets committed understand it you can include this as part of the CI so this is an example code where I'm checking the code if it complies with black auto format so in this step I added the installation set up I'm telling it to install the black package and then run the black dash dash check to make sure it's being run and I can also use the CI in this example I added the job for running unit tests and then running the coverage report so all of these tests and checks will automatically be run whenever anyone makes a pull request to this repository whenever anyone wants to make changes to the report so since I want to ensure a certain quality standard I wanted to make sure that these checks are passing before I would merge it now that I know the code works it doesn't break anything it's following a certain code style I can simply click the merge button confidently so that's the introduction the introduction actually examples on unit testing and there are lots of resources out there for learning more about how to write unit tests you can read the documentation on unit testing on docs.python.org this is a pretty good tutorial there's lots of tutorials out there here's an example that I found quite useful introductionary tutorial on Python unit test module on YouTube by Cody Shaffer there is also really good in that article about this from real Python and as you do more unit tests you will start doing integration testing or you might also test using the third party application of third party systems third party API you may come across the concept of mocking when writing your test and so Python comes with its own mock much object library that you can use for those I'm going to try to explain what is mocking if you're not familiar with this so like one of the reasons you write test code works you call a function and it does what is supposed to do what if the code interacts with external systems maybe your code will charge customers credit card your code will print something on a paper you don't want to execute these functionalities you don't want to charge customers credit card each time you run the test print something on a paper each time you run the test on this kind of scenarios you will still write test but you will mock the cause you fake the cause to those external systems so mocking and patching is actually pretty powerful tools in unit testing you will eventually need to use this and there are really good tutorials on how to do it there is a great article from real python understanding the python mock object library and there is also a great talk by Lisa Roach it was even at python years ago called demystifying the patch function another useful testing framework is py test this is a third party library so you need to install it separately you need to do like pip install this is pretty powerful testing framework as well I recommend learning about this I've been using py test at work and as well as at various open source projects that I continue to people are using py test so there is there is a great tutorial about this topic in introduction to unit testing in python with py test that was given in python US by Michael Tomwing and Christy Wilson and once you do unit test integration test then you're probably going to be doing entrance testing so in entrance testing not only you're going to test a single unit not just a single function but you'll be testing the entire workflow from start to finish so there is a great resource, a great tutorial that you can read about in free code camp and one of the framework that I've used in the past for entrance testing in python is called serenium python so I've shared the documentation for it so you can learn about it so now that you've learned about unit testing and CI continuous integration to understand the importance of this you know how to do it do it write unit test, have CI have coverage have 100% coverage possible so improve your code base thank you so much for listening and thank you again python Montreal for having me here I really appreciate your feedback about this talk so feel free to get in touch you can find me on Twitter, I'm on GitHub I'm on LinkedIn, I'm on Hollywood I'm everywhere so you can get in touch with me thank you again Marietta, let me bring back Yannick who gonna take care of Yannick so thank you guys I let you guys take care of question excellent thank you again Marietta and everyone you can ask your questions directly on YouTube or in Slack and I will relay them to Marietta tout le monde vous pouvez poser vos questions en français ou en anglais ça va me faire plaisir de les traduire ou sur Slack et quand vous faites vos questions j'ai une question pour vous Marietta donc vous avez mentionné aller à 100% de coverage pour moi ça semble beaucoup mais peut-être je ne suis pas focussé dans votre expérience quand est-ce que vous avez suffisamment de coverage pour dire je suis bon pour maintenant et peut-être je vais le faire ou est-ce que 100% est la seule qui a la réponse acceptable ici je vais essayer de 100% mais oui je suis d'accord avec les situations c'est difficile j'ai vu des bases de code que je n'ai que 50% c'est trop bas vous avez besoin de coverage je pense que vous pourrez avoir 109 j'ai vu 90% d'accepter de certaines entreprises c'est ce que vous êtes confortable avec. Je veux partager une coût que j'ai écoutée par Nat Batchelor, qui est le maintien de la coûtée. Et je pense qu'il a dit une fois que quand vous avez 90% de la coûtée, vous ne savez pas ce que 10% de votre coût est en fait. Quand vous n'avez pas de coûtée pour ça, vous n'avez pas d'idée de ce qui fonctionne. C'est ce que ça fait. C'est ça. Si vous êtes maintien de la coûtée, vous voulez faire des upgrades, comme si vous avez une coûtée de 2, si vous faites ça de 2 à 3, ou même de 3, 8, 2, 3, 10. Si vous n'avez pas de la coûtée pour ça, c'est difficile de savoir si votre coût va vraiment fonctionner dans la nouvelle version. Donc, essayez de faire le meilleur pour que vous ayez beaucoup de coûtée. Je ne vais pas vous dire que 8 ou 7 ans c'est bien. Faites le meilleur pour que vous ayez beaucoup de coûtée. Excellent, c'est très bien. Nous avons une question de JP Borshu. C'est-à-dire, est-ce que l'unit de la coûtée est mieux étudiant pour le programme objectif ou pour le programme fonctionnel ? J'ai utilisé unit de la coûtée pour les deux cas, pour le programme fonctionnel, je pense que le Python itself est bien étudiant pour le programme objectif ou pour le programme fonctionnel. Vous pouvez utiliser les deux styles avec Python, donc je ne... Je dirais qu'on utilise ça pour tous les deux. Oui, c'est bien étudiant pour les deux. C'est très bien. Et ce sont peut-être toutes les questions qu'on a maintenant. N'hésitez pas, tout le monde, si vous avez des questions, vous pouvez les poser sur Slack ou YouTube. Je vais double-check. Ça semble être... Oh, wait, wait, wait, wait, we're not done. Une question d'Andrew Francis. Andrew Francis est nouveau à CD. Je veux étudier l'unit de la coûtée quand j'utilise une feature, qui est très similaire à ce que vous avez parlé de, puis décoriser avant l'étudiant, donc un petit peu plus involvement que juste de vérifier le code. Alors, quels sont les outils que l'Andrew devrait utiliser pour faire quelque chose comme ça ? Vous pouvez totalement faire ça sur GitHub, en utilisant... Je crois que même les actions GitHub sont supportées. C'est-à-dire, si vous voulez qu'il y ait quelque chose à faire après que vous mergez, il y a des événements webhook sur GitHub qui va vous dire que quelque chose a été mélangé. Maintenant, vous pouvez faire le test. Donc, c'est... C'est supporté sur GitHub. Vous pouvez utiliser les actions GitHub. Vous pouvez aussi utiliser Jenkins. Excellent. Ce n'est pas sur le toulon, mais en utilisant les webhooks, les webhooks sur GitHub. Excellent. GitHub ou Jenkins sera des zones que l'Andrew devrait regarder. Merci. Et un commentaire, c'est une question de Johanna Mpou. Où pouvons-nous obtenir tous les liens des ressources que vous avez mentionnées dans votre talk ? Il y avait beaucoup d'interessants liens. Oui, je dois avoir ça. Je dois avoir ça dans ma parole. Je n'ai pas évoqué ça, mais je vais évoquer ça. Je peux partager ça avec vous tout à l'heure, ou sur Twitter. Je vais l'utiliser, pour que vous puissiez partager ça avec la communauté de Python. Je peux l'utiliser et l'appliquer. Merci pour ça. Oui, c'est parfait. On va partager cette information. Peut-être dans la description de YouTube. On va l'émerger quand on a l'information sur Slack et toutes les places régulaires où nous avons mentionné ces choses. Excellent. Merci beaucoup. C'est tout pour notre question pour aujourd'hui. Ok. Merci, les gars. Ok. Merci. Merci d'avoir regardé. Ok, je pense que ça conclut notre présentation. Je vais te garder, Yannick, parce que je vais peut-être avoir besoin de ton net. Oui, c'est ça. La dernière chose que je veux mentionner, mais attends, je vais voir si... Parce que je veux que les gens nous rejoignent beaucoup et tout ça. Donc, je vais ajouter encore mon écran ici. Là, je me souviens que tout le monde voit mon écran. Ce que... La dernière chose, avant de partir à notre... Mais premièrement, pour les gens qui veulent nous rejoindre, c'est toujours... On va aller là. C'est notre après-haut. Et... Le dernier annonce, c'est que notre prochain événement, ça va être le 21 février 2022, si je ne me trompe pas de date, Yannick. Ça me semble pas mal bon. Laisse-moi vérifier mon caractère. Et oui, le 21, exact. Ok. Si c'est ça, on cherche les présentateurs. Si vous avez des... Bien, ça va être comme on a vu là, comme toutes les présentations, vous pouvez toujours nous envoyer. C'est pour ça que j'ai mis notre email là. Vous pouvez toujours nous contacter par email. Ou toujours, on a notre Slack channel que vous pouvez toujours nous rejoindre. Ça va nous faire plaisir de... Regarder votre présentation ou votre propose. Tu peux le répéter ça en anglais, Yannick. Absolument. Donc, notre prochaine rencontre, après aujourd'hui, c'est le 21 février 2021, le Python 91, l'exotique Viking. Et à l'exotique Viking, on a déjà eu la confirmation d'un talk. Et ma mémoire blanche, c'est de la performance principale, networking en Python, par Yuri Selivanov. Selivanov. Oh, mon Dieu. Je suis le plus probablement prononcé. Je suis très désolé, Yuri. Mais Yuri est un contributeur Python. Il a fait beaucoup de contributions dans le library Async. Il nous explique comment prendre advantage pour faire une performance en Python. Ça va être excellent. Et si vous voulez parler à l'extérieur de Yuri, et partager vos projets, ou vos pensées, ou tout ce que vous faites en Python, vous pouvez nous envoyer un email à l'adresse qui est ici sur le slide, mtlpy.googlegroups.com. Et nous serons heureux de vous présenter dans cette discussion. C'est cool. Mais je pense qu'on accroche tout ça, et qu'on va aller tout de suite sur notre after-hours. Super. Bonne soirée tout le monde. Bye-bye.