Académique Documents
Professionnel Documents
Culture Documents
##1.1 C'est quoi Google Colab ? Google Colaboratory ou Colab est un des services cloud de
Google Research. Il permet à quiconque d'écrire et d'exécuter du code Python via le navigateur,
et est particulièrement bien adapté à l'apprentissage automatique et à l'analyse de données.
Plus techniquement, Colab est un service de bloc-notes Jupyter hébergé qui ne nécessite aucune
configuration pour être utilisé, tout en offrant un accès gratuit aux ressources informatiques, y
compris les GPU.
Cellule de code
2*3
Cellule de texte
Accès au shell
!pwd
/content
##1.2 String — Opérations usuelles sur des chaînes Sous Python, les chaînes de caractères sont
des objets. On peut donc effectuer de nombreux traitements dessus en utilisant des méthodes
appropriées. En voici quelques-unes, choisies parmi les plus utiles. Mais vous pouvez obtenir la
liste complète de toutes les méthodes associées à un objet à l’aide de la fonction intégrée
dir(str) ou help(str). Il existe de nombreuses méthodes (sortes de fonctions préfixées par l’objet
ici la chaîne) sur le traitement des chaînes.Les méthodes suivantes sont applicables sur des
objets Python de type str : capitalize(), casefold(), center(), count(), encode(), endswith(),
expandtabs(), find(), format(), format_map(), index(), isalnum(), isalpha(), isascii(), isdecimal(),
isdigit(), isidentifier(), islower(), isnumeric(), isprintable(), isspace(), istitle(), isupper(), join(),
ljust(), lower(), lstrip(), maketrans(), partition(), replace(), rfind(), rindex(), rjust(), rpartition(),
rsplit(), rstrip(), split(), splitlines(), startswith(), strip(), swapcase(), title(), translate(), upper(),
zfill().
dir(str)
Quelques méthodes
####Les méthodes .lower() et .upper()
Les méthodes .lower() et .upper() renvoient un texte en minuscule et en majuscule
respectivement. On remarque que l’utilisation de ces fonctions n’altère pas la chaîne de
caractères de départ mais renvoie une chaîne de caractères transformée. Pour mettre en
majuscule la première lettre seulement, vous pouvez faire :
x='girafe'
print(x [0]. upper () + x [1:])
#'Girafe '
#ou encore plus simple avec la méthode adéquate
print(x. capitalize())
#'Girafe'
#pour mettre en MAJ toute la chaine
print(x. upper())
#pour mettre en MIN toute la chaine
print(x. lower())
Girafe
Girafe
girafe
girafe
La méthode .split() découpe une chaîne de caractères en plusieurs éléments appelés champs, en
utilisant comme séparateur n’importe quelle combinaison « d’espace(s) blanc(s) ».
girafe
tigre
singe
souris
[' girafe ', ' tigre ', ' singe ', '', ' souris ']
Attention, dans cet exemple, le séparateur est un seul caractères : (et non pas une combinaison
de un ou plusieurs ":)" menant ainsi à une chaîne vide entre singe et souris. Il est également
intéressant d’indiquer à .split() le nombre de fois qu’on souhaite découper la chaîne de
caractères avec l’argument maxsplit() :
La méthode .find(), quant à elle, recherche une chaîne de caractères passée en argument :
animal = "girafe"
print(animal . find ("i"))
#1
print(animal . find ("afe"))
#3
print(animal . find ("z"))
#-1
print(animal . find ("tig"))
#-1
1
3
-1
-1
On trouve aussi la méthode .replace() qui substitue une chaîne de caractères par une autre :
2
0
1
False
Cette méthode est particulièrement utile lorsqu’on lit un fichier et que l’on veut récupérer
certaines lignes commençant par un mot-clé. Par exemple dans un fichier PDB, les lignes
contenant les coordonnées des atomes commencent par le mot-clé ATOM.
####La méthode .strip() La méthode .strip() permet de “nettoyer les bords” d’une chaîne de
caractères. C'est l'équivalent de trim() dans Java :
{"type":"string"}
La méthode .strip() enlève les espaces situés sur les bords de la chaîne de caractère mais pas
ceux situés entre des caractères visibles. En réalité, cette méthode enlève n’importe quel
combinaison « d’espace(s) blanc(s) » sur les bords, par exemple :
{"type":"string"}
La méthode .strip() est très pratique quand on lit un fichier et qu’on veut se débarrasser des
retours à la ligne.
####Application: On considère la chaîne de caractères val :val = "3.4 17.2 atom " On souhaite
extraire les valeurs 3.4 et 17.2 pour ensuite les additionner.
####Solution:
##Qu’est-ce la fonction Lambda en Python ? La fonction lambda est une petite fonction
contenant qu’une seule expression. Elle peut agir sous anonymat parce qu’elle ne nécessite
aucun nom. Elles sont très utiles lorsqu’il faut effectuer des petites tâches avec moins de code.
Ce qui est très pratique lorsqu’on élabore des solutions Big Data.
On retrouve les fonctions lambda dans plusieurs langages de programmation. Elles sont très
pratiques, mais dans cet article, nous nous concentrons ici sur leur utilisation en Python. Voici la
syntaxe de la fonction lambda en Python :
• Mot-clé
• Variable/argument lié
• Corps ou expression
Le mot-clé est obligatoire et ne peut être que “lambda”, mais les variables et les corps peuvent
être changés en fonction des exigences.
Les fonctions lambda sont définies dans l’ensemble par le mot-clé lambda et elles peuvent
comporter n’importe quel nombre d’argument mais une seule expression.
Même sans aucune instruction, la fonction lambda renvoie un objet fonction qui peut être affecté
à n’importe quelle autre variable.
Quant aux fonctions régulières, elles sont créées avec le mot clé def. Le nombre d’argument et
d’expression de ce dernières peuvent être un, deux, voire plus.
Elles sont utilisées pour n’importe quelle instruction et sont généralement utilisées pour les
gros blocs de code.
13
C'est équivalent à:
def add3(x):
return x+3
print(add3(10))
13
##Pour quelle raison les fonctions lambda sont très utiles ? On ne voit l’utilité de la fonction
lambda que lorsque l’on veut utiliser une fonction qui prend comme argument une autre
fonction. Par exemple les fonctions map(), filter() …
##Un exemple pratique de fonction lambda en Python Dans cet exemple, nous allons découvrir
l’utilisation de la fonction python filter() avec la notation lambda. Mais avant de commencer,
nous vous conseillons de lire notre tutoriel sur la programmation Python pour obtenir les bases
nécessaires.
La fonction filter() a pour premier argument une fonction et c’est la fonction lambda dans ce cas.
Le deuxième argument est la liste à filtrer.
print(new_list)
[4, 6, 8, 12]
print(new_list)
##Application: Utiliser une fonction Lambda pour afficher le carré de la liste des nombres de 1 à
10.
# votre réponse
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-3.1.1-bin-hadoop3.2"
!ls
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
spark.conf.set("spark.sql.repl.eagerEval.enabled", True) # Property
used to format output tables better
spark
<pyspark.sql.session.SparkSession at 0x7f030e88dd60>
#commencez ici
from pyspark import SparkContext
from pyspark.sql import SparkSession
spark = SparkSession\
.builder\
.master('local[*]')\
.getOrCreate()
sc = spark.sparkContext
References:
• Ils sont immuables, car vous ne pouvez pas modifier le contenu des RDD après les
avoir créés.
-Transformations : crée un nouveau RDD à partir d'une source de données ou d'un RDD existant
précédemment. Un graphe acyclique dirigé (DAG) de transformations (dans de nombreux cas
prenant simplement la forme d'une séquence) qui définit un RDD est appelé le RDD lineage.
-Actions : Une action consiste à appliquer une fonction et à retourner une valeur au programme
driver pour par exemple les afficher sur l’écran ou les enregistrer dans un fichier.
data = sc.parallelize([1,2,3,4,5])
print (data)
data = sc.parallelize([(1,2),(3,4),(3,6),(3,4)])
print (data)
data.collect()
type(data)
pyspark.rdd.RDD
data.count()
• les dépendances étroites où chaque partition d’un parent RDD est utilisé par au plus
une partition d’un RDD enfant,
• la récupération après un noeud en échec est plus efficace avec une dépendance
étroite puisque seules les partitions parentes perdues doivent être recalculées et
que cela peut être fait en parallèle sur différents noeuds. A l’inverse, avec une
dépendance large, un simple échec d’un noeud peut entrainer la perte de plusieurs
partitions sur tous les ancêtres d’un RDD entraînant une réexécution complète des
opérations.
num.map(lambda a : a*2).collect()
#.collect se fait pas avec les big datas(cas réel)
Image(filename='FlatMap.jpg')
rdd = sc.parallelize([ 2, 3,4])
rdd.collect()
[2, 3, 4]
a = range(1,10)
for i in a:
print(i)
1
2
3
4
5
6
7
8
9
[1, 1, 2, 1, 2, 3]
a = sc.parallelize([1,2,3])
a.map(lambda x: (x,x*10,57)).collect()
Image(filename='Filter.jpg')
num.collect()
[5, 5, 4, 3, 2, 9, 2]
[4, 2, 2]
names.collect()
['Bills', 'Brain']
Image(filename='Union.jpg')
num.collect()
[5, 5, 4, 3, 2, 9, 2]
num2 = sc.parallelize([1,7,9,4,10,15])
num2.collect()
num3=num2.union(num)
num3.distinct().collect()
x = sc.parallelize([1,2,3], 2)
y = sc.parallelize([3,4], 1)
z = x.union(y)
z.collect()
[1, 2, 3, 3, 4]
#Image(filename='Sample.jpg')
[1, 2, 3, 4, 5, 6, 7, 8, 9]
parallel.sample(True,.2,).collect()
[]
parallel.sample(True,.2,seed=19).collect()
[2, 4, 6, 9]
parallel.sample(False,.2).collect()
[8]
parallel.sample(True,.2).collect()
[5]
parallel.sample(False,.2,seed=23).collect()
[4, 5]
Transformations larges
Image(filename='GroupBy.jpg')
names.collect()
['Bills', 'Mark', 'Brain', 'Mick']
names_gr
B ['Bills', 'Brain']
M ['Mark', 'Mick']
aa = sc.parallelize([1, 1, 2, 3, 5, 8])
result
0 [3]
1 [1, 1]
2 [2, 5, 8]
Image(filename='Intersection.jpg')
num.collect()
[5, 5, 4, 3, 2, 9, 2]
num2.collect()
num.intersection(num2).collect()
[4, 9]
num2.intersection(num).collect()
[4, 9]
[2, 2, 5, 5, 3]
[10, 1, 7, 15]
Image(filename='Distinct.jpg')
num.collect()
[5, 5, 4, 3, 2, 9, 2]
num.distinct().collect()
[3, 9, 4, 5, 2]
#Join
dataStr = sc.parallelize([(1,'mike'),(2,'john'),(3,'rambo'),
(4,'bill')])
dataStr.collect()
dataStr.count()
dataStr.countByValue()
defaultdict(int,
{(1, 'mike'): 1, (2, 'john'): 1, (3, 'rambo'): 1, (3,
'bill'): 1})
data.collect()
data.sortByKey().collect()
[4, 6, 4]
[1, 3, 3, 3]
data.values().collect()
[2, 4, 6, 4]
data.mapValues(lambda a : a*a).collect()
Image(filename='ReduceByKey.jpg')
data.collect()
data.reduceByKey(lambda x, y : x+y).collect()
data.reduceByKey(max).collect()
Image(filename='GroupByKey.jpg')
# groupBy: This transformation groups all the rows with the same key
into a single row.
result = data.groupByKey().collect()
result
1 [2]
3 [4, 6, 4]
aa = data.groupByKey().mapValues(sum)
aa.collect()
#equivalent à reduceByKey
bb = data.groupByKey().mapValues(max)
bb.collect()
[(1, 1),
(3, 1),
(3, 2),
(3, 3),
(3, 1),
(3, 2),
(3, 3),
(3, 4),
(3, 5),
(3, 1),
(3, 2),
(3, 3)]
data.collect()
data2 = sc.parallelize([(3,9)])
data2.collect()
[(3, 9)]
data.subtractByKey(data2).collect()
[(1, 2)]
data2.subtractByKey(data).collect()
[]
##Les actions
Image(filename='RDD_Actions_Transformations.jpg')
Create RDD and their Basic Actions
names =
sc.parallelize(['Adam','Cray','Shaun','Brain','Mark','Christ','Shail',
'Satya','Mark','Norby','Frans','Mark','Bill'])
type(names)
pyspark.rdd.RDD
names.collect()
['Adam',
'Cray',
'Shaun',
'Brain',
'Mark',
'Christ',
'Shail',
'Satya',
'Mark',
'Norby',
'Frans',
'Mark',
'Bill']
type(a)
list
names.countByValue()
defaultdict(int,
{'Adam': 1,
'Cray': 1,
'Shaun': 1,
'Brain': 1,
'Mark': 3,
'Christ': 1,
'Shail': 1,
'Satya': 1,
'Norby': 1,
'Frans': 1,
'Bill': 1})
type(a)
NoneType
a=sc.parallelize([(1,2),(2,4)])
a.countByValue()
names.collect()
['Adam',
'Cray',
'Shaun',
'Brain',
'Mark',
'Christ',
'Shail',
'Satya',
'Mark',
'Norby',
'Frans',
'Mark',
'Bill']
names.take(5)
employees = sc.textFile("employees.txt")
type(employees)
pyspark.rdd.RDD
employees.collect()
['Adam',
'Cray',
'Shaun',
'Brain',
'Mark',
'Christ',
'Shail',
'Satya',
'Mark',
'Norby',
'Frans',
'Mark',
'Bill']
employees.first()
'Adam'
employees.count()
13
employees.top(5)
employees.top(19)
['Shaun',
'Shail',
'Satya',
'Norby',
'Mark',
'Mark',
'Mark',
'Frans',
'Cray',
'Christ',
'Brain',
'Bill',
'Adam']
employees.distinct().count()
11
Autres exemples
num = sc.parallelize([5,5,4,3,2,9,2],9)
num.collect()
[5, 5, 4, 3, 2, 9, 2]
num.take(4)
[5, 5, 4, 3]
num.countByValue()
type(num)
pyspark.rdd.RDD
num.glom().collect()
type(num.glom())
pyspark.rdd.PipelinedRDD
num.max()
num.min()
num.mean()
4.285714285714286
Image(filename='Action_Reduce.jpg')
num.collect()
[5, 5, 4, 3, 2, 9, 2]
30
10800
def myfun(a,b):
return a*2 + b*2
num.reduce(myfun)
872
num.collect()
[5, 5, 4, 3, 2, 9, 2]
num.takeOrdered(3)
[2, 2, 3]
# fold: the initial value for the accumulated result of each partition
for the op operator,
# and also the initial value for the combine results from different
partitions
num = sc.parallelize([5,5,4,3,2,9,2],2)
num.collect()
[5, 5, 4, 3, 2, 9, 2]
num.glom().collect()
30
10800
num.fold(2,lambda a,b:a+b)
34
86400
17
1080000
b = sc.parallelize(range(1,10))
b.collect()
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[('les', 2), ('amis', 2), ('sont', 1), ('Bonjour', 1), ('là', 1)]