Skip to content

Intermediate Python

Run the hidden code cell below to import the data used in this course.


1 hidden cell

Les datasets

Supposons que vous travaillez dans une usine chimique et que vous avez une tonne de mesures de température à analyser. Ces données peuvent se présenter sous la forme suivante : chaque ligne est une mesure, ou une observation, et pour chaque observation, il existe différentes variables. Pour chaque mesure, il y a bien sûr la température, mais aussi la date et l'heure de la mesure, et le lieu. Autre exemple : vous avez collecté des informations sur les pays dits BRICS, le Brésil, la Russie, l'Inde, la Chine et l'Afrique du Sud. Vous pouvez à nouveau construire une table avec ces données, comme ça. Chaque ligne est une observation et représente un pays. Chaque observation a les mêmes variables : le nom du pays, la capitale, la superficie en millions de kilomètres carrés et la population en millions.

Pour commencer à travailler sur ces données en Python, vous aurez besoin d'une sorte de structure de données rectangulaire. C'est facile, on en connaît déjà un ! Le tableau NumPy 2D, n'est-ce pas ? Eh bien, c'est une option, mais pas nécessairement la meilleure. Dans les deux exemples que nous avons couverts, il existe différents types de données et les tableaux NumPy ne sont pas très efficaces pour les gérer. Dans l'exemple des BRICS, la superficie et la population sont des flotteurs, tandis que le pays et la capitale sont des chaînes, par exemple. Vos ensembles de données comprendront généralement différents types de données, nous avons donc besoin d'un outil mieux adapté à la tâche.

Pour gérer facilement et efficacement ces données, il existe le package Pandas. Pandas est un outil de manipulation de données de haut niveau développé par Wes McKinney, basé sur le package NumPy. Comparé à NumPy, il est de plus haut niveau, ce qui le rend très intéressant pour les data scientists du monde entier. Dans pandas, nous stockons les données tabulaires comme la table brics ici dans un objet appelé DataFrame. Jetez un œil à la version Pandas DataFrame des données BRICS que je vous ai montrées auparavant.

On peut créer un dataset en plusieurs moyens

via un dictionnaire

via un fichier.csv Essayons d'importer ces données dans Python en utilisant la fonction Pandas read_csv. Vous passez le chemin vers le fichier csv comme argument.

Si vous imprimez maintenant des briques, il y a toujours quelque chose qui ne va pas. Les étiquettes de ligne sont considérées comme une colonne à part entière. Pour résoudre ce problème, nous devrons indiquer à la fonction read_csv que la première colonne contient les index de ligne. Pour ce faire, définissez l'argument index_col, comme ceci.

Cette fois, les brics contiennent le DataFrame avec lequel nous avons commencé dans cette vidéo. Il contient bien les étiquettes de ligne et de colonne. La fonction read_csv comporte de nombreux autres arguments qui vous permettent de personnaliser votre importation de données, assurez-vous de consulter sa documentation.

Accès aux colonnes, aux lignes et aux éléments uniques Il existe de nombreuses façons d'indexer et de sélectionner des données à partir de DataFrames, nous allons donc procéder étape par étape. Tout d'abord, je vais parler de la façon d'utiliser les crochets ; Ensuite, il y a les méthodes avancées d'accès aux données, loc et iloc, qui rendent Pandas extrêmement puissant.

Si vous souhaitez sélectionner une colonne mais conserver les données dans un DataFrame, vous aurez besoin de doubles crochets, comme celui-ci.

La façon de le faire est de spécifier une tranche. Pour obtenir les deuxième, troisième et quatrième rangées de briques, nous utilisons la tranche 1 deux-points 4. Rappelez-vous que la fin de la tranche est exclusive et que l'index commence à zéro. Voici les index des lignes pour que vous voyez ce qui se passe. Ces crochets fonctionnent, mais ils n'offrent que des fonctionnalités limitées. Idéalement, nous voudrions quelque chose de similaire aux tableaux NumPy 2D. Là, vous avez également utilisé des crochets, l'index ou la tranche avant la virgule faisant référence aux lignes, l'index ou la tranche après la virgule faisant référence aux colonnes. Si nous voulons faire la même chose avec Pandas, nous devons étendre notre boîte à outils avec les fonctions loc et iloc. loc est une technique permettant de sélectionner des parties de vos données en fonction d'étiquettes, iloc est basé sur la position. Commençons d'abord par loc.

Jetons un autre coup d'œil au brics DataFrame et essayons d'obtenir la ligne pour la Russie. C'est comme ça que c'est fait. Vous mettez l'étiquette de la ligne d'intérêt entre crochets après loc. Encore une fois, nous obtenons une série Pandas, contenant toutes les informations de la ligne, affichées de manière plutôt gênante sur différentes lignes.

Pour obtenir un DataFrame, nous devons mettre la chaîne "RU" dans une autre paire de crochets.

