Importation du package XLSX¶

In [1]:
# installer le package XLSX - à faire à chaque nouvelle session
# peut prendre un certain temps (près de 2 minutes)
#import Pkg
#Pkg.add("XLSX")

Chargement et inspection des données¶

In [2]:
# librairies
import XLSX
import DataFrames as DF

# importation
data = DF.DataFrame(XLSX.readtable("/content/autos.xlsx","dataset"))
println("Type de l'objet : $(typeof(data))")
Type de l'objet : DataFrames.DataFrame
In [3]:
# 5 premières lignes
DF.first(data,5)
Out[3]:
5×9 DataFrame
RowModelepuissancecylindreevitessepoidsCO2prixoriginecarburant
StringInt64Int64Int64Int64Int64Int64StringString
1PANDA5411081508601358070EuropeEssence
2TWINGO6011491518401438950FranceEssence
3CITRONC261112415893214110700FranceEssence
4YARIS6599815588013410450AutresEssence
5FIESTA681399164113811714150EuropeDiesel
In [4]:
# description
DF.describe(data)
Out[4]:
9×7 DataFrame
Rowvariablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64DataType
1ModeleALFA156YARIS0String
2puissance137.66754139.02500Int64
3cylindree1903.439981979.532220Int64
4vitesse199.4150200.52500Int64
5poids1310.48401369.017350Int64
6CO2177.533113165.52870Int64
7prix24557.3807023975.0464500Int64
8origineAutresFrance0String
9carburantDieselEssence0String
In [5]:
# nom des variables
DF.names(data)
Out[5]:
9-element Vector{String}:
 "Modele"
 "puissance"
 "cylindree"
 "vitesse"
 "poids"
 "CO2"
 "prix"
 "origine"
 "carburant"
In [6]:
# type des variables
DF.eltype.(DF.eachcol(data))
Out[6]:
9-element Vector{DataType}:
 String
 Int64
 Int64
 Int64
 Int64
 Int64
 Int64
 String
 String
In [7]:
# que quelques colonnes
DF.first(data[:,["Modele","puissance","cylindree"]],10)
Out[7]:
10×3 DataFrame
RowModelepuissancecylindree
StringInt64Int64
1PANDA541108
2TWINGO601149
3CITRONC2611124
4YARIS65998
5FIESTA681399
6CORSA701248
7GOLF751968
8P1007751360
9MUSA1001910
10CLIO1001461
In [8]:
# infos sur les dimensions
println("Dimensions : $(DF.size(data))")
println("Nombre de lignes : $(DF.nrow(data))")
println("Nombre de colonnes : $(DF.ncol(data))")
Dimensions : (30, 9)
Nombre de lignes : 30
Nombre de colonnes : 9

Accès indicé¶

In [9]:
# 1ère ligne et 1ère colonne
# indices commence à 1 en Julia
# noms des variables pas prises en compte
println(data[1,1])
PANDA
In [10]:
# 1ère ligne entière
println(data[1,:])
DataFrameRow
 Row │ Modele  puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String  Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼────────────────────────────────────────────────────────────────────────────────
   1 │ PANDA          54       1108      150    860    135   8070  Europe   Essence
In [11]:
# 5 premières lignes et de la 4è colonne à la dernière
# cf. la ligne n°5 est intégrée
# cf. le mot clé << end >> pour dernière colonne
println(data[1:5,4:end])
5×6 DataFrame
 Row │ vitesse  poids  CO2    prix   origine  carburant 
     │ Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────
   1 │     150    860    135   8070  Europe   Essence
   2 │     151    840    143   8950  France   Essence
   3 │     158    932    141  10700  France   Essence
   4 │     155    880    134  10450  Autres   Essence
   5 │     164   1138    117  14150  Europe   Diesel
In [12]:
# 5 premières lignes, toutes les colonnes sauf les n°3 et 5 (cylindree et longueur)
println(data[1:5,DF.Not([3,5])])
5×7 DataFrame
 Row │ Modele    puissance  vitesse  CO2    prix   origine  carburant 
     │ String    Int64      Int64    Int64  Int64  String   String    
