Weekend produktif kali ini kita akan ngelanjutin buat ngerjain rangkaian modul dari DQLab Career Track, yaitu Data Manipulation With Pandas. Show
Check it out!
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. Memanggil Library PandasUntuk memanggil library pandas cukup dengan meng-import nya, biasanya ketika memanggil library pandas, library numpy juga akan ikut dipanggil sehingga syntax nya menjadi seperti ini, import pandas as pd DataFrame & SeriesTernyata dalam Pandas terdapat 2 kelas data baru yang digunakan sebagai struktur dari spreadsheet,
Untuk lebih jelasnya, kita praktek aja ya. import pandas as pd Hasilnya adalah sebagai berikut, Atribut DataFrame & SeriesDataframe dan Series ini juga memiliki sangat banyak atribut yang digunakan untuk transformasi data, tetapi hanya beberapa attribute yang sering digunakan. Misalkan kita menggunakan data yang sama, kemudian akan kita praktekkan penggunaan atrribut import pandas as pd 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. # [1] attribute .info() Outputnya akan seperti berikut ini, 2. Attribute .shape Attribute.shape digunakan untuk mengetahui berapa baris dan kolom, hasilnya dalam format tuple (baris, kolom). # [2] attribute .shape Output yang didapatkan 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). # [3] attribute .dtypes Output yang dihasilkan 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. # [4] attribute .astype() Outputnya adalah 5. Attribute .copy() Attribute .copy() digunakan melakukan duplikat, untuk disimpan di variable yang berbeda mungkin supaya tidak loading data lagi. # [5] attribute .copy() Output yang didapatkan adalah 6. Attribute .to_list() Attribute .to_list() digunakan untuk mengubah series menjadi list dan tidak dapat digunakan untuk dataframe. # [6] attribute .to_list() Output yang dihasilkan 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. # [7] attribute .unique() 8. Attribute .index Attribute .index digunakan untuk mencari index/key dari Series atau Dataframe. import pandas as pd 0Output yang dihasilkan adalah 9. Attribute .columns Attribute .columns digunakan untuk mengetahui apa saja kolom yang tersedia di dataframe tersebut (hanya digunakan untuk dataframe saja). import pandas as pd 1Dan output yang dihasilkan adalah 10. Attribute .loc Attribute .loc digunakan slice dataframe atau series berdasarkan nama kolom dan/atau nama index. import pandas as pd 2Hasilnya akan seperti ini, 11. Attribute .iloc Attribute .iloc digunakan untuk slice dataframe atau series berdasarkan index kolom dan/atau index. import pandas as pd 3Creating Series & Dataframe from ListUntuk membuat Series atau Dataframe bisa dari berbagai macam tipe data container/mapping di python, seperti list dan dictionary, maupun dari numpy array. Kita akan mencoba untuk membuat Series dan Dataframe yang bersumber dari list. List merupakan sebuah kumpulan data dari berbagai macam tipe data, yang bersifat mutable (dapat diganti). import pandas as pd 4Outpunya adalah sebagai berikut, Creating Series & Dataframe from DictionarySelanjutnya kita akan membuat Series dan Dataframe yang bersumber dari dictionary. Dictionary sendiri merupakan kumpulan data yang strukturnya terdiri dari key dan value. import pandas as pd 5Hasilnya adalah Creating Series & Dataframe from Numpy ArrayKemudian kita akan belajar membuat Series dan Dataframe yang bersumber dari numpy array. Numpy array disini merupakan kumpulan data yang terdiri atas berbagai macam tipe data, mutable, tapi dibungkus dalam array oleh library Numpy. import pandas as pd 6Output yang dihasilkan adalah sebagai berkut, Dataset I/ORead Dataset — CSV dan TSVCSV dan TSV pada dasarnya adalah tipe data text yang hampir sama dengan perbedaan terletak pada pemisah antar data dalam satu baris. Pada file CSV, antar data dalam satu baris dipisahkan oleh comma, “,” sedangkan 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). Datasetnya dapat di unduh disini : 2. Dataset tsv import pandas as pd 7Output yang didapat adalah Read Dataset — ExcelFile Excel dengan ekstensi *.xls atau *.xlsx cukup banyak digunakan dalam menyimpan data. Pandas juga memiliki fitur untuk membaca file excel. Dataset bisa diunduh di sini: Dataset Excel Fungsi .read_excel() digunakan untuk membaca file excel menjadi dataframe pandas. import pandas as pd 8Hasilnya adalah Read Dataset — JSONMethod .read_json() digunakan untuk membaca URL API yang formatnya JSON dan merubahnya menjadi dataframe pandas. Dataset yang digunakan adalah Dataset Json. import pandas as pd 9Outputnya adalah Read Dataset — SQLFungsi .read_sql() atau .read_sql_query() digunakan untuk membaca query dari database dan translate menjadi pandas dataframe, contoh case ini database sqlite. Jika menggunakan .read_sql_query Dan outputnya adalah Jika menggunakan .read_sql Output yang dihasilkan adalah Terlihat keduanya menghasilkan output yang sama. Read Dataset — Google BigQueryUntuk 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 yang digunakan. Output yang dihasilkan seperti ini, Write DatasetKetika kita bekerja sebagai data scientist atau data analyst, maka kita perlu menyimpan data yang telah melalui proses cleansing ke dalam media penyimpanan. Menariknya, ternyata Pandas menyediakan fitur demikian secara ringkas melalui penerapan method pada dataframe/series yang ditabelkan berikut ini. Head & TailSeperti yang telah dipelajari sebelumnya bahwa ada method .head yang diterapkan pada suatu variabel bertipe pandas baik itu dataframe atau series. Method .head bertujuan untuk membatasi tampilan jumlah baris teratas dari dataset. Sementara itu, method .tail digunakan untuk membatasi jumlah baris terbawah dari dataset. Secara umum kedua method ini memiliki bentuk import pandas as pd 0dengan n merupakan jumlah baris yang akan ditampilkan, jika tidak disebutkan n = 5 (sebagai nilai default dari n). import pandas as pd 1Indexing, Slicing, dan TransformingIndexingIndex 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:
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. Secara default setelah suatu data frame dibaca dari file dengan format tertentu, index-nya merupakan single index. Untuk menentukan index dan kolom yang dimiliki oleh dataset yang berbentuk dataframe, maka dapat dilakukan dengan menggunakan attribut .index dan .columns. Nah, kita coba yuk untuk mencetak index dan kolom yang dimiliki oleh file “sample_csv.csv”. import pandas as pd 2Jika syntax berhasil dijalankan maka akan menghasilkan output: Selanjutnya kita akan mempelajari tentang 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. Kita akan membuat multi index dengan menggunakan kolom ‘order_id’, ‘customer_id’, ‘product_id’, dan ‘order_date’ dengan menggunakan method .set_index(). import pandas as pd 3Hasilnya adalah Kumpulan index yang ada di 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’. Selanjutnya kita akan belajar menggunakan assignment untuk menset index dari suatu data frame. import pandas as pd 4Misalkan file yang akan dibaca dapat dipreview terlebih dahulu struktur datanya, maka kita dapat melakukan set di kolom mana 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. import pandas as pd 5Jika berhasil dijalankan kodenya maka akan tampil hasil berikut: SlicingSlicing merupakan 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. import pandas as pd 6Selanjutnya kita akan menerapkan slicing berdasarkan index. Tentu syaratnya adalah dataset sudah dilakukan indexing terlebih dahulu melalui penerapan method .set_index import pandas as pd 7TransformingTransform adalah ketika mengubah dataset yang ada menjadi entitas baru, dapat dilakukan dengan
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, import pandas as pd 8Untuk 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 import pandas as pd 9dengan argumen adalah isi kolom dari dataframe yang akan dirubah tipe datanya, misal dalam format umum # [1] attribute .info() 0Sehingga lengkapnya dapat ditulis sebagai # [1] attribute .info() 1Agar lebih paham, kita bisa mencoba dengan cara berikut: # [1] attribute .info() 2Outputnya adalah Kemudian kita akan belajar mengubah tipe data pada kolom dataframe yang sama menjadi tipe data float (kolom quantity) dan tipe categori (kolom city). Secara umum, untuk merubah ke numerik dapat menggunakan pd.to_numeric(), yaitu # [1] attribute .info() 3Sedangkan untuk menjadi suatu kolom yang dapat dinyatakan sebagai kategory dapat menggunakan method .astype() pada dataframe, yaitu # [1] attribute .info() 4Agar lebih jelasnya, yuk praktekin! # [1] attribute .info() 5Outputnya adalah Kita kemudian akan belajar menggunakan 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. 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. Berikut ini adalah contohnya yaitu akan merubah setiap baris pada kolom brand menjadi lowercase. # [1] attribute .info() 6Outputnya Selanjutnya kita akan menggunakan method .applymap pada dataframe. # [1] attribute .info() 7Output yang dihasilkan adalah Handling Missing ValuesInspeksi Missing ValueValue yang hilang serta 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. Kali ini, kita akan menggunkan Data COVID-19 yang diambil dari google big query, tetapi sudah disediakan datasetnya dalam format csv dengan nama “public data covid19 jhu csse eu.csv”. Untuk mengakses datanya bisa klik di sini. 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 Cara 2: mengetahui berapa banyak nilai hilang dari tiap kolom di dataset tersebut dengan menerapkan chaining method pada dataframe yaitu .isna().sum(). # [1] attribute .info() 8Output dari cara 1 : Output dari cara 2: Treatment untuk Missing ValueTerdapat beberapa cara untuk mengatasi missing value, antara lain:
Sebelum melakukan action ke missing value pada data covid diatas, sebaiknya tampilkan beberapa row teratas dari dataset tersebut, 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. Sekarang dapat menerapkan dua aksi yaitu
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. 2. Menghapus Kolom 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? # [1] attribute .info() 9Pada 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
# [2] attribute .shape 03. Mengisi Missing Value dengan Nilai Lain Sekarang, kita akan melakukan treatment ketiga untuk menghandle missing value pada dataframe. Treatment ini dilakukan dengan cara mengisi missing value dengan nilai lain, yang dapat berupa :
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. # [2] attribute .shape 1Selanjutnya kita 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. # [2] attribute .shape 2Outputnya adalah : 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. # [2] attribute .shape 3Sehingga outputnya adalah : Mini ProjectUntuk melihat tingkat pemahaman kita, kita akan mencoba mengerjakan project untuk melakukan ETL di data untuk cabang perusahaan ritel. Data tersebut merupakan kumpulan data bulan Januari 2019 untuk setiap kota dan provinsi, tanggal ordernya, customer, ordernya apa aja terkait brand, product, quantity dan item pricenya juga. Dan, yang terakhir adalah GMV/Gross Merchandise Volume (total price)-nya. Diberikan dataset ‘retail_raw_test.csv’
Karena data yang dimiliki berbentuk csv, maka kita dapat # [2] attribute .shape 4Hasilnya adalah sebagai berikut. 2. Tipe data diubah menjadi tipe yang seharusnya
# [2] attribute .shape 5Dapat dilihat bahwa tipe kolom customer_id, quantity, serta item_price telah berubah menjadi 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”. # [2] attribute .shape 6Berdasarkan output yang dihasilkan, product_value sudah tidak tersedia lagi dan format untuk product_id sudah terlihat lebih rapi. 4. Tranform order_date menjadi value dengan format YYYY-mm-dd Karena format pada order_date bukan merupakan format date pada pandas, maka kita perlu mentransformasi terlebih dahulu menggunakan dictionary. Selain itu kita juga menambahkan tanda (-) diantara hari, bulan, dan tahun. # [2] attribute .shape 7Dari output yang dihasilkan, kita dapat melihat bahwa order_date telah bertipe datetime64[ns]. 5. cek data hilang dari tiap kolom dan kemudian isi missing value
# [2] attribute .shape 8Hore! Dari output ini kita bisa lihat kalo missing value nya udah hilang termasuk di brand juga city dan province. 6. Create column city/province dari gabungan city & province Agar lebih mudah, maka kita akan menggabungkan antara city dan province, tapi setelah itu field city dan province nya juga di hapus ya biar efektif. # [2] attribute .shape 9Nah, udah jadi nih. Sekarang kita punya 8 kolom loh, lebih ringkas dan efektif kan? 7. Membuat index berdasarkan city_provice, order_date, customer_id, order_id, product_id (cek index) # [3] attribute .dtypes 0Nah setelah berhasil, maka tampilannya akan seperti ini, 8. Membuat kolom “total_price” sebagai hasil perkalian quantity dengan item_price. Agar informasi yang tersedia lebih lengkap dan lebih mempermudah proses analisa, maka kita perlu menambahkan field total_price. # [3] attribute .dtypes 1Taraaa, field total_price berhasil ditambah. 9. Slice data hanya untuk Jan 2019 Nah, misalkan kita hanya ingin melihat data untuk Januari 2019, maka kita perlu melakukan filter dengan slice. Bagaimana penulisan variabel dengan menggunakan Python?Penulisan variabel dalam Python juga memiliki aturan tertentu, yaitu:. Karakter pertama harus berupa huruf atau garis bawah/underscore ( _ ).. Karakter selanjutnya dapat berupa huruf, garis bawah/underscore ( _ ) atau angka.. Karakter pada nama variabel bersifat sensitif (case-sensitif).. Apa itu slicing pada Python?Slicing merupakan teknik memilih data dari sebuah set data. Misal kita memiliki data berat badan mahasiswa: 65, 78, 77, 100, 56. Maka jika kita urutkan maka urutan pertama adalah 65, urutan kedua adalah 78, urutan ketiga adalah 77, urutan keempat adalah 100, dan urutan terakhir adala 56.
\N di Python untuk apa?Karakter baris baru di Python adalah \n . Dipakai untuk menandai akhir dari sebuah baris teks.
F string untuk apa?Formatted string literals (juga disebut f-string) memungkinkan Anda menyertakan nilai ekspresi Python di dalam string dengan mengawali string dengan f atau F dan menulis ekspresi sebagai {expression} .
|