Dalam data sains atau machine learning, terkadang kita menghadapi dataset yang cukup besar hingga jutaan atau miliaran record. Apabila kita memproses dataset tersebut menggunakan library pandas maka untuk komputer dengan RAM yang terbatas akan cepat terkuras habis. Oleh sebab itu saya menggunakan salah satu library untuk mengolah big data yaitu Dask.
Dask dataframe digunakan untuk memproses dataset yang besar dengan melakukan partisi dataframe tersebut menjadi beberapa bagian (disebut chunk), kemudian diproses secara parallel oleh CPU. Sebenarnya API Dask ada beberapa diantaranya : Dask Array, Dask Bags, Dask Delayed, dan Dask Dataframe salah satunya. Penulis akan membahas Dask Dataframe API karena sedang penulis gunakan secara intens.
Dataset yang menjadi ujicoba penulis kali ini bersumber dari CIC-IDS 2018 yang merupakan dataset yang berisi serangan malware ke sebuah server. Dalam dataset ini terdapat 79 features dan 1 label, yang terdiri dari jutaan baris.
Dataset ini terdiri dari 10 file csv, yang berkasnya diberi nama sesuai dengan tanggal serangan, yaitu:
| Nama Berkas | Ukuran (KB) | Jumlah Baris | Keterangan |
|---|---|---|---|
| 02-14-2018.csv | 349.828 | 1.048.575 | * FTP-BruteForce * Benign * SSH-Bruteforce |
| 02-15-2018.csv | 367.135 | 1.048.575 | * Benign * DoS attacks-GoldenEye * DoS attacks-Slowloris |
| 02-16-2018.csv | 325.902 | ||
| 02-20-2018.csv | 3.959.889 | ||
| 02-21-2018.csv | 321.186 | ||
| 02-22-2018.csv | 373.669 | ||
| 02-23-2018.csv | 373.868 | ||
| 02-28-2018.csv | 204.346 | ||
| 03-01-2018.csv | 105.316 | ||
| 03-02-2018.csv | 344.110 |
Untuk instalasi library dask dapat dilihat pada artikel lain. Artikel ini fokus pada penggunaan Dask Dataframe. Dibawah ini contoh implementasi Dask DataFrame :
Menampilkan info dari file 02-14-2018.csv
import dask.dataframe as dd
df = dd.read_csv('02-14-2018.csv', dtype={'Active Mean': 'float64', 'Active Std': 'float64'})
df.info()
#output
<class 'dask_expr.DataFrame'>
Columns: 80 entries, Dst Port to Label
dtypes: float64(22), int64(56), string(2)
import dask.dataframe as dd, digunakan untuk mengimport librarydf = dd.read_csv("02-14-2018.csv"), digunakan untuk membaca file csv dan menyimpan dalam objek df- parameter
dtype={'Active Mean': 'float64', 'Active Std': 'float64'}digunakan untuk memaksa perubahan tipe data pada kolomActive MeandanActive Stdmenjadifloat64
Catatan: Dask hanya membaca beberapa baris sampel dan menyimpulkan tipe dataint64, namun kenyataanya terdapat baris dengan tipe datafloat64, sehingga akan mengakibatkan error. Solusinya adalah dengan merubah kedua kolom tadi menjadi tipe data yang sesuai yaitufloat64 - Terlihat bahwa dataset terdiri dari 80 kolom, dengan data type float sebanyak 22 kolom, int64 sebanyak 56 kolom, dan string sebanyak 2 kolom.
Mencari total baris pada dataframe
import dask.dataframe as dd
df = dd.read_csv('02-14-2018.csv', dtype={'Active Mean': 'float64', 'Active Std': 'float64'})
df.count().compute()
#output pandas.core.series.Series
Dst Port 1048575
Protocol 1048575
Timestamp 1048575
Flow Duration 1048575
Tot Fwd Pkts 1048575
...
Idle Mean 1048575
Idle Std 1048575
Idle Max 1048575
Idle Min 1048575
Label 1048575
Length: 80, dtype: int64
df.count().compute(), akan mengeksekusi perintah untuk menghitung jumlah baris
Catatan:df.count()mempersiapkan data tanpa benar-benar mengeksekusi perintah, namun apabila ditambahkan fungsi.compute()maka perintah baru akan dijalankan.
Menampilkan n baris pertama
import dask.dataframe as dd
df = dd.read_csv('02-14-2018.csv', dtype={'Active Mean': 'float64', 'Active Std': 'float64'})
df.head(5)
#output tidak ditampilkan
#tipe data output : pandas.core.frame.DataFrame
- df.head(5), menampilkan 5 baris pertama
- output memiliki tipe data
Mencari nilai unik pada kolom ‘Label’
import dask.dataframe as dd
df = dd.read_csv('02-14-2018.csv', dtype={'Active Mean': 'float64', 'Active Std': 'float64'})
result = df["Label"].drop_duplicates().compute() #output1
result = df["Label"].drop_duplicates().compute().reset_index(drop=True) #output2
result = df["Label"].unique().compute() #output3
#output1 pandas.core.series.Series
94 FTP-BruteForce
0 Benign
179431 SSH-Bruteforce
Name: Label, dtype: object
#output2 pandas.core.series.Series
0 FTP-BruteForce
1 Benign
2 SSH-Bruteforce
Name: Label, dtype: object
#output3 pandas.core.series.Series
0 FTP-BruteForce
0 Benign
1 SSH-Bruteforce
Name: Label, dtype: object
Menghitung nilai mean
import dask.dataframe as dd
df = dd.read_csv("file.csv")
result = df.groupby('category').mean()
final_result = result.compute()
print(final_result)
- import dask.dataframe as dd, digunakan untuk mengimport library
- df = dd.read_csv(“file.csv”), digunakan untuk membaca file csv
- result = df.groupby(‘category’).mean(), digunakan untuk mendaftarkan job untuk mengkategorikan berdasarkan ‘category’ kemudian mengambil nilainya dan dirata-ratakan. Perlu dipahami bahwa proses belum benar-benar dikerjakan, hanya didaftarkan dalam job list Dask.
- final_result = result.compute(), result.compute() merupakan perintah untuk menjalankan job list yang telah didaftarkan, hasilnya disimpan di final_result
- print(final_result), untuk mencetak hasil
