Concevoir un CRM avec Django et Stripe
Session du 22 juin 2023 à 20h00
Data Science & IA
Développement Web & Frameworks
Bases de données
Librairie Standard & Modules
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Concevoir un CRM avec Django et Stripe
Dans cette session de mentorat, Pierre-André explique comment gérer les secrets et mots de passe dans Streamlit en utilisant le module Faker pour générer une base de données avec TinyDB.
Il montre également comment effectuer des requêtes dans la base de données et manipuler les données à l'aide de pandas.
00:00:00 :Alors un outil CRM, donc pour gérer des clients, des factures etc. C'est ça? Plus marketing.Fernando, en tout cas je te conseille de regarder la librairie Python Docx qui est hyper bien pourmanipuler des fichiers Word. Alors plus marketing, c'est un Talbator, ton projet c'est, tu veux
00:00:41 :développer un CRM ou tu voudrais utiliser un CRM? Ah le développer, bah écoute lemieux que tu puisses utiliser, enfin ça c'est Django, parce qu'en fait un CRM c'est quoi? C'est
00:01:04 :un truc qui est un petit peu, pour moi Django c'est le meilleur outil pour faire ça parceque le CRM ça dépend vraiment des liens que tu as en différentes tables. En fait
00:01:21 :Django gère très bien les foreign keys etc. et un CRM, donc imagine que tu as un clientet tu as des factures, donc en fait tu vas avoir dans ton projet Django, tu vas avoirune table qui va lister tous tes clients et tu vas avoir une table qui va lister toutes
00:01:34 :tes factures. Et en fait tu vas avoir des foreign keys entre chacune des tables parceque tes factures, tu vas avoir une relation one to many par exemple, tu vas avoir un clientqui va être lié à plusieurs factures. Donc en fait vraiment tu verras que quand tu vas
00:01:50 :faire ton projet Django, bah tu vas, ça va se faire facilement et en plus demande àGabriel mais tu peux générer des factures facilement grâce à Stripe, tu peux intégrer,tu peux envoyer des factures par email etc. Donc vraiment je te conseille vraiment Django
00:02:08 :vas-y à fond si tu veux faire développer un CRM pour moi c'est le mieux. Après tuvois Jonathan il te conseille aussi PySide, pourquoi pas mais là du coup PySide tu vasdevoir gérer toi même les classes et les relations entre les classes. Alors qu'avec
00:02:27 :Django t'as un moyen et puis en plus t'as une interface web que tu peux, et puis tupeux développer ton CRM et juste tout faire via l'interface admin par exemple. T'aurais
00:02:38 :pas besoin de développer un frontend juste si c'est pour toi. Donc voilà un petit peupour les projets, les factures. Et du coup ouais Gabriel pour tes factures automatiques
00:02:48 :je t'avais pas demandé là sur Twitter, t'as utilisé un template PDF et après tule remplis automatiquement? Non en fait dans l'API Stripe dans le check-out session
00:03:07 :là quand j'ai ajouté une ligne de code qui fait que du coup dès que l'exclusifpaye, toi sur ton compte Stripe en fait t'as une facture qui est édité automatiquementet après t'as plus qu'à lui envoyer. Alors je sais pas si on peut faire un envoi automatique
00:03:24 :après, si si voilà si ça envoie après la facture c'est bon. C'est juste qu'en modetest tu peux pas faire ça. Ouais ok. Non bah oui c'est bien ça avec Stripe j'avais vu
00:03:33 :que tu peux faire ça directement. Moi j'utilise Paypal, enfin Paypal Pro, c'est un peu pareilque Stripe en fait tu peux, de quoi? C'est cool ouais ça m'intéresse ça. Après en
00:03:46 :fait franchement c'est un peu la même chose c'est juste qu'avec Paypal Pro bah tu paraistu peux faire des, tu peux gérer des clients donc tu peux ajouter des clients, tu peuxfaire des factures, tu peux faire des devis et tu peux générer des QR codes de paiement.
00:03:59 :Par exemple tu peux envoyer à ton client un QR code, il le scanne et puis il peut payerdirectement Paypal. Moi c'est comme ça que, enfin moi j'utilise un CRM qui s'appelle Dolibar,
00:04:12 :c'est un CRM qui existe, qui le fait tourner sous un service Docker mais c'est pas un CRMque j'ai développé mais en gros quand j'envoie une facture à un client ça génère automatiquementun QR code Paypal et en plus de mon RIB que je mets pour le paiement j'envoie aussi un
00:04:30 :QR code Paypal comme ça soit il fait un virement bancaire ou soit il fait un virement avecPaypal, c'est plus rapide si jamais il n'a pas mon RIB renseigné. Mais c'est un peu
00:04:39 :le même principe qu'avec Stripe, tu sais avec Stripe tu peux générer une page danslaquelle il peut payer par carte directement le client. Ouais, en gros moi dans ma vue
00:04:52 :Django je fais en sorte que le client s'il a déjà un ID Stripe en fait ça le récupère,j'ai toutes les informations qu'il faut en fait d'adresse, comme ça c'est tout rempliil n'a plus besoin de le faire et puis ouais c'est ça il paye par carte bancaire et si
00:05:08 :jamais c'est un nouveau client ça le crée automatiquement et ça me renvoie l'adressequ'il a lui créée dans la base de données Django. D'accord ok, ouais bah c'est bien
00:05:17 :ça. Et après je voyais que tu me disais que, enfin j'ai vu dans les messages quetu as écrits tu stressais un peu pour la mise en prod, franchement justement l'intérêtd'utiliser des systèmes comme Stripe c'est de ne pas s'emmerder avec la sécurité descoordonnées bancaires etc donc il n'y a pas de... Ah bah du coup ouais, c'est toi qui
00:05:43 :m'avais expliqué le check deploy avec Django, du coup qu'est ce qu'on pourrait avoir commeproblème de sécurité en fait avec Django parce que là j'ai fait mon check deploy ducoup je force HTTPS tout ça, mais quel autre problème de sécurité auquel on n'a paspensé on peut avoir avec Django, je sais pas, un bloc de check post, mettre une guette
00:06:05 :à la place, un endroit, ou c'est quoi vraiment les possibilités?Franchement avec tous les, avec les CSRF token, avec les HTML safe etc, après moi je ne suispas un expert en cybersécurité mais en fait ce qui est bien aussi avec Django c'est quevoilà tu, l'accès à ta base de données il est protégé par Python Anywhere par la
00:06:28 :plateforme, après on n'est jamais à l'abri de se faire que Python Anywhere se fasse hackeret qu'il récupère toutes les bases de données etc mais en fait tu vois par exemple toutce qui est mots de passe etc c'est des mots de passe hachés des utilisateurs, tout cequi est coordonnées bancaires etc c'est dans Strip, dans le coffre fort de Strip,
00:06:47 :donc voilà pourquoi aussi les gens utilisent Django parce que voilà c'est safe et c'estdéveloppé de manière safe donc il ne faut pas non plus trop, c'est clair que voilàsi on a peur de la sécurité etc on ne mettra jamais rien en prod, il faut se dire que tu
00:07:05 :as respecté les règles de sécurité et puis voilà si jamais il y a un problèmec'est pas forcément toi le responsable, ça peut être Python Anywhere, ça peut êtreStrip, donc voilà toi tant que tu as fait toutes les checks de sécurité etc tu peuxmontrer pas de blanche à tes clients etc.
00:07:23 :Voilà, je t'en remercie, mon premier gros projet complet est terminé quasiment.Mais c'est ton projet de réservation de place de concert c'est ça?Non non non, tu sais les trucs des idées là.
00:07:34 :Ah oui d'accord, mais là du coup il est où le… ah oui parce que tu vas gérer,les gens ils payent pour les idées?Ouais c'est ça, c'est pour un collègue, en gros il paye pour les idées et en faitj'ai fait en sorte, je voudrais vous montrer d'ailleurs un jour ça, j'ai fait par exemple
00:07:54 :en sorte que dans la page, le profil de la personne qui est inscrite sur le site, ily a toutes les idées en gros sur une même page en attente de modération, nos idéesqui sont publiées, nos idées payées tu vois, j'ai fait une page comme ça, doncavec pas mal de courriers différents, et en plus il y a un système de commentaires
00:08:18 :chaque fois sur chaque idée.Ok.Bah ouais ouais, hâte que tu nous montres ça quand ce sera en production.Bon bah du coup, je parle je parle mais je vais peut-être vous montrer des choses quandmême.
00:08:39 :Alors par quoi est-ce que vous voulez commencer l'intégralité de votre écran? Je vouspropose qu'on commence, est-ce que vous voyez, ouais vous voyez mon PyCharm là? Je vous
00:08:54 :propose qu'on commence par la mise en place des secrets dans Streamlit, et puis aprèson déroule si ça vous va.Alors, est-ce que je vais zoomer? Alors le classique, on va installer Streamlit.
00:09:24 :On va créer notre application, Python file dashboard.Alors je vous montre d'abord comment on fait pour gérer les secrets en local, parce qu'enfait vous développez toujours en local de toute façon avant de mettre en prod, et aprèsje vous montre dans Streamlit comment on fait pour gérer le secret.
00:09:54 :Alors en fait, il faut créer, là je suis dans mon dossier, bon il s'appelle le mentora2023 06 22, c'est le dossier dans lequel je suis.
00:10:04 :Il faut créer à la racine de là où il y a votre application principale Streamlit,vous créez un nouveau dossier qui s'appelle.streamlit, c'est un peu comme la dernière
00:10:14 :fois avec la config, je sais pas si vous vous souvenez.Et dans le.streamlit vous créez un nouveau fichier file qui s'appelle secret.toml.En fait, toml c'est un autre, je vous avais déjà montré les fichiers json, les fichiersyamal, et en fait c'est un type de fichier de configuration.
00:10:39 :Et donc là vous dites, vous rentrez un peu comme dans un fichier environnement, secret.key,et là vous mettez on va dire mon super secret, donc bien sûr vous mettez un truc intéressant,et ici dans le dashboard vous pouvez accéder à tout ce qui est secret via la variable,en fait c'est un dictionnaire qui s'appelle secret, et vous pouvez y accéder.
00:11:07 :Donc en fait ce qu'on va faire nous, on va définir deux colonnes, parce que j'aimebien celui-ci pour le formatage, et on va dire with col1, donc là on va dire, en faitça va être le login, donc là on va mettre, je vais mettre st, je vais le mettre dans
00:11:36 :une sidebar, je vais enlever ça en fait, et là on va mettre un champ de password,on va dire text-input, donc là on va dire password, et on va dire ici type password,en fait je ne vais pas le mettre et vous verrez pourquoi après il faut le mettre.
00:12:14 :Ok donc là pour l'instant on va juste faire ça, je vais vous montrer, streamlit-en-dashboard.On pourrait utiliser un.env, je ne suis pas sûr, parce qu'en fait là en local ça marcherait,
00:12:31 :par contre vous savez des fois quand je vous montre quand on héberge sur le streamlitcloud, attendez j'ai un truc, quand on héberge sur le streamlit cloud il ne va pas comprendrele.env, c'est pas un vps classique, donc attendez j'ai un problème, sidebar, elle
00:12:59 :s'écrit comment, oui il n'y a pas besoin de, je vais le mettre ici. Ok donc là vousvoyez en fait j'ai mon truc, et si je tape mon mot de passe vous voyez il est en clair,bon c'est pas terrible parce qu'en fait si vous avez un collègue qui est derrière
00:13:33 :votre épaule ça fait chier, donc il suffit juste ici de mettre type et vous dites passwordet ça va faire, vous voyez ici si je rerun, là vous voyez maintenant il va être caché,donc si j'écris ça va être caché. Donc là déjà c'est pas mal, attendez je ne
00:13:50 :vois plus vos commentaires, pour afficher le type password, c'était ça ta questiondu coup? Ah oui c'était plutôt, tu savais comment on faisait, c'était une question
00:14:08 :Fernando ou c'était plutôt une, oui Gabriel? J'ai un doute, pourquoi déjà extremevite on utilise le contexte with déjà, j'ai un doute. Pourquoi, parce qu'en fait
00:14:23 :ça veut dire, en fait si je ne mets pas le with st.sidebar il ne va pas comprendre,tu vois si par exemple je mets st.write, ah oui d'accord Gabriel, je pense que c'est
00:14:35 :bon. Je pose des questions de temps en temps, tu vois si je rerun, en fait il ne va pasme le mettre là où je veux. Oui ok d'accord. En fait c'est un moyen assez clean et pythonesque
00:14:53 :d'écrire là où on veut. Et tu peux même ici mettre des, en fait pour séparer toncode tu peux mettre des, c'est pas des contextes, c'est des, comment on appelle ça, c'estdes containers. En fait tu peux mettre des containers comme ça tu peux dire st.write
00:15:14 :hello et en fait ça te permet d'avoir un code un peu plus clean tu vois. Ok donc làon a mis notre password et maintenant ce qu'on veut c'est, ouais en fait Seb pour répondreà ta question, sur n'importe quel VPS oui tu peux installer, tu peux faire tourner une
00:15:49 :application Django mais, ouais voilà. Je te conseille d'utiliser les docker containersen fait si tu veux déployer une application Django sur un VPS, d'utiliser un docker containerc'est le mieux parce qu'en fait pour le déploiement c'est plus simple. Et voilà. Sinon, parce
00:16:08 :que, sinon ce qu'il faut faire oui c'est tu dois déployer ton projet Django, tu doisfaire tourner le serveur avec Junicorn et voilà. Donc c'est un petit peu, il y a un
00:16:18 :petit peu de mise en place quand même c'est pour ça que genre Python Anywhere c'est bienparce qu'en fait il le déploie pour toi tout seul mais c'est tout à fait possible de déployerune application Django sur un VPS. Je crois que docstring, bah docstring il est fait en
00:16:36 :Django et il tourne sur un VPS chez, je sais plus comment c'est, c'est pas hostinger,c'est DigitalOcean je crois. Ouais honnêtement franchement si tu veux pas trop te prendre
00:16:50 :la tête tu fais Python Anywhere, si t'as des questions n'hésite pas j'ai déjà faitplein de fois, Gabriel aussi l'a déjà fait et d'autres j'imagine aussi dans la communauté.
00:17:01 :Donc voilà, maintenant ce qu'on va faire c'est que pour pouvoir accéder, donc imaginonsqu'on veuille uniquement autoriser l'accès à notre application à des gens qui ont lebon mot de passe. Donc ce qu'on va faire c'est qu'on va dire dans l'application, on va dire
00:17:23 :tentative password, donc là on va récupérer en fait ce que l'utilisateur y rentre et donclà on va dire déjà if tentative pass, donc déjà est-ce que ça a été renseigné,if tentative password égal égal et donc là il suffit juste d'aller dire st.secret
00:17:44 :key, st.white on va mettre success et puis on va dire, voilà imaginons qu'on fasse destrucs sinon else st.warning access denied, ok donc voilà on est comme ça, et donc si
00:18:19 :je retourne sur mon application je fais rerun, donc là je vais essayer de tenter mon password,donc si par exemple je rentre burger, ici hop access denied on a pas accès, par contresi je rentre le mot de passe que j'ai dit je m'en souviens déjà même plus, c'est mon
00:18:39 :super secret, je mets ici, access denied, ok toujours un problème, tentative pass, pourquoipas, je pense qu'il faut que je le relance parce qu'en fait il n'a pas mis à jour,access granted, et si je remets, pour vous en convaincre, burger access denied, et enfait en fonction de, voilà, du coup si vous vous retrouvez ici il suffit de, voilà,
00:19:36 :là vous mettez votre application, vous mettez vos fonctions etc. mais voilà, donc voilàcomment vous pouvez gérer facilement une authentification, et en gros c'est safe parceque ici si par exemple vous utilisez git ou github, celui là le secret.toml il faut jamais
00:19:54 :le mettre dans le gitignore, c'est à dire il ne faut pas le publier, et après quandvous allez aller dans votre, dans streamlit, et ben en fait il suffira, je vais le mettreici, streamlit, streamlin, je vais continuer coquelle, oui, oui, allez, en fait ici quandvous allez déployer votre application, je vais essayer d'en déployer une autre, mais
00:20:40 :vous allez dans advanced settings, et là vous allez coller vos fichiers, donc là vousavez un truc secret, et il suffit juste d'aller mettre votre key, secret key, et là vousmettez votre password, donc my password, et ça va se comporter exactement comme en localici, et du coup ça veut dire qu'à aucun endroit dans votre code, vous voyez ici quand
00:21:11 :j'ai fait if tentative pass égal égal pour tester si mon code est bon, à aucun endroitdans mon code j'ai mis cette variable là, donc en fait ce qui va être ici sera toujourscaché et jamais personne ne le verra, que ce soit dans votre repo git hub, ou en fait
00:21:25 :il sera visible uniquement quand vous allez dans advanced settings que vous déployezvotre application ici, mais ça après c'est streamlit cloud qui le conserve, qui le hash,et il est jamais visible, il est visible uniquement par vous.
00:21:40 :Donc quand vous déployez votre application streamlit, vous allez ici, advanced settings,voilà.Pourquoi quoi, j'ai eu not callable, à quel moment?T'as pas eu une erreur à un moment donné quand tu as rentré ton secret, ton mot depasse, t'as pas eu une erreur la première fois?
00:22:02 :Euh, si, mais c'est parce que j'avais mal, j'avais tout simplement mal tapé je pense.Ah, j'ai essayé de le faire aussi, j'ai eu l'erreur aussi, je sais pas pourquoi.
00:22:12 :Avec les secrets?Ouais, ça me met not callable.Est-ce que tu l'as bien mis entre le crochet? Parce que en fait not callable c'est quand
00:22:21 :tu fais avec des parenthèses j'imagine.Ah oui, oui, oui, je suis bête, ouais c'est pour ça.Et en fait secret c'est un dictionnaire donc il fallait le chercher comme ça.
00:22:30 :Excuse-moi.Non, pas de souci.Voilà, est-ce que c'est du coup c'était Seb qui disait, qui était intéressé parça, est-ce que ça t'as capté le mécanisme?
00:22:42 :Ok, bah très bien, donc voilà comment on peut gérer une authentification assez simplementavec Streamlit et les secrets, franchement vous faites pas de soucis, c'est vraimentdes fichiers qui sont cachés et donc voilà, je redis, en local vous déployez comme çapour faire vos tests etc, mais après quand vous allez le déployer dans Streamlit, ouais
00:23:14 :donc le dossier Streamlit secret.ctoml etc c'est vraiment juste pour votre développementlocal pour tester.Quand vous allez le déployer sur Streamlit, vous allez dans advanced settings, vous tapezdirectement ce que vous avez mis dans votre, vous copiez-collez en fait ce que vous avezmis dans votre secret.ctoml et quand vous allez faire des appels de ce type là, le
00:23:34 :commande st.secrets, bah en fait il va aller chercher directement dans ce que vous avezrentré, donc vous avez pas besoin de vous occuper de mettre un fichier secret.ctoml
00:23:45 :dans Streamlit etc, c'est juste ça, en fait tout ce que vous aurez mis là, ça seraaccessible via la commande st.secrets entrecroché, voilà.Donc c'est directement stocké sur le Streamlit Cloud de manière sécurisée.
00:24:05 :Il y a des utilisateurs qui seront stockés là-dessus?De quoi? Le nom d'utilisateur?Tu peux, non en fait il n'y a pas de nom d'utilisateur, quand t'as une applicationStreamlit, en fait les seules choses qui seront stockées sur le cloud de Streamlit ce seratout ce que tu mets là-dedans, et après un utilisateur, tu vois moi en fait dans
00:24:30 :l'application que j'ai créée ici, j'ai pas mis d'utilisateur mais j'aurais puen mettre un, mais en gros toutes les datas que tu mets dans un Streamlit c'est stockédans le cache web de la session, mais dès que tu vas quitter ta page web etc, tout vaêtre effacé.
00:24:48 :Donc il y a uniquement les datas dans le cache qui sont stockées.Après tout ce qui est données utilisateurs etc, c'est jamais enregistré dans le cloudde Streamlit si c'est ta question et ta crainte.
00:25:00 :Parce qu'en fait oui on pourrait se poser la question, si tu développes une applicationcomme ça Streamlit pour un client qui a des données sensibles et qui charge des CSVpar exemple avec, je sais pas, vite bêtise, des données bancaires, des salaires ou deschoses comme ça, il n'y a pas d'inquiétude, c'est jamais stocké sur les serveurs de
00:25:21 :Streamlit, c'est écrit dans leur doc et pour m'en convaincre j'avais aussi poséune fois la question à la communauté au contact support technique qui m'avait réponduque non, en fait c'est uniquement stocké en cache sur ton navigateur web, dans lescookies etc.
00:25:37 :Après vérifie toujours qu'ils sont bien effacés mais normalement il n'y a pas desouci avec ça.Voilà, voilà pour les secrets.C'est bon pour vous, c'est clair? Ok, ok.
00:26:02 :Qu'est-ce que j'avais d'autre?J'avais un petit, ouais, ce que je vous propose maintenant c'est que, vous savezce qu'on a fait la dernière fois là, la base de données, enfin la base de données,est-ce que ça vous intéresse qu'on regarde comment on fait pour générer une petitebase de données TinyDB avec le module Faker qu'on a utilisé la dernière fois et après
00:26:38 :comment on fait des petites requêtes dessus.Dites-moi si ça vous intéresse.Ok, ok.Donc tout ça je peux le dégager.Alors.J'ai huit ans avant que je vienne sur Streamlit.
00:27:03 :Vas-y.Il me restait une dernière question.Tout le bloc, toute l'application que tu as fait avec Streamlit, tu vas tout fairedu coup dans la condition if tentative passe?
00:27:15 :Ouais, c'est une bonne question.Si on réfléchit en fait derrière ça.En fait moi ce que je fais c'est que je définis toute ma logique, parce que vraimentStreamlit faut le voir comme une interface en fait, et tout ce qui est logique du codeje l'écris dans des fonctions ou même dans des… Ouais je préfère écrire.
00:27:35 :Après je trouve que j'ai déjà eu pas mal de problèmes quand j'écris dans d'autresfichiers.Ça peut marcher en fait quand tu vas déployer ton application Streamlit, en fait tu vasdéployer un repo GitHub.
00:27:48 :Donc tous les fichiers qui sont dans le repo GitHub ils sont accessibles.Par exemple si tu fais un truc qui s'appelle utils, tu développes tes fonctions, def testfunction, retourne non.
00:28:04 :En fait dans ton dashboard tu peux dire from utils import, ça s'appelle comment ma fonction,test function, et en fait ici tu vas dire, tu vas appliquer st.write le résultat de
00:28:25 :ta fonction tu vois, test function.Comme ça tu sépares au maximum toute ta logique et ton application, mais oui, ce quiveut dire que tu vas être obligé de mettre tout ton code dans ce bloc là quoi, dansle tentative pass.
00:28:39 :Après tu peux trouver un moyen de mettre, je sais pas, t'enregistre, mais à la fintu es quand même obligé d'écrire des choses dans ce bloc là, dans ce niveau d'indentationici.
00:28:55 :C'est obligatoire.Mais je te conseille au maximum de séparer, de faire des fonctions, même si tu veux unseul fichier, tu écris tes fonctions et après tu les appelles ici parce que sinon ça devientvite le bordel.
00:29:07 :Ok super, super.Je t'appris.Voilà donc on va créer un petit, est-ce que, non je n'ai pas installé, donc çava être obligé, donc python tinydb, alors, c'est pas celui-là que je cherche, ouaisc'est celui-là.
00:29:46 :Ok, donc on va commencer par créer une database qui va s'appeler db.vizone, donc en faitles tinydb c'est des databases qui sont en mode, c'est un fichier physique que vous allezavoir sur votre ordinateur sous forme de json.
00:30:07 :Donc en fait voyez-le un peu comme du sqlite.Ok donc nous ce qu'on va faire c'est qu'on va d'abord créer une table ici, on va diretable employé et ça s'appelle employé, ok, et après on va la remplir.
00:30:27 :Donc je ne l'ai pas installé, ok donc là c'est installé, et maintenant ce qu'on vafaire, bon je vais peut-être le faire direct, je vais écrire le code que j'ai écrit justeavant pour que ça aille plus vite, create database, je vais tout copier et puis je vaisvous l'expliquer, et du coup je vais utiliser Faker aussi, install, Faker comme ça, ouais.
00:31:07 :Donc en gros on va utiliser le module Faker qui permet de générer des informations, desinformations un peu de test pour générer de la data, donc on le met en français.
00:31:22 :Comme la dernière fois je ne sais pas si vous vous souvenez mais on va créer une listede professions, on va en créer 20 parce qu'en fait si, imaginez que je crée 100 employés,je peux me retrouver avec 100 professions différentes.
00:31:39 :Donc moi ce que je veux c'est juste créer 20 professions différentes et à chaque foisque je vais créer un employé je vais aller faire un random pick, c'est à dire je vaisutiliser le module random pour aller choisir aléatoirement parmi la liste des 20 métiers.
00:31:54 :Donc en gros ma liste des 20 métiers elle est créée une seule fois quand je vais lancermon code et après c'est tout, j'aurai mes 20 métiers aléatoires et je vais aller leschercher aléatoirement dedans.
00:32:04 :C'est un peu la petite subtilité qu'on peut faire.Après là on va créer 3 types de contrats, cdi, cdd et cdc et le genre homme ou femme,je ne mets pas le genre autre comme on avait fait la dernière fois parce que j'ai enviede générer des prénoms féminins ou masculins en fonction du genre.
00:32:21 :Donc on va créer notre base de données, on va créer notre table et ici on va faireune boucle qui va itérer, en gros on dit qu'on veut 100 employés, on va même enmettre 1000, soyons fous.
00:32:38 :Est-ce que vous connaissez aussi, je vais vous le montrer, je pense que je vous l'avaisdéjà montré, c'est UDM, en fait ça permet de voir un progrès quand on itère commeça sur, là j'en mets 1000, du coup ça peut être long, je vais voir si j'en mets10000, voilà on va faire, chrome tqdm, import tqdm, en fait des fois quand on fait des boucles,
00:33:11 :on aime bien voir si notre programme il dure hyper longtemps, on aime bien voir où est-ceque ça en est si jamais il y a un bug ou quoi, et avec tqdm c'est hyper simple, vouspouvez en fait afficher où est-ce qu'il en est quand vous avez un itérable, vous
00:33:25 :allez le voir affiché, je vais vous le montrer après.Donc en gros ce que j'ai dit c'est que pour chaque itération d'employé, on vagénérer un genre, on va prendre soit un homme soit une femme, c'est pour ça queje fais un random choice dans la liste genre.
00:33:42 :Non je crois pas que tu puisses l'afficher dans le front Gabriel, c'est uniquement duterminal.Alors on va choisir au hasard un homme ou une femme à chaque itération, et du coupon va définir si le genre c'est féminin, on va choisir un prénom féminin, et si legenre est masculin on va choisir un prénom masculin.
00:34:07 :Ok, et après du coup ce qu'on va faire c'est que dans la table, dans la table, bienvenueSébastien, ce qu'on va faire maintenant c'est que dans la table qu'on a créé,donc la table employé, on va faire un insert, donc c'est vraiment comme si dans une basede données vous faisiez en SQL insert table, enfin intable insert machin, ben là en fait
00:34:42 :on fait ça et c'est sous forme de dictionnaire.Donc c'est pour ça que TinyDB c'est cool parce que c'est de la manipulation de dictionnaireen somme.
00:34:52 :Donc là ce que je fais c'est qu'à chaque itération je vais lui dire le nom, c'estun fake nom, le prénom on l'a déjà défini ici parce qu'en fait il dépend de est-ceque c'est un homme ou est-ce que c'est une femme.
00:35:05 :Ici la profession comme on l'a dit c'est un random choice dans une liste, ça vousconnaissez random choice? Si par exemple je vais juste l'écrire import random as
00:35:22 :nbn, si je définis une liste par exemple, ok si vous connaissez je ne vais pas revenirdessus, ça ne sert à rien.Voilà donc à chaque itération je vais faire un random choice de contrat, je vais choisirle genre que j'ai déjà mis en random dont je me suis servi et le salaire.
00:35:42 :Le salaire on va dire que c'est un chiffre random entre 1000 et 5000 et la date de naissanceça va être une fake date, fake date between dates donc en fait ça permet de dire la datede débarque et la date de fin.
00:36:02 :Donc je lui dis deux objets date et après je le retransforme en string parce qu'en faitdans Json on ne peut pas stocker des objets date, on ne peut stocker que des strings doncc'est pour ça qu'ici je lui dis le format dans lequel je le veux.
00:36:17 :Donc voilà et si maintenant je fais, il va peut-être falloir, attendez, je vais installerle clip, install, et puis il va falloir que je relance parce qu'en fait, je vais relancerle clip.
00:36:55 :Ok donc là vous avez vu, je vous ai un peu expliqué comment on fait pour créer la tableet donc là si je fais, je sais si j'arrive à écrire monsieur, ok donc là je vais fairerun create database tindb et donc là vous voyez j'ai bien ma barre de progress grâce
00:37:20 :à TQDM, donc vous voyez j'ai demandé 10 000, dans ma base de données je lui ai demandé10 000 employés, donc là il me dit en fait à chaque itération où est-ce qu'il est,donc ça je trouve que c'est cool, ça permet un peu, si vous avez une boucle qui est hyper
00:37:34 :longue, parfois on se dit bah merde c'est bugué tout ça je vais devoir arrêter, donclà vous voyez c'est assez simple avec juste TQDM dans votre itération vous pouvez afficherle progress.
00:37:49 :Donc là j'ai une base de données qui commence à être un peu élevée, mais bon j'ai peut-êtreété un peu gourmand je lui ai dit 10 000, c'est un peu gros, et il vous donne aussi,en fait il vous fait une estimation du temps restant, donc là il dit 55, ouais à peu
00:38:14 :près ça va durer une minute je pense, une minute cinq secondes, bon je le laisse unpetit peu faire.Tu vois là avec le processeur que j'ai je suis à 50 itérations par seconde, peut-êtreque si j'avais un autre, si j'avais plus de RAM ou quoi ce serait à 100 itérations
00:38:37 :par seconde.Bon maintenant je le laisse terminer, j'aurais peut-être pas dû mettre 10 000 mais bonc'était pour vous montrer la barre de progression c'est intéressant.
00:38:47 :T'es sur Mac toi? Ouais sur la puce M1.Je ne connaissais pas trop, et c'est bien ça non? Ouais en fait c'est les nouvellespuces M1 qui sont sorties, donc là maintenant ils sont aux puces M2, mais les puces M1en fait la RAM elle est directement intégrée au processeur, donc ça fait des processeurs
00:39:16 :un peu plus, beaucoup plus performants parce que t'as beaucoup moins de barrières physiquesentre ta RAM et ton processeur, en fait entre ta RAM la mémoire cache elle est directementaccessible par le processeur parce qu'elles sont quasiment soudées l'une avec l'autre.
00:39:35 :Là où sur un processeur classique t'as ton unité logique processeur et ta mémoirecache qui est dans ta RAM qui est pas au même endroit.
00:39:46 :Voilà donc là la base de données elle est créée, elle s'appelle db.json donc si jevais la voir, donc vous voyez que j'ai mes 10 000 employés, c'est pas mal, don'tworry, je vais le faire encore et juste avant j'ai installé une application dans PyCharmqui permet, voilà le fichier JSON il est un peu dégueulasse à lire, pas de soucis
00:40:11 :c'est le machin t'inquiète pour le retard, qui s'appelle JSON parser, comment j'avaisfait tout à l'heure, login install json, comment j'ai fait tout à l'heure pour lelire, ah oui evaluate machin, donc en fait vous pouvez copier coller, où est-ce quej'avais mis ça, attendez attendez, ah oui c'était ça, JSON input.
00:41:21 :Bon je sais plus comment il fonctionne mais en fait ça permettait d'avoir une visualisationun peu plus sympa du JSON parce que là c'est un peu dégueu, mais je pense que mon fichierJSON est hyper lourd aussi.
00:41:57 :Bon bref c'est pas grave, tiens d'ailleurs il est en train de me bugger tellement lefichier est lourd je pense.Et ouais bravo j'ai réussi à le bugger.
00:42:27 :Ok bon je vais le quitter.Et donc maintenant on a notre base de données, on est content, si je vais dans terminal,et que si maintenant on veut faire des petits filtres et qu'on veut lire les choses qu'ily a dans la base de données, on peut le faire, bien sûr, je vais récupérer ce que j'avais
00:42:47 :créé tout à l'heure.Donc en gros on a notre DB, ce qu'on peut dire c'est qu'on peut aller voir les tables,DB.tables, vous voyez que dans ma table, j'ai une table qui s'appelle employé, donc en
00:43:04 :fait ce qu'il faut faire, il faut se créer un objet query qui va nous permettre de fairedes requêtes dans la base de données.Donc en gros ici il faut que je définisse une query, donc d'abord je vais définir matable, donc imaginez qu'on peut même faire un autre script en fait où on a déjà, on
00:43:26 :va dire un autre script où on va lire la base de données, donc read DB, ok, et jevais même l'écrire ici, ok, je vais zoomer, donc là en gros je vais quitter ça, justepour que, pour vous en convaincre, donc là on a notre base de données qui a été créée,
00:43:47 :donc maintenant c'est un fichier JSON, on peut se les changer entre copains etc. commeon veut.Et pour aller le lire, il suffit ici, vous voyez, donc là je vais récupérer ma basede données qui existe, donc là vous voyez tout à l'heure elle n'existait pas du coupil me l'a créée, mais là maintenant qu'elle existe, il va aller la lire.
00:44:07 :Ce que je veux c'est aller voir la table employée parce qu'en fait dans une base dedonnées on peut créer plusieurs tables, mais là nous ce qui nous intéresse c'estla table employée.
00:44:16 :Ici je vais créer ma query qui va me permettre d'aller faire des requêtes, donc query, etici donc c'est voilà un exemple de requête qu'on peut faire, on veut dans la table employéeon veut faire un search dans lequel uniquement les employés de genre homme.
00:44:32 :Donc si je fais run, run, run, read, et là si je fais employé homme, bah là je vaisvraiment avoir que les employés qui sont des hommes.
00:44:53 :Et ce que vous voulez on peut même faire un petit truc sympa, on peut dire import pandaas pd, et on peut même dire df égal pd point data frame, data frame employé homme, donclà je vais mettre juste un head, vous avez votre base de données en data frame, mais
00:45:30 :en gros ce que je vous conseille c'est de garder votre base de données en mode db.jsonet comme ça après vous pouvez la manipuler.Et donc là vous voyez j'ai affiché uniquement les cinq premières entrées de ma base dedonnées, j'aurais pu faire un tail, tail pour queue en anglais, et donc là c'est les derniers.
00:45:50 :Et vous voyez que normalement j'ai 10 000 entrées et la dernière entrée c'est 4891parce qu'en fait j'ai demandé que les hommes et ça correspond bien à un comportementaléatoire parce qu'en fait vous voyez j'ai à peu près 5000 employés hommes parce qu'enfait j'avais une chance sur deux à chaque fois de récupérer un homme parce que j'ai
00:46:09 :fait un random.Donc voilà j'ai à peu près 5000 lignes parce que voilà j'avais une chance sur deux.Si par exemple, après on peut utiliser la puissance des data frames, là vous voyezj'ai un data frame, si je fais df.countsValue il me semble, c'est juste df.counts, comment
00:46:44 :on fait avec la data frame, attendez je vérifie juste, ah c'est value count, si je fais df.valuecount il va me sortir, je vais sortir attendez avec, je vais pas faire uniquement df en faitje vais sortir, le genre, ah oui mais je suis con c'est parce que je suis que les employés,
00:47:30 :c'est parce que j'ai que les hommes.En fait imaginez que l'on veuille par exemple, dans le df moi j'ai quoi, dans le df j'aiaussi la profession, donc parmi tous les hommes on va dire qu'on va compter, on va essayerde connaître il y a combien d'hommes par profession.
00:47:45 :Donc si je fais ici profession.value.counts, en fait il va me sortir, vous voyez un peudes statistiques, donc là par profession, en gros dans les hommes j'ai 268 ingénieursdu son, 261 ingénieurs qualité moteur, 237 élagueurs etc.
00:48:03 :Donc c'est pas mal en fait avec le, une fois que vous avez votre base de données en Jsonvous pouvez la mettre dans un data frame et avec le data frame vous avez accès à toutesles statistiques imaginables que vous pouvez avoir.
00:48:17 :Si par exemple là dans mon df, si je veux dire df, je veux dire groupe moi les hommesgroup by profession, et par profession après moi ce que je veux faire c'est que je veuxdire group by machin, on va dire apply max, max et juste on va dire les salaires, apply
00:48:54 :max.Et donc en fait vous voyez là ce que j'ai fait c'est que j'ai par profession, donc j'aigroupé mon data frame par profession, et par profession j'ai sorti le salaire et j'aisorti le max.
00:49:08 :Donc là ça veut dire que parmi tout, vous voyez tout à l'heure en value.counts, sije regardais par exemple les pharmaciens, donc j'avais 225 pharmaciens et je sais queparmi les pharmaciens, où est-ce qu'il est les pharmaciens, parmi tous les pharmaciens,parmi les 225, le salaire maximum du pharmacien c'était 4978.
00:49:33 :On pourrait faire autre chose, là j'ai dit le max, mais je pourrais dire je veux la moyenne,le minimum, pourquoi la moyenne il meurt pas, j'en sais rien, voilà, il y a plein de,on peut sortir la médiane, il faut import, et là en fait ça va être np.min, donc là
00:50:03 :j'ai sorti la moyenne, je peux sortir la médiane, je peux faire plein de trucs.Le salaire mini et maxi, bah ouais je peux faire ça, en fait je peux faire même agrègue,et en fait ce que tu lui dis, tu donnes un dictionnaire et tu dis sur le salaire, donc
00:50:21 :en fait il n'y a même pas besoin je pense, tu peux lui dire, en fait tu peux mettre,je crois, tu peux mettre une liste, donc tu peux dire max, min, comment on fait déjà,on va apply several functions, je vais demander à chatgp, ça va faire un bon exemple, je
00:51:24 :vais zoomer un peu. Alors c'est ag, ok donc c'est ce que j'ai testé, function, ag function,ouais donc on va se dire comme ça, on va se définir des fonctions, donc on va dire lasomme max, nous on veut juste par exemple le max et le min, donc je lui dis max, min,
00:52:18 :et donc là au lieu maintenant de faire le apply, si c'est ça que j'avais fait, c'étaitdirectement un dictionnaire que je pouvais mettre, function, ah oui d'accord, et salairemax, oui je peux mettre comme ça, attends excuse moi c'est parce que je suis en trainde le faire en live, max et min, ok donc ça je peux le dégager, donc en fait là tu vois
00:53:21 :par profession j'ai affiché le max, le min et puis je peux même rajouter dans les fonctions,je peux dire je veux np, ça ça va marcher, median, la moyenne, voilà tu vois donc j'aitout rassemblé par profession, j'ai sorti le max, le min, la median et la moyenne. Bon
00:53:57 :bah voilà c'était un peu ce que je voulais vous montrer avec tinyDB, un petit peu demanipulation panda aussi. Est-ce que vous avez des questions, des remarques?
00:54:18 :Ok bon bah c'est cool, si vous n'avez pas de questions, j'avais dit que je vous montreraisun peu le setup et tout ça que j'ai mais je vous montrerai la prochaine fois parceque ça peut prendre un peu de temps. La rediff sera dispo bien sûr Sébastien je
00:54:53 :pense que j'upload ce soir et puis ce sera dispo. Désolé au tout début on a un petitpeu discuté je pense pendant 5 minutes et j'ai pas enregistré mais rien d'important.
00:55:04 :Puis n'hésite pas si tu as des questions Sébastien, si t'étais pas là au début.Et puis vous en faites pas quand vous êtes en retard ou quoi, y'a aucun soucis pourmoi c'est plus pour vous, vous pouvez louper des choses mais voilà y'a la rediffusiondonc c'est pas grave. Faut pas que ce soit un truc chiant pour vous. Bon bah si ça vous
00:55:30 :va on s'arrête là et puis on va uploader comme d'habitude. Je vais couper le partagedu écran. Bonne soirée à tous, merci. Bonne soirée du coup. Merci, merci. Ouais,
00:56:02 :c'est assez aberrant. Oui Salvatore je peux faire du scrapping si tu veux la prochainefois avec Beautiful Soup, tu connais? Ouais, après je t'avoue que je suis pas le plus
Aucune occurrence trouvée pour « ».
Bravo, tu es prêt à passer à la suite