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
| 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 | CITRONC2 | 61 | 1124 | 158 | 932 | 141 | 10700 | France | Essence |
| 4 | YARIS | 65 | 998 | 155 | 880 | 134 | 10450 | Autres | Essence |
| 5 | FIESTA | 68 | 1399 | 164 | 1138 | 117 | 14150 | Europe | Diesel |
In [4]:
# description
DF.describe(data)
Out[4]:
9×7 DataFrame
| Row | variable | mean | min | median | max | nmissing | eltype |
|---|---|---|---|---|---|---|---|
| Symbol | Union… | Any | Union… | Any | Int64 | DataType | |
| 1 | Modele | ALFA156 | YARIS | 0 | String | ||
| 2 | puissance | 137.667 | 54 | 139.0 | 250 | 0 | Int64 |
| 3 | cylindree | 1903.43 | 998 | 1979.5 | 3222 | 0 | Int64 |
| 4 | vitesse | 199.4 | 150 | 200.5 | 250 | 0 | Int64 |
| 5 | poids | 1310.4 | 840 | 1369.0 | 1735 | 0 | Int64 |
| 6 | CO2 | 177.533 | 113 | 165.5 | 287 | 0 | Int64 |
| 7 | prix | 24557.3 | 8070 | 23975.0 | 46450 | 0 | Int64 |
| 8 | origine | Autres | France | 0 | String | ||
| 9 | carburant | Diesel | Essence | 0 | String |
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
| Row | Modele | puissance | cylindree |
|---|---|---|---|
| String | Int64 | Int64 | |
| 1 | PANDA | 54 | 1108 |
| 2 | TWINGO | 60 | 1149 |
| 3 | CITRONC2 | 61 | 1124 |
| 4 | YARIS | 65 | 998 |
| 5 | FIESTA | 68 | 1399 |
| 6 | CORSA | 70 | 1248 |
| 7 | GOLF | 75 | 1968 |
| 8 | P1007 | 75 | 1360 |
| 9 | MUSA | 100 | 1910 |
| 10 | CLIO | 100 | 1461 |
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