─────┼────────────────────────────────────────────────────────────────
   1 │ PANDA            54      150    135   8070  Europe   Essence
   2 │ TWINGO           60      151    143   8950  France   Essence
   3 │ CITRONC2         61      158    141  10700  France   Essence
   4 │ YARIS            65      155    134  10450  Autres   Essence
   5 │ FIESTA           68      164    117  14150  Europe   Diesel
In [13]:
# projection sur une colonne
println(data[1:5,"vitesse"])
[150, 151, 158, 155, 164]
In [14]:
# autre utilisation des noms des colonnes
println(data[1:5,:vitesse])
[150, 151, 158, 155, 164]
In [15]:
# si plusieurs
println(data[1:5,["Modele","vitesse"]])
5×2 DataFrame
 Row │ Modele    vitesse 
     │ String    Int64   
─────┼───────────────────
   1 │ PANDA         150
   2 │ TWINGO        151
   3 │ CITRONC2      158
   4 │ YARIS         155
   5 │ FIESTA        164
In [16]:
# ou encore
println(data[1:5,[:Modele, :vitesse]])
5×2 DataFrame
 Row │ Modele    vitesse 
     │ String    Int64   
─────┼───────────────────
   1 │ PANDA         150
   2 │ TWINGO        151
   3 │ CITRONC2      158
   4 │ YARIS         155
   5 │ FIESTA        164
In [17]:
# exclure certaines colonnes avec Not
# appliqué aux noms de colonnes cette fois-ci
println(data[1:5,DF.Not([:Modele,:vitesse,:prix])])
5×6 DataFrame
 Row │ puissance  cylindree  poids  CO2    origine  carburant 
     │ Int64      Int64      Int64  Int64  String   String    
─────┼────────────────────────────────────────────────────────
   1 │        54       1108    860    135  Europe   Essence
   2 │        60       1149    840    143  France   Essence
   3 │        61       1124    932    141  France   Essence
   4 │        65        998    880    134  Autres   Essence
   5 │        68       1399   1138    117  Europe   Diesel

Restrictions avec les conditions¶

In [18]:
# intégrer une condition portant sur les lignes
# le << . >> est important pour la vectorisation
println(data[data.cylindree .> 2000,:])
7×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   2 │ P607             204       2721      230   1723    223  40550  France   Diesel
   3 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
   4 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
   5 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
   6 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
   7 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
In [19]:
# la condition définit un booléen
b = data.cylindree .> 2000
println(b)
Bool[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1]
In [20]:
# et indexation avec le booléen
println(data[b,:])
7×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   2 │ P607             204       2721      230   1723    223  40550  France   Diesel
   3 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
   4 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
   5 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
   6 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
   7 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
In [21]:
# on peut utiliser << filter >> aussi
# filtrage sur les lignes << row >>
println(DF.filter(row -> row.cylindree > 2000, data))
7×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   2 │ P607             204       2721      230   1723    223  40550  France   Diesel
   3 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
   4 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
   5 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
   6 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
   7 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
In [22]:
# ou autre solution avec subset
# on passe par un alias (x)
println(DF.subset(data,:cylindree => x -> x .> 2000))
7×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   2 │ P607             204       2721      230   1723    223  40550  France   Diesel
   3 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
   4 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
   5 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
   6 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
   7 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
In [23]:
# combinaison ET
# attention toujours au << . >> pour la vectorisation
# attention, bien mettre les parenthèses
println(data[(data.cylindree .> 2000) .& (data.vitesse .>= 230),:])
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ P607            204       2721      230   1723    223  40550  France   Diesel
   2 │ MERC_E          204       3222      243   1735    183  46450  Europe   Diesel
   3 │ CITRONC5        210       2496      230   1589    238  33000  France   Essence
   4 │ BMW530          231       2979      250   1495    231  46400  Europe   Essence
   5 │ ALFA156         250       3179      250   1410    287  40800  Europe   Essence
In [24]:
# ET avec filter
println(DF.filter(row -> row.cylindree > 2000 && row.vitesse >= 230, data))
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ P607            204       2721      230   1723    223  40550  France   Diesel
   2 │ MERC_E          204       3222      243   1735    183  46450  Europe   Diesel
   3 │ CITRONC5        210       2496      230   1589    238  33000  France   Essence
   4 │ BMW530          231       2979      250   1495    231  46400  Europe   Essence
   5 │ ALFA156         250       3179      250   1410    287  40800  Europe   Essence
In [25]:
# ET avec subset
println(DF.subset(data,
            :cylindree => x -> x .> 2000,
            :vitesse => x -> x .>= 230))
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ P607            204       2721      230   1723    223  40550  France   Diesel
   2 │ MERC_E          204       3222      243   1735    183  46450  Europe   Diesel
   3 │ CITRONC5        210       2496      230   1589    238  33000  France   Essence
   4 │ BMW530          231       2979      250   1495    231  46400  Europe   Essence
   5 │ ALFA156         250       3179      250   1410    287  40800  Europe   Essence
In [26]:
# ET avec subset (bis)
# attention, bien mettre les parenthèses
println(DF.subset(data,[:cylindree,:vitesse] => (x,y) -> (x .> 2000) .& (y .>= 230)))
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ P607            204       2721      230   1723    223  40550  France   Diesel
   2 │ MERC_E          204       3222      243   1735    183  46450  Europe   Diesel
   3 │ CITRONC5        210       2496      230   1589    238  33000  France   Essence
   4 │ BMW530          231       2979      250   1495    231  46400  Europe   Essence
   5 │ ALFA156         250       3179      250   1410    287  40800  Europe   Essence
In [27]:
# condition avec OU (indexation)
println(data[(data.cylindree .> 2000) .| (data.vitesse .> 200),:])
17×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ P407             136       1997      212   1415    194  23400  France   Essence
   2 │ CITRONC4         138       1997      207   1381    142  23400  France   Diesel
   3 │ MERC_A           140       1991      201   1340    141  24550  Europe   Diesel
   4 │ MONDEO           145       1999      215   1378    189  23100  Europe   Essence
   5 │ VECTRA           150       1910      217   1428    159  26550  Europe   Diesel
   6 │ PASSAT           150       1781      221   1360    197  27740  Europe   Essence
   7 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   8 │ LAGUNA           165       1998      218   1320    196  25350  France   Essence
   9 │ MEGANECC         165       1998      225   1415    191  27800  France   Essence
  10 │ P307CC           180       1997      225   1490    210  28850  France   Essence
  11 │ P607             204       2721      230   1723    223  40550  France   Diesel
  12 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
  13 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
  14 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
  15 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence
  16 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
  17 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
In [28]:
# condition OU (filter)
println(DF.filter(row -> row.cylindree > 2000 || row.vitesse > 200,data))
17×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ P407             136       1997      212   1415    194  23400  France   Essence
   2 │ CITRONC4         138       1997      207   1381    142  23400  France   Diesel
   3 │ MERC_A           140       1991      201   1340    141  24550  Europe   Diesel
   4 │ MONDEO           145       1999      215   1378    189  23100  Europe   Essence
   5 │ VECTRA           150       1910      217   1428    159  26550  Europe   Diesel
   6 │ PASSAT           150       1781      221   1360    197  27740  Europe   Essence
   7 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   8 │ LAGUNA           165       1998      218   1320    196  25350  France   Essence
   9 │ MEGANECC         165       1998      225   1415    191  27800  France   Essence
  10 │ P307CC           180       1997      225   1490    210  28850  France   Essence
  11 │ P607             204       2721      230   1723    223  40550  France   Diesel
  12 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
  13 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
  14 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
  15 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence
  16 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
  17 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
In [29]:
# condition OU (subset)
println(DF.subset(data,[:cylindree,:vitesse] => (x,y) -> (x .> 2000) .| (y .> 200)))
17×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ P407             136       1997      212   1415    194  23400  France   Essence
   2 │ CITRONC4         138       1997      207   1381    142  23400  France   Diesel
   3 │ MERC_A           140       1991      201   1340    141  24550  Europe   Diesel
   4 │ MONDEO           145       1999      215   1378    189  23100  Europe   Essence
   5 │ VECTRA           150       1910      217   1428    159  26550  Europe   Diesel
   6 │ PASSAT           150       1781      221   1360    197  27740  Europe   Essence
   7 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
   8 │ LAGUNA           165       1998      218   1320    196  25350  France   Essence
   9 │ MEGANECC         165       1998      225   1415    191  27800  France   Essence
  10 │ P307CC           180       1997      225   1490    210  28850  France   Essence
  11 │ P607             204       2721      230   1723    223  40550  France   Diesel
  12 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
  13 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
  14 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
  15 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence
  16 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
  17 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence

Tri (max-min)¶

In [30]:
# tri croissant selon un critère -> prix
print(DF.sort(data,:prix))
30×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ PANDA             54       1108      150    860    135   8070  Europe   Essence
   2 │ TWINGO            60       1149      151    840    143   8950  France   Essence
   3 │ YARIS             65        998      155    880    134  10450  Autres   Essence
   4 │ CITRONC2          61       1124      158    932    141  10700  France   Essence
   5 │ CORSA             70       1248      165   1035    127  13590  Europe   Diesel
   6 │ P1007             75       1360      165   1181    153  13600  France   Essence
   7 │ FIESTA            68       1399      164   1138    117  14150  Europe   Diesel
   8 │ MODUS            113       1598      188   1170    163  16950  France   Essence
   9 │ CLIO             100       1461      185    980    113  17600  France   Diesel
  10 │ MUSA             100       1910      179   1275    146  17900  Europe   Diesel
  11 │ GOLF              75       1968      163   1217    143  19140  Europe   Diesel
  12 │ AUDIA3           102       1595      185   1205    168  21630  Europe   Essence
  13 │ MONDEO           145       1999      215   1378    189  23100  Europe   Essence
  14 │ P407             136       1997      212   1415    194  23400  France   Essence
  15 │ CITRONC4         138       1997      207   1381    142  23400  France   Diesel
  16 │ MERC_A           140       1991      201   1340    141  24550  Europe   Diesel
  17 │ LAGUNA           165       1998      218   1320    196  25350  France   Essence
  18 │ AVENSIS          115       1995      195   1400    155  26400  Autres   Diesel
  19 │ VECTRA           150       1910      217   1428    159  26550  Europe   Diesel
  20 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
  21 │ PASSAT           150       1781      221   1360    197  27740  Europe   Essence
  22 │ MEGANECC         165       1998      225   1415    191  27800  France   Essence
  23 │ P307CC           180       1997      225   1490    210  28850  France   Essence
  24 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
  25 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence
  26 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
  27 │ P607             204       2721      230   1723    223  40550  France   Diesel
  28 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
  29 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
  30 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
In [31]:
# les 5 voitures les moins chères
print(DF.sort(data,:prix)[1:5,:])
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ PANDA            54       1108      150    860    135   8070  Europe   Essence
   2 │ TWINGO           60       1149      151    840    143   8950  France   Essence
   3 │ YARIS            65        998      155    880    134  10450  Autres   Essence
   4 │ CITRONC2         61       1124      158    932    141  10700  France   Essence
   5 │ CORSA            70       1248      165   1035    127  13590  Europe   Diesel
In [32]:
# tri décroissant, les 5 voitures les plus chères
print(DF.sort(data,:prix,rev=true)[1:5,:])
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ MERC_E          204       3222      243   1735    183  46450  Europe   Diesel
   2 │ BMW530          231       2979      250   1495    231  46400  Europe   Essence
   3 │ ALFA156         250       3179      250   1410    287  40800  Europe   Essence
   4 │ P607            204       2721      230   1723    223  40550  France   Diesel
   5 │ VELSATIS        150       2188      200   1735    188  38250  France   Diesel
In [33]:
# tri avec un double critère
# carburant et prix
println(DF.sort(data,[:carburant,:prix]))
30×9 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ CORSA             70       1248      165   1035    127  13590  Europe   Diesel
   2 │ FIESTA            68       1399      164   1138    117  14150  Europe   Diesel
   3 │ CLIO             100       1461      185    980    113  17600  France   Diesel
   4 │ MUSA             100       1910      179   1275    146  17900  Europe   Diesel
   5 │ GOLF              75       1968      163   1217    143  19140  Europe   Diesel
   6 │ CITRONC4         138       1997      207   1381    142  23400  France   Diesel
   7 │ MERC_A           140       1991      201   1340    141  24550  Europe   Diesel
   8 │ AVENSIS          115       1995      195   1400    155  26400  Autres   Diesel
   9 │ VECTRA           150       1910      217   1428    159  26550  Europe   Diesel
  10 │ VELSATIS         150       2188      200   1735    188  38250  France   Diesel
  11 │ P607             204       2721      230   1723    223  40550  France   Diesel
  12 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel
  13 │ PANDA             54       1108      150    860    135   8070  Europe   Essence
  14 │ TWINGO            60       1149      151    840    143   8950  France   Essence
  15 │ YARIS             65        998      155    880    134  10450  Autres   Essence
  16 │ CITRONC2          61       1124      158    932    141  10700  France   Essence
  17 │ P1007             75       1360      165   1181    153  13600  France   Essence
  18 │ MODUS            113       1598      188   1170    163  16950  France   Essence
  19 │ AUDIA3           102       1595      185   1205    168  21630  Europe   Essence
  20 │ MONDEO           145       1999      215   1378    189  23100  Europe   Essence
  21 │ P407             136       1997      212   1415    194  23400  France   Essence
  22 │ LAGUNA           165       1998      218   1320    196  25350  France   Essence
  23 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
  24 │ PASSAT           150       1781      221   1360    197  27740  Europe   Essence
  25 │ MEGANECC         165       1998      225   1415    191  27800  France   Essence
  26 │ P307CC           180       1997      225   1490    210  28850  France   Essence
  27 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence
  28 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence
  29 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence
  30 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence
In [34]:
# les 5 voitures les plus chères parmi les françaises
# on peut le faire en 2 temps aussi
println(DF.sort(DF.filter(row -> row.origine == "France",data),:prix,rev=true)[1:5,:])
5×9 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ P607            204       2721      230   1723    223  40550  France   Diesel
   2 │ VELSATIS        150       2188      200   1735    188  38250  France   Diesel
   3 │ CITRONC5        210       2496      230   1589    238  33000  France   Essence
   4 │ P307CC          180       1997      225   1490    210  28850  France   Essence
   5 │ MEGANECC        165       1998      225   1415    191  27800  France   Essence
In [35]:
# *** tri personnalisé selon une variable calculée ***
# solution "lisible" en créant la colonne calculée avec transform()
data_bis = DF.transform(data,[:poids,:puissance] =>((x,y) -> x./y) => :rapport)
println(DF.first(data_bis,5))
# puis tri
println()
println(DF.first(DF.sort(data_bis,:rapport),10))
5×10 DataFrame
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant  rapport 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String     Float64 
─────┼───────────────────────────────────────────────────────────────────────────────────────────
   1 │ PANDA            54       1108      150    860    135   8070  Europe   Essence    15.9259
   2 │ TWINGO           60       1149      151    840    143   8950  France   Essence    14.0
   3 │ CITRONC2         61       1124      158    932    141  10700  France   Essence    15.2787
   4 │ YARIS            65        998      155    880    134  10450  Autres   Essence    13.5385
   5 │ FIESTA           68       1399      164   1138    117  14150  Europe   Diesel     16.7353

10×10 DataFrame
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant  rapport 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String     Float64 
─────┼────────────────────────────────────────────────────────────────────────────────────────────
   1 │ ALFA156          250       3179      250   1410    287  40800  Europe   Essence    5.64
   2 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence    6.01732
   3 │ BMW530           231       2979      250   1495    231  46400  Europe   Essence    6.47186
   4 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence    7.15247
   5 │ CITRONC5         210       2496      230   1589    238  33000  France   Essence    7.56667
   6 │ LAGUNA           165       1998      218   1320    196  25350  France   Essence    8.0
   7 │ P307CC           180       1997      225   1490    210  28850  France   Essence    8.27778
   8 │ P607             204       2721      230   1723    223  40550  France   Diesel     8.44608
   9 │ MERC_E           204       3222      243   1735    183  46450  Europe   Diesel     8.5049
  10 │ MEGANECC         165       1998      225   1415    191  27800  France   Essence    8.57576

Aggrégations, calculs¶

In [36]:
# effectuer un groupby selon l'origine
# on obtient des sous-data frame
gb_origine = DF.groupby(data,:origine)
println(gb_origine)
GroupedDataFrame with 3 groups based on key: origine
Group 1 (13 rows): origine = "Europe"
 Row │ Modele   puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String   Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼─────────────────────────────────────────────────────────────────────────────────
   1 │ PANDA           54       1108      150    860    135   8070  Europe   Essence
   2 │ FIESTA          68       1399      164   1138    117  14150  Europe   Diesel
   3 │ CORSA           70       1248      165   1035    127  13590  Europe   Diesel
   4 │ GOLF            75       1968      163   1217    143  19140  Europe   Diesel
   5 │ MUSA           100       1910      179   1275    146  17900  Europe   Diesel
   6 │ AUDIA3         102       1595      185   1205    168  21630  Europe   Essence
   7 │ MERC_A         140       1991      201   1340    141  24550  Europe   Diesel
   8 │ MONDEO         145       1999      215   1378    189  23100  Europe   Essence
   9 │ VECTRA         150       1910      217   1428    159  26550  Europe   Diesel
  10 │ PASSAT         150       1781      221   1360    197  27740  Europe   Essence
  11 │ MERC_E         204       3222      243   1735    183  46450  Europe   Diesel
  12 │ BMW530         231       2979      250   1495    231  46400  Europe   Essence
  13 │ ALFA156        250       3179      250   1410    287  40800  Europe   Essence
Group 2 (13 rows): origine = "France"
 Row │ Modele    puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String    Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼──────────────────────────────────────────────────────────────────────────────────
   1 │ TWINGO           60       1149      151    840    143   8950  France   Essence
   2 │ CITRONC2         61       1124      158    932    141  10700  France   Essence
   3 │ P1007            75       1360      165   1181    153  13600  France   Essence
   4 │ CLIO            100       1461      185    980    113  17600  France   Diesel
   5 │ MODUS           113       1598      188   1170    163  16950  France   Essence
   6 │ P407            136       1997      212   1415    194  23400  France   Essence
   7 │ CITRONC4        138       1997      207   1381    142  23400  France   Diesel
   8 │ VELSATIS        150       2188      200   1735    188  38250  France   Diesel
   9 │ LAGUNA          165       1998      218   1320    196  25350  France   Essence
  10 │ MEGANECC        165       1998      225   1415    191  27800  France   Essence
  11 │ P307CC          180       1997      225   1490    210  28850  France   Essence
  12 │ P607            204       2721      230   1723    223  40550  France   Diesel
  13 │ CITRONC5        210       2496      230   1589    238  33000  France   Essence
Group 3 (4 rows): origine = "Autres"
 Row │ Modele     puissance  cylindree  vitesse  poids  CO2    prix   origine  carburant 
     │ String     Int64      Int64      Int64    Int64  Int64  Int64  String   String    
─────┼───────────────────────────────────────────────────────────────────────────────────
   1 │ YARIS             65        998      155    880    134  10450  Autres   Essence
   2 │ AVENSIS          115       1995      195   1400    155  26400  Autres   Diesel
   3 │ PTCRUISER        223       2429      200   1595    235  27400  Autres   Essence
   4 │ MAZDARX8         231       1308      235   1390    284  34000  Autres   Essence
In [37]:
# calcul sur les sous-groupes
# prix moyens
#importer le module statistics
import Statistics as st
println(DF.combine(gb_origine,:prix => st.mean => :prix_moyen))
3×2 DataFrame
 Row │ origine  prix_moyen 
     │ String   Float64    
─────┼─────────────────────
   1 │ Europe      25390.0
   2 │ France      23723.1
   3 │ Autres      24562.5
In [38]:
# avec 2 critères de regroupement
data_count = DF.combine(DF.groupby(data,[:origine,:carburant]),:prix => st.mean => :prix_moyen)
println(data_count)
6×3 DataFrame
 Row │ origine  carburant  prix_moyen 
     │ String   String     Float64    
─────┼────────────────────────────────
   1 │ Europe   Essence       27956.7
   2 │ France   Essence       20955.6
   3 │ Autres   Essence       23950.0
   4 │ Europe   Diesel        23190.0
   5 │ France   Diesel        29950.0
   6 │ Autres   Diesel        26400.0
In [39]:
# on peut présenter les résultats sous forme de tableau croisé
# valeur (fill = 0) si le cas n'existe pas
println(DF.unstack(data_count,:carburant,:prix_moyen,fill=0))
3×3 DataFrame
 Row │ origine  Essence  Diesel  
     │ String   Float64  Float64 
─────┼───────────────────────────
   1 │ Europe   27956.7  23190.0
   2 │ France   20955.6  29950.0
   3 │ Autres   23950.0  26400.0