Transcription
1. Bande-annonce du cours: Bonjour à tous, Bienvenue dans la vidéo d'aujourd'hui, qui contient des conseils pour écrire un Python efficace. m'appelle Lisa Simpson et je suis scientifique des données dans une grande institution financière. Mais environ quatre ans d'expérience mon collègue Ray et moi voulions vraiment réaliser ces vidéos, car nous constatons qu'il y a un énorme écart et les compétences que vous
apprenez à l'école par rapport celles dont vous avez réellement besoin. dans le monde réel. Toutes nos vidéos seront donc axées sur des jeux de données
réels, des problèmes réels, et vous donneront les compétences nécessaires pour résoudre ceux qu'ils n'enseignent pas nécessairement à l'école. Nous sommes très heureux de vous accueillir aujourd'hui et espérons que vous resterez dans les parages. Il existe des tonnes de façons différentes d' accélérer ou d'optimiser votre code en Python. Dans ce cours, je vais me concentrer sur l'
accélération d'une tâche spécifique que vous allez probablement faire beaucoup en tant que scientifique des données et non pas en boucle dans un DataFrame Pandas et en appliquant des
transformations en données textuelles. Nous expliquerons quand et pourquoi
optimiser votre code, ainsi que six façons différentes de
parcourir un DataFrame Pandas. Ensuite, nous allons prendre ce que nous avons appris pour l'appliquer à deux exemples de code que nous avons refactorisés. Ce tutoriel est conçu pour être super convivial pour les débutants. Nous utiliserons les Notebooks Jupyter pour que vous puissiez voir tout le code que j'écris et l'exécuter seul pour vous-même. Et nous utiliserons des bibliothèques de science des données très populaires comme les pandas et NLTK. Les données que nous utiliserons pour cours d'
aujourd'hui sont le jeu de données AG News. Il s'agit d'un ensemble de données de textes très populaire qui contient plus d'un million d'articles d'actualité, leurs titres et leurs descriptions, ainsi que des catégories pour chacun des articles de presse. Dans ce cours, nous allons simplement nous concentrer sur le titre de l'article de presse. De plus, bien qu'il y ait plus d'un million de points de données dans cet ensemble de données, nous n'allons échantillonner quelques milliers d'enregistrements simplement parce que nous ne voulons pas que notre code fonctionne pour toujours. Et avec ça, commençons.
2. Aperçu du cours et outils: Très bien, passons à quelques conseils pour écrire un Python efficace. Ce cours est destiné à être vraiment convivial pour les débutants. Nous utiliserons quelques bibliothèques de science des données
très populaires, telles que les pandas et NLTK ou Natural Language Toolkit. Maintenant, vous n'avez pas besoin d'être un expert dans ces bibliothèques, mais il est utile de les connaître
un peu. Je ferai de mon mieux pour expliquer les choses tout au long du cours. J'ai répertorié Python 3 dans la section Compétences intermédiaires. Je m'attends à ce que vous connaissiez déjà un
peu Python. Mais si ce n'est pas le cas, nous utiliserons des carnets Jupyter. Vous pouvez facilement suivre et exécuter les cellules vous-même. Tout au long de ce cours, nous allons nous concentrer sur le prétraitement de texte pour nos articles d'actualité. J'ai en fait un autre cours sur le traitement du langage naturel en Python, nous utiliserons plusieurs
des méthodes enseignées dans ce cours. Je vous recommande donc fortement de
vérifier celui-ci avant de regarder ce cours, donc, ce cours, nous utiliserons PyCharm comme environnement de développement, mais nous utiliserons vraiment Jupyter Carnets de notes pour le développement réel. Pycharm nous permettra simplement de faire tourner un carnet Jupiter et d'y apporter toutes nos modifications. Vous pouvez désormais utiliser n'importe quel IDE de votre choix. Je préfère simplement PyCharm mais n'hésitez pas si vous utilisez Anaconda, pourrait être spidered ou VS Code ou n'importe quel IDE le fera. En plus des cahiers PyCharm et Jupiter, nous nous concentrerons sur les bibliothèques, les pandas et le Natural Language Toolkit, ou NLTK.
3. Guide de l'optimisation: Donc, la version courte pour
résumer ce cours est que vous n'avez peut-être pas besoin
d'effectuer une optimisation immédiatement. Je vous recommande de suivre quelques
étapes avant de vous lancer
dans l'optimisation de votre code. Tout d'abord, votre code
doit être exécuté pour que vous puissiez savoir s'
il s'agit d'une optimisation. Alors commencez par faire l'étape pour vous
assurer que votre code s'exécute, puis après cette vérification, mais vous obtenez la
sortie que vous attendez, car parfois
votre code peut fonctionner, mais les résultats sont produire de l'art une fois que
vous vous y attendez,
une fois que
vous l'avez exécuté, et qu'il s'agit de la sortie
à laquelle vous vous attendez, alors vous pouvez commencer à réfléchir ,
ok, est-ce
que cette vue est actuellement acceptable Pour moi ? Mais il ne s'agit pas uniquement de vous. Si vous écrivez ce code pour quelqu'un d'autre ou que quelqu'un d'autre consomme votre code
si vous voulez vous
assurer que la vitesse est
acceptable pour cela, alors s'il n'y a pas de personnes
qui utilisent votre code, il se peut que des utilisateurs travaillent
indirectement avec votre code. Il est donc important de parler
avec eux du type de performance qu'ils
attendent
d' une certaine application. Enfin, après avoir
couvert tout cela, vous êtes potentiellement
prêt à optimiser. Et lorsque vous commencez à optimiser, vous finirez par répéter
le cycle encore et
encore jusqu'à ce que vous répondiez à vos exigences
d'optimisation. J'ai modifié ce type est un peu tiré de la
documentation de Python. N'hésitez donc pas à vous
rendre sur leur site Web et lire une tonne plus sur les
différentes façons d'optimiser. Et encore une fois, dans ce cours, je ne
vais me concentrer que sur un
très petit sous-ensemble de la façon dont vous pouvez optimiser votre code Python.
4. Quand optimiser: Nous avons parlé des
étapes de l'optimisation, mais quand devriez-vous réellement
optimiser votre code ? J'ai énuméré
ici quelques exemples
différents de moments où vous voudrez peut-être
optimiser votre code. Parlons-en à travers eux. Et l'une des premières
fois que vous
devrez peut-être optimiser votre
code est lorsque vous commencez travailler avec l'IA Big Data le plus longtemps et que vous travaillez
avec de très petits jeux de données. J'ai écrit du code qui fonctionnait
pour ces jeux de données. Il y a donc eu des moments
où j'ai commencé à évoluer vers des jeux de données plus volumineux que je n'étais pas en mesure exécuter mon code efficacement
comme auparavant. Ainsi, une fois que vous commencez à gérer
des jeux de données très volumineux, vous voulez commencer à
écrire votre code la
manière la plus optimale possible. Une autre raison pour laquelle vous souhaiterez
peut-être optimiser votre code est la
création d'un composant réutilisable. Supposons donc que vous travailliez sur une certaine fonction
et que vous découvriez que cette
fonction est
vraiment utile pour les
autres membres de votre équipe. Vous avez d'autres personnes
qui font exactement
la même chose que vous, et elles pourraient également utiliser
cette fonction. C'est peut-être le cas lorsque
vous souhaitez optimiser votre code, car de plus en plus de
personnes l'utilisent,
et potentiellement, elles
peuvent s' exécuter, exemple, sur un jeu de données plus grand, alors vous voyez
si vous allez de l'avant et effectuez une certaine
optimisation pour eux. Ensuite, vous
voudrez peut-être optimiser moment où vous êtes déployé dans le Cloud, de
sorte que chaque fois que vous commencez
à exécuter des choses et que vous dites AWS ou Google Cloud, ces ressources ne sont pas gratuites lorsque vous exécutez les choses
sur votre ordinateur portable local. Peu importe la lenteur
qu'ils courent. Il s'agit simplement de
combien de temps êtes-vous prêt à attendre qu'ils
terminent le Cloud. Vous avez cette
complexité supplémentaire de devoir payer pour ces
ressources que vous utilisez. Donc, afin de ne pas
avoir vos affaires pour toujours et de vous
charger de cette énorme cloche, vous voulez probablement essayer
d'optimiser vos codes, faire fonctionner le plus rapidement possible. Un autre exemple de l'
optimisation peut être lorsque vous travaillez
avec des utilisateurs externes
et
que vous essayez de leur offrir la meilleure expérience
possible. Supposons que vous ayez créé une
sorte de modèle qui fait une prédiction sur certains sites Web et que l'utilisateur doit
interagir avec ce modèle. Eh bien, ils ne veulent
pas attendre 10 heures pour obtenir une réponse de votre part
quant à votre prédiction. Lorsque vous avez des personnes
qui
dépendent de quelque chose que vous
leur
fournissez, vous voulez absolument
essayer d'optimiser votre code et de le rendre
le plus rapide possible. L'optimisation entre en
jeu chaque fois que vous essayez d' effectuer une itération rapide pendant
une démonstration de concept. Et souvent, lorsque vous
travaillez sur une preuve de concept, vous aurez beaucoup de méthodes
ou de techniques
différentes que vous
souhaitez vérifier. Et pour pouvoir
les tester rapidement, votre code doit être optimisé. Enfin, il existe des préoccupations
éthiques pour un code qui
fonctionne très longtemps, même si
votre code s'exécute dans le Cloud en coulisses, tout est exécuté dans un centre de
données quelque part dans les centres de données ont une
empreinte carbone qui leur est attachée. Ainsi, plus votre code s'exécute longtemps, plus vous augmentez
potentiellement empreinte
carbone
du centre de données. Donc, si vous êtes conscient
de l'environnement, cela pourrait également être une autre
raison d'optimiser.
5. Aperçu des méthodes: Nous allons parcourir six façons différentes de
parcourir un DataFrame Pandas. Nous allons commencer par la version
la plus lente et
progresser jusqu'à
la version la plus rapide. Nous allons donc
couvrir les boucles. Il est apparu ou tuples,
une compréhension de liste, déclarations d'
application et de
vectorisation avec des séries de pandas. Et si vous ne
savez pas ce que cela signifie, c'est très bien. Nous allons
tout couvrir dans ce cours aujourd'hui.
6. Charger un carnet de notes Jupyter: Très bien, j'ai donc ouvert mon IDE, qui est PyCharm. Et ce que j'ai fait, c'est déjà créer un projet TA pour ce cours. J'ai un dossier pour les données, ai mon carnet Jupyter là-dedans ainsi que mon fichier
requirements.txt qui contient toute la bibliothèque que nous utiliserons. Encore une fois, n'hésitez pas à utiliser n'importe quel environnement de développement qui vous convient. C'est peut-être du code VS, peut-être vous, cette araignée n'a pas vraiment d'importance. Nous allons simplement utiliser cela pour nos fichiers, puis ouvrir un carnet Jupiter à partir d'ici. L'une des meilleures pratiques lorsque vous
démarrez un projet Python
consiste donc démarrez un projet Python à créer un environnement virtuel et y
installer toutes vos bibliothèques. Je l'ai déjà fait, mais si vous ne l'avez pas fait, ce que vous pouvez faire est d'ouvrir le terminal dans PyCharm, j'ai déjà configuré mon environnement d'origine et pour installer ces exigences, ce que je ferais c'est simplement faire cette ligne ici. s'agit donc de pip install dash r, qui
lui dit que nous avons un fichier de besoins et ensuite nous listons le nom du fichier de besoins. Donc pour que notre ordinateur portable
Jupiter fonctionne ici dans le terminal, je vais juste taper le carnet jupyter. Et cela va se produire en observant nous interagissons avec le carnet Jupyter. Voici donc notre serveur Web local avec notre bloc-notes Jupiter. J'ai ce carnet Python ici. Vous auriez dû pouvoir télécharger ceci ainsi que les données et le fichier d'exigences avec les bibliothèques du site Web du cours. Je vais cliquer sur ces conseils pour écrire un bloc-notes Python
efficace pour l'
ouvrir et nous allons commencer. Bon, maintenant que nous avons notre bloc-notes, commençons à parcourir un peu de code. Ce carnet est vraiment conçu pour être une pièce autonome, et il y a beaucoup de ce que j'ai couvert dans les diapositives. Alors n'hésitez pas à lire tout ce texte si vous voulez un peu de motivation pour pourquoi nous pourrions accélérer notre code. Petit exemple ici au début, j'ai également une note ici sur la façon de télécharger PyCharm si vous n'avez pas d'environnement de développement et que vous souhaitez en avoir un, je recommande vivement PyCharm. Vous pouvez suivre ce lien ici, allez sur ce site et ensuite vous
pourrez sélectionner votre système d'exploitation différent. Et je recommande d' la version communautaire car elle contient peu près tout ce dont vous auriez besoin. Un pied que je cours en ce moment. Mais si vous voulez payer quelques fonctionnalités supplémentaires, elles ont également une version professionnelle. Je vais passer en revue certains
des éléments que j'ai déjà abordés dans les diapositives et allons descendre pour en savoir plus sur notre jeu de données.
7. À propos des données: Nous travaillerons avec le jeu de données AG News. Et il s'agit d'un ensemble de données texte très populaire qui contient plus d'un million d'articles d'actualité différents et qui contient les titres de leurs articles d'actualité, les descriptions, ainsi qu'une colonne
de catégorie et quelles sont les différentes catégories. des articles de presse sont les suivants : J'ai extrait cet ensemble de données de Kaggle, donc j'ai fait un lien ici si vous voulez y aller et avoir peur, même s'il y a plus d'un million d'enregistrements dans le jeu de données, nous allons simplement en utiliser un échantillon. Ce que je fais ici, c'est charger et quelques bibliothèques dont nous aurons besoin. Je suis en train de lire dans ce fichier CSV train.py. Ce sera notre jeu de données avec lequel nous travaillerons. Ensuite, j'échantillonne 5 000 disques à partir de là. Cet état aléatoire n'est qu'un nombre aléatoire qui vous permet de reproduire mes résultats. Allons de l'avant et lançons cela et examinons notre jeu de données. Vous pouvez donc voir ici que nous
avons cette colonne d'index de classes. Il y a une catégorie pour chacun des articles de presse. Nous avons le titre de l'article de presse
ainsi qu' une description de l'article d'actualité. Dans cette classe, nous allons vraiment nous
concentrer uniquement sur la manipulation du titre de
l'article d' actualité que vous pourriez également utiliser cet ensemble de données pour un
problème de classification si vous le souhaitez.
8. Loop For: Aujourd'hui, nous allons donc parcourir un bloc de données. Et il y a beaucoup de façons différentes de le faire. L'une des choses vraiment géniales que j'aime Python ou n'importe quel langage de programmation, c'est qu'il n'y a pas de bon moyen de résoudre un problème. Vous pouvez avoir deux personnes qui ont tendance à être audacieuses. 20 personnes trouvent toutes des solutions
complètement différentes qui résolvent le même problème. Nous allons donc parcourir six façons différentes de parcourir un DataFrame Pandas. Et nous allons calculer le nombre de caractères dans le titre de chacun de ces articles d'actualité. Et nous verrons comment les performances ont un impact sur chacune de ces méthodes. Nous allons donc commencer par l'une des méthodes les plus lentes. Et il ne s'agit que d'une boucle de base de quatre boucles qui
sont utilisées, se trouvent dans de nombreuses langues différentes et constituent l'
un des moyens
les plus basiques l'
un des moyens
les plus basiques d'itération sur les données. Donc, si vous avez appris un autre langage de programmation avant Python, vous avez probablement déjà fait quatre boucles auparavant. Ce à quoi cela finit par ressembler en Python, c'est la suite pour chacun de ces exemples, je vais démarrer un minuteur pour suivre le temps que prennent les exemples. Notez simplement que, selon les ressources dont vous disposez sur votre machine, vous obtiendrez peut-être des réponses légèrement différentes de celles que moi. Même si vous l'exécutez plusieurs fois, vous obtiendrez probablement des réponses différentes. Nous utilisons donc la bibliothèque de temps pour obtenir notre heure de départ. Et ensuite, dans notre
heure de fin, nous calculons combien de temps cela prend. Donc, pour faire une boucle sur un DataFrame avec une boucle pour, ce que nous faisons d'abord , une liste
temporaire pour contenir tout le nombre de caractères du titre que nous allons parcourir en boucle. La syntaxe est similaire à de nombreuses langues différentes. Nous allons dire que pour moi dans plage 0 jusqu'à la longueur du DataFrame, tout ce qui fait est d'obtenir nombre de lignes dans le DataFrame, déterminant quel est le nombre maximal que nous avons besoin d'itrer. terminé. Et nous utilisons moi comme variable d'index. Donc, à l'intérieur de la boucle for, ce que nous faisons, c'est prendre ce DataFrame, c'est ce que nous faisons. Je le verrouille. Et c'est un moyen d'indexer différentes parties d' un DataFrame Pandas et d'accéder à différentes parties de celles-ci utilisant notre variable précédemment pour indiquer quel élément nous sommes dans le DataFrame. Et puis nous extrayons également le titre de cette colonne et pour obtenir le nombre de caractères, tout ce que nous faisons cette fonction Len pour obtenir la longueur de cela. Nous stockons cela dans une variable, puis nous l'ajoutons notre liste que nous avions créée temporairement auparavant. Il va donc parcourir chaque élément de notre DataFrame, calculer la longueur, ajouter à la liste, puis ensuite attribuer cette liste à une nouvelle colonne de notre DataFrame. Voyons donc combien de temps cela prend 5000 disques et voyons le résultat. Donc,
pour moi, cela a pris environ cinq secondes et en fonction vos ressources sur votre machine, vous obtiendrez probablement une réponse différente celle que je fais, et c'est tout à fait très bien. Nous commençons donc par notre méthode la plus lente ici
, puis nous allons travailler à la hauteur des méthodes
les plus efficaces. Jusqu'à présent nos résultats ici, nous avons cette nouvelle colonne notre DataFrame appelée allonger. Et cela indique le nombre de caractères figurant dans le titre de chacun de ces enregistrements. Donc je viens d'imprimer le premier virus, oh, les enregistrements. Mais cela l'a fait si j'ai 1000 enregistrements au total.
9. Iterrows: Ensuite, nous avons une fonction appelée Iter Rows. Il s'agit d'une fonction spécifique à Pandas DataFrames et je vous
permet de parcourir un DataFrame sous forme de paires de séries d'index. Et les paires de séries d'index sont l'élément important, car c'est là
que nous obtenons certains de nos gains d'efficacité ici. Syntaxe, pourquoi cela
ressemble-t-il vraiment à la boucle for que nous avons écrite auparavant. En fait, cela commence par une boucle for-loop. Il semble que nous utilisions cette fonction de lignes
ITER au lieu de la plage pour obtenir automatiquement le nombre de lignes qui doivent être itératées. Nous n'avons pas à faire ce que nous avions fait avant. Cependant, cette fois-ci, nous nommons deux variables, une appelée index,
puis une ligne de colonne afin que nous
puissions parcourir les indices. Ensuite, nous avons notre ligne, et nous prenons chaque ligne, nous obtenons le titre de cette ligne, puis nous obtenons la longueur de celle-ci. Et nous ajoutons également que notre liste est similaire à notre exemple précédent. Affectez ensuite cette liste à une nouvelle colonne appelée length. Donc, si nous exécutons cela, nous pouvons voir combien de temps cela prend et comparer cela à la méthode d'origine. On dirait donc que nous
avions déjà eu environ cinq secondes ici et que nous l'avons descendu à environ 1,5 seconde. Et vous pouvez voir dans notre DataFrame ici que nous
obtenons exactement la même réponse. Il suffit donc de trouver un peu changer la façon dont nous avons écrit notre code. Nous avons gagné beaucoup d'efficacité ici, mais en alerte au spoiler, nous pouvons réellement faire mieux que cela.
10. Itertuples: Il y a donc une autre fonction dans les pandas appelée itertools et elle est vraiment similaire à elle, mais au lieu d'itérer sur des paires de séries d'index, et cela crée chaque ligne en tant que tuple nommé. Et c'est là que nous obtenons les gains d'efficacité ici. vue syntaxique ressemble à l'autre. Nous n'avons pas besoin de définir un index car il s'agit d'un tuple nommé, nous définissons simplement notre variable de ligne, puis nous appelons ce df.head sont des tuples pour en
boucle sur chaque élément de notre DataFrame sans avoir à faire de ce que nous avons fait dans notre premier exemple. Cette fois, nous prenons chaque ligne, nous obtenons le titre, puis nous avons la longueur pour l'ajouter à notre liste et nous lui attribuons une nouvelle colonne. Donc, lorsque nous exécutons cela et que cela
finit par obtenir des résultats inférieurs à la seconde, si ce qui est une amélioration par rapport à l'endroit où nous avons commencé, que vous donnez sujet ou des tuples, c'est que vous devez utiliser cet accessoire à points. Donc le titre des points rho au lieu de cette notation entre crochets que nous avons utilisée avec les lignes ITER. Et ce qui est ennuyeux, c'
est que cela ne fonctionne pas si vous avez des espaces dans le nom de vos colonnes. Donc, pour utiliser cette méthode, que je vous recommande fortement de le
faire, il est apparu renommer toutes vos colonnes
si elles ont des espaces pour s'en débarrasser, ce qui peut être un peu ennuyeux à faire. Mais une fois que vous avez écrit et une fois que vous avez cela pour le reste de votre vie. Donc, dans le cas où vous essayez de décider si je devais l'utiliser est apparu ou entrez des tuples. Il est toujours recommandé de l'utiliser ou tuples pour effectuer une itération sur un bloc de données. C'est donc l'un des moyens les plus rapides que vous puissiez.
11. Comprendre la liste: Les trois dernières méthodes et je vais en parler. Ils sont tous assez similaires en vitesse. Et en fonction de la situation dans laquelle vous
vous trouvez, vous pourriez être en mesure d'en utiliser une ou vous devrez peut-être la récupérer. La prochaine étape est la compréhension des listes. La compréhension des listes offre simplement une syntaxe plus courte pour créer une nouvelle liste basée sur les valeurs d'une liste existante. Et c'est spécifique à Python, je crois que oui. Vous n'avez peut-être pas vu cela dans d'autres langues avant lui. La syntaxe peut être un peu déroutante. Je sais que lorsque j'ai commencé à apprendre la compréhension des listes, j'ai
un peu soufflé. C'est vraiment difficile à comprendre pour moi. Une fois que vous commencez à les voir, à quelques reprises, vous vous sentez vraiment à l'aise avec eux, puis vous avez
commencé à voir où vous pouvez les utiliser beaucoup dans votre code. En fait, c'est ce que j'aime faire avec une compréhension de liste, c'est commencer par la boucle for, lire là, puis revenir à ce
qui se passe au début de la compréhension de la liste. Nous disons donc que pour x dans le titre
de la colonne DataFrame, obtenez la longueur de chaque sortie. Nous utilisons donc cette liste comme liste et nous disons
essentiellement que notre colonne d'origine était une liste, puis nous allons en obtenir la
longueur et l'enregistrer en tant que nouvelle liste. Nous le faisons en une seule ligne, donc c'est un peu plus simple et
plus compact que les autres méthodes dont nous avons parlé jusqu'ici. Et cela crée une liste pour nous,
donc nous n'avons pas à ajouter à la liste comme nous l'avons fait et à d'autres scénarios. Nous prenons notre liste, puis nous l'affectons à une nouvelle colonne et nous pouvons exécuter et voir combien de temps cela prend. Et encore une fois, c'est un peu plus rapide. En fin de compte, l'approche des tuples ITER que nous avions faite auparavant. Mais parfois, il y a beaucoup de choses
compliquées que vous devrez peut-être
faire pour texter ou n'importe quelle donnée avec laquelle vous travaillez. Et cela ne correspond pas
parfaitement à une compréhension de liste. Il y a donc des moments où vous pouvez utiliser cette méthode et d'autres fois où il peut être logique d'utiliser la méthode suivante qui est appliquée.
12. Appliquer: Fly est spécifique à Pandas DataFrames. Et ce qu'il fait, c'est qu'il permet
d'appliquer une fonction le long d'un axe d'un DataFrame. Cela signifie que je peux appliquer une fonction à toutes mes colonnes ou à toutes mes lignes. Et la façon dont je l'utilise la plupart du temps, c'est que je vais
appliquer une fonction à toutes les lignes de mon DataFrame. Souvent, vous utilisez les instructions Appliquer avec Lambda pour créer des fonctions en ligne. Donc, la façon dont cela ressemble en Python, c'est que
nous déterminons quelle colonne nous voulons manipuler. Dans ce cas, c'est notre titre de DataFrame. Nous appliquons des points et ensuite nous faisons ce lambda x avec un deux-points
, puis nous lui donnons la fonction que nous voulons faire. Donc, dans ce cas, je reçois juste la longueur de ma valeur x si elle va obtenir la longueur, chaque titre dans nos lignes DataFrame. Mais ils sont vraiment gentils avec les instructions d'application, c'est que vous pouvez écrire votre propre fonction personnalisée, ce que nous verrons en fait plus tard sur quelques exemples qui,
et que, au lieu de mettre de la longueur ici, vous n'avez qu'à appeler votre fonction. C'est donc vraiment bien que vous puissiez faire des choses plus complexes dans votre fonction. Ensuite, appelez simplement la fonction ici et appliquez-la à chaque ligne de votre dataframe. Donc, si on y arrive, c'est super, super rapide. Nous avons encore une fois des vitesses inférieures à la seconde sur 5000 disques. Et appliquer est l'une de mes méthodes préférées pour appliquer des fonctions à différentes lignes et à mon DataFrame. Comme c'est celle que j'ai tendance à choisir souvent parmi toutes les méthodes dont nous parlons.
13. Vectorization avec série Pandas: Une dernière méthode de bouclage sur un DataFrame est la vectorisation avec des séries de pandas. Il s'agit généralement de l'approche la plus rapide que vous puissiez utiliser pour effectuer une boucle sur DataFrame. Le plus délicat, c'est que parfois vous ne pouvez pas obtenir vos données dans le bon format pour utiliser cette méthode. Nous avons de la chance que dans ce cas, je nous ai donné un exemple où cela ne fonctionne pas. Nous pouvons voir comment cela fonctionne, mais parfois vous ne pouvez pas obtenir vos données dans le bon format pour que cela fonctionne. La vectorisation vous permet donc d'appliquer différentes opérations sur des tableaux entiers plutôt que sur chaque individu. Donc, pour tous les autres exemples que nous avons parcourus jusqu'ici, il s'agit de parcourir chaque ligne de notre DataFrame. vectorisation consiste à prendre la colonne entière ,
puis à appliquer une transformation à la colonne. De cette façon, nous n'avons pas à
parcourir chaque élément du DataFrame. Dans la pratique, c'est que nous avons notre chronique que nous voulons manipuler. Je reçois la version chaîne de cette colonne, puis j'obtiens la longueur de celle-ci. Et quand nous exécutons ça, et c'est aussi assez rapide. Et je vois ici que c'est un peu plus lent que la méthode d'application. Mais si vous l'exécutez plusieurs fois, vous obtiendrez des résultats différents. Donc, ce sont tous des sous-secondes, donc nous sommes en très bonne forme.
14. Exemple de code 1 - Example: Prenons maintenant tout ce que nous avons appris ici et examinons quelques exemples de code où nous avons une version plus lente du code, puis nous allons y refactoriser un peu rendre un peu plus rapide. Dans ce premier exemple, ce que nous allons faire, c'est nettoyer le titre de nos articles d'actualité en minuscules m et textos, ou en plaçant certains jetons d'un dictionnaire puis en supprimant les nombres et la ponctuation des textes. Ce sont des étapes de prétraitement assez standard que vous feriez normalement si vous avez affaire à des données textuelles. Et j'ai en fait un cours sur le traitement du langage
naturel avec Python qui couvre plusieurs d'entre eux, ainsi que différentes méthodes pour travailler avec le traitement du langage naturel. Donc, s'ils sont nouveaux pour vous, je vous recommande vivement de consulter ce cours et d'en apprendre davantage sur ces étapes. Donc, dans notre dossier de données, une autre chose que j'ai incluse est un dictionnaire que j'ai créé. C'est juste un fichier CSV. Nous avons donc deux colonnes depuis et vers. De la colonne a un tas d'abréviations et UK et NBA, nous et les deux colonnes ont la version complètement élargie de cette abréviation. Il arrive parfois que vous
souhaitiez étendre les abréviations que vous pourriez avoir dans votre texte. Et c'est une façon de le faire. Je suis en train de créer un dictionnaire vous-même. C'est exactement ce que nous allons faire ici. Nous avons des abréviations dans les titres de nos articles de presse que nous voulons étendre à leur version complète. Pour ce premier exemple, nous allons commencer par importer quelques bibliothèques que nous utiliserons. La plupart d'entre eux se trouvent uniquement dans le Python de base, puis nous utiliserons pandas pour nos DataFrames comme nous l'avons utilisé dans ces autres exemples. Je vais donc filtrer quelques avertissements que nous avons reçu ne pas encombrer nos tracés de sorties sans avertissement, les avertissements de filtre d'
arrêt sont en train de faire. Ensuite, nous avons deux fonctions ici pour prétraiter nos textes. La première est une fonction de remplacement de dictionnaire, et nous ne faisons que prendre
le titre de l'article d'actualité ici. Ainsi, dans cette fonction, nous chargeons
notre dictionnaire et l'enregistrons en tant que DataFrame, nous créons une liste temporaire pour contenir tous nos jetons étendus ou propres. Et ce que nous faisons, c'est prendre notre titre de notre article d'actualité et le diviser sur les espaces blancs. Cela nous donne donc une liste de jetons que nous allons parcourir. Ce que nous faisons ici parcourir chacun de nos jetons en
boucle, vérifiant si c'est dans le dictionnaire que nous l'avons chargé. Si c'est le cas, nous allons
ajouter cette version étendue à notre nouvelle liste. Sinon, il suffit d'ajouter le jeton précédent à partir de là. Ce que nous faisons, c'est de réunir tous ceux qui sont ensemble
à l'aide de cette fonction de jointure. Et nous venons de séparer ceux avec des espaces blancs pour qu'il s'agisse d'une seule chaîne au lieu d'une liste de jetons. Tout cela consiste donc à remplacer un dictionnaire. Ensuite, nous avons ici la deuxième partie de notre prétraitement. Nous prenons en compte toute une trame de données
et cette fonction , et ce que nous faisons, c'est en fait faire une factorisation, qui était l'une des méthodes
les plus rapides nous avons parlé, nous sommes d'abord en minuscules dans nos textes avec cette chaîne est inférieure sur toute la colonne. Ensuite, nous remplaçons les chiffres par un espace. Et puis nous avons un tas de ponctuations différentes que nous avons énumérées ici que nous allons également
remplacer par des espaces. Donc, après avoir fait tout
cela, nous utilisons une application avec un Lambda pour appeler cette fonction de remplacement de dictionnaire et appliquer à chaque ligne du DataFrame. Nous utilisons donc ici un mélange de méthodes plus lentes ainsi que de quelques méthodes rapides. Et nous verrons ici combien de temps cela prendra. Je vais charger ces fonctions que je viens de parler. Et puis, comme nous l'appelons réellement ainsi et prétraitons la fonction de titre, nous transmettons l'intégralité de notre DataFrame. Et puis rappelez-vous que cela applique également le
remplacement du dictionnaire après le nettoyage de nos jetons. Donc, si nous exécutons cela, nous verrons combien de temps cela prendra. Et donc sur ma note de machine j'exécute un logiciel de reporting. C'est probablement pour cela que ça prend un peu plus de temps, mais il
m'a fallu environ deux minutes pour courir sur environ 5000 disques. Maintenant, si vous n'avez que 5 000 points de données, c'est peut-être suffisant pour vous. Encore une fois, vous pouvez réfléchir à ces différentes étapes d'optimisation. Nous avons eu notre urine de pied, nous avons obtenu les bons résultats, puis nous commençons à réfléchir, d'accord, est-ce logique est-ce logique
que cela dure aussi longtemps dans mon scénario ? Je suis d'accord avec ça ? Donc, si je fais
juste cette analyse sur le côté, c'est
probablement très bien pour moi. Mais les problèmes surviennent généralement lorsque
vous commencez à traiter des jeux de données très volumineux. Encore une fois, cet ensemble de données compte au total plus d'un million d'enregistrements. Donc, si nous devions le faire sur l'ensemble de données et que nous devions attendre trop de
temps pour que nous soyons patients et que nous attendions. Nous pouvons donc voir les résultats ici, nous avons cette nouvelle colonne intitulée Clean. Et vous pouvez voir ici que nous l'avons réduit en minuscules. Nous avons quelques abréviations auxquelles j'ai été étendu. Nous nous sommes également débarrassés des chiffres ,
puis de n'importe laquelle de ces ponctuations.
15. Exemple de code 2 - refactored: En ce qui concerne notre version refactorisée, nous avons nos deux mêmes fonctions, mais nous les avons écrites légèrement différemment. Donc, au lieu de charger le dictionnaire chaque fois
que la fonction s'exécute, ce que
nous faisions auparavant, nous allons le charger une fois puis le transmettre dans notre fonction. Et ensuite, nous allons également prendre le titre de l'article d'actualité comme nous l'avons déjà fait. Nous avons donc condensé notre fonction originale en lion. Et cela utilise la fonctionnalité des dictionnaires ainsi que la compréhension des listes. Vous pouvez donc voir ci-dessous dans notre code ci-dessous, lorsque nous chargeons notre dictionnaire, nous effectuons un formatage pour l'obtenir dans un vrai format de dictionnaire, alors qu'auparavant il s'agissait d'un DataFrame. Lorsque nous le faisons, nous pouvons utiliser cette fonctionnalité d'obtention de points pour le faire. Regardez vers le haut pour voir si le mot existe dans le dictionnaire. S'il renvoie la version entièrement développée, sinon retournez le mot d'origine. Nous avons donc changé toute cette déclaration si elle est
en une seule ligne ici. Et le reste n'est qu'une compréhension de liste. Nous disons donc que pour chaque mot de notre partage de points de titre, exécutez cette fonction. Ce fractionnement de points de titre obtient simplement une liste
des jetons qui se trouvent dans le titre en fonction de l'espace blanc. Donc, puis nous parcourons chacun de
ces éléments , puis exécutons cette fonction de dictionnaire. Enfin, après avoir récupéré l'intégralité de notre liste, nous l'avons rejoint en une seule chaîne avec la fonction jointure. Ensuite, nous avons notre fonction de prétraitement cette fois-ci Au lieu de prendre un DataFrame entier et effectuer des opérations sur l'intégralité du DataFrame, nous allons simplement les faire sur le titre lui-même et utiliser application ultérieurement. pour appliquer cela. Nous avons donc ici les mêmes choses que nous faisions auparavant. Nous faisons notre boîtier inférieur avec le point de titre plus bas. Cette fois-ci, vous remplacez les chiffres par la bibliothèque 3D, qui est un peu plus rapide que l'approche que nous faisions auparavant. Et ensuite, nous supprimons également toute ponctuation ici. Cela peut sembler un peu compliqué, mais ce que nous faisons ici, c'est utiliser cette fonction Translate, qui est une fonction que vous pouvez appeler sur des chaînes. Et puis nous utiliserions ce point str make trans pour effectuer certaines transformations. Ici, vous remarquerez que nous avons une ponctuation de points de cordes. La bibliothèque de chaînes est vraiment sympa car elle a déjà
une liste calculée pour nous de toutes les différentes ponctuations. Nous n'avons donc pas à les
énumérer tous comme nous l'avons fait auparavant. Donc, en fin de compte, l'ambitieux remplace toute ponctuation par des espaces blancs. Et pour être honnête, je ne l'ai pas écrit moi-même. Je suis allé voir mon vieil ami Google et trouvé un article sur Stack Overflow qui
discutait des différentes façons d'éliminer la ponctuation et de quelle façon était la plus rapide. Je l'ai trouvé et je l'ai juste copié dans ce carnet et cela fonctionne très bien pour notre situation. est donc qu'un simple rappel que vous
n'avez pas besoin de savoir comment
tout optimiser est tout à fait normal de ne pas se sentir libre d'utiliser des ressources telles que Google et StackOverflow pour trouver le moyen le plus optimal de faire quelque chose. Passons maintenant à l'
application de ces fonctions et voyez, vous verrez ici que nous chargeons notre dictionnaire juste une fois, à l'origine, il semblait logique d'inclure cela avec le car elle était liée à ce que nous faisions, mais elle s'ouvrait chaque fois que cette fonction était appelée. Nous n'avons pas besoin de le faire. Nous pouvons simplement le charger en une seule fois et l'obtenir dans
ce format de dictionnaire
, puis le transmettre dans notre fonction. Donc, pour réellement appliquer ces fonctions, nous utilisons des instructions d'application avec une fonction Lambda pour appeler cette fonction en ligne. Ici, nous prenons le titre de la colonne DataFrame. Nous utilisons cette application avec lambda x, puis nous appelons notre fonction de prétraitement. C'est maintenant la version la plus avancée de ce dont je parlais plus tôt, où nous utilisions simplement des lambdas pour appeler la longueur du titre. Cette fois, nous appelons notre propre fonction personnalisée, ce qui est vraiment sympa. Donc généralement la façon dont j'aime faire les choses. Ainsi, une fois notre texte prétraité et la prochaine chose que nous pourrons faire, appelez le remplacement de notre dictionnaire et remplacez toutes ces instances. Et donc, si nous courons, cela finit par prendre moins d'une seconde. Nous sommes donc passés de deux minutes auparavant à moins d'une seconde ici, ce qui est fou juste en réécrivant la façon dont nous avons écrit notre code original. Vous verrez ici que j'ai sauvegardé cette nouvelle colonne appelée title clean version deux. Et cela nous donne exactement le même résultat que celui que nous avons obtenu avant.
16. Exemple de code 2 - Example: Passons donc à notre prochain exemple. Disons que dans cet exemple, nous voulons compter le nombre de jetons figurant dans le titre de l'article d'actualité. Mais pour être considéré comme un jeton, et nous allons avoir quelques conditions qui doivent être vraies. Nous allons lemmatiser tous nos jetons pour les amener à leur forme racine. Et ces jetons lemmatisés doivent
être plus grands qu'un seul personnage pour ne pas être un mot d'arrêt. Et trois, soyez dans Natural Language Toolkit, vocabulaire. Tout cela est une sorte de nouvelle terminologie pour vous. Je vous recommande de consulter mon autre cours, traitement du langage
naturel en Python, où nous approfondissons ce que signifie lemmatiser si les mots stop, ce qu'est un vocabulaire, toute cette terminologie. Pour implémenter ces règles en Python,
nous pourrions donc importer quelques bibliothèques dont nous avons besoin,
principalement NLTK, qui est Natural Language Toolkit et pandas. Donc NLTK a une liste de mots stop et ensuite a son propre sont lemmatisées que nous allons faire. Si vous exécutez cela pour la première fois, vous devrez peut-être les télécharger et je les ai déjà téléchargés, donc il devrait simplement me passer lorsque je l'exécute. Nous avons ici cette fonction appelée nombre de jetons dans le vocabulaire NLTK, et elle prend une chaîne à l'intérieur de la fonction que nous appelons WordNet lemmatisée à partir de NLTK. Ensuite, nous allons mettre en place un comptoir. Nous commençons par une simple boucle for ici. Et nous sommes de nouveau en train de diviser notre chaîne sur des espaces blancs comme nos autres exemples. Cela nous donne une liste de jetons et nous allons parcourir chacun de ces jetons. Euh, donc pour chaque jeton de notre liste, on va lemmatiser le jeton. Et si la longueur des jetons est supérieure à un, ce n'est pas dans nos mots stop et c'est dans notre vocabulaire, alors augmentez le compteur et cela
reviendra le nombre de jetons répondant à ce critère. Allons les charger. Vous pouvez voir ici que j'ai déjà téléchargé
ces éléments NLTK, mais le téléchargement peut prendre une seconde. Ensuite, je vais supprimer le DataFrame avec lequel nous travaillions plus tôt et simplement échantillonné 50 enregistrements car l'alerte spoiler, cette méthode prend beaucoup de temps. Et si nous faisions 5000 disques pour
lesquels je ne voudrais pas que nous soyons assis ici. Nous allons donc nous faire gagner du temps ici et les supprimer et
les recharger dans un DataFrame avec seulement 50. Donc, pour appliquer cette fonction en premier lieu, nous allons appliquer le prétraitement que nous avons fait dans notre premier exemple, ainsi que le remplacement de notre dictionnaire. Nous allons maintenant utiliser l'une des méthodes les plus rapides pour appliquer cette fonction à notre colonne de nettoyage du titre. Voyons donc combien de temps cela prend à courir. Très bien, donc pour moi, cela a pris près de trois minutes, qui n'est probablement pas acceptable étant donné qu'il ne s'agit que de 50 enregistrements. Voyons donc quels sont les résultats ici. regardant simplement En regardant simplement
les cinq premiers enregistrements de notre DataFrame, vous pouvez voir ici que nous avons le nombre de jetons répondant à certains critères.
17. Exemple de code 2 - refactored: Maintenant, en ce qui concerne la
version refactorisée, nous
allons en fait nous débarrasser de la fonction que
nous avons écrite auparavant et l'
utiliser d'une manière
légèrement différente. Nous allons garder les deux
premières choses que nous
avons faites de notre exemple précédent, le
prétraitement et le remplacement de notre
dictionnaire. Maintenant, ce que nous avons également fait ici,
c'est sortir ce mot net lemmatisé et les mots d'arrêt et le vocabulaire
de la fonction. Et nous appelons simplement ces
derniers pour qu'ils ne soient pas recréés chaque fois
que la fonction est appelée. Maintenant, c'est là que
la magie se produit. Nous avons ici une
déclaration d'application où le lambda avec une compréhension de
liste. Décomposons cela car cela peut sembler un peu
compliqué au début. Donc, ce que j'
aime habituellement refaire, quand je regarde les
compréhensions des listes, Commencez là où se passe la boucle
for-loop, lisez tout cela à droite, puis revenez à ce
qui se passe sur le
du côté gauche de ça. Nous appliquons donc
cette opération
à l' intégralité de notre DataFrame sur
notre colonne de nettoyage du titre. Donc, dans ce cas, c'est notre sortie. Par conséquent, pour chaque élément que
nous effectuons une itération, nous allons le
diviser sur l'espace blanc. Cela nous donne donc
une liste de jetons semblable à ce que nous avons fait
dans les exemples précédents. Ensuite, nous allons vérifier
certaines conditions différentes. Nous allons nous assurer que
le jeton lemmatisé est supérieur à un personnage. Ce n'est pas dans nos mots
stop et c' est dans notre vocabulaire NLTK, si tous ces critères sont remplis, nous allons
revenir juste ce jeton. Tout cela est enroulé dans
une compréhension de liste. N'oubliez pas que nous
allons avoir une liste de jetons
qui répondent à ces critères. Et puis on peut juste obtenir
la longueur de la liste. Et cela devrait
nous donner le même résultat que celui de
la diapositive précédente. Donc, lorsque nous exécutons cela, nous passons de
près de trois minutes
à moins d'une seconde, ce qui est génial de le voir. Dans notre code ici, vous verrez que nous obtenons
exactement la même réponse que pour la version
précédente. Et nous avons gagné
tellement de temps à le faire. Cela termine donc ce cours sur conseils pour écrire un Python
efficace. J'espère que vous avez appris
quelques techniques pour parcourir les Pandas, DataFrames ainsi que quelques
prétraitements en cours de route. Et cela ne fait que gratter la surface de ce que vous pouvez faire avec l'optimisation de votre
code en Python. De plus, lorsque vous commencez à traiter
des données agar, il existe d'autres outils
et bibliothèques tels que Hadoop et VAX qui peuvent
vous aider à gérer vos Big Data. Merci d'avoir
suivi cette leçon, et j'ai hâte de vous
voir dans la prochaine.