Versions¶

In [1]:
#version de datatable
import datatable as dt
dt.__version__
Out[1]:
'1.1.0'

Chargement¶

In [2]:
#changer le répertoire courant
import os
os.chdir("C:/Users/ricco/Desktop/demo")
In [3]:
%%time

#importer les données
D = dt.fread("kddcup99twice.txt",sep=",")
display(D.head())
V1V2V3V4V5V6V7V8V9V10…V38V39V40V41V42
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
00tcphttpSF215450760000…0000normal.
10tcphttpSF215450760000…0000normal.
20tcphttpSF16245280000…0000normal.
30tcphttpSF16245280000…0000normal.
40tcphttpSF23612280000…0000normal.
50tcphttpSF23612280000…0000normal.
60tcphttpSF23320320000…0000normal.
70tcphttpSF23320320000…0000normal.
80tcphttpSF2394860000…0000normal.
90tcphttpSF2394860000…0000normal.
10 rows × 42 columns
CPU times: total: 7.67 s
Wall time: 1.22 s
In [4]:
#type de l'objet
print(type(D))
<class 'datatable.Frame'>
In [5]:
# liste des variables
print(D.names)
('V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'V29', 'V30', 'V31', 'V32', 'V33', 'V34', 'V35', 'V36', 'V37', 'V38', 'V39', 'V40', 'V41', 'V42')
In [6]:
#type des variables
print([D[:,col].type for col in D.names])
[Type.int32, Type.str32, Type.str32, Type.str32, Type.int32, Type.int32, Type.bool8, Type.int32, Type.int32, Type.int32, Type.int32, Type.bool8, Type.int32, Type.bool8, Type.int32, Type.int32, Type.int32, Type.int32, Type.int32, Type.bool8, Type.bool8, Type.bool8, Type.int32, Type.int32, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.int32, Type.int32, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.float64, Type.str32]

Filtrage¶

In [7]:
#f-expression - alias pour accéder aux colonnes
#voir https://datatable.readthedocs.io/en/latest/manual/f-expressions.html
from datatable import f
In [8]:
%%time

#requête - 382696 obs.
res = D[(f.V42=="normal.") & (f.V2=="udp"),:].shape[0]
display(res)
382696
CPU times: total: 891 ms
Wall time: 164 ms

Moyennes pour variables numériques¶

In [9]:
%%time
#liste des variables numériques
numeric_columns = [col for col in D.names if D[:, col].type != dt.Type.str32]
# Calculer la moyenne des colonnes numériques
moyennes = D[:,numeric_columns].mean()
#on a un dataframe des moyennes par variable
#on fait la somme des moyennes pour contrôle
print(moyennes[:,dt.rowsum(f[float])])
   |      C0
   | float64
-- + -------
 0 | 4032.38
[1 row x 1 column]

CPU times: total: 2.69 s
Wall time: 384 ms

Filtrage + moyennes¶

In [10]:
%%time
#liste des variables numériques
numeric_columns = [col for col in D.names if D[:, col].type != dt.Type.str32]
#Calculer la moyenne des colonnes numériques avec filtrage
moyennes = D[(f.V42 == 'normal.'),numeric_columns].mean()
print(moyennes[:,dt.rowsum(f[float])])
   |      C0
   | float64
-- + -------
 0 | 5303.22
[1 row x 1 column]

CPU times: total: 1.38 s
Wall time: 239 ms

Tri selon une variable¶

In [11]:
%%time
#tri décroissant
#utilisation de la fonction sort() pour indiquer la colnne de référence
res = D[:,:,dt.sort('V6',reverse=True)]
display(res[0,:])
V1V2V3V4V5V6V7V8V9V10…V38V39V40V41V42
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
010999tcpotherRSTR013099374010000…0011portsweep.
1 row × 42 columns
CPU times: total: 453 ms
Wall time: 117 ms

Comptage de valeurs¶

In [12]:
%%time
#première partie: comptage, résultat = dataframe avec colonne "count"
res = D[:,dt.count(),dt.by("V42")]
#deuxième partie : tri du résultat sur la colonne "count"
display(res[:,:,dt.sort('count',reverse=True)])
V42count
▪▪▪▪▪▪▪▪▪▪▪▪
0smurf.5615772
1neptune.2144034
2normal.1945562
3satan.31784
4ipsweep.24962
5portsweep.20826
6nmap.4632
7back.4406
8warezclient.2040
9teardrop.1958
10pod.528
11guess_passwd.106
12buffer_overflow.60
13land.42
14warezmaster.40
15imap.24
16rootkit.20
17loadmodule.18
18ftp_write.16
19multihop.14
20phf.8
21perl.6
22spy.4
23 rows × 2 columns
CPU times: total: 1.84 s
Wall time: 262 ms

Moyennes conditionnelles (1 critère)¶

In [13]:
%%time
#group by + moyenne -- utilisation de l'alias f
res = D[:,dt.mean(f.V34),dt.by('V42')]
#résultat = data frame -> tri sur les moyennes calculées V34 ensuite
display(res[:,:,dt.sort('V34')])
V42V34
▪▪▪▪▪▪▪▪▪▪▪▪
0portsweep.0.00292807
1perl.0.0133333
2satan.0.0142147
3neptune.0.0433713
4spy.0.185
5teardrop.0.246834
6rootkit.0.306
7nmap.0.526736
8pod.0.659735
9multihop.0.715714
10warezclient.0.735441
11loadmodule.0.835556
12normal.0.844879
13land.0.87
14ftp_write.0.875
15warezmaster.0.9
16imap.0.916667
17ipsweep.0.930469
18phf.0.9725
19smurf.0.999691
20back.1
21buffer_overflow.1
22guess_passwd.1
23 rows × 2 columns
CPU times: total: 1.62 s
Wall time: 313 ms

Moyennes conditionnelles (2 critères)¶

In [14]:
%%time
#dixit la doc. https://datatable.readthedocs.io/en/latest/manual/comparison_with_pandas.html
#datatable n'implémente pas l'équivant de pivot_table à ce jour
#on passe par une solution de type group_by
display(D[:,dt.mean(f.V34),dt.by('V42','V2')])
V42V2V34
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
0back.tcp1
1buffer_overflow.tcp1
2ftp_write.tcp0.875
3guess_passwd.tcp1
4imap.tcp0.916667
5ipsweep.icmp0.999392
6ipsweep.tcp0.0684091
7land.tcp0.87
8loadmodule.tcp0.835556
9multihop.tcp0.715714
10neptune.tcp0.0433713
11nmap.icmp0.996008
12nmap.tcp0.00355899
13nmap.udp0.75344
14normal.icmp0.51977
⋮⋮⋮⋮
27smurf.icmp0.999691
28spy.tcp0.185
29teardrop.udp0.246834
30warezclient.tcp0.735441
31warezmaster.tcp0.9
32 rows × 3 columns
CPU times: total: 2.66 s
Wall time: 459 ms