Kursus
Pendahuluan
Mengimpor data adalah salah satu langkah paling penting dan paling awal dalam setiap permasalahan terkait data. Kemampuan untuk mengimpor data dengan benar adalah keterampilan yang wajib dimiliki setiap calon data scientist.
Data hadir dalam berbagai bentuk, dan Anda tidak hanya perlu tahu cara mengimpor beragam format data, tetapi juga cara menganalisis dan memanipulasinya untuk memperoleh wawasan yang bermanfaat.
pandas adalah pustaka Python open source yang mudah digunakan, berkinerja tinggi, dan merupakan alat analisis data untuk berbagai format data.
Perangkat ini memberi Anda kemampuan untuk membaca berbagai jenis format data seperti CSV, JSON, Excel, Pickle, dan lain-lain. Ini memungkinkan Anda merepresentasikan data dalam bentuk tabel baris dan kolom, sehingga data mudah dibaca dan disajikan.
pandas merepresentasikan data dalam bentuk DataFrame dan menyediakan penggunaan yang ekstensif untuk analisis serta manipulasi data. Setelah Anda mulai memahami data dengan berbagai fungsionalitas di pandas, Anda dapat menggunakan data ini untuk analisis, peramalan, klasifikasi, dan banyak lagi!
pandas memiliki API input dan output yang berisi sekumpulan fungsi tingkat-atas reader dan writer. Fungsi reader diakses dengan pandas.read_json() yang mengembalikan objek pandas, dan fungsi writer diakses dengan pandas.to_json() yang merupakan metode objek.
DataFrame memiliki fungsi Reader dan Writer. Fungsi Reader memungkinkan Anda membaca berbagai format data, sementara fungsi Writer memungkinkan Anda menyimpan data dalam format tertentu.
Di bawah ini adalah format data yang didukung DataFrame, yang berarti jika data Anda berada dalam salah satu bentuk di bawah ini, Anda dapat menggunakan pandas untuk memuat format tersebut dan bahkan menulis ke format tertentu.
Dalam tutorial hari ini, Anda akan bekerja dengan beberapa jenis format di atas seperti JSON, HTML, dan Pickle.
Catatan: Lihat tutorial ini untuk mempelajari cara membaca berkas CSV menggunakan pandas.
Memuat Data JSON
JSON, atau JavaScript Object Notation, adalah format serialisasi teks untuk pertukaran data. JSON mudah dibaca dan ditulis. Ini berbasis pada subset dari Bahasa Pemrograman JavaScript tetapi menggunakan konvensi dari Python, dan banyak bahasa lain di luar Python.
JSON paling sering digunakan untuk menyimpan data tidak terstruktur, dan basis data SQL kesulitan menyimpannya. JSON membuat data dapat diakses untuk dibaca oleh mesin.
JSON terutama dibangun di atas dua struktur:
-
Koleksi pasangan kunci/nilai. Dalam Python, pasangan kunci/nilai disebut
Dictionary, dan sebuahkeyadalah atribut unik, sedangkan nilai tidak harus unik. -
Daftar nilai yang terurut. Daftar terurut kadang-kadang bisa berupa daftar berisi daftar. List di Python adalah sekumpulan nilai yang bisa berupa string, integer, dan sebagainya.
Sekarang mari kita lihat bagaimana Anda dapat memuat data JSON dengan berbagai cara.
Dataset JSON pertama berasal dari tautan ini. Datanya berada dalam format kamus kunci-nilai. Total ada tiga kunci: yaitu integer, datetime, dan category.
- Pertama, Anda akan mengimpor pustaka
pandaslalu meneruskanURLkepd.read_json()yang akan mengembalikan sebuah dataframe. Kolom-kolom dataframe mewakili kunci, dan barisnya adalah nilai dari JSON.
import pandas as pd
json = pd.read_json('https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/data.json')
Mari cepat-cepat mencetak beberapa baris terakhir dari JSON yang Anda baca menggunakan fungsi .tail().
json.tail(6)
| integer | datetime | category | |
|---|---|---|---|
| 94 | 5 | 2015-01-01 00:01:34 | 0 |
| 95 | 9 | 2015-01-01 00:01:35 | 0 |
| 96 | 8 | 2015-01-01 00:01:36 | 0 |
| 97 | 6 | 2015-01-01 00:01:37 | 0 |
| 98 | 8 | 2015-01-01 00:01:38 | 0 |
| 99 | 1 | 2015-01-01 00:01:39 | 0 |
json.shape
(100, 3)
Dari keluaran di atas, Anda dapat melihat bahwa ada total tiga kolom: integer, datetime, dan category. Selain itu, terdapat 100 sampel dalam dataset seperti yang diverifikasi dari metode .shape yang mengembalikan keluaran 100 x 3.
- Menulis JSON
Menulis data JSON semudah membacanya dan hanya satu baris kode. Alih-alih read_json() Anda akan menggunakan to_json() dengan nama berkas dan selesai!
json.to_json('dataframe.json')
- Mengurai JSON Bersarang sebagai String
Selanjutnya, Anda akan menggunakan jenis dataset JSON lain yang tidak sesederhana itu. Ini adalah struktur nested JSON (JSON bersarang). Struktur JSON bersarang berarti setiap key dapat memiliki lebih banyak key yang terkait dengannya.
Mari lihat contoh dataset untuk memahaminya lebih baik.
nested_json = """{
"article": [
{
"id":"01",
"language": "JSON",
"edition": "first",
"author": "Allen"
},
{
"id":"02",
"language": "Python",
"edition": "second",
"author": "Aditya Sharma"
}
],
"blog":[
{
"name": "Datacamp",
"URL":"datacamp.com"
}
]
}"""
Pada dataset di atas, Anda dapat mengamati bahwa article dan blog adalah dua kunci utama yang di bawahnya terdapat nilai dari kunci-kunci tersebut. Nilai-nilai ini memiliki kombinasi key-value masing-masing.
Perhatikan bahwa dataset di atas diapit dengan tanda kutip ganda dan berbentuk string.
Membaca JSON bersarang dapat dilakukan dengan beberapa cara.
Pertama, Anda akan menggunakan fungsi json.loads untuk membaca string JSON dengan meneruskan variabel data sebagai parameternya. Lalu, Anda akan menggunakan fungsi json_normalize untuk meratakan data JSON bersarang menjadi sebuah tabel.
Anda akan mengimpor fungsi json_normalize dari pustaka pandas.io.json.
import json
from pandas.io.json import json_normalize
nested = json.loads(nested_json)
nested
{'article': [{'id': '01',
'language': 'JSON',
'edition': 'first',
'author': 'Allen'},
{'id': '02',
'language': 'Python',
'edition': 'second',
'author': 'Aditya Sharma'}],
'blog': [{'name': 'Datacamp', 'URL': 'datacamp.com'}]}
Selanjutnya, Anda akan meratakan JSON menggunakan fungsi normalize. Untuk saat ini Anda akan meneruskan seluruh data dan melihat tampilannya.
nested_full = json_normalize(nested)
nested_full
| article | blog | |
|---|---|---|
| 0 | [{'id': '01', 'language': 'JSON', 'edition': '... | [{'name': 'Datacamp', 'URL': 'datacamp.com'}] |
Bagus! Seperti yang Anda lihat dari keluaran di atas, kunci utama menjadi kolom dataframe sementara kunci lainnya mewakili baris.
Namun, keluarannya terlihat agak berantakan, bukan? Mari lihat bagaimana Anda bisa membaginya lebih lanjut ke beberapa dataframe.
Anda akan kembali meneruskan keluaran json.loads ke json_normalize tetapi kali ini Anda akan menentukan elemen tambahan bernama record_path.
blog = json_normalize(nested,record_path ='blog')
blog
| URL | name | |
|---|---|---|
| 0 | datacamp.com | Datacamp |
article = json_normalize(nested,record_path ='article')
article
| author | edition | id | language | |
|---|---|---|---|---|
| 0 | Allen | first | 01 | JSON |
| 1 | Aditya Sharma | second | 02 | Python |
Dari keluaran di atas, Anda dapat melihat bahwa kunci utama kini terbagi menjadi dua dataframe berbeda di mana nama kolom sekarang menjadi kunci yang bersarang di dalam kunci utama sebagai pasangan kunci-nilai. Keren, bukan?
Terakhir, untuk menutup bagian pemuatan data JSON, mari cepat cari tahu bagaimana Anda dapat membaca JSON sebagai berkas dan bukan sebagai string.
- Membaca JSON sebagai Berkas
nested_json = {
"article": [
{
"id":"01",
"language": "JSON",
"edition": "first",
"author": "Allen"
},
{
"id":"02",
"language": "Python",
"edition": "second",
"author": "Aditya Sharma"
}
],
"blog":[
{
"name": "Datacamp",
"URL":"datacamp.com"
}
]
}
Jika Anda perhatikan pada sel di atas, tidak ada tanda kutip ganda di awal dan akhir data, yang berarti Anda akan memperlakukan data ini sebagai berkas dan membacanya.
Anda dapat melakukannya hanya dengan satu baris kode. Mari cari tahu caranya!
json_file = pd.DataFrame.from_dict(json_normalize(nested_json))
json_file
| article | blog | |
|---|---|---|
| 0 | [{'id': '01', 'language': 'JSON', 'edition': '... | [{'name': 'Datacamp', 'URL': 'datacamp.com'}] |
Dari keluaran di atas, Anda dapat melihat bahwa hasilnya mirip saat Anda membaca JSON sebagai string. Satu-satunya perbedaan di sini adalah Anda menggunakan pandas untuk sekaligus mengurai dan meratakan JSON. Karena JSON adalah sebuah dictionary, Anda menggunakan fungsi .from_dict().
Memuat Data HTML
HTML adalah Hypertext Markup Language yang terutama digunakan untuk membuat aplikasi dan halaman web. HTML berupaya menjelaskan struktur halaman web secara semantik. Peramban web menerima dokumen HTML dari server web dan merendernya menjadi halaman web multimedia.
Untuk aplikasi web, HTML digunakan bersama cascading style sheets (CSS) sementara di sisi server HTML berkolaborasi dengan berbagai kerangka kerja server web seperti Flask, Django, dan lain-lain.
HTML menggunakan tag untuk mendefinisikan setiap blok kode seperti tag <p></p> untuk awal dan akhir paragraf, tag <image></image> untuk menambahkan konten ke halaman web sebagai gambar, dan serupa ada banyak tag yang bersama-sama menyusun halaman web HTML.
Untuk membaca berkas HTML, dataframe pandas mencari sebuah tag. Tag tersebut adalah tag <td></td>. Tag ini digunakan untuk mendefinisikan tabel dalam HTML.
pandas menggunakan read_html() untuk membaca dokumen HTML.
Jadi, kapan pun Anda meneruskan HTML ke pandas dan berharap ia menghasilkan dataframe yang rapi, pastikan halaman HTML tersebut memiliki tabel di dalamnya!
- Tentang Data: Anda akan menggunakan situs
Cryptocurrencysebagai dataset HTML yang memuat berbagai koin kripto dan beragam detail tentang masing-masing koin seperti:- Harga terakhir koin (
Last price) - Apakah harga koin naik atau turun (dalam persentase
%) - Volume 24 jam (berapa banyak koin yang diperdagangkan
24 volume) - Jumlah total koin (
# Coins)
- Harga terakhir koin (
Baik, mari mulai!
Pertama Anda akan mengimpor pustaka requests yang akan membantu Anda mengirim permintaan ke URL tempat Anda ingin mengambil konten HTML.
import requests
url = 'https://www.worldcoinindex.com/'
crypto_url = requests.get(url)
crypto_url
<Response [200]>
Sejauh ini, Anda telah mendefinisikan URL lalu menggunakan requests.get() Anda mengirim permintaan ke URL tersebut dan menerima respons berupa acknowledgement [200] OK yang berarti Anda berhasil terhubung dengan server web itu.
Sekarang, untuk membaca konten halaman web HTML, yang perlu Anda lakukan adalah memanggil crypto_url.text yang akan memberi Anda kode HTML dari halaman web cryptocurrency tersebut.
Silakan jalankan perintah crypto_url.text untuk melihat keluarannya.
Terakhir, Anda akan meneruskan crypto_url.text ke fungsi pd.read_html() yang akan mengembalikan daftar dataframe di mana setiap elemen dalam daftar tersebut adalah tabel (dataframe) yang dimiliki halaman web cryptocurrency.
crypto_data = pd.read_html(crypto_url.text)
Mari cetak panjang dan tipe dari dataframe. type seharusnya berupa list.
len(crypto_data), type(crypto_data)
(1, list)
Dari keluaran di atas, jelas bahwa hanya ada 1 tabel dengan tipe list.
crypto_data = crypto_data[0]
Mari hapus kolom pertama dan kedua karena tidak memiliki informasi yang berguna dan pertahankan semua baris.
crypto_final = crypto_data.iloc[:,2:]
Akhirnya, saatnya mencetak dataframe cryptocurrency!
crypto_final.head()
| Name | Ticker | Last price | % | 24 high | 24 low | Price Charts 7d | 24 volume | # Coins | Market cap | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | bitcoin | BTC | $ 8,008.027 | +1.83% | $ 8,056.630 | $ 7,812.784 | NaN | $ 12.04B | 17.71M | $ 141.89B |
| 1 | ethereum | ETH | $ 251.72335 | +2.68% | $ 253.84721 | $ 242.95687 | NaN | $ 6.93B | 106.20M | $ 26.73B |
| 2 | litecoin | LTC | $ 98.633851 | +11.08% | $ 99.946324 | $ 88.618815 | NaN | $ 3.46B | 61.91M | $ 6.10B |
| 3 | bitcoincash | BCH | $ 411.94075 | +2.31% | $ 418.60850 | $ 394.18927 | NaN | $ 2.10B | 17.79M | $ 7.33B |
| 4 | eos | EOS | $ 6.4230717 | +6.05% | $ 6.4765695 | $ 6.0264079 | NaN | $ 2.06B | 1.01B | $ 6.50B |
Dari tabel di atas, Anda dapat melihat bahwa Bitcoin memiliki Market Cap terbesar.
Menghapus NaN (Not a Number)
Ada beberapa nilai dalam dataframe yang bukan nilai sebenarnya, jadi mari cepat kita hapus dari tabel.
Namun, pertama-tama, mari hapus (delete) kolom Price Charts 7d sepenuhnya karena seluruhnya NaN dan tidak berisi informasi apa pun.
del crypto_final['Price Charts 7d']
crypto_final.head()
| Name | Ticker | Last price | % | 24 high | 24 low | 24 volume | # Coins | Market cap | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | bitcoin | BTC | $ 8,008.027 | +1.83% | $ 8,056.630 | $ 7,812.784 | $ 12.04B | 17.71M | $ 141.89B |
| 1 | ethereum | ETH | $ 251.72335 | +2.68% | $ 253.84721 | $ 242.95687 | $ 6.93B | 106.20M | $ 26.73B |
| 2 | litecoin | LTC | $ 98.633851 | +11.08% | $ 99.946324 | $ 88.618815 | $ 3.46B | 61.91M | $ 6.10B |
| 3 | bitcoincash | BCH | $ 411.94075 | +2.31% | $ 418.60850 | $ 394.18927 | $ 2.10B | 17.79M | $ 7.33B |
| 4 | eos | EOS | $ 6.4230717 | +6.05% | $ 6.4765695 | $ 6.0264079 | $ 2.06B | 1.01B | $ 6.50B |
Sekarang mari kita hapus NaN.
crypto_final = crypto_final.dropna()
Memvisualisasikan Koin Kripto (Ticker) vs. Persentase Kenaikan/Penurunan Harga (%)
Pertama, mari impor matplotlib untuk membuat grafik.
import matplotlib.pyplot as plt
%matplotlib inline
Kolom % bertipe string, dan Anda perlu mengonversi tipe string tersebut ke float. Pertama, Anda akan menghapus tanda % dari kolom lalu mengonversi tipe kolom % menjadi float.
crypto_final['%'] = crypto_final['%'].apply(lambda x: x.strip('%'))
crypto_final['%'] = crypto_final['%'].astype('float')
Sekarang mari kita plot datanya.
plt.figure()
plt.figure(figsize=(16,10))
x = crypto_final.iloc[:20]['Ticker']
y = crypto_final.iloc[:20]['%']
plt.xticks(fontsize=12)
plt.yticks(fontsize=14)
plt.xlabel('Percentage Increase/Decrease in Price',fontsize=20)
plt.ylabel('Ticker',fontsize=20)
plt.plot(x,y,label='% Increase/Decrease in Price')
plt.legend(loc='lower left',prop={'size': 15})
<matplotlib.legend.Legend at 0x1298a9630>
<Figure size 432x288 with 0 Axes>
Dari grafik di atas, Anda dapat melihat bahwa Litecoin (LTC) dan Huobitoken (HT) mengalami kenaikan harga terbesar dan di sisi lain, Maticnetwork (MATIC) dan Waves mengalami penurunan harga terbesar di antara koin kripto.
Memuat Data Pickle
Pickle adalah format serialisasi biner khusus Python yang tidak dapat dibaca manusia, berbeda dengan JSON. Ini digunakan untuk melakukan serialisasi dan deserialisasi struktur objek Python. Pickle men-serialisasi objek dan menyimpannya ke disk. Ia mengonversi objek seperti DataFrame, list, dictionary, dan lain-lain menjadi aliran karakter.
Bagian terbaik dari Pickle adalah dapat menyimpan berbagai jenis tipe data Python.
Pickle banyak digunakan untuk menyimpan instance algoritma pembelajaran mesin yang telah dilatih. Seperti JSON, Pickle juga memiliki fungsi praktis seperti pickle.load() untuk memuat berkas berformat Pickle, dan pickle.dump() untuk menyimpan berkas Pickle atau format lain ke dalam format Pickle.
Keunggulan lain menggunakan Pickle adalah bahwa Menyimpan dataframe sebagai berkas Pickle membutuhkan ruang disk lebih sedikit dan menjaga tipe data tetap utuh saat dimuat kembali.
Jadi, mari kita cepat-cepat pickle dataframe cryptocurrency yang Anda buat sebelumnya, lalu Anda akan membaca objek yang sudah dipickle tersebut menggunakan pandas.
import pickle
Anda akan menggunakan pickle.dump untuk menyimpan dataframe sebagai objek Pickle dan menggunakan protocol HIGHEST_PROTOCOL, yang juga kompatibel mundur dengan Python 2.
with open('crypto_final.pickle', 'wb') as sub_data:
pickle.dump(crypto_final, sub_data, protocol=pickle.HIGHEST_PROTOCOL)
Terakhir, Anda akan menggunakan fungsi pandas read_pickle untuk mengonversi objek pickle menjadi sebuah dataframe.
crypto_final = pd.read_pickle('crypto_final.pickle')
crypto_final.head()
| Name | Ticker | Last price | % | 24 high | 24 low | 24 volume | # Coins | Market cap | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | bitcoin | BTC | $ 7,776.567 | +1.81% | $ 7,870.205 | $ 7,506.518 | $ 12.70B | 17.71M | $ 137.78B |
| 1 | ethereum | ETH | $ 241.81372 | -0.97% | $ 245.57293 | $ 232.62523 | $ 7.47B | 106.18M | $ 25.67B |
| 2 | litecoin | LTC | $ 88.062811 | +0.33% | $ 88.946501 | $ 85.248641 | $ 2.59B | 61.90M | $ 5.45B |
| 3 | bitcoincash | BCH | $ 388.76089 | +0.06% | $ 398.27697 | $ 370.29831 | $ 2.33B | 17.79M | $ 6.91B |
| 4 | eos | EOS | $ 5.9327948 | -0.41% | $ 6.0163442 | $ 5.7789154 | $ 1.99B | 1.01B | $ 6.00B |
Wah! Bukankah itu luar biasa? Betapa sederhananya. Selain itu, dengan Pickle, Anda tidak perlu khawatir tentang kesalahan konversi tipe data karena serialisasi pickle dapat menanganinya untuk Anda!
Lanjutkan
Selamat telah menyelesaikan tutorial ini.
Tutorial ini menjadi titik awal yang baik tentang cara Anda dapat memuat berbagai format data di Python dengan bantuan pandas.
Masih banyak format data seperti Excel, SQL, HDF5, dan lain-lain, yang masuk dalam payung impor data pandas. Anda sebaiknya mulai bereksperimen dengan menemukan beberapa dataset publik menarik dalam format-format ini dan coba bereksperimen dengannya.
Jika Anda ingin mempelajari lebih lanjut tentang DataFrame di pandas, ikuti kursus interaktif DataCamp data manipulation with pandas. DataCamp juga memiliki beberapa tutorial pandas bermanfaat lainnya yang membahas menggabungkan dataframe, menerapkan moving averages dan menggunakan metode apply. Atau, jika Anda benar-benar baru di pandas, mulailah dengan panduan pemula pandas ini.
Referensi:
Jangan ragu untuk mengajukan pertanyaan apa pun terkait tutorial ini di kolom komentar di bawah.