Reprenons les mêmes exemples qu'avec loc, et commençons par obtenir la rangée pour la Russie. En loc, vous utilisez la chaîne "RU" entre doubles crochets, pour obtenir un DataFrame, comme ici. Dans iloc, vous utilisez l'index 1 au lieu de RU. Les résultats sont exactement les mêmes.

Take Notes

Add notes about the concepts you've learned and code cells with code you want to keep.

Add your notes here

Liste vs Dictionnaire les listes et les disctionnaires sont semblables

Il y a cependant de grandes différences. La liste est une séquence de valeurs qui sont indexés par une plage de nombres. Le dictionnaire, par contre, est indexé par des clés uniques, qui peuvent être de n'importe quel type immuable. Quand utiliser lequel, je vous entends demander? Eh bien, si vous avez une collection de valeurs lorsque l'ordre est important et que vous souhaitez sélectionner facilement des sous-ensembles entiers de données, vous devez utiliser une liste. Si, d'autre part, vous avez besoin d'une sorte de table de recherche, où la recherche de données doit être rapide et où vous pouvez spécifier des clés uniques, un dictionnaire est l'option préférée.

View example of dictionnary

# Add your code snippets here

dict= {'delta': 23, 'gama': 45.6}
print(dict)

Matplotlib Vizualisation

Cette librairie est uiliser pour visualiser des donnés

  • plt.plot(xdata, ydata, linestyle = 'linestyle_value') --> pour le diagramme linéaire
  • plt.scatter(xdata, ydata, s = size_data, c = col_data, alpha = opacity_value) --> diagramme de points
  • plt.hist(xdata, nbBins) --> histogramme pour classer les données dans x et compter le nombre de valeurs dans chaque classe
import matplotlib.pyplot as plt
import numpy as np

x_data = np.random.normal(150, 10, 250)
y_data = np.random.normal(1600, 10, 250)

linear = plt.plot(x_data, y_data, linestyle = 'dotted')
plt.title("Linear")
plt.show(linear)
scatter = plt.scatter(x_data, y_data, s= x_data/2)
plt.title("Scatter")
plt.show(scatter)
hist = plt.hist(y_data, 20)
plt.title("Histogram")
plt.show(hist)

Les disctionnaires

Quelques récaps

dict = { key: value} ( liste de clés valeurs)

  • get value : dict[key]
  • set new data : dict[key] = value
  • update existing key : dict[key] = value
  • remove data : del(dict[key])

Numpy array comparator

Filtrage des données Pandas Dataframe

Supposons maintenant que vous souhaitiez conserver les pays, donc les observations dans ce cas, dont la superficie est supérieure à 8 millions de kilomètres carrés. Il y a trois étapes à cela. Tout d'abord, nous voulons obtenir la colonne d'aire de brics. Ensuite, nous effectuons la comparaison sur cette colonne et stockons son résultat. Enfin, nous devrions utiliser ce résultat pour faire la sélection appropriée sur le DataFrame.

Étape 1 : Obtenir la colonne Donc, la première étape, obtenir la colonne de zone à partir de brics. Il existe de nombreuses façons de procéder. Ce qui est important ici, c'est que nous obtenons idéalement une série Pandas, pas un DataFrame Pandas. Faisons cela avec des crochets, comme ceci. Cette alternative loc, et cette version iloc, fonctionneraient également parfaitement bien.

Étape 2 : Comparez Ensuite, nous effectuons réellement la comparaison. Pour voir quelles lignes ont une aire supérieure à 8, nous ajoutons simplement plus de 8 au code précédent, comme ceci. Nous obtenons maintenant une série contenant des booléens. Si vous le comparez aux valeurs réelles de la zone, vous pouvez voir que les zones avec une valeur supérieure à 8 correspondent à True, et celles avec une valeur inférieure à 8 correspondent maintenant à False. Permettez-moi de stocker cette série booléenne sous la forme is_huge.

Étape 3 : Sous-ensemble DF La dernière étape consiste à utiliser cette série booléenne pour créer un sous-ensemble de Pandas DataFrame. C'est quelque chose que je ne vous ai pas encore montré. Pour ce faire, vous mettez is_huge entre crochets. Le résultat est exactement ce que nous voulons : uniquement les pays dont la superficie est supérieure à 8, à savoir le Brésil, la Russie et la Chine.

Opérateurs booléens Maintenant, nous n'avons pas encore utilisé les opérateurs booléens. Rappelez-vous que nous avons utilisé cette fonction logical_and du package NumPy pour effectuer une opération booléenne par élément sur les tableaux NumPy ? Parce que Pandas est construit sur NumPy, vous pouvez également utiliser cette fonction ici. Supposons que vous ne vouliez conserver que les observations dont la superficie est comprise entre 8 et 10 millions de kilomètres carrés. Après avoir importé numpy en tant que np, nous pouvons utiliser la fonction logical_and() pour créer une série booléenne. La seule chose qui reste à faire est de placer ce code entre crochets pour subdiviser les briques de manière appropriée. Cette fois, seuls le Brésil et la Chine sont inclus. La Russie a une superficie de 17 millions de kilomètres carrés, ce qui ne remplit pas les conditions. J'espère que ces exemples vous ont montré à quel point il est facile de filtrer les DataFrames pour obtenir des résultats intéressants.

Boucles For

For in dataframe with pandas

Si un Pandas DataFrame devait fonctionner de la même manière qu'un tableau NumPy 2D, alors peut-être qu'une boucle for de base comme celle-ci, pour imprimer chaque ligne, pourrait fonctionner. Voyons quelle est la sortie. Eh bien, c'était plutôt inattendu. Nous avons simplement obtenu les noms de colonne. Aussi intéressant, mais pas exactement ce que nous voulons. Dans Pandas, vous devez mentionner explicitement que vous souhaitez parcourir les lignes.

Pour ce faire, vous appelez la méthode iterrows sur le pays brics, spécifiant ainsi une autre "séquence" : la méthode iterrows examine le DataFrame et, à chaque itération, génère deux données : l'étiquette de la ligne, puis les données réelles dans le ligne comme une série Pandas. Modifions le reste de la boucle for pour refléter ce changement : nous stockons l'étiquette de ligne en tant que lab et les données de ligne en tant que ligne. Pour comprendre ce qui se passe, imprimons lab et row séparément. Dans la première itération, le laboratoire est BR, et la ligne est toute cette série Pandas. Étant donné que cette variable de ligne à chaque itération est une série, vous pouvez facilement sélectionner des informations supplémentaires à partir de celle-ci à l'aide des techniques de sous-ensemble que vous avez apprises précédemment.

Supposons que vous ne souhaitiez imprimer que la capitale à chaque itération : modifions l'instruction d'impression comme suit, en imprimant l'étiquette et la capitale ensemble. Cependant, vous pouvez aller plus loin que de simples impressions.

Ajoutons une nouvelle colonne au brics DataFrame, nommée name_length, contenant le nombre de caractères dans le nom du pays. Pour ce faire, nous devrons combiner beaucoup de choses que nous avons apprises. C'est assez avancé, alors essayez de rester avec moi ici. La spécification de la boucle for peut être la même, car nous aurons besoin à la fois de l'étiquette de la ligne et des données de la ligne. Ensuite, nous pouvons calculer la longueur de chaque nom de pays en sélectionnant la colonne de pays dans la ligne, puis en la transmettant à la fonction len(), qui détermine le nombre de caractères dans une chaîne. Enfin, nous devrons ajouter ces nouvelles informations à une nouvelle colonne, name_length, à l'emplacement approprié. J'ai utilisé loc ici, qui est basé sur des étiquettes. Pour voir si nous avons codé les choses correctement, j'ajoute une impression de brics après la boucle for, donc sans indentation. L'exécution de ces scripts montre que cela a fonctionné : il y a une nouvelle colonne avec la longueur des noms de pays. Bien, mais pas particulièrement efficace, car vous créez un objet Series à chaque itération. Pour ce petit DataFrame, cela n'a pas d'importance, mais si vous faites des trucs funky sur un ensemble de données ginormous, cette perte d'efficacité peut devenir problématique.

Une meilleure approche si vous souhaitez calculer une colonne DataFrame entière en appliquant une fonction sur une colonne particulière d'une manière élément par élément, est apply (). Dans ce cas, vous n'avez même pas besoin d'une boucle for. C'est comme ça que c'est fait. Fondamentalement, vous sélectionnez la colonne country du brics DataFrame, puis, sur cette colonne, vous appliquez la fonction len. Apply appelle la fonction len avec chaque nom de pays en entrée et produit un nouveau tableau, que vous pouvez facilement stocker dans une nouvelle colonne, "name_length". C'est beaucoup plus efficace, et aussi plus facile à lire, si vous me demandez. Donc, je vous ai expliqué comment itérer DataFrames avec une boucle for et comment effectuer des opérations vectorisées avec la fonction apply. Ces compétences deviendront très utiles une fois que vous commencerez à transformer vos propres ensembles de données !

Random Numbers

Supposons que nous voulions simuler un tirage au sort. Définissez d'abord la graine - encore une fois, cela pourrait être n'importe quoi - puis utilisez la fonction randint(). Pour qu'il génère aléatoirement 0 ou 1, nous passons deux arguments : le premier argument doit être 0, le second 2, car 2 ne sera pas inclus. Si nous imprimons une pièce, puis exécutons le script, nous obtenons un nombre entier aléatoire, 0. Vous pouvez maintenant utiliser cette pièce pour jouer à un jeu.

Nous étendons le code avec une instruction if-else : si coin est égal à 0, nous affichons "faces". S'il est égal à 1, nous affichons "queues". Si nous exécutons à nouveau ce script, coin sera à nouveau égal à 0, car la graine est la même. Cela signifie également que la condition if est True, donc les têtes de chaîne sont imprimées. C'était un premier exemple sur la façon dont vous pouvez utiliser des nombres aléatoires pour simuler des situations réelles qui impliquent le hasard ou la probabilité.