Anda di halaman 1dari 82

DATA MANIPULATION WITH PANDAS PART 1

Introduction to Pandas

Pendahuluan
“Apa kegunaan mempelajari Pandas? Aku tahunya Pandas nama hewan,” kelakarku pada
Andra. Benar kan! Lagi-lagi aku menemukan istilah umum tapi punya makna berbeda di
dunia data.
 
“Itu Panda, Aksara. Kalau Pandas berguna untuk melakukan analisis dan pengolahan data
dari menengah sampai besar. Coba dibaca saja dulu modulnya biar lebih jelas. Nanti akan
ada praktik yang memperjelas,” tukas Andra.
 

Seperti yang bisa kutebak, aku harus memahami modul dan


pembelajaran baru ini sendiri. Karena kulihat Andra sudah
melengang pergi setelah memberi intruksi sederhana seperti itu.
Tak apa, perlahan aku terbiasa juga belajar mandiri. Walau
memang lebih nyaman kalau dbimbing, hehehe.

Memanggil Library Pandas


 
Pandas adalah library python open source yang biasanya digunakan untuk kebutuhan data
analisis. Pandas membuat Python supaya dapat bekerja dengan data yang berbentuk tabular
seperti spreadsheet dengan cara pemuatan data yang cepat, manipulasi data, menggabungkan
data, serta ada berbagai fungsi yang lain.
 
Pertama-tama, harus di import dulu Pandas library di Python script yang telah tersedia

biasanya ketika menggunakan library Pandas, library Numpy juga diimport, sehingga
menjadi
 
Tugas praktek:
Pada code editor dapat terlihat kode-kode yang tidak lengkap. Tugasnya sekarang
mengimport library pandas dan juga library numpy dengan mengisi _ _ _ pada masing-
masing baris.
Code
import pandas as pd
import numpy as np

DataFrame & Series

Di Pandas terdapat 2 kelas data baru yang digunakan sebagai struktur dari spreadsheet:

1. Series: satu kolom bagian dari tabel dataframe yang merupakan 1 dimensional numpy
array sebagai basis data nya, terdiri dari 1 tipe data (integer, string, float, dll).
2. DataFrame: gabungan dari Series, berbentuk rectangular data yang merupakan tabel
spreadsheet itu sendiri (karena dibentuk dari banyak Series, tiap Series biasanya
punya 1 tipe data, yang artinya 1 dataframe bisa memiliki banyak tipe data).

 
Contoh:
Series

 
DataFrame

 
Tugas praktek:
Pada code editor terlihat kode-kode yang tidak lengkap. Tugasnya sekarang adalah mengganti
tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh di atas.

Code

import pandas as pd
# Series
number_list = pd.Series([1,2,3,4,5,6])
print("Series:")
print(number_list)
# DataFrame
matrix = [[1,2,3],
['a','b','c'],
[3,4,5],
['d',4,6]]
matrix_list = pd.DataFrame(matrix)
print("DataFrame:")
print(matrix_list)

Atribut DataFrame & Series - Part 1

Dataframe dan Series memiliki sangat banyak atribut yang digunakan untuk transformasi
data, tetapi ada beberapa attribute yang sering dipakai. Di sini series number_list dan data
frame matrix_list pada subbab sebelumnya digunakan kembali.

 
Tampilan output di console untuk masing-masing penggunaan attribute berikut merupakan
hasil setelah menuliskan seluruh kode di code editor dan kemudian mengklik
tombol  .
 
1. Attribute .info()
Attribute .info() digunakan untuk mengecek kolom apa yang membentuk dataframe itu, data
types, berapa yang non null, dll. Attribute ini tidak dapat digunakan pada series, hanya pada
data frame saja.

Output di console untuk penggunaan attribute .info() ini adalah

 
2. Attribute .shape
Attribute .shape digunakan untuk mengetahui berapa baris dan kolom, hasilnya dalam format
tuple (baris, kolom).

Output di console untuk penggunaan attribute .shape ini adalah

 
3. Attribute .dtypes
Attribute .dtypes digunakan untuk mengetahui tipe data di tiap kolom. Tipe data object:
kombinasi untuk berbagai tipe data (number & text, etc).

Output di console untuk penggunaan attribute .dtypes ini adalah


 
4. Attribute .astype(nama_tipe_data)
Attribute .astype(nama_tipe_data) untuk convert tipe data berdasarkan tipe data
seperti: float, int, str, numpy.float, numpy.int ataupun numpy.datetime.

Output di console untuk penggunaan attribute .astype() ini adalah

 
Tugas praktek:
Pada code editor dapat terlihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas

Code

import pandas as pd

# Series

number_list = pd.Series([1,2,3,4,5,6])

# DataFrame

matrix_list = pd.DataFrame([[1,2,3],
['a','b','c'],

[3,4,5],

['d',4,6]])

# [1] attribute .info()

print("[1] attribute .info()")

print(matrix_list.info())

# [2] attribute .shape

print("\n[2] attribute .shape")

print(" Shape dari number_list:", number_list.shape)

print(" Shape dari matrix_list:", matrix_list.shape)

# [3] attribute .dtypes

print("\n[3] attribute .dtypes")

print(" Tipe data number_list:", number_list.dtypes)

print(" Tipe data matrix_list:", matrix_list.dtypes)

# [4] attribute .astype()

print("\n[4] attribute .astype()")

print(" Konversi number_list ke str:", number_list.astype("str"))

print(" Konversi matrix_list ke str:", matrix_list.astype("str"))

Atribut DataFrame & Series - Part 2

Dataframe dan Series memiliki sangat banyak atribut yang digunakan untuk transformasi
data, tetapi ada beberapa attribute yang sering dipakai. Di sini series number_list dan data
frame matrix_list digunakan kembali.
Tampilan output di console untuk masing-masing penggunaan attribute berikut merupakan
hasil setelah menuliskan seluruh kode di code editor dan kemudian mengklik
tombol  .
 
5. Attribute .copy()
Attribute .copy() digunakan melakukan duplikat, untuk disimpan di variable yang berbeda
mungkin supaya tidak loading data lagi.

Output di console untuk penggunaan attribute .copy() ini adalah

 
6. Attribute .to_list()
Attribute .to_list() digunakan untuk mengubah series menjadi list dan tidak dapat digunakan
untuk dataframe.

Output di console untuk penggunaan attribute .to_list() ini adalah

 
7. Attribute .unique()
Attribute .unique() digunakan menghasilkan nilai unik dari suatu kolom, hasilnya dalam
bentuk numpy array. Attribute ini hanya digunakan pada series saja.
Output di console untuk penggunaan attribute .unique() ini adalah

 
Tugas praktek:
Pada code editor dapat terlihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas.

Code

import pandas as pd

# Series

number_list = pd.Series([1,2,3,4,5,6])

# DataFrame

matrix_list = pd.DataFrame([[1,2,3],

['a','b','c'],

[3,4,5],

['d',4,6]])

# [5] attribute .copy()

print("[5] attribute .copy()")

num_list = number_list.copy()

print(" Copy number_list ke num_list:", num_list)

mtr_list = matrix_list.copy()

print(" Copy matrix_list ke mtr_list:", mtr_list)

# [6] attribute .to_list()

print("[6] attribute .to_list()")

print(number_list.to_list())

# [7] attribute .unique()

print("[7] attribute .unique()")

print(number_list.unique())

Atribut DataFrame & Series - Part 3


Dataframe dan Series memiliki sangat banyak atribut yang digunakan untuk transformasi
data, tetapi ada beberapa attribute yang sering dipakai. Di sini series number_list dan data
frame matrix_list pada subbab sebelumnya digunakan kembali.

Tampilan output di console untuk masing-masing penggunaan attribute berikut merupakan


hasil setelah menuliskan seluruh kode di code editor dan kemudian mengklik
tombol  .
 
8. Attribute .index
Attribute .index digunakan untuk mencari index/key dari Series atau Dataframe.

Output di console untuk penggunaan attribute .index ini adalah

 
9. Attribute .columns
Attribute .columns digunakan untuk mengetahui apa saja kolom yang tersedia di dataframe
tersebut (hanya digunakan untuk dataframe saja). 

Output di console untuk penggunaan attribute .columns ini adalah

 
10. Attribute .loc
Attribute .loc digunakan slice dataframe atau series berdasarkan nama kolom dan/atau nama
index.
Output di console untuk penggunaan attribute .loc[] ini adalah

 
11. Attribute .iloc
Attribute .iloc digunakan untuk slice dataframe atau series berdasarkan index kolom dan/atau
index.

Output di console untuk penggunaan attribute .iloc[] ini adalah

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas.

Code

import pandas as pd
# Series
number_list = pd.Series([1,2,3,4,5,6])
# DataFrame
matrix_list = pd.DataFrame([[1,2,3],
['a','b','c'],
[3,4,5],
['d',4,6]])
# [8] attribute .index
print("[8] attribute .index")
print(" Index number_list:", number_list.index)
print(" Index matrix_list:", matrix_list.index)
# [9] attribute .columns
print("[9] attribute .columns")
print(" Column matrix_list:", matrix_list.columns)
# [10] attribute .loc
print("[10] attribute .loc")
print(" .loc[0:1] pada number_list:", number_list.loc[0:1])
print(" .loc[0:1] pada matrix_list:", matrix_list.loc[0:1])
# [11] attribute .iloc
print("[11] attribute .iloc")
print(" iloc[0:1] pada number_list:", number_list.iloc[0:1])
print(" iloc[0:1] pada matrix_list:", matrix_list.iloc[0:1])

Creating Series & Dataframe from List

Untuk membuat Series atau Dataframe bisa dari berbagai macam tipe data container/mapping
di python, seperti list dan dictionary, maupun dari numpy array.
 
Pada sub bagian ini, kamu akan membuat Series dan Dataframe yang bersumber
dari list. Sekedar meninjau bahwa, list merupakan sebuah kumpulan data berbagai macam
tipe data, yang mutable (dapat diganti).
Series
Contoh membuat series dari list:
Output di console:

 
DataFrame
Contoh membuat dataframe dari list of list:

Output di console:

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas.

Code
import pandas as pd
# Creating series from list
ex_list = ['a',1,3,5,'c','d']
ex_series = pd.Series(ex_list)
print(ex_series)
# Creating dataframe from list of list
ex_list_of_list = [[1 ,'a','b','c'],
[2.5,'d','e','f'],
[5 ,'g','h','i'],
[7.5,'j',10.5,'l']]
index = ['dq','lab','kar','lan']
cols = ['float','char','obj','char']
ex_df = pd.DataFrame(ex_list_of_list, index=index, columns=cols)
print(ex_df)

Output :

In [1]: import pandas as pd


# Creating series from list
ex_list = ['a',1,3,5,'c','d']
ex_series = pd.Series(ex_list)
print(ex_series)
# Creating dataframe from list of list
ex_list_of_list = [[1 ,'a','b','c'],
[2.5,'d','e','f'],
[5 ,'g','h','i'],
[7.5,'j',10.5,'l']]
index = ['dq','lab','kar','lan']
cols = ['float','char','obj','char']
ex_df = pd.DataFrame(ex_list_of_list, index=index, columns=cols)
print(ex_df)

0 a
1 1
2 3
3 5
4 c
5 d
dtype: object
float char obj char
dq 1.0 a b c
lab 2.5 d e f
kar 5.0 g h i
lan 7.5 j 10.5 l

Creating Series & Dataframe from Dictionary

Untuk membuat Series atau Dataframe bisa dari berbagai macam tipe data container/mapping
di python, seperti list dan dictionary, maupun dari numpy array.
 
Pada sub bagian ini, akan membuat Series dan Dataframe yang bersumber dari dictionary.
Sekedar meninjau bahwa, dictionary merupakan kumpulan data yang strukturnya terdiri dari
key dan value.
Series
Contoh membuat series dari dictionary:

Output di console:

 
DataFrame
Contoh membuat dataframe dari dict dengan setiap pasangan key dan value-nya berisi list yang sama
panjangnya:

Output di console:

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas.

Code
import pandas as pd
# Creating series from dictionary
dict_series = {'1':'a',
'2':'b',
'3':'c'}
ex_series = pd.Series(dict_series)
print(ex_series)
# Creating dataframe from dictionary
df_series = {'1':['a','b','c'],
'2':['b','c','d'],
'4':[ 2 , 3 ,'z']}
ex_df = pd.DataFrame(df_series)
print(ex_df)

Output:

In [1]: import pandas as pd


# Creating series from dictionary
dict_series = {'1':'a',
'2':'b',
'3':'c'}
ex_series = pd.Series(dict_series)
print(ex_series)
# Creating dataframe from dictionary
df_series = {'1':['a','b','c'],
'2':['b','c','d'],
'4':[ 2 , 3 ,'z']}
ex_df = pd.DataFrame(df_series)
print(ex_df)

1 a
2 b
3 c
dtype: object
1 2 4
0 a b 2
1 b c 3
2 c d z

Creating Series & Dataframe from Numpy Array

Untuk membuat Series atau Dataframe bisa dari berbagai macam tipe data container/mapping
di python, seperti list dan dictionary, maupun dari numpy array.
 
Pada sub bagian ini, akan membuat Series dan Dataframe yang bersumber dari numpy
array. Sekedar meninjau bahwa, numpy array kumpulan data yang terdiri atas berbagai
macam tipe data, mutable, tapi dibungkus dalam array oleh library Numpy.
Series
Contoh membuat series dari numpy array 1D:

Output:

 
DataFrame
Contoh membuat dataframe dari numpy array 2D:

Output:

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas.

Code:
import pandas as pd
import numpy as np
# Creating series from numpy array (1D)
arr_series = np.array([1,2,3,4,5,6,7])
ex_series = pd.Series(arr_series)
print(ex_series)
# Creating dataframe from numpy array (2D)
arr_df = np.array([[1 ,2 ,3 ,5],
[5 ,6 ,7 ,8],
['a','b','c', 10]])
ex_df = pd.DataFrame(arr_df)
print(ex_df)

Output:

In [1]: import pandas as pd


import numpy as np
# Creating series from numpy array (1D)
arr_series = np.array([1,2,3,4,5,6,7])
ex_series = pd.Series(arr_series)
print(ex_series)
# Creating dataframe from numpy array (2D)
arr_df = np.array([[1 ,2 ,3 ,5],
[5 ,6 ,7 ,8],
['a','b','c', 10]])
ex_df = pd.DataFrame(arr_df)
print(ex_df)

0 1
1 2
2 3
3 4
4 5
5 6
6 7
dtype: int64
0 1 2 3
0 1 2 3 5
1 5 6 7 8
2 a b c 10

Dataset I/O
Pendahuluan
Aku berhenti sejenak dari bacaan modul dan latihan kuis. Timbul satu pertanyaan yang
menggelitikku. Dan, pas sekali aku melihat Andra sedang mampir ke meja di seberangku.
Waktu yang tepat untuk memanggilnya dan bertanya.
 
“Ndra, memangnya file apa saja sih yang bisa dibaca oleh Pandas? Aku penasaran.”
 
“Saya kirim saja yah lengkapnya ada di link. Coba kamu cek di email,” jawab Andra singat,
padat, jelas.
 
Sesaat setelah aku bertanya, aku melihat Andra mengutak-atik ponselnya. Semenit kemudian,
aku sudah menemukan link di kotak masuk emailku yang berisi file-file yang bisa diakses
Pandas. Aku pun membukanya dan menyimaknya satu per satu:
 
Pandas menyediakan berbagai method untuk membaca file tersebut hanya dengan dipanggil
method itu, code yang lebih simple dan loading yang lebih, tentu saja output nya dapat
berupa Series atau Dataframe.
Terdapat sangat banyak file yang dapat dibaca/dapat disimpan oleh Pandas, tapi ada
beberapa file yang paling umum dan sering digunakan oleh praktisi data seperti berikut ini:

1. CSV (Comma Separated Values), antar data dalam satu baris dipisahkan oleh
comma, ",".
2. TSV (Tab Separated Values), antar data dalam satu baris dipisahkan oleh "Tab".
3. Excel
4. Google BigQuery
5. SQL Query
6. JSON (Java Script Object Notation)

Read Dataset - CSV dan TSV


CSV dan TSV pada hakikatnya adalah tipe data text dengan perbedaan terletak pada pemisah
antar data dalam satu baris. Pada file CSV, antar data dalam satu baris dipisahkan oleh
comma, ",". Namun, pada file TSV antar data dalam satu baris dipisahkan oleh "Tab".
Fungsi .read_csv() digunakan untuk membaca file yang value nya dipisahkan oleh comma
(default), terkadang pemisah value nya bisa di set ‘\t’ untuk file tsv (tab separated values).
Notes :
Dataset csv : https://storage.googleapis.com/dqlab-dataset/sample_csv.csv
Dataset tsv : https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv
Membaca file CSV
Jika dijalankan akan menghasilkan output di console:

 
Membaca file TSV

Jika dijalankan akan menghasilkan output di console:

 
Tugas praktek:
Pada code editor dapat kamu lihat kode-kode yang tidak lengkap. Tugas kamu sekarang
adalah mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada
contoh di atas. 
Tampilkanlah tiga data teratas dari kedua jenis file yang telah dibaca!

Code

import pandas as pd

# File CSV

df_csv = pd.read_csv(“https://storage.googleapis.com/dqlab-dataset/sample_csv.csv”)

print(df_csv.head(3)) # Menampilkan 3 data teratas

# File TSV

df_tsv = pd.read_csv(“https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv”, sep='\t')


print(df_tsv.head(3)) # Menampilkan 3 data teratas

Output:

In [1]: import pandas as pd


# File CSV
df_csv = pd.read_csv('https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv')
print(df_csv.head(3)) # Menampilkan 3 data teratas
# File TSV
df_tsv = pd.read_csv('https://storage.googleapis.com/dqlab-
dataset/sample_tsv.tsv', sep='\t')
print(df_tsv.head(3)) # Menampilkan 3 data teratas

order_id order_date customer_id ... brand quantity item_price


0 1612339 2019-01-01 18055 ... BRAND_C 4 1934000
1 1612339 2019-01-01 18055 ... BRAND_V 8 604000
2 1612339 2019-01-01 18055 ... BRAND_G 12 747000

[3 rows x 9 columns]
order_id order_date customer_id ... brand quantity item_price
0 1612339 2019-01-01 18055 ... BRAND_C 4 1934000
1 1612339 2019-01-01 18055 ... BRAND_V 8 604000
2 1612339 2019-01-01 18055 ... BRAND_G 12 747000

[3 rows x 9 columns] 

Read Dataset - Excel


File Excel dengan ekstensi *.xls atau *.xlsx cukup banyak digunakan dalam menyimpan data.
Pandas juga memiliki fitur untuk membaca file excel.
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_excel.xlsx
Fungsi .read_excel() digunakan untuk membaca file excel menjadi dataframe pandas.

Jika dijalankan code di atas akan menghasilkan output di console seperti berikut
 
Tugas praktek:
Pada code editor dapat kamu lihat kode-kode yang tidak lengkap. Tugas kamu sekarang
adalah mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada
contoh di atas. 
Tampilkanlah empat data teratas dari file excel yang telah dibaca!

Code:
import pandas as pd
# File xlsx dengan data di sheet "test"
df_excel = pd.read_excel("https://storage.googleapis.com/dqlab-dataset/sample_excel.xlsx",
sheet_name="test")
print(df_excel.head(4)) # Menampilkan 4 data teratas

Output:

In [1]: import pandas as pd


# File xlsx dengan data di sheet "test"
df_excel = pd.read_excel("https://storage.googleapis.com/dqlab-
dataset/sample_excel.xlsx", sheet_name="test")
print(df_excel.head(4)) # Menampilkan 4 data teratas

order_id order_date customer_id ... brand quantity item_price


0 1612339 2019-01-01 18055 ... BRAND_C 4 1934000
1 1612339 2019-01-01 18055 ... BRAND_V 8 604000
2 1612339 2019-01-01 18055 ... BRAND_G 12 747000
3 1612339 2019-01-01 18055 ... BRAND_B 12 450000

[4 rows x 9 columns] 

Read Dataset - JSON


Method .read_json() digunakan untuk membaca URL API yang formatnya JSON dan
merubahnya menjadi dataframe pandas. Method ini dapat digunakan seperti yang
dicontohkan berikut ini:
Dataset JSON: https://storage.googleapis.com/dqlab-dataset/covid2019-api-herokuapp-
v2.json
 

Jika dengan benar dituliskan codenya di code editor maka setelah tombol   diklik
kemudian akan mendapatkan hasilnya di console seperti berikut

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas. 
Tampilkanlah sepuluh data teratas dari file JSON yang telah dibaca!

Code:
import pandas as pd
# File JSON
url = "https://storage.googleapis.com/dqlab-dataset/covid2019-api-herokuapp-v2.json"
df_json = pd.read_json(url)
print(df_json.head(10)) # Menampilkan 10 data teratas

Output:

In [1]: import pandas as pd


# File JSON
url = "https://storage.googleapis.com/dqlab-dataset/covid2019-api-
herokuapp-v2.json"
df_json = pd.read_json(url)
print(df_json.head(10)) # Menampilkan 10 data teratas

data dt ts
0 {'deaths': 135605, 'active': 2253244, 'confirm... 07-14-2020 1594684800
1 {'deaths': 72833, 'active': 520883, 'confirmed... 07-14-2020 1594684800
10 {'deaths': 28406, 'active': 77172, 'confirmed'... 07-14-2020 1594684800
100 {'deaths': 93, 'active': 1636, 'confirmed': 30... 07-14-2020 1594684800
101 {'deaths': 51, 'active': 2178, 'confirmed': 30... 07-14-2020 1594684800
102 {'deaths': 25, 'active': 1662, 'confirmed': 29... 07-14-2020 1594684800
103 {'deaths': 91, 'active': 762, 'confirmed': 284... 07-14-2020 1594684800
104 {'deaths': 13, 'active': 459, 'confirmed': 276... 07-14-2020 1594684800
105 {'deaths': 11, 'active': 654, 'confirmed': 264... 07-14-2020 1594684800
106 {'deaths': 39, 'active': 1644, 'confirmed': 24... 07-14-2020 1594684800 

Read Dataset - SQL


Fungsi .read_sql() atau .read_sql_query() digunakan untuk membaca query dari database
dan translate menjadi pandas dataframe, contoh case ini database sqlite.
 
Contoh penggunaannya:

Jika menggunakan .read_sql_query

Output:
 
Jika menggunakan .read_sql

Output:

Terlihat keduanya menghasilkan output yang sama.

Read Dataset - Google BigQuery


Untuk data yang besar (big data), umumnya digunakan Google BigQuery. Layanan ini dapat
digunakan jika telah memiliki Google BigQuery account.
 
Fungsi .read_gbq() digunakan untuk membaca Google BigQuery table menjadi dataframe
pandas.
project_id="XXXXXXXX" adalah ID dari Google BigQuery account.
Outputnya:

Write Dataset
Dalam bekerja sebagai data scientist/analis setelah dilakukan data cleaning dataset yang
sudah rapi tentunya disimpan terlebih dahulu ke dalam media penyimpanan.  
 
Pandas menyediakan fitur demikian secara ringkas melalui penerapan method pada
dataframe/series yang ditabelkan berikut ini.
Method Code

CSV

.to_csv() df.to_csv("csv1.csv", index=False)

→ digunakan untuk export TSV


dataframe kembali ke csv atau tsv
df.to_csv("tsv1.tsv", index=False, sep='\t')

.to_clipboard()
→ export dataframe menjadi bahan df.to_clipboard()
copy jadi nanti bisa tinggal klik
paste di excel atau google sheets

.to_excel()
→ export dataframe menjadi file df_excel.to_excel("xlsx1.xlsx", index=False)
excel

df.to_gbq("temp.test", project_id="XXXXXX",
if_exists="fail")

temp: nama dataset,
test: nama table
.to_gbq() if_exists: ketika tabel dengan dataset.table_name yang
sama sudah ada, apa action yang ingin dilakukan
→ export dataframe menjadi table di
Google BigQuery ("fail": tidak melakukan apa-apa,
 "replace': membuang tabel yang sudah ada dan
mengganti yang baru,
 "append": menambah baris di tabel tersebut dengan
data yang baru
)
 

Head & Tail


Seperti yang telah dipelajari sebelumnya bahwa ada method .head yang diterapkan pada suatu
variabel bertipe pandas dataframe/series.
Method .head ditujukan untuk membatasi tampilan jumlah baris teratas dari
dataset. Sementara itu, method .tail ditujukan untuk membatasi jumlah baris terbawah dari
dataset.
Secara umum kedua method ini memiliki bentuk
[nama_dataframe].head(n) 

dan 

[nama_dataframe].tail(n)

dengan n merupakan jumlah baris yang akan ditampilkan, jika tidak disebutkan n = 5
(sebagai nilai default dari n). 
 
Tugas Praktek:
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_csv.csv
Berdasarkan file sample_csv.csv cetaklah 3 data teratas dan 3 data terbawah. 
Jika berhasil maka tampilan berikut yang akan kamu peroleh di console.

 
 
Code:
import pandas as pd
# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_csv.csv")
# Tampilkan 3 data teratas
print("Tiga data teratas:\n", df.head(3))
# Tampilkan 3 data terbawah
print("Tiga data terbawah:\n", df.ail(3))
Output:

In [1]: import pandas as pd


# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv")
# Tampilkan 3 data teratas
print("Tiga data teratas:\n", df.head(3))
# Tampilkan 3 data terbawah
print("Tiga data terbawah:\n", df.tail(3))

Tiga data teratas:


order_id order_date customer_id ... brand quantity item_price
0 1612339 2019-01-01 18055 ... BRAND_C 4 1934000
1 1612339 2019-01-01 18055 ... BRAND_V 8 604000
2 1612339 2019-01-01 18055 ... BRAND_G 12 747000

[3 rows x 9 columns]
Tiga data terbawah:
order_id order_date customer_id ... brand quantity item_price
98 1612390 2019-01-01 12681 ... BRAND_S 24 450000
99 1612390 2019-01-01 12681 ... BRAND_S 24 450000
100 1612390 2019-01-01 12681 ... BRAND_B 4 1325000

[3 rows x 9 columns]

Indexing, Slicing, dan Transforming


 

Pendahuluan
Aku masih fokus mengutak-atik dokumen yang bisa dibaca oleh Pandas ketika Andra
menyahut dari belakangku. “Sudah dipelajari modulnya, Aksara? Apakah sudah cukup
paham dasarnya penggunaan basic data of Pandas? Terutama cara bikin data frame dan data
source yang diolah dari Pandas?”
 
Seperti biasa, Andra ingin memastikan proses belajarku berjalan lancar. Tapi, mumpung ia
berada di sini dan aku punya pertanyaan, lebih baik kusampaikan.
 
“Iya, Ndra. Tapi aku masih agak bingung soal manipulasi data, seperti membuat index,
slicing dan transform tipe data di series maupun dataframe,” ungkapku jujur. Apakah Andra
akan membantuku? Aku menunggu responsnya sampai kemudian Andra menarik bangku ke
sebelahku.
 
“Oke, coba sini saya bantu jelaskan.”
 
Mataku berbinar. Aku tak akan melewatkan kesempatan ini. Aku pun menggeser bangku agar
lebih dekat dengan Andra yang siap menampilkan beberapa contoh manipulasi data, terutama
membuat index, seperti yang dijelaskan selanjutnya.

Indexing
Indexing - Part 1

Index merupakan key identifier dari tiap row/column untuk Series atau Dataframe (sifatnya
tidak mutable untuk masing-masing value tapi bisa diganti untuk semua value sekaligus).
Jika tidak disediakan, pandas akan membuat kolom index default secara otomatis sebagai
bilangan bulat (integer) dari 0 sampai range jumlah baris data tersebut.
Kolom index dapat terdiri dari

1. satu kolom (single index), atau


2. multiple kolom (disebut dengan hierarchical indexing).

Index dengan multiple kolom ini terjadi karena unique identifier tidak dapat dicapai hanya
dengan set index di 1 kolom saja sehingga membutuhkan beberapa kolom yang menjadikan
tiap row menjadi unique.

Indexing - Part 2

Secara default setelah suatu data frame dibaca dari file dengan format tertentu, index-nya
merupakan single index.
Pada sub bab ini akan mencetak index dan kolom yang dimiliki oleh file
"https://storage.googleapis.com/dqlab-dataset/sample_csv.csv". Untuk menentukan index dan
kolom yang dimiliki oleh dataset yang telah dinyatakan sebagai sebuah dataframe pandas
dapat dilakukan dengan menggunakan attribut .index dan .columns.
 
Untuk lebih jelasnya diberikan oleh kode yang ditampilkan berikut ini

 
Jika dijalankan dengan menekan tombol   maka akan menghasilkan output seperti
berikut di console untuk masing-masing indeks dan kolom yang dimiliki oleh dataframe df.

 
Tugas praktek:
Pada code editor dikamu lihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas. 
Tampilkanlah index dan kolom data teratas dari file TSV
"https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv" yang telah dibaca!
Jika kode yang dituliskan telah benar dan kemudian tombol ditekan, maka hasil beriku yang
akan kamu peroleh di console.

 
Code:
import pandas as pd
# Baca file TSV sample_tsv.tsv
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv", sep="\t")
# Index dari df
print("Index:", df.index)
# Column dari df
print("Columns:",df.columns)
Output:

In [1]: import pandas as pd


# Baca file TSV sample_tsv.tsv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv", sep="\t")
# Index dari df
print("Index:", df.index)
# Column dari df
print("Columns:",df.columns)

Index: RangeIndex(start=0, stop=101, step=1)


Columns:
Index(['order_id,order_date,customer_id,city,province,product_id,brand,quantity,it
em_price'], dtype='object')

Indexing - Part 3

Di sub bab sebelumnya telah dibahas terkait single index, tentunya pada sub bab ini akan
bahas multi index atau disebut juga dengan hierarchical indexing.
Untuk membuat multi index (hierarchical indexing) dengan pandas diperlukan kolom-kolom
mana saja yang perlu disusun agar index dari data frame menjadi sebuah hirarki yang
kemudian dapat dikenali.
 
Pada sub bab sebelumnya telah diberikan nama-nama kolom dari dataframe yang telah
dibaca, yaitu

dengan output

Selanjutnya akan membuat multi index dengan menggunakan kolom 'order_id', 'customer_id',
'product_id', dan 'order_date' dengan menggunakan method .set_index(). Mari perhatikan
contoh kode yang diberikan berikut ini

berikut hasil tampilan dataframe df_x-nya


 
Untuk melihat multi index yang telah diset dapat dilakukan dengan

yang memberikan output

 
Perlu diketahui bahwa kumpulan index dari multi index adalah list dari banyak tuples, tuples
nya merupakan kombinasi yang ada dari gabungan index-index tersebut. Dari multi index
tersebut juga terdapat atribut levels yang menunjukkan urutan index, dalam case ini 'order_id'
> 'customer_id' > 'product_id' > 'order_date'.

yang menghasilkan output berupa


 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai seperti yang diberikan pada contoh
di atas. 
Tampilkanlah multi index dari file TSV "sample_tsv.tsv" yang telah dibaca berupa nama dan
level indexnya.
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv
Kolom yang menjadi indexnya yaitu 'order_date', 'city', dan 'customer_id'!
 
Jika di code editor telah dengan benar ditulis kodenya dan kemudian setelah menekan
tombol  , maka akan memperoleh hasil berikut di console

 
 
 
Code :
import pandas as pd
# Baca file TSV sample_tsv.tsv
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv", sep="\t")
# Set multi index df
df_x = df.set_index(['order_date', 'city', 'customer_id'])
# Print nama dan level dari multi index
for name, level in zip(df_x.index.names, df_x.index.levels):
print(name,':',level)

Output:

In [1]: import pandas as pd


# Baca file TSV sample_tsv.tsv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_tsv.tsv", sep="\t")
# Set multi index df
df_x = df.set_index(['order_date', 'city', 'customer_id'])
# Print nama dan level dari multi index
for name, level in zip(df_x.index.names, df_x.index.levels):
print(name,':',level)

order_date : Index(['2019-01-01'], dtype='object', name='order_date')


city : Index(['Bogor', 'Jakarta Pusat', 'Jakarta Selatan', 'Jakarta Utara',
'Makassar', 'Malang', 'Surabaya', 'Tangerang'],
dtype='object', name='city')
customer_id : Int64Index([12681, 13963, 15649, 17091, 17228, 17450, 17470, 17511,
17616,
18055],
dtype='int64', name='customer_id')

Indexing - Part 4

Terdapat beberapa cara untuk membuat index, salah satunya adalah seperti yang telah
dilakukan pada sub bab sebelumnya dengan menggunakan method .set_index().
Di sub bab ini akan menggunakan assignment untuk menset index dari suatu data frame.
Untuk itu file "sample_excel.xlsx" yang digunakan. Perhatikan code berikut.
Jika dijalankan dengan mengklik tombol   hasilnya adalah sebagai berikut

 
Note:

 Cara yang ditunjukkan oleh baris ketujuh (ke 7) pada code editor di atas hanya
berlaku jika index yang diassign tersebut memiliki panjang yang sama dengan jumlah
baris dari dataframe.
 Jika ingin kembalikan dataframe ke index defaultnya yaitu dari 0 s/d jumlah baris data
- 1, maka dapat menggunakan method .reset_index(drop=True), argument
drop=True bertujuan untuk menghapus index lama. 

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai. 
Baca kembali file TSV "sample_tsv.tsv" hanya untuk 10 baris pertama. Set lah indeknya
dengan menggunakan nama "Pesanan ke-i" i adalah bilangan bulat dari 1 sampai dengan
jumlah baris (10 baris data).
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv
Jika berhasil dijalankan kodenya maka akan tampil hasil berikut:
 
Code:
import pandas as pd
# Baca file sample_tsv.tsv untuk 10 baris pertama saja
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv", sep="\t",
nrows=10)
# Cetak data frame awal
print("Dataframe awal:\n", df)
# Set index baru
df.index = ["Pesanan ke-" + str(i+1) for i in range(0, len(df))]
# Cetak data frame dengan index baru
print("Dataframe dengan index baru:\n", df)
Output:

In [1]: import pandas as pd


# Baca file sample_tsv.tsv untuk 10 baris pertama saja
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_tsv.tsv", sep="\t", nrows=10)
# Cetak data frame awal
print("Dataframe awal:\n", df)
# Set index baru
df.index = ["Pesanan ke-" + str(i+1) for i in range(0, len(df))]
# Cetak data frame dengan index baru
print("Dataframe dengan index baru:\n", df)

Dataframe awal:
order_id order_date customer_id ... brand quantity item_price
0 1612339 2019-01-01 18055 ... BRAND_C 4 1934000
1 1612339 2019-01-01 18055 ... BRAND_V 8 604000
2 1612339 2019-01-01 18055 ... BRAND_G 12 747000
3 1612339 2019-01-01 18055 ... BRAND_B 12 450000
4 1612339 2019-01-01 18055 ... BRAND_G 3 1500000
5 1612339 2019-01-01 18055 ... BRAND_V 3 2095000
6 1612339 2019-01-01 18055 ... BRAND_H 3 2095000
7 1612339 2019-01-01 18055 ... BRAND_S 3 1745000
8 1612339 2019-01-01 18055 ... BRAND_F 6 1045000
9 1612339 2019-01-01 18055 ... BRAND_P 6 1045000

[10 rows x 9 columns]


Dataframe dengan index baru:
order_id order_date customer_id ... brand quantity
item_price
Pesanan ke-1 1612339 2019-01-01 18055 ... BRAND_C 4 1934000
Pesanan ke-2 1612339 2019-01-01 18055 ... BRAND_V 8 604000
Pesanan ke-3 1612339 2019-01-01 18055 ... BRAND_G 12 747000
Pesanan ke-4 1612339 2019-01-01 18055 ... BRAND_B 12 450000
Pesanan ke-5 1612339 2019-01-01 18055 ... BRAND_G 3 1500000
Pesanan ke-6 1612339 2019-01-01 18055 ... BRAND_V 3 2095000
Pesanan ke-7 1612339 2019-01-01 18055 ... BRAND_H 3 2095000
Pesanan ke-8 1612339 2019-01-01 18055 ... BRAND_S 3 1745000
Pesanan ke-9 1612339 2019-01-01 18055 ... BRAND_F 6 1045000
Pesanan ke-10 1612339 2019-01-01 18055 ... BRAND_P 6 1045000

[10 rows x 9 columns]

Indexing - Part 5

Jika file yang akan dibaca melalu penggunaan library pandas dapat dipreview terlebih dahulu
struktur datanya maka melalui fungsi yang ditujukan untuk membaca file dapat diset mana
kolom yang akan dijadikan index.
 
Fitur ini telah dimiliki oleh setiap fungsi yang digunakan dalam membaca data dengan
pandas, yaitu penggunaan argumen index_col pada fungsi yang dimaksud. Untuk jelasnya
dapat diperhatikan pada kode berikut ini.
 
Dari dataset sample_csv.csv, sample_tsv.tsv, atau sample_excel.xlsx sudah tahu bahwa
kolom dataset adalah 'order_id'; 'order_date'; 'customer_id'; 'city'; 'province'; 'product_id';
'brand'; 'quantity'; and 'item_price'. Sehingga kode di atas digunakan langsung kolom
'order_date' pada saat membaca filenya.

Jika dijalankan dengan mengklik tombol   maka akan menghasilkan output berikut
di console

Terlihat bahwa kolom order_date sudah jadi index, dan tentunya jumlah kolom dataframe
berkurang satu, yaitu menjadi delapan kolom.
 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai.  
Baca kembali file TSV "sample_tsv.tsv" dan set lah kolom "order_date" dan "order_id"
sebagai index_col-nya dan cetaklah dataframe untuk delapan baris pertama. 
Notes : 
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv
Jika berhasil dijalankan kodenya maka akan tampil hasil berikut:
 
Code:
import pandas as pd
# Baca file sample_tsv.tsv dan set lah index_col sesuai instruksi
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_tsv.tsv", sep="\t",
index_col=["order_date","order_id" ])
# Cetak data frame untuk 8 data teratas
print("Dataframe:\n", df.head(8))

Output:

In [1]: import pandas as pd


# Baca file sample_tsv.tsv dan set lah index_col sesuai instruksi
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_tsv.tsv", sep="\t", index_col=["order_date","order_id" ])
# Cetak data frame untuk 8 data teratas
print("Dataframe:\n", df.head(8))

Dataframe:
customer_id city ... quantity item_price
order_date order_id ...
2019-01-01 1612339 18055 Jakarta Selatan ... 4 1934000
1612339 18055 Jakarta Selatan ... 8 604000
1612339 18055 Jakarta Selatan ... 12 747000
1612339 18055 Jakarta Selatan ... 12 450000
1612339 18055 Jakarta Selatan ... 3 1500000
1612339 18055 Jakarta Selatan ... 3 2095000
1612339 18055 Jakarta Selatan ... 3 2095000
1612339 18055 Jakarta Selatan ... 3 1745000

[8 rows x 7 columns]
Slicing
Slicing - Part 1
Seperti artinya slicing adalah cara untuk melakukan filter ke dataframe/series berdasarkan
kriteria tertentu dari nilai kolomnya ataupun kriteria index-nya.
Terdapat 2 cara paling terkenal untuk slicing dataframe, yaitu dengan menggunakan
method .loc dan .iloc pada variabel bertipe pandas DataFrame/Series. Method .iloc ditujukan
untuk proses slicing berdasarkan index berupa nilai integer tertentu. Akan tetapi akan lebih
sering menggunakan dengan method .loc karena lebih fleksibel. 
 
Mari ikuti ilustrasi berikut ini.
Dataset belum dilakukan indexing, jadi slicing berdasarkan nilai kolomnya. Untuk itu
"sample_csv.csv" dibaca kembali dan dipraktikkan metode .loc[] dengan mengambil tanggal
1 Januari 2019 dari kolom order_date dan product_id nya adalah P2154 dan P2556.

Jika kode di atas dijalankan dengan menekan   diperoleh

 
Tugas praktek:
Pada code editor dapat dilihat kode-kode yang tidak lengkap. Tugas sekarang adalah
mengganti tanda _ _ _ di code editor dengan yang sesuai.  
Baca kembali file TSV "sample_csv.csv" dan slice/filter-lah dataset jika customer_id adalah
18055 dan product_id-nya yaitu P0029, P0040, P0041, P0116, dan P0117. 
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_csv.csv
Jika berhasil dijalankan kodenya maka akan tampil hasil berikut:
 
Code:
import pandas as pd
# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_csv.csv")
# Slice langsung berdasarkan kolom
df_slice = df.loc[(df["customer_id"] == 18055) &
(df["product_id"].isin(["P0029", "P0040", "P0041", "P0116","P0117"]))
]
print("Slice langsung berdasarkan kolom:\n", df_slice)

Output:

In [1]: import pandas as pd


# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv")
# Slice langsung berdasarkan kolom
df_slice = df.loc[(df["customer_id"] == “18055”) &

(df["product_id"].isin(["P0029","P0040","P0041","P0116","P0117"]))
]
print("Slice langsung berdasarkan kolom:\n", df_slice)

Slice langsung berdasarkan kolom:


Empty DataFrame
Columns: [order_id, order_date, customer_id, city, province, product_id, brand,
quantity, item_price]
Index: []

 
Slicing - Part 2

Dalam sub bab sebelumnya telah mempelajari bagaimana menslicing/filtering dataset dengan
menggunakan method .loc pada kolom dataset.
Sekarang, menerapkan berdasarkan index. Tentu syaratnya adalah dataset sudah dilakukan
indexing terlebih dahulu melalui penerapan method .set_index 
 
Cara 1: Gunakan method .loc seperti yang dicontohkan berikut
Output cara 1:

 
Cara 2: Gunakan pd.IndexSlice sebagai varaibel untuk melakukan slicing index

Output cara 2:

 
Tugas praktek:
Pada code editor dapat terlihat kode-kode yang tidak lengkap. Tugas kamu adalah mengganti
tanda _ _ _ di code editor dengan yang sesuai.  
Baca kembali file TSV "sample_csv.csv" dan set terlebih dahulu indexnya yaitu order_date,
order_id, dan product_id. Kemudian slice/filter-lah dataset jika order_date adalah 2019-01-
01, order_id adalah 1612339 dan product_id-nya yaitu P2154 dan P2159. Gunakanlah cara
pertama.
Notes :
Dataset :  https://storage.googleapis.com/dqlab-dataset/sample_csv.csv
Jika berhasil dijalankan kodenya maka akan tampil hasil berikut:
 
Code:
import pandas as pd
# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_csv.csv")
# Set index dari df sesuai instruksi
df = df.set_index(["order_date","order_id","product_id"])
# Slice sesuai intruksi
df_slice = df.loc[("2019-01-01",1612339,["P2154","P2159"]),:]
print("Slice df:\n", df_slice)

Output:

In [1]: import pandas as pd


# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv")
# Set index dari df sesuai instruksi
df = df.set_index(["order_date","order_id","product_id"])
# Slice sesuai intruksi
df_slice = df.loc[("2019-01-01",1612339,["P2154","P2159"]),:]
print("Slice df:\n", df_slice)

Slice df:
customer_id ... item_price
order_date order_id product_id ...
2019-01-01 1612339 P2154 18055 ... 1745000
P2159 18055 ... 310000

[2 rows x 6 columns] 

Transforming
Transforming - Part 1
Transform adalah ketika mengubah dataset yang ada menjadi entitas baru, dapat dilakukan
dengan

 konversi dari satu data type ke data type yang lain,


 transpose dataframe
 atau yang lainnya.

Hal yang biasa dilakukan pertama kali setelah data dibaca adalah mengecek tipe data di setiap
kolomnya apakah sesuai dengan representasinya. Untuk itu dapat menggunakan attribut
.dtypes pada dataframe yang telah kita baca tadi,

[nama_dataframe].dtypes

 
Untuk konversi tipe data, secara default system akan mendeteksi data yang tidak bisa di
render as date type or numeric type sebagai object yang basically string. Tidak bisa di render
oleh system ini karena berbagai hal, mungkin karena formatnya asing dan tidak dikenali oleh
python secara umum (misal: date type data → '2019Jan01').
Data contoh tersebut tidak bisa di render karena bulannya Jan tidak bisa di translate menjadi
in form of number (00-12) dan tidak ada ‘-’ di antara tahun, bulan dan harinya. Jika seluruh
data pada kolom di order_date sudah tertulis dalam bentuk 'YYYY-MM-DD' maka ketika
dibaca, kolom order_date sudah langsung dinyatakan bertipe data datetime.
Untuk merubah kolom date_order yang sebelumnya bertipe object menjadi kolom bertipe
datetime, cara pertama yang dapat dilakukan adalah menggunakan

pd.to_datetime(argumen)

dengan argumen adalah isi kolom dari dataframe yang akan dirubah tipe datanya, misal
dalam format umum

nama_dataframe["nama_kolom"]

Sehingga lengkapnya dapat ditulis sebagai

nama_dataframe["nama_kolom"] = pd.to_datetime(nama_dataframe["nama_kolom"])

 
Tugas praktek:
Ubahlah tipe data di kolom order_date yang semula bertipe objek menjadi bertipe datetime.
Di code editor telah disediakan kode yang tidak lengkap, silakan diisi sesuai dengan instruksi
yang diberikan. 
Jika dengan benar dituliskan dan berhasil dijalankan maka output berikut yang akan diperoleh
pada console.
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_csv.csv
 
Code:

import pandas as pd

# Baca file sample_csv.csv

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_csv.csv")

# Tampilkan tipe data

print("Tipe data df:\n", df.dtypes)

# Ubah tipe data kolom order_date menjadi datetime

df["order_date"] = pd.to_datetime(df["order_date"])

# Tampilkan tipe data df setelah transformasi

print("\nTipe data df setelah transformasi:\n", df.dtypes)

Output:

In [1]: import pandas as pd


# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv")
# Tampilkan tipe data
print("Tipe data df:\n", df.dtypes)
# Ubah tipe data kolom order_date menjadi datetime
df["order_date"] = pd.to_datetime(df["order_date"])
# Tampilkan tipe data df setelah transformasi
print("\nTipe data df setelah transformasi:\n", df.dtypes)

Tipe data df:


order_id int64
order_date object
customer_id int64
city object
province object
product_id object
brand object
quantity int64
item_price int64
dtype: object

Tipe data df setelah transformasi:


order_id int64
order_date datetime64[ns]
customer_id int64
city object
province object
product_id object
brand object
quantity int64
item_price int64
dtype: object

Transforming - Part 2

Pada sub bab ini akan mengubah tipe data pada kolom dataframe yang telah dibaca menjadi
tipe data float (kolom quantity) dan tipe categori (kolom city).
Secara umum, untuk merubah ke numerik dapat menggunakan pd.to_numeric(), yaitu

nama_dataframe["nama_kolom"] = pd.to_numeric(nama_dataframe["nama_kolom"],
downcast="tipe_data_baru")

Sedangkan untuk menjadi suatu kolom yang dapat dinyatakan sebagai kategory dapat
menggunakan method .astype() pada dataframe, yaitu

nama_dataframe["nama_kolom"] = nama_dataframe["nama_kolom"].astype("category")

 
Tugas Praktek:
Ubahlah tipe data di kolom
 quantity yang semula bertipe int64 menjadi bertipe float32, dan
 city yang semula bertipe object menjadi bertipe category

Di code editor telah disediakan kode yang tidak lengkap, silakan diisi sesuai dengan instruksi
yang diberikan. 
Jika dengan benar dituliskan dan berhasil dijalankan maka output berikut yang akan kamu
peroleh di console.
Notes : 
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_csv.csv

 
Code:

import pandas as pd

# Baca file sample_csv.csv

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_csv.csv")

# Tampilkan tipe data

print("Tipe data df:\n", df.dtypes)

# Ubah tipe data kolom quantity menjadi tipe data numerik float

df["Quantity"] = pd.to_numeric(df["Quantity"], downcast="float")


# Ubah tipe data kolom city menjadi tipe data category

df["city"] = df["city"].astype("category")

# Tampilkan tipe data df setelah transformasi

print("\nTipe data df setelah transformasi:\n", df.dtypes)

Ouput:

In [1]: import pandas as pd


# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv")
# Tampilkan tipe data
print("Tipe data df:\n", df.dtypes)
# Ubah tipe data kolom quantity menjadi tipe data numerik float
df["quantity"] = pd.to_numeric(df["quantity"], downcast="float")
# Ubah tipe data kolom city menjadi tipe data category
df["city"] = df["city"].astype("category")
# Tampilkan tipe data df setelah transformasi
print("\nTipe data df setelah transformasi:\n", df.dtypes)

Tipe data df:


order_id int64
order_date object
customer_id int64
city object
province object
product_id object
brand object
quantity int64
item_price int64
dtype: object

Tipe data df setelah transformasi:


order_id int64
order_date object
customer_id int64
city category
province object
product_id object
brand object
quantity float32
item_price int64
dtype: object

Transforming - Part 3

Sekarang akan mempelajari teknik/cara berikutnya dalam proses transformasi suatu


dataframe. Di sub bab ini akan memakai method .apply() dan .map() pada suatu dataframe.
 
Method .apply() digunakan untuk menerapkan suatu fungsi python (yang dibuat dengan def
atau anonymous dengan lambda) pada dataframe/series atau hanya kolom tertentu dari
dataframe. 
Berikut ini adalah contohnya yaitu akan merubah setiap baris pada kolom brand menjadi
lowercase.  

Jika dijalankan maka akan menghasilkan

 
Method .map() hanya dapat diterapkan pada series atau dataframe yang diakses satu kolom
saja. Method ini digunakan untuk mensubstitusikan suatu nilai ke dalam tiap baris datanya.
Mari lihat contoh yang diberikan berikut ini yang mana akan ambil huruf terakhir dari brand
Jika dijalankan maka akan menghasilkan

 
Tugas praktek:
Kerjakanlah seperti yang diinstruksikan melalui code editor dan di code editor juga telah
disediakan kode yang tidak lengkap, silakan diisi dengan yang seharusnya. Apa yang telah
dicontohkan dapat dijadikan referensi.

Jika kode nya tidak ada yang salah dan dijalankan dengan tombol   maka akan
memperoleh hasil berikut di console.
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/sample_csv.csv
 
Code:

import pandas as pd

# Baca file sample_csv.csv

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/sample_csv.csv")

# Cetak 5 baris teratas kolom brand

print("Kolom brand awal:\n", df["brand"].head())

# Gunakan method apply untuk merubah isi kolom menjadi lower case

df["brand"] = df["brand"].apply(lambda x: x.lower())

# Cetak 5 baris teratas kolom brand

print("Kolom brand setelah apply:\n", df["brand"].head)

# Gunakan method map untuk mengambil kode brand yaitu karakter terakhirnya

df["brand"] = df["brand"].map(lambda x: x[-1])

# Cetak 5 baris teratas kolom brand

print("Kolom brand setelah map:\n", df["brand"].head())

Output:

In [1]: import pandas as pd


# Baca file sample_csv.csv
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/sample_csv.csv")
# Cetak 5 baris teratas kolom brand
print("Kolom brand awal:\n", df["brand"].head())
# Gunakan method apply untuk merubah isi kolom menjadi lower case
df["brand"] = df["brand"].apply(lambda x: x.lower())
# Cetak 5 baris teratas kolom brand
print("Kolom brand setelah apply:\n", df["brand"].head())
# Gunakan method map untuk mengambil kode brand yaitu karakter terakhirnya
df["brand"] = df["brand"].map(lambda x: x[-1])
# Cetak 5 baris teratas kolom brand
print("Kolom brand setelah map:\n", df["brand"].head())

Kolom brand awal:


0 BRAND_C
1 BRAND_V
2 BRAND_G
3 BRAND_B
4 BRAND_G
Name: brand, dtype: object
Kolom brand setelah apply:
0 brand_c
1 brand_v
2 brand_g
3 brand_b
4 brand_g
Name: brand, dtype: object
Kolom brand setelah map:
0 c
1 v
2 g
3 b
4 g
Name: brand, dtype: object

Transforming - Part 4

Di sub bab sebelumnya sudah mengetahui bahwa map hanya dapat digunakan untuk pandas
series. Pada sub bab ini akan menggunakan method .applymap pada dataframe.
 
Untuk itu perhatikan contoh berikut:
Cara 1 dengan tanpa define function awalnya, langsung pake fungsi anonymous lambda x

Cara 2 dengan define function

Setelah dijalankan dengan menekan tombol   maka diperoleh output berikut di


console

Cara 1 dan cara 2 menunjukkan bahwa keduanya menhasilkan dataframe yang sama.
 
Tugas Praktek:
Dengan cara yang sama seperti diatas buatlah matriks random ukuran 3 x 4 dengan seed
randomnya 1234. Kemudian gunakan kedua cara seperti di atas untuk merubah seluruh isi
dengan fungsi kuadrat x**2 + 3*x + 2.

Jika kode dengan benar ditulis dan kemudian dijalankan dengan menekan tombol   
diperoleh output berikut:

 
Code:

import numpy as np

import pandas as pd

# number generator, set angka seed menjadi suatu angka, bisa semua angka, supaya hasil random
nya selalu sama ketika kita run

np.random.seed(1234)

# create dataframe 3 baris dan 4 kolom dengan angka random

df_tr = pd.DataFrame(np.random.rand(3,4))

# Cetak dataframe

print("Dataframe:\n", df_tr)

# Cara 1 dengan tanpa define function awalnya, langsung pake fungsi anonymous lambda x

df_tr1 = df_tr.applymap(lambda x: x**2+3*x+2)

print("\nDataframe - cara 1:\n", df_tr1)

# Cara 2 dengan define function

def qudratic_fun(x):

return x**2+3*x+2
df_tr2 = df_tr.applymap(qudratic_fun)

print("\nDataframe - cara 2:\n", df_tr2)

Ouput :

In [1]: import numpy as np


import pandas as pd
# number generator, set angka seed menjadi suatu angka, bisa semua angka,
supaya hasil random nya selalu sama ketika kita run
np.random.seed(1234)
# create dataframe 3 baris dan 4 kolom dengan angka random
df_tr = pd.DataFrame(np.random.rand(3,4))
# Cetak dataframe
print("Dataframe:\n", df_tr)
# Cara 1 dengan tanpa define function awalnya, langsung pake fungsi
anonymous lambda x
df_tr1 = df_tr.applymap(lambda x: x**2+3*x+2)
print("\nDataframe - cara 1:\n", df_tr1)
# Cara 2 dengan define function
def qudratic_fun(x):
return x**2+3*x+2
df_tr2 = df_tr.applymap(qudratic_fun)
print("\nDataframe - cara 2:\n", df_tr2)

Dataframe:
0 1 2 3
0 0.191519 0.622109 0.437728 0.785359
1 0.779976 0.272593 0.276464 0.801872
2 0.958139 0.875933 0.357817 0.500995

Dataframe - cara 1:
0 1 2 3
0 2.611238 4.253346 3.504789 4.972864
1 4.948290 2.892085 2.905825 5.048616
2 5.792449 5.395056 3.201485 3.753981

Dataframe - cara 2:
0 1 2 3
0 2.611238 4.253346 3.504789 4.972864
1 4.948290 2.892085 2.905825 5.048616
2 5.792449 5.395056 3.201485 3.753981

Handling Missing Values

Pendahuluan

“Aksara, saya barusan kirim email lagi ya berisi link seputar handling missing values untuk
Pandas. Kamu bisa belajar lebih lengkap di sana bersama isi modul.”
 
“Siap!”
 
Tanpa menunggu lagi, aku mengecek link yang diberikan Andra:
https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html

Inspeksi Missing Value

Value yang hilang/tidak lengkap dari dataframe akan membuat analisis atau model prediksi
yang dibuat menjadi tidak akurat dan mengakibatkan keputusan salah yang diambil. Terdapat
beberapa cara untuk mengatasi data yang hilang/tidak lengkap tersebut.
 
Data COVID-19 yang akan digunakan ini diambil dari google big query, tetapi sudah
disediakan datasetnya dalam format csv dengan nama "public data covid19 jhu csse eu.csv".
Ini adalah studi kasus untuk meng-handle missing value. Bagaimanakah langkah-
langkahnya?
Di pandas data yang hilang umumnya direpresentasikan dengan NaN.
 
Langkah pertama, harus tahu kolom mana yang terdapat data hilang dan berapa banyak
dengan cara:
Cara 1: menerapkan method .info() pada dataframe yang dapat diikuti dari kode berikut ini
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-
%20missing%20value%20-%20public%20data%20covid19%20.csv

Output baris kode kelima:


 
Cara 2: mengetahui berapa banyak nilai hilang dari tiap kolom di dataset tersebut dengan
menerapkan chaining method pada dataframe yaitu .isna().sum(). Method .isna() digunakan
untuk mengecek berapa data yang bernilai NaN dan .sum() menjumlahkannya secara default
untuk masing-masing kolom dataframe.
Perhatikanlah kode berikut

Output untuk baris kode ketujuh dan kedelapan:


Seperti kedua output di atas, artinya ada beberapa kolom yang ada null sebagian dan ada yang
nilainya null semua untuk kolomnya.
 
Tugas Praktek:
Ketikkanlah kembali statement seperti yang ditunjukkan dalam kedua cara untuk mendeteksi
missing value pada dataframe dengan mengsisi tanda _ _ _ di code editor.

Jika dijalankan dengan menekan tombol   maka akan diperoleh kedua output di atas
di bagian console.

Code:

import pandas as pd

# Baca file "public data covid19 jhu csse eu.csv"

df = pd.read-csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-%20missing
%20value%20-%20public%20data%20covid19%20.csv")

# Cetak info dari df

print(df.info())

# Cetak jumlah missing value di setiap kolom

mv = df.isna().sum()

print("\nJumlah missing value per kolom:\n", mv)

Output:
In [1]: import pandas as pd
# Baca file "public data covid19 jhu csse eu.csv"
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER
%204%20-%20missing%20value%20-%20public%20data%20covid19%20.csv")
# Cetak info dari df
print(df.info())
# Cetak jumlah missing value di setiap kolom
mv = df.isna().sum()
print("\nJumlah missing value per kolom:\n", mv)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 13 columns):
province_state 960 non-null object
country_region 1000 non-null object
date 1000 non-null object
latitude 874 non-null float64
longitude 874 non-null float64
location_geom 874 non-null object
confirmed 1000 non-null int64
deaths 999 non-null float64
recovered 999 non-null float64
active 949 non-null float64
fips 949 non-null float64
admin2 842 non-null object
combined_key 0 non-null float64
dtypes: float64(7), int64(1), object(5)
memory usage: 101.6+ KB
None

Jumlah missing value per kolom:


province_state 40
country_region 0
date 0
latitude 126
longitude 126
location_geom 126
confirmed 0
deaths 1
recovered 1
active 51
fips 51
admin2 158
combined_key 1000
dtype: int64

Treatment untuk Missing Value - Part 1

Terdapat beberapa cara untuk mengatasi missing value, antara lain:

1. dibiarkan saja,
2. hapus value itu, atau
3. isi value tersebut dengan value yang lain (biasanya interpolasi, mean, median,
etc)

 
Sebelum melakukan action ke missing value pada data covid diatas, sebaiknya tampilkan
beberapa row teratas dari dataset itu

dan dilihat kembali jumlah missing value tiap kolomnya

agar dapat ditelaah terlebih dahulu.


 
Hanya kolom combine_key yang keseluruhan barisnya adalah missing value (1000 buah),
sementara kolom country_region, date, dan confirmed tidak memiliki missing value. Untuk
kolom lainnya terdapat beragam jumlah missing value. Apa yang dapat dilakukan?
Untuk memahami mana kolom yang akan ditreatment dengan tiga perlakukan di atas lihat
nature dari data terlebih dahulu. Contohnya pada kolom death dan recovered jika ada yang
missing value maka kemungkinan terbesarnya adalah tidak ada meninggal atau sembuh pada
hari tersebut. 
Untuk kolom yang seluruhnya missing yaitu combined_key dapat dibuang saja satu kolom itu
karena tidak ada data yang dapat diketahui dari kolom tersebut.
Sementara, kolom yang lainnya bagaimana? Misal ambil kolom province_stat, missing
valuenya dapat terjadi bahwa tidak dilaporkan itu berasal dari daerah mana di negara itu.
Dapat mengisi misal dengan string 'unknown' karena tahu kolom tersebut bertipe data string.

Treatment untuk Missing Value - Part 2

Sekarang dapat menerapkan dua aksi yaitu

1. Membiarkannya saja
2. Mengahapus kolom

 
Treatment pertama (membiarkannya saja) seperti pada kolom confirmed, death, dan
recovered. Akan tetapi jika tidak ada yang terkonfirmasi, meninggal dan sembuh sebenarnya
dapat menukar value ini dengan angka nol. Meskipun ini lebih make sense dalam representasi
datanya, tetapi untuk sub bab ini ketiga kolom tersebut diasumsikan dibiarkan memiliki nilai
missing value.
 
Treatment kedua yaitu dengan menghapus kolom, yang mana ini digunakan jika seluruh
kolom dari dataset yang dipunyai semua barisnya adalah missing value. Untuk itu dapat
menerapkan method .dropna() pada dataframe, bagaimana caranya?

nama_dataframe.dropna(axis=1, how="all")

Pada method .dropna() ada dua keyword argumen yang harus diisikan yaitu axis dan how.
Keyword axis digunakan untuk menentukan arah dataframe yang akan dibuang angka 1 untuk
menyatakan kolom (column-based) atau dapat ditulis dalam string "column". Jika digunakan
angka 0 berarti itu dalam searah index (row-based) atau dapat ditulis dalam string "index".
Sementara, keyword how digunakan untuk bagaimana cara membuangnya. Opsi yang dapat
diterimanya (dalam string) adalah

  "all" artinya jika seluruh data di satu/beberapa kolom atau di satu/beberapa baris
adalah missing value.
 "any" artinya jika memiliki 1 saja data yang hilang maka buanglah baris/kolom
tersebut.

 
Tugas Praktek:

1. Cetaklah ukuran awal dari dataframe dengan attribut .shape pada dataframe yang telah
dibaca.
2. Buanglah kolom jika memiliki seluruh data adalah missing value, kemudian cetaklah
ukurannya.
3. Dari dataframe hasil langkah kedua buanglah baris-baris yang setidaknya memilki
satu saja missing value, dan cetak kembali ukurannya.

Jika berhasil akan ditampilkan outputnya sebagai berikut

 
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-
%20missing%20value%20-%20public%20data%20covid19%20.csv
 
Code:

import pandas as pd

# Baca file "public data covid19 jhu csse eu.csv"

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-%20missing
%20value%20-%20public%20data%20covid19%20.csv")

# Cetak ukuran awal dataframe

print("Ukuran awal df: %d baris, %d kolom." % df.shape)

# Drop kolom yang seluruhnya missing value dan cetak ukurannya

df = df.dropna(axis=1, how="all")

print("Ukuran df setelah buang kolom dengan seluruh data missing: %d baris, %d kolom." %
df.shape)

# Drop baris jika ada satu saja data yang missing dan cetak ukurannya

df = df.dropna(axis=0, how="any")

print("Ukuran df setelah dibuang baris yang memiliki sekurangnya 1 missing value: %d baris, %d
kolom." % df.shape)

Output:

In [1]: import pandas as pd


# Baca file "public data covid19 jhu csse eu.csv"
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER
%204%20-%20missing%20value%20-%20public%20data%20covid19%20.csv")
# Cetak ukuran awal dataframe
print("Ukuran awal df: %d baris, %d kolom." % df.shape)
# Drop kolom yang seluruhnya missing value dan cetak ukurannya
df = df.dropna(axis=1, how="all")
print("Ukuran df setelah buang kolom dengan seluruh data missing: %d
baris, %d kolom." % df.shape)
# Drop baris jika ada satu saja data yang missing dan cetak ukurannya
df = df.dropna(axis=0, how="any")
print("Ukuran df setelah dibuang baris yang memiliki sekurangnya 1 missing
value: %d baris, %d kolom." % df.shape)

Ukuran awal df: 1000 baris, 13 kolom.


Ukuran df setelah buang kolom dengan seluruh data missing: 1000 baris, 12 kolom.
Ukuran df setelah dibuang baris yang memiliki sekurangnya 1 missing value: 746
baris, 12 kolom. 

Treatment untuk Missing Value - Part 3

Sekarang, akan melakukan treatment ketiga untuk menghandle missing value pada dataframe.
Treatment ini dilakukan dengan cara mengisi missing value dengan nilai lain, yang dapat
berupa :

 nilai statistik seperti mean atau median


 interpolasi data
 text tertentu

 
Akan mulai pada kolom yang missing yang tipe datanya adalah berupa object. Kolom
tersebut adalah province_state, karena tidak tahu secara persis province_state mana yang
dimaksud, bisa menempatkan string "unknown" sebagai substitusi missing value. Meskipun
keduanya berarti sama-sama tidak tahu tetapi berbeda dalam representasi datanya.
Untuk melakukan hal demikian dapat menggunakan method .fillna() pada kolom dataframe
yang dimaksud. Perhatikan kode berikut

Jika dijalankan akan menghasilkan output berikut di console


Terlihat bahwa unique value di kolom "province_state" yang semula ada nan telah berubah
menjadi "unknown". 
 
Tugas Praktek:
Lakukanlah dengan cara yang sama dengan yang telah dicontohkan di atas, tetapi isilah
missing value dengan string "unknown_province_state".

Jika dituliskan dengan benar dan dijalankan dengan   maka output di console berikut
akan diperoleh. 
Notes :
Dataset : https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-
%20missing%20value%20-%20public%20data%20covid19%20.csv

 
Code:

import pandas as pd

# Baca file "public data covid19 jhu csse eu.csv"

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-%20missing
%20value%20-%20public%20data%20covid19%20.csv")

# Cetak unique value pada kolom province_state

print("Unique value awal:\n", df["province_state"].unique())

# Ganti missing value dengan string "unknown_province_state"

df["province_state"] = df["province_state"].fillna("unknown_province_state")

# Cetak kembali unique value pada kolom province_state

print("Unique value setelah fillna:\n", df["province_state"].unique())

Output:
In [1]: import pandas as pd
# Baca file "public data covid19 jhu csse eu.csv"
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER
%204%20-%20missing%20value%20-%20public%20data%20covid19%20.csv")
# Cetak unique value pada kolom province_state
print("Unique value awal:\n", df["province_state"].unique())
# Ganti missing value dengan string "unknown_province_state"
df["province_state"] =
df["province_state"].fillna("unknown_province_state")
# Cetak kembali unique value pada kolom province_state
print("Unique value setelah fillna:\n", df["province_state"].unique())

Unique value awal:


[nan 'US' 'Guam' 'Iowa']
Unique value setelah fillna:
['unknown_province_state' 'US' 'Guam' 'Iowa']

Treatment untuk Missing Value - Part 4

Masih melanjutkan bagaimana menghandle missing value tentunya dengan jalan mengganti
missing value dengan nilai lainnya. Pada bab sebelumnya telah mengganti kolom bertipe
objek dengan sesuatu string/teks.
Dalam sub bab ini akan mengganti missing value dengan nilai statistik kolom bersangkutan,
baik median atau mean (nilai rata-rata). Misalnya akan menggunakan kolom active. Dengan
mengabaikan terlebih dahulu sebaran berdasarkan negara (univariate), jika mengisi dengan
nilai rata-rata maka harus melihat terlebih dahulu data apakah memiliki ouliers atau tidak.
Jika ada outliers dari data maka menggunakan nilai tengah (median) data adalah cara yang
lebih safe.
Untuk itu diputuskan dengan mengecek nilai median dan nilai mean kolom active juga nilai
min dan max-nya. Jika data pada kolom active terdistribusi normal maka nilai mean dan
median akan hampir sama.

Terlihat data memiliki distribusi yang skewness, karena nilai mean dan median yang cukup
jauh serta range data yang cukup lebar. Di sini pada kolom active data memiliki outliers. Jadi
akan mengisi missing value dengan median.
 

Jika dijalankan dengan menekan tombol   diperoleh output:

 
Tugas Praktek:
Carilah perbedaan nilai mean dan median kolom active untuk kondisi sebelum dan setelah
missing valuenya diisi masing-masingnya dengan median dan mean.
Jika berjalan lancar maka akan diperoleh hasil seperti berikut ini di console:

 
Notes :
dataset : https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-%20missing
%20value%20-%20public%20data%20covid19%20.csv

Code:

import pandas as pd

# Baca file "https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-%20missing%20value


%20-%20public%20data%20covid19%20.csv"

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-%20missing
%20value%20-%20public%20data%20covid19%20.csv")

# Cetak nilai mean dan median awal

print("Awal: mean = %f, median = %f." % (df["active"].mean(),df["active"].median()))

# Isi missing value kolom active dengan median


df_median = df["active"].fillna(df["active"].median())

# Cetak nilai mean dan median awal setelah diisi dengan median

print("Fillna median: mean = %f, median = %f." % (df_median.mean(), df_median.median()))

# Isi missing value kolom active dengan mean

df_mean = df["active"].fillna(df["active"].mean())

# Cetak nilai mean dan median awal setelah diisi dengan mean

print("Fillna mean: mean = %f, median = %f." % (df_mean.mean(), df_mean.median()))

Output:

In [1]: import pandas as pd


# Baca file "https://storage.googleapis.com/dqlab-dataset/CHAPTER%204%20-
%20missing%20value%20-%20public%20data%20covid19%20.csv"
df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/CHAPTER
%204%20-%20missing%20value%20-%20public%20data%20covid19%20.csv")
# Cetak nilai mean dan median awal
print("Awal: mean = %f, median = %f." %
(df["active"].mean(),df["active"].median()))
# Isi missing value kolom active dengan median
df_median = df["active"].fillna(df["active"].median())
# Cetak nilai mean dan median awal setelah diisi dengan median
print("Fillna median: mean = %f, median = %f." % (df_median.mean(),
df_median.median()))
# Isi missing value kolom active dengan mean
df_mean = df["active"].fillna(df["active"].mean())
# Cetak nilai mean dan median awal setelah diisi dengan mean
print("Fillna mean: mean = %f, median = %f." % (df_mean.mean(),
df_mean.median()))

Awal: mean = 192.571128, median = 41.000000.


Fillna median: mean = 184.841000, median = 41.000000.
Fillna mean: mean = 192.571128, median = 49.000000. 

Treatment untuk Missing Value - Part 5

Di bagian ini akan menggunakan teknik interpolasi dalam mengisi nilai missing value pada
suatu dataset.
Data yang menggunakan interpolasi untuk mengisi data yang hilang adalah time series data,
yang secara default akan diisi dengan interpolasi linear.
Perhatikan kode berikut:
Jika dijalankan akan menghasilkan
 
Tugas praktek:
Kerjakan kembali seperti contoh kode di atas dengan hasil output seperti yang ditujukkan
berikut ini: 
 
Code:

import numpy as np

import pandas as pd

# Data

ts = pd.Series({

"2020-01-01":9,

"2020-01-02":np.nan,

"2020-01-05":np.nan,

"2020-01-07":24,

"2020-01-10":np.nan,

"2020-01-12":np.nan,

"2020-01-15":33,

"2020-01-17":np.nan,

"2020-01-16":40,

"2020-01-20":45,

"2020-01-22":52,

"2020-01-25":75,

"2020-01-28":np.nan,

"2020-01-30":np.nan

})
# Isi missing value menggunakan interpolasi linier

ts = ts.interpolate()

# Cetak time series setelah interpolasi linier

print("Setelah diisi missing valuenya:\n", ts)

Output:

In [1]: import numpy as np


import pandas as pd
# Data
ts = pd.Series({
"2020-01-01":9,
"2020-01-02":np.nan,
"2020-01-05":np.nan,
"2020-01-07":24,
"2020-01-10":np.nan,
"2020-01-12":np.nan,
"2020-01-15":33,
"2020-01-17":np.nan,
"2020-01-16":40,
"2020-01-20":45,
"2020-01-22":52,
"2020-01-25":75,
"2020-01-28":np.nan,
"2020-01-30":np.nan
})
# Isi missing value menggunakan interpolasi linier
ts = ts.interpolate()
# Cetak time series setelah interpolasi linier
print("Setelah diisi missing valuenya:\n", ts)

Setelah diisi missing valuenya:


2020-01-01 9.0
2020-01-02 14.0
2020-01-05 19.0
2020-01-07 24.0
2020-01-10 27.0
2020-01-12 30.0
2020-01-15 33.0
2020-01-16 40.0
2020-01-17 42.5
2020-01-20 45.0
2020-01-22 52.0
2020-01-25 75.0
2020-01-28 75.0
2020-01-30 75.0
dtype: float64
Mini Project

Project dari Andra

Berikut adalah isi email yang ditugaskan oleh Andra:


 
Diberikan dataset ‘retail_raw_test.csv’

1. Baca dataset
2. Tipe data diubah menjadi tipe yang seharusnya
o customer_id dari string ke int64,
o quantity dari string ke int64,
o item_price dari string ke int64

3. transform product_value supaya bentuknya seragam dengan format PXXXX, assign


ke kolom baru "product_id", dan drop kolom "product_value", jika terdapat nan
gantilah dengan "unknown".
4. tranform order_date menjadi value dengan format YYYY-mm-dd
5. cek data hilang dari tiap kolom dan kemudian isi missing value
o di brand dengan "no_brand", dan
o cek dulu bagaimana missing value di city & province - isi missing value di
city dan province dengan "unknown"

6. create column city/province dari gabungan city & province


7. membuat index berdasarkan city_provice, order_date, customer_id, order_id,
product_id (cek index)
8. membuat kolom "total_price" sebagai hasil perkalian quantity dengan item_price
9. slice data hanya untuk Jan 2019

Notes :
Dataset :  https://storage.googleapis.com/dqlab-dataset/retail_raw_test.csv
Preview akhir data:
 
Code:

import pandas as pd

# 1. Baca dataset

print("[1] BACA DATASET")

df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/retail_raw_test.csv",
low_memory=False)

print(" Dataset:\n", df.head())

print(" Info:\n", df.info())

# 2. Ubah tipe data

print("\n[2] UBAH TIPE DATA")

df["customer_id"] = df["customer_id"].apply(lambda x: x.split("'")[1]).astype("int64")

df["quantity"] = df["quantity"].apply(lambda x: x.split("'")[1]).astype("int64")

df["item_price"] = df["item_price"].apply(lambda x: x.split("'")[1]).astype("int64")

print(" Tipe data:\n", df.dtypes)

# 3. Transform "product_value" supaya bentuknya seragam dengan format "PXXXX", assign ke kolom
baru "product_id", dan drop kolom "product_value", jika terdapat nan gantilah dengan "unknown"
print("\n[3] TRANSFORM product_value MENJADI product_id")

# Buat fungsi

import math

def impute_product_value(val):

if math.isnan(val):

return "unknown"

else:

return 'P' + '{:0>4}'.format(str(val).split('.')[0])

# Buat kolom "product_id"

df["product_id"] = df["product_value"].apply(lambda x: impute_product_value(x))

# Hapus kolom "product_value"

df.drop(["product_value"], axis=1, inplace=True)

# Cetak 5 data teratas

print(df.head())

# 4. Tranform order_date menjadi value dengan format "YYYY-mm-dd"

print("\n[4] TRANSFORM order_date MENJADI FORMAT YYYY-mm-dd")

months_dict = {

"Jan":"01",

"Feb":"02",

"Mar":"03",

"Apr":"04",

"May":"05",

"Jun":"06",

"Jul":"07",

"Aug":"08",

"Sep":"09",

"Oct":"10",

"Nov":"11",

"Dec":"12"

}
df["order_date"] = pd.to_datetime(df["order_date"].apply(lambda x: str(x)[-4:] + "-" +
months_dict[str(x)[:3]] + "-" + str(x)[4:7]))

print(" Tipe data:\n", df.dtypes)

# 5. Mengatasi data yang hilang di beberapa kolom

print("\n[5] HANDLING MISSING VALUE")

# Kolom "city" dan "province" masih memiliki missing value, nilai yang hilang di kedua kolom ini diisi
saja dengan "unknown"

df[["city","province"]] = df[["city","province"]].fillna("unknown")

# Kolom brand juga masih memiliki missing value, Ganti value NaN menjadi "no_brand"

df["brand"] = df["brand"].fillna("no_brand")

# Cek apakah masih terdapat missing value di seluruh kolom

print(" Info:\n", df.info())

# 6. Membuat kolom baru "city/province" dengan menggabungkan kolom "city" dan kolom
"province" dan delete kolom asalnya

print("\n[6] MEMBUAT KOLOM BARU city/province")

df["city/province"] = df["city"] + "/" + df["province"]

# drop kolom "city" dan "province" karena telah digabungkan

df.drop(["city","province"], axis=1, inplace=True)

# Cetak 5 data teratas

print(df.head())

# 7. Membuat hierarchical index yang terdiri dari kolom "city/province", "order_date",


"customer_id", "order_id", "product_id"

print("\n[7] MEMBUAT HIERACHICAL INDEX")

df = df.set_index(["city/province","order_date","customer_id","order_id","product_id"])

# urutkanlah berdasarkan index yang baru

df = df.sort_index()

# Cetak 5 data teratas

print(df.head())
# 8. Membuat kolom "total_price" yang formula nya perkalian antara kolom "quantity" dan kolom
"item_price"

print("\n[8] MEMBUAT KOLOM total_price")

df["total_price"] = df["quantity"] * df["item_price"]

# Cetak 5 data teratas

print(df.head())

# 9. Slice dataset agar hanya terdapat data bulan Januari 2019

print("\n[9] SLICE DATASET UNTUK BULAN JANUARI 2019 SAJA")

idx = pd.IndexSlice

df_jan2019 = df.loc[idx[:, "2019-01-01":"2019-01-31"], :]

print("Dataset akhir:\n", df_jan2019)

# END OF PROJECT

Output:

In [1]: import pandas as pd

# 1. Baca dataset
print("[1] BACA DATASET")
df = pd.read_csv("https://storage.googleapis.com/dqlab-
dataset/retail_raw_test.csv", low_memory=False)
print(" Dataset:\n", df.head())
print(" Info:\n", df.info())

# 2. Ubah tipe data


print("\n[2] UBAH TIPE DATA")
df["customer_id"] = df["customer_id"].apply(lambda x: x.split("'")
[1]).astype("int64")
df["quantity"] = df["quantity"].apply(lambda x: x.split("'")
[1]).astype("int64")
df["item_price"] = df["item_price"].apply(lambda x: x.split("'")
[1]).astype("int64")
print(" Tipe data:\n", df.dtypes)

# 3. Transform "product_value" supaya bentuknya seragam dengan format


"PXXXX", assign ke kolom baru "product_id", dan drop kolom "product_value", jika
terdapat nan gantilah dengan "unknown"
print("\n[3] TRANSFORM product_value MENJADI product_id")
# Buat fungsi
import math
def impute_product_value(val):
if math.isnan(val):
return "unknown"
else:
return 'P' + '{:0>4}'.format(str(val).split('.')[0])
# Buat kolom "product_id"
df["product_id"] = df["product_value"].apply(lambda x:
impute_product_value(x))
# Hapus kolom "product_value"
df.drop(["product_value"], axis=1, inplace=True)
# Cetak 5 data teratas
print(df.head())

# 4. Tranform order_date menjadi value dengan format "YYYY-mm-dd"


print("\n[4] TRANSFORM order_date MENJADI FORMAT YYYY-mm-dd")
months_dict = {
"Jan":"01",
"Feb":"02",
"Mar":"03",
"Apr":"04",
"May":"05",
"Jun":"06",
"Jul":"07",
"Aug":"08",
"Sep":"09",
"Oct":"10",
"Nov":"11",
"Dec":"12"
}
df["order_date"] = pd.to_datetime(df["order_date"].apply(lambda x: str(x)
[-4:] + "-" + months_dict[str(x)[:3]] + "-" + str(x)[4:7]))
print(" Tipe data:\n", df.dtypes)

# 5. Mengatasi data yang hilang di beberapa kolom


print("\n[5] HANDLING MISSING VALUE")
# Kolom "city" dan "province" masih memiliki missing value, nilai yang
hilang di kedua kolom ini diisi saja dengan "unknown"
df[["city","province"]] = df[["city","province"]].fillna("unknown")
# Kolom brand juga masih memiliki missing value, Ganti value NaN menjadi
"no_brand"
df["brand"] = df["brand"].fillna("no_brand")
# Cek apakah masih terdapat missing value di seluruh kolom
print(" Info:\n", df.info())

# 6. Membuat kolom baru "city/province" dengan menggabungkan kolom "city"


dan kolom "province" dan delete kolom asalnya
print("\n[6] MEMBUAT KOLOM BARU city/province")
df["city/province"] = df["city"] + "/" + df["province"]
# drop kolom "city" dan "province" karena telah digabungkan
df.drop(["city","province"], axis=1, inplace=True)
# Cetak 5 data teratas
print(df.head())

# 7. Membuat hierarchical index yang terdiri dari kolom "city/province",


"order_date", "customer_id", "order_id", "product_id"
print("\n[7] MEMBUAT HIERACHICAL INDEX")
df =
df.set_index(["city/province","order_date","customer_id","order_id","product_id"])
# urutkanlah berdasarkan index yang baru
df = df.sort_index()
# Cetak 5 data teratas
print(df.head())

# 8. Membuat kolom "total_price" yang formula nya perkalian antara kolom


"quantity" dan kolom "item_price"
print("\n[8] MEMBUAT KOLOM total_price")
df["total_price"] = df["quantity"] * df["item_price"]
# Cetak 5 data teratas
print(df.head())

# 9. Slice dataset agar hanya terdapat data bulan Januari 2019


print("\n[9] SLICE DATASET UNTUK BULAN JANUARI 2019 SAJA")
idx = pd.IndexSlice
df_jan2019 = df.loc[idx[:, "2019-01-01":"2019-01-31"], :]
print("Dataset akhir:\n", df_jan2019)

# END OF PROJECT

[1] BACA DATASET


Dataset:
order_id order_date customer_id ... quantity item_price product_value
0 1730350 Dec 11, 2019 '13447 ... '24 '113000 1374.0
1 1677490 Jul 31, 2019 '0 ... '1 '1164000 1370.0
2 1704211 Oct 18, 2019 '16128 ... '12 '747000 1679.0
3 1679695 Aug 07, 2019 '16225 ... '6 '590000 1708.0
4 1679080 Aug 05, 2019 '0 ... '2 '740000 1201.0

[5 rows x 9 columns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5000 entries, 0 to 4999
Data columns (total 9 columns):
order_id 5000 non-null int64
order_date 5000 non-null object
customer_id 5000 non-null object
city 3802 non-null object
province 3802 non-null object
brand 4995 non-null object
quantity 5000 non-null object
item_price 5000 non-null object
product_value 4995 non-null float64
dtypes: float64(1), int64(1), object(7)
memory usage: 351.6+ KB
Info:
None

[2] UBAH TIPE DATA


Tipe data:
order_id int64
order_date object
customer_id int64
city object
province object
brand object
quantity int64
item_price int64
product_value float64
dtype: object

[3] TRANSFORM product_value MENJADI product_id


order_id order_date customer_id ... quantity item_price product_id
0 1730350 Dec 11, 2019 13447 ... 24 113000 P1374
1 1677490 Jul 31, 2019 0 ... 1 1164000 P1370
2 1704211 Oct 18, 2019 16128 ... 12 747000 P1679
3 1679695 Aug 07, 2019 16225 ... 6 590000 P1708
4 1679080 Aug 05, 2019 0 ... 2 740000 P1201

[5 rows x 9 columns]

[4] TRANSFORM order_date MENJADI FORMAT YYYY-mm-dd


Tipe data:
order_id int64
order_date datetime64[ns]
customer_id int64
city object
province object
brand object
quantity int64
item_price int64
product_id object
dtype: object

[5] HANDLING MISSING VALUE


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5000 entries, 0 to 4999
Data columns (total 9 columns):
order_id 5000 non-null int64
order_date 5000 non-null datetime64[ns]
customer_id 5000 non-null int64
city 5000 non-null object
province 5000 non-null object
brand 5000 non-null object
quantity 5000 non-null int64
item_price 5000 non-null int64
product_id 5000 non-null object
dtypes: datetime64[ns](1), int64(4), object(4)
memory usage: 351.6+ KB
Info:
None

[6] MEMBUAT KOLOM BARU city/province


order_id order_date ... product_id city/province
0 1730350 2019-12-11 ... P1374 Surakarta/Jawa Tengah
1 1677490 2019-07-31 ... P1370 unknown/unknown
2 1704211 2019-10-18 ... P1679 Jakarta Pusat/DKI Jakarta
3 1679695 2019-08-07 ... P1708 Yogyakarta/Yogyakarta
4 1679080 2019-08-05 ... P1201 unknown/unknown

[5 rows x 8 columns]

[7] MEMBUAT HIERACHICAL INDEX


brand ...
item_price
city/province order_date customer_id order_id product_id ...
Banda Aceh/Aceh 2019-04-17 12818 1642480 P1936 BRAND_K ...
450000
2019-11-12 12360 1715116 P0758 BRAND_C ...
695000
P3042 BRAND_R ...
310000
2019-12-09 12374 1729036 P1660 BRAND_G ...
2795000
Bandar Lampung/Lampung 2019-01-15 12515 1619257 P0628 BRAND_C ...
695000

[5 rows x 3 columns]

[8] MEMBUAT KOLOM total_price


brand ...
total_price
city/province order_date customer_id order_id product_id ...
Banda Aceh/Aceh 2019-04-17 12818 1642480 P1936 BRAND_K ...
10800000
2019-11-12 12360 1715116 P0758 BRAND_C ...
5560000
P3042 BRAND_R ...
3720000
2019-12-09 12374 1729036 P1660 BRAND_G ...
11180000
Bandar Lampung/Lampung 2019-01-15 12515 1619257 P0628 BRAND_C ...
8340000

[5 rows x 4 columns]

[9] SLICE DATASET UNTUK BULAN JANUARI 2019 SAJA


Dataset akhir:
brand ...
total_price
city/province order_date customer_id order_id product_id ...
Bandar Lampung/Lampung 2019-01-15 12515 1619257 P0628 BRAND_C ...
8340000
Bandung/Jawa Barat 2019-01-09 16134 1617055 P1597 BRAND_G ...
4680000
2019-01-10 17392 1617952 P2137 BRAND_M ...
2124000
2019-01-14 15527 1618828 P3115 BRAND_S ...
1045000
2019-01-29 13253 1620289 P0099 BRAND_A ...
5400000
Bekasi/Jawa Barat 2019-01-02 14030 1613578 P2891 BRAND_R ...
5400000
2019-01-04 14082 1614598 P3008 BRAND_R ...
1745000
18065 1614790 P1800 BRAND_H ...
6560000
2019-01-07 17231 1615915 P0211 BRAND_A ...
2090000
P2114 BRAND_M ...
159000
2019-01-10 15620 1617784 P0968 BRAND_C ...
5424000
2019-01-11 15780 1618138 P2169 BRAND_M ...
6270000
16885 1618369 P1954 BRAND_L ...
450000
2019-01-31 13081 1621117 P0106 BRAND_A ...
5400000
P1305 BRAND_F ...
10600000
P3062 BRAND_R ...
12540000
P3069 BRAND_R ...
6270000
14680 1620829 P2106 BRAND_L ...
5424000
Bogor/Jawa Barat 2019-01-03 13102 1614172 P0167 BRAND_A ...
10600000
P3574 BRAND_S ...
5400000
2019-01-06 17917 1615264 P2489 BRAND_P ...
1045000
2019-01-07 13211 1616005 P2489 BRAND_P ...
36160000
15311 1615954 P0517 BRAND_B ...
450000
2019-01-08 13102 1616563 P1800 BRAND_H ...
19680000
16442 1616128 P0723 BRAND_C ...
1045000
17158 1616497 P2430 BRAND_P ...
5400000
2019-01-09 15641 1617115 P0128 BRAND_A ...
4920000
2019-01-10 15574 1617646 P1307 BRAND_F ...
1325000
2019-01-14 15311 1618924 P0541 BRAND_B ...
5400000
2019-01-30 12921 1620448 P2930 BRAND_R ...
4500000
... ... ...
...
unknown/unknown 2019-01-15 0 1619215 P1674 BRAND_H ...
1486000
P2106 BRAND_L ...
1783000
1619218 P3069 BRAND_R ...
10405000
1619221 P0692 BRAND_C ...
2081000
1619224 P3961 BRAND_W ...
1486000
1619227 P1467 BRAND_F ...
2977000
1619230 P3475 BRAND_S ...
1516000
1619233 P0359 BRAND_B ...
2977000
P1907 BRAND_J ...
2972000
1619251 P1119 BRAND_D ...
4464000
P1802 BRAND_H ...
26790000
2019-01-17 0 1619875 P1736 BRAND_H ...
3564000
P2613 BRAND_P ...
1486000
P2776 BRAND_P ...
3564000
P3397 BRAND_S ...
3564000
P3847 BRAND_V ...
891000
2019-01-29 0 1620079 P0116 BRAND_A ...
1486000
P0564 BRAND_B ...
1188000
P0743 BRAND_C ...
930000
P1972 BRAND_L ...
31206000
P3330 BRAND_S ...
5954000
P3387 BRAND_S ...
4151000
2019-01-30 0 1620463 P2191 BRAND_M ...
296000
P3494 BRAND_S ...
978000
P3893 BRAND_V ...
5954000
1620766 P3070 BRAND_R ...
593000
P3483 BRAND_S ...
1779000
2019-01-31 0 1621057 P1298 BRAND_F ...
296000
P1773 BRAND_H ...
2965000
P2877 BRAND_R ...
1486000

[334 rows x 4 columns]

Anda mungkin juga menyukai