Premiers pas en Python

Python

Inventeur de Python
Inventeur de Python

Python est l’un des langages orientés objet les plus utilisés lors de travaux de data science.
Il ne s’agit pas d’un nouveau langage car ce dernier a été inventé fin des années 90 par un développeur néerlandais (Guido Van Rossum).
Dans le cadre de la data science, il est utilisé principalement pour manipuler des données, souvent sous la forme de dataframes ou « tableaux de données ».
L’autre langage, souvent comparé à Python, est R.
Il n’y a pas, à proprement parler, une raison de choisir un langage et de délaisser complètement un autre.
En effet, il arrive de temps en temps qu’une fonctionnalité que l’on cherche dans l’un se trouve dans l’autre.
Le Jupyter notebook permet d’expérimenter et de développer des programmes directement depuis un navigateur web et même de combiner plusieurs langages.

NB: Pour information, iPython n’est pas une version de Python développée par Apple.
Elle apporte un peu de magie comme de l’auto-complétion et des fonctions utiles.

Commençons par des choses simples.

EDITEUR DE TEXTE
Quel éditeur de texte souhaitez-vous utiliser pour coder ?

Basiques :
- gedit (Linux)
- notepad++ (Windows)

Avancés :
- sublime text
- vim - emacs - atom

JUPYTER NOTEBOOK 

Project Jupyter | HomeVous pouvez aussi coder directement dans votre navigateur. Il est en effet totalement possible d’avoir un onglet Jupyter et un onglet Netflix.
Jupyter apporte de l’interactivité et permet de coder plus rapidement tout en n’envelant rien à la qualité du code développé.
Il permet de mêler cellules de code (Python, R, Javascript, …) et cellules explicatives (langage markdown, images, …)
Il est possible d’avoir des notebooks dans différents langages (R, Julia, …).
Certaines commandes « magiques » (Built-in magic commands) sont très utiles :

  • %time permet de savoir combien de temps dure une ligne de code 
    (par exemple pour la lecture d’un fichier volumineux)
    %time df = pd.read_csv('coronavirus_france_latest.csv')
  • %%time permet  de chronométrer l’intégralité de la cellule
    %%time 
    df = pd.read_csv('coronavirus_france_latest.csv')
    epidemic_status = process(df)

Une erreur est survenue mais difficile de vraiment identifier la cause ? 

  • %debug permet de rejouer étape par étape ce qu’il s’est passé et devrait aider à résoudre le problème. 

LES IMPORTS
Selon ce que vous souhaitez faire, vous aurez besoin d’importer différents paquets. Avant de pouvoir importer un paquet, il faut souvent l’installer. 
Pour cela, on utilise souvent pip install paquet
Un paquet souvent importé est « numpy ».
Pour importer numpy, il suffit d’écrire :

import numpy

On aura souvent besoin de faire appel à une fonctionnalité fournie par numpy, par exemple :

numpy.array(…)

Il est possible d’utiliser un alias et d’écrire :

np.array(…)

np est l’alias de numpy et doit être défini dans l’import comme suit :

import numpy as np

Il existe beaucoup de paquets et vous les importerez au fur et à mesure que vous en aurez besoin.

Il est judicieux de bien organiser son code :

  • une première partie contenant les imports
  • une seconde contenant les fonctions que vous définirez par la suite (fonctions ?)
  • une dernière partie qui effectue les traitements
    • chargement de données (fichier CSV, élément JSON, …)
    • appels des fonctions définies dans la seconde partie (pipeline ?)
      et génération des fichiers résultats.

Calculs simples

Dans la console Python, vous pouvez essayer de taper « 2+2 » et vous verrez s’afficher le résultat « 4 ». Rien de surprenant.
Vous pouvez essayer de faire des calculs plus complexes en ajoutant des parenthèses et en jouant avec les différents opérateurs mathématiques.
Vous ne devriez pas être très surpris sauf peut-être lors de calculs impliquant des chiffres à virgules et des entiers. Par exemple « 1/2 » retournera 0. Pour obtenir le résultat souhaité, il faut faire soit 1/2.0 soit 1/float(2) de sorte que le résultat soit un chiffre à virgule.
Si vous avez la dernière version de Python (> 3) et non la version 2.7, le résultat est correct sans ces manipulations.

Découverte des types en Python

Types de base :

Integer int
Il s’agit des entiers 1, 2 , 3, 4, …

Float
float
Il s’agit des chiffres à virgule 1.14, 2.15, 3.16, …

String str
Il s’agit des chaînes de caractères :
‘a’, ‘épidémie’, ‘situation actuelle’, ‘vague’, …
Possible aussi d’utiliser des double guillemets : « mondial »

Certains types permettent de grouper des types de base.

Une petite parenthèse sur les transformations de types 

On peut effectivement passer d’un type à un autre, on parle de casting mais pas à la télévision. 
Il n’est pas étonnant qu’on puisse passer d’un chiffre à virgule (float) à un entier (int).
Ainsi, int(5.6) renvoie 5.
L’inverse est également vrai, float(5) renvoie 5.0

Types construits :

Tuples (…)
Un tuple ne pas pas être modifié une fois créé.
(1, 2) est un tuple.
(‘pandemic’, ‘coronavirus’) aussi.
 Il est utilisé par exemple pour stocker en mémoire des informations sur l’utilisateur : (‘identifiant’, ‘nom’, ‘prénom’, ‘date de naissance’)

Listes list […]
Une liste est similaire au tuple mais elle se différencie par le fait qu’on peut l’initialiser vide et y ajouter des éléments par la suite. 
On peut par exemple crawler toutes les pages d’acteurs et actrices sur wikipédia. On pourrait utiliser plusieurs listes, une pour contenir les informations sur chaque acteur / actrice et une autre les contenant toutes (une liste de liste).   Un exemple avec des super-héros : 

Liste 1 : [‘Melissa’, ‘Benoist’, ‘Supergirl’]
Liste 2 : [‘Grant’, ‘Gustin’, ‘Flash’]
Liste 3 : [‘Stephen Amell’, ‘Arrow’]
Liste 4 : [‘Brec’, ‘Bassinger’, ‘Stargirl’]
Liste 5 : [‘Robert’, ‘Downey Jr.’, ‘Ironman’]

Liste de liste :

L = [ ['Melissa', 'Benoist', 'Supergirl'], 
         ['Grant', 'Gustin', 'Flash'],
       ['Stephen', 'Amell', 'Arrow'],
         ['Brec', 'Bassinger', 'Stargirl'],
         ['Robert', 'Downey Jr.', 'Ironman'] ]

Besoin d’ajouter un superhéros ? On le peut facilement sur une liste.
Ajoutons Captain America : 

L.append(['Chris', 'Evans', 'Captain America'])

L’élément a été ajouté à la liste L, l’ajout s’est fait « inplace » : 
cela signifie que la fonction append ne renvoie rien.
En effet, on a dit qu’on peut modifier une liste et c’est ce qu’a fait la fonction append (contrairement à un tuple qui n’est pas « mutable »).

Maintenant, on arrive à la partie de manipulation de ces structures qui est la plus intéressante.
Une chaîne de caractères est similaire à une liste, en effet c’est une liste de caractères. list(‘pandemic’) renvoie :

['p', 'a', 'n', 'd', 'e', 'm', 'i', 'c']

La boucle for permet de répéter certaines instructions pour chaque élément d’une liste. Ainsi, on peut faire :

for c in ['p', 'a', 'n', 'd', 'e', 'm', 'i', 'c']:
    print(c)

Cela affiche chaque caractère présents dans pandémic. 
c est une variable qui représente une lettre du mot pandemic à chaque tour de la boucle for. On peut nommer cette variable comme on le souhaite (par exemple letter dans l’exemple suivant). 
Comme liste et String sont très proches, cela donne le même résultat : 

for letter in 'pandemic':
  print(letter)

Maintenant qu’on connaît la boucle for, utilisons-la pour extraire la liste des prénoms de super-héros de notre liste de liste L.

firstnames = []    # liste vide
for superliste in L:
  firstnames.append(superlist[0])

On voit ici plusieurs choses, comment accéder à un élément particulier d’une liste. Dans le cas du prénom, c’est le premier élément de notre « superliste ». Le second étant le nom, le troisième le nom de super-héros.
En python, on parle d’index et la première valeur a pour position 0, la seconde pour position 1, etc.

On aime bien quand on peut diminuer le nombre de lignes de codes.
Pour cela, on peut utiliser la compréhension de listes :

firstnames  = [ superliste[0] for superliste in L]  

Et voilà à quoi ressemble cette liste de prénoms :

['Melissa', 'Grant', 'Stephen', 'Brec', 'Robert']

La compréhension de listes est vraiment très puissante et permet même de filtrer la liste comme dans cet exemple (len permet de connaitre le nombre d’éléments d’une liste, d’une chaîne de caractères, …): 

firstnames  = [ superliste[0] for superliste in L if len(superliste[0]) == 7]  

On peut donc faire beaucoup de choses en une seule ligne de code. 
La liste est maintenant réduite à nos héros au prénom à 7 lettres :

['Melissa', 'Stephen']

On peut maintenant introduire un nouveau type, non ordonné : le dictionnaire. On va le présenter en repartant de notre liste de super-héros en utilisant quelque chose qui ressemble à la compréhension de listes, la compréhension de dictionnaires (en anglais, possible que les termes sonnent mieux : list comprehension, dict comprehension)

superdict = { superliste[-1] : f'{superliste[0]} {superliste[1]}' for superliste in L}

On a créé ce superdict : 

{'Supergirl': 'Melissa Benoist', 'Flash': 'Grant Gustin', 'Arrow': 'Stephen Amell Arrow', 'Stargirl': 'Brec Bassinger', 'Ironman': 'Robert Downey Jr.'}

Un dictionnaire correspond à un ensemble de clés / valeurs. 
Dans notre exemple les clés sont les noms de super-héros et les valeurs leurs identités secrètes (il va donc de soi qu’il faut conserver le secret).

On s’est appuyé sur plusieurs choses pour créer ce dictionnaire :

  • Accès au dernier élément d’une liste avec l’index -1 : superliste[-1]
  • Création d’une nouvelle String à partir de deux Strings :
    • utilisée dans l’exemple:
      f-string : f'{variable_prenom} {variable_nom}’
    • aussi possible :
      « {} {} ».format(variable_prenom, variable_nom)
    • ou encore
      « %s %s » % (variable_prenom, variable_nom)
    • d’autres possibilités …

Il peut être utile de renverser un dictionnaire et de faire que la clé devienne la valeur. On utilise pour cela toujours la compréhension de dictionnaires mais avec deux arguments dans le for pour capter les deux éléments du dictionnaires qui nous intéressent, la clé et la valeur.
Renversons superdict : 

superdict = { value : key for key, value in superdict.items() }

On s’arrête là pour ce premier article d’initiation à Python.
N’hésitez pas à nous laisser des commentaires et nous dire ce que vous en avez pensé.

@ bientôt sur DataSciencePost