Jupyter notebook adalah software sangat sangat populer beberapa tahun terakhir. Mungkin sebagian besar dari pembaca sudah menggunakannya sehari-hari. Saya sendiri nyaris selalu berkutat dengan Jupyter notebook ini setiap hari. Tapi mungkin ada beberapa yang baru mengenal nama saja dan belum terlalu mengerti apa dia. Atau bahkan mungkin baru mendengar. Jangan kuatir, tulisan ini akan mengenalkan Anda kepada Jupyter notebook dari nol sampai sedikit menguasainya.
*Jupyter* (lihat https://jupyter.org/) adalah sebuah organisasi dan proyek non-profit untuk mengembangkan software interaktif dalam berbagai bahasa pemrograman. *Notebook* adalah satu software buatan Jupyter, adalah aplikasi web open-source yang memungkinkan Anda membuat dan berbagi dokumen yang berisi kode live, persamaan, visualisasi, dan teks naratif. Penggunaan meliputi: pembersihan dan transformasi data, simulasi numerik, pemodelan statistik, visualisasi data, pembelajaran mesin, dan banyak lagi. Demikian menurut situs Jupyter.
Mungkin penjelasan di atas kurang jelas. Ilustrasinya begini. Dulu, biasanya kita membuat kode dan dokumen secara terpisah. Kode-kode kita satukan dalam sebuah librari/aplikasi/proyek (Visual Studio, Eclipse, dsb), dan untuk dokumentasi kita membuatnya secara terpisah dengan penyunting kata. Dalam dokumentasi itu kita bisa tampilkan cuplikan kode, tampilan hasil, dan visualisasi lainnya.
Nah Jupyter Notebook menyatukan semua ini dalam satu file, baik itu teks/narasi (dokumentasi), kode hidup, persamaan, tampilan hasil, gambar statis, dan visualisasi grafis, dan interaktif, dapan dijalankan ulang oleh siapapun yang membukanya, sehingga tercapai aspek reproduksibilitasnya.
Contohnya adalah dokumen ini sendiri. Dokumen ini aslinya adalah sebuah Jupyter Notebook. Mungkin Anda membacanya di blog IndoML, karena notebook ini telah dikonversi menjadi blog Wordpress dengan menggunakan utilitas nb2wp (yang baru selesai saya buat barusan hehe). Anda bisa melihat file aslinya di GitHub sebagai file Pengenalan-Jupyter-Notebook.ipynb.
Nah keistimewaan dari dokumen ini adalah kemampuannya membawa kode hidup (live code). Seperti di bawah ini.
import datetime
now = datetime.datetime.now()
print('Halo teman. Sekarang adalah {}'.format(now))
Halo teman. Sekarang adalah 2019-09-24 13:47:20.040984
Kode di atas bukan sekedar cuplikan tulisan kode di dokumentasi, tapi adalah kode hidup. Kalau Anda melihat tulisan ini di blog IndoML atau di GitHub, memang yang Anda lihat adalah tampilan statis dari eksekusi terakhir ketika notebook ini disimpan. Ibaratnya Anda sedang melihat sebuah dokumen. Tampilannya tidak akan berubah. Tapi kalau Anda menjalankan file notebook ini di instalasi Jupyter Anda, maka Anda bisa menjalankan kode di atas dan nanti akan keluar tampilan waktu yang berbeda tentunya!
Jenis keluaran kode yang didukung juga tidak sebatas teks sederhana seperti di atas. Bisa juga grafik yang dihasilkan oleh Matplotlib seperti ini:
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
fig.suptitle('Contoh Beberapa Grafis Acak')
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
ax1.scatter(x, y, c=colors, s=sizes, alpha=0.3, cmap='viridis')
ax1.set_xlabel('Sumbu X')
ax1.set_ylabel('Sumbu Y')
x = np.linspace(0, 10, 30)
y = np.sin(x)
ax2.plot(x, y, '-ok')
ax2.set_xlabel('Sumbu X')
ax2.set_ylabel('Sumbu Y')
fig.tight_layout(rect=[0, 0.03, 1, 0.97])
plt.show()
Bisa juga menampilkan tabel/DataFrame pandas dengan kode seperti ini:
import pandas as pd
df = pd.DataFrame({
'nama':['joni','meri','peter','japri','budi','lisa'],
'umur':[23,78,22,19,12,33],
'propinsi':['Sumatera Selatan','Jatim','DKI','Bali','Papua','NTT']
})
df
nama | propinsi | umur | |
---|---|---|---|
0 | joni | Sumatera Selatan | 23 |
1 | meri | Jatim | 78 |
2 | peter | DKI | 22 |
3 | japri | Bali | 19 |
4 | budi | Papua | 12 |
5 | lisa | NTT | 33 |
Banyak jenis-jenis media lain yang bisa ditampilkan secara hidup, misalnya Markdown, HTML, audio, video, Javascript, dan sebagainya.
from IPython import display
display.Markdown('Contoh tulisan dengan huruf **tebal**')
Contoh tulisan dengan huruf tebal
display.Video('https://archive.org/download/Sita_Sings_the_Blues/Sita_Sings_the_Blues_small.mp4')
display.Audio(url="http://www.nch.com.au/acm/8k16bitpcm.wav")
Dengan begitu kayanya interativitas yang disediakan Jupyter notebook, maka Anda bisa melihat potensi penggunaannya, terutama untuk riset dan kolaborasi. Jadi kita memakai Jupyter notebook sebagai "kanvas" eksperimentasi kita, dan ketika kita perlu membagikan eksperimentasi kita kepada kolega, maka kita cukup membagikan notebook itu saja, dan semua ada di situ (narasinya, persamaan, kode, visualisai, dsb.)
Tidak. Walaupun Jupyter notebook ditulis dalam bahasa Python, namun kemampuan untuk mendukung suatu bahasa pemrograman di dalam notebook diimplementasikan secara modular dalam bentuk *kernel*. Saat ini ada lebih dari 130 kernel yang mendukung hampir 100 bahasa pemrograman misalnya:
Untuk daftar lengkapnya silakan lihat laman Jupyter Kernels.
Nah sekarang mudah-mudahan Anda semakin tertarik untuk mencoba Jupyter notebook. Mari kita install.
Jupyter notebook tersedia dalam bundel JupyterLab, atau secara mandiri dalam paket yang disebut Jupyter Notebook classic. Karena tutorial ini khusus membahas Jupyter Notebook, maka kita akan install Jupyter Notebook classic saja.
Sebelumnya, semestinya Anda harus sudah mempunyai instalasi Python. Kalau belum, maka Anda perlu menginstalasinya terlebih dahulu dari https://www.python.org/downloads/. Pilih Python versi 3 terakhir.
Untuk menginstalasi Jupyter Notebook, jalankan perintah ini di Terminal (Mac/Linux) atau Command Prompt (Windows):
python3 -m pip install --upgrade pip
python3 -m pip install jupyter
Setelah terinstall, maka siap dijalankan.
Untuk menjalankan Jupyter Notebook, jalankan perintah di bawah ini di Terminal (Mac/Linux) atau Command Prompt (Windows) dari direktori yang menaungi semua direktori proyek-proyek Anda (misalnya Anda mempunyai dua proyek yaitu di C:\project\project1
dan C:\project\project2
, maka jalankan dari direktori C:\project
agar Anda bisa mengakses kedua proyek tersebut dari Jupyter).
jupyter notebook
Setelah beberapa saat, jupyter akan membuka laman http://localhost:8888/ yang merupakan laman depan dari instalasi Jupyter notebook Anda (disebut laman *Notebook Dashboard*). Laman ini menampilkan semua direktori dan file yang ada di direktori dimana Jupyter dijalankan. Di tempat saya tampilannya seperti ini:
Sekarang kita siap membuat notebook baru.
Klik tombol *New, lalu pilih Python 3* seperti pada gambar di bawah ini:
Sebuah tab (atau window) baru akan muncul di browser Anda, berisi notebook baru yang kosong. Setelah beberapa saat (menunggu inisialisasi), kita siap menyunting notebook tersebut.
Setelah itu, bagian penting yang Anda harus ketahui adalah *sel* (atau *cell) (lihat gambar di atas). Sel* adalah tempat Anda menuliskan karya Anda, baik berupa narasi ataupun kode. Jenis sel Anda pilih dengan memilih pada dropdown jenis sel seperti yang ditunjukkan pada gambar. Pada awalnya, jenis sel adalah kode.
Untuk sel pertama, sebaiknya kita isi dengan narasi awal tentang karya kita, misalnya judul, narasi pendahuluan, dsb. Ikuti petunjuk berikut.
Untuk menulis narasi, gantilah jenis sel menjadi *Markdown* dari pilihan dropdown jenis cell di atas. Lalu tulislah judul dan narasi awal untuk karya Anda, misalnya seperti ini:
Ketika kita menyunting sel seperti ini, maka sel disebut sedang dalam *mode edit*. Perhatikan garis kotak hijau yang mengelilingi sel. Pada mode ini, untuk sel Markdown kode sumber Markdownnya akan ditampilkan.
Lalu kita jalankan (eksekusi) dengan petunjuk berikut ini.
Untuk melihat tampilan sebuah sel, maka sel itu harus kita jalankan, dengan mengklik sel itu agar menjadi fokus lalu pilih salah satu cara berikut:
Cara Menjalankan Cell dari Menu | Kunci Pintas | Keterangan |
---|---|---|
Menu Cell --> Run Cells | Ctrl+Enter (atau Cmd+Enter untuk Mac) |
Menjalankan sel |
Menu Cell --> Run Cells and Select Below | Shift+Enter |
Menjalankan sel lalu memindahkan fokus ke sel berikutnya |
Menu Cell --> Run Cells and Insert Below | Alt+Enter (atau Option+Enter untuk Mac) |
Menjalankan sel lalu membuat sel baru di bawahnya |
Menjalankan sel mempunyai makna yang berbeda tergantung jenis selnya. Untuk jenis sel Markdown, maka ini akan merubah kode Markdown itu menjadi tampilan yang diharapkan (dirender). Untuk jenis sel kode, maka kodenya akan dijalankan dan hasilnya ditampilkan.
Sebagai tambahan informasi, ada juga di menu Cell opsi untuk menjalankan semua sel:
Mari kita eksekusi sel Markdown kita di atas, dan hasilnya akan seperti ini:
Setelah sel dieksekusi, maka sel disebut ada dalam *mode command*. Perhatikan garis kotak biru yang mengelilingi sel.
Selanjutnya mari kita membuat sel baru bertipe kode. Tambahkan sel baru dengan memilih menu *Cell* --> *Insert Cell Below, atau dengan menekan tombol +
* dari toolbar.
Setelah sel dalam mode command, untuk menyunting kembali di mode edit* Anda bisa mengklik ganda sel itu atau mengklik sekali untuk menjadikan sel itu fokus lalu menekan Enter
.
Mari kita sunting sel kode seperti di bawah ini:
Perhatikan juga bahwa untuk jenis sel kode, ada square bracket di sebelah kiri sel, bertuliskan "In [ ]
". Square bracket ini nanti akan diisi angka urutan eksekusi setelah selnya dieksekusi.
Mari kita jalankan. Hasilnya akan seperti ini:
Yeyy.. kodenya dijalankan. Perhatikan square bracketnya sekarang terisi nomor urutan eksekusi ("In [1]
"). Nomor ini berguna karena urutan eksekusi tidak harus sama dengan urutan sel dalam notebook. Misalnya Anda punya lima sel, katakanlah sel 1 2 3 4 5, maka bisa saja Anda mengeksekusinya dengan urutan 1 4 2 5 3. Hal ini mungkin terdengar aneh sekarang. Tapi pada prakteknya ini merupakan hal yang sangat biasa Anda lakukan nantinya. Makanya nomor urutan eksekusi ini sangat berguna untuk diperhatikan.
Variabel-variabel dan fungsi-fungsi yang Anda deklarasikan di sel akan mempunyai lingkup global, dan bisa diakses dari sel lainnya. Misalnya, mari kita membuat sel baru yang mengakses variabel msg
yang kita deklarasikan di sel kedua tadi:
Anda bisa mengakses global variabel yang didefinisikan di sel lain, asalkan sel tempat variabel tersebut didefinisikan telah dieksekusi sebelumnya. Cara melihatnya adalah dengan melihat nomor eksekusi dalam braket kotak di sebelah kiri sel itu.
Dengan Markdown kita bisa membuat teks narasi yang cukup kaya. Semua fitur-fitur dasar yang dibutuhkan dalam penyuntingan teks didukung oleh Markdown, misalnya heading, mulai heading 1 sampai heading 6, tipografi (huruf tebal, miring, huruf tetap
, *tebal miring*, tercoret, dsb.).
List
List bernomor:
Dan juga tautan, gambar, tabel, kode, dan sebagainya. Banyak fitur-fitur ini yang sudah Anda lihat sendiri dalam notebook yang sedanga Anda baca ini!
Referensi lengkap dari Markdown dapat Anda lihat di laman Markdown Cheatsheet.
Harap dibedakan kode yang merupakan bagian dari narasi (di dalam sel Markdown), dengan kode hidup yang ada di dalam sel kode. Cuplikan kode dalam sel Markdown juga diwarnai sesuai sintaks (syntax coloring), sehingga terlihat bagus seperti pada cuplikan berikut:
def katakan(berita):
"""Fungsi untuk mengatakan berita"""
print(berita)
Jangan salah, cuplikan kode di atas hanyalah berupa teks Markdown dan tidak dapat dieksekusi, karena bukan dalam sel kode.
Cuplikan kode di atas ditulis dengan membungkus kodenya dengan tiga backtick (```
), lalu tuliskan bahasa pemrograman yang diinginkan untuk mengaktifkan pewarnaan sintaks, seperti ini:
```python
def katakan(berita):
"""Fungsi untuk mengatakan berita"""
print(berita)
```
Markdown mendukung Latex untuk menampilkan ekspresi matematika, yang bisa ditampilkan secara inline misalnya: $e^{i\pi} + 1 = 0$ atau mandiri:
$$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$$Persamaan inline diawali dan diakhiri dengan satu simbol dollar ($
):
$e^{i\pi} + 1 = 0$
Sedangkan persamaan yang dalam baris tersendiri diawali dan diakhiri dengan dua simbol dollar ($$
):
$$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$$
Untuk menutup notebook, pilih dari menu *File* --> *Close and Halt*.
Kadang-kadang window/tab browser tidak tertutup setelah Anda melakukan itu. Anda bisa menutup tab/window browser secara manual.
Anda bisa membuka notebook dari Notebook Dashboard dengan mengklik notebooknya:
Kini saatnya untuk membagikan karya gemilang notebook Anda pada orang-orang!
Saya akan mengelompokkan jenis cara membagikan menjadi dua, yaitu statis dan dinamis. Statis artinya penerima bisa melihat hasil eksekusi terakhir dari notebook, tapi tidak bisa mengeksekusi kode-kode di situ. Dinamis artinya penerima bisa mengeksekusi notebook itu.
Anda bisa membagikan notebook Anda sebagai file PDF atau HTML, dengan cara memilih menu *File* --> *Download as*. Cara ini cocok kalau kalau penerimanya kurang mengerti teknis, misalnya bos Anda hehe.
Kalau pekerjaan Anda tersimpan di GitHub atau GitLab, maka Anda cukup bagikan link ke file notebook di GitHub/GitLab itu. Penerima bisa melihat tampilan dari notebook Anda dari situ, atau mengunduhnya dan menjalankannya sendiri di komputernya.
Menurut saya cara ini adalah cara yang paling praktis untuk membagikan notebook ke kolega Anda.
Google Colab (https://colab.research.google.com) adalah layanan gratis untuk kolaborasi Jupyter notebook. Seperti Google Doc untuk berkolaborasi dalam menyunting dokumen, maka dengan Google Colab untuk berkolaborasi dalam menyunting Jupyter notebook!
Colab juga menyediakan fitur eksekusi GPU (gratis) bagi notebook Anda, sehingga sangat berguna untuk melatih model pembelajaran mesin Anda.
Colab bisa membuka notebook Anda dari GitHub, tapi kalau notebook Anda membutuhkan file lain (misalnya file gambar, atau file Python yang diimport oleh notebook Anda) maka mungkin harus ada langkah-langkah lain yang harus Anda lakukan (saya belum terlalu mencoba).
Nbviewer (https://nbviewer.jupyter.org/) adalah layanan untuk melihat notebook. Kalau notebook Anda dapat terakses dengan sebuah URL, maka Anda bisa melihat notebook tersebut dengan memberikan URLnya ke situ Nbviewer.
Cara ini tidak banyak berbeda dengan melihat notebook dengan GitHub/GitLab. Bedanya adalah dengan GitHub kita bisa melihat repository privat. Tapi GitHub sering error juga dalam menampilkan notebook, jadi cara ini bisa menjadi alternatif.
Anda juga bisa bagikan saja file notebooknya kepada kolega Anda. Jika notebook Anda membutuhkan file-file lain (misalnya file gambar, atau file Python yang diimport oleh notebook Anda), jangan lupa untuk membagikan file-file tersebut juga.
Cara ini hanya efektif kalau notebook Anda tidak tergantung pada file-file lain.
Kalau blog Anda di Wordpress, cara yang paling tepat untuk mempublikasikan notebook Anda menurut saya adalah dengan mengkonversinya ke HTML sederhana dengan utilitas nb2wp. Silakan Anda baca tautan nb2wp untuk informasi lebih lanjut. Oya utilitas ini buatan saya.
Export notebook ke HTML, lalu unggah file web atau blog Anda. Kalau Anda membutuhkan kustomisasi, Anda bisa edit file HTML-nya, atau rubah template nbconvert
(agak panjang ceritanya).
Cara ini lumayan, tapi membutuhkan layanan web atau blog yang memungkinkan Anda mengunggah file HTML secara utuh. Wordpress.com, misalnya, tidak memperbolehkan ini.
Cara lain yang mudah adalah meng-embded Gist di laman postingan blog. Caranya:
.ipynb
) di teks editor.ipynb
agar gist ini ditampilkan sebagai Jupyter notebookDengan cara ini, notebook akan tampil dalam sebuah iframe kecil yang bisa di-scroll.
Cara ini mungkin cocok kalau Anda berniat untuk membuat narasi tersendiri di blog Anda, dan hanya ingin mereferensi notebook Anda.
Kelebihan cara ini adalah mudah, sedangkan kekurangannya menurut saya:
Mari kita sedikit mengenal tentang konsep *kernel* pada Jupyter notebook.
Kernel adalah komponen dari Jupyter yang bertugas untuk mengeksekusi kode yang terdapat di notebook dan mengirimkan kembali hasilnya untuk ditampilkan di notebook. Ketika kita membuka notebook, maka server Jupyter notebook (ingat, yang kita jalankan pertama kali dengan perintah jupyter notebook
) akan membuat satu kernel untuk sesi notebook itu. Satu notebook hanya akan terhubung dengan tepat satu kernel. Sebenarnya satu kernel bisa melayani beberapa sesi, tapi biasanya untuk server pribadi satu kernel hanya akan melayani satu notebook.
Ketika Anda menutup notebook dan kernelnya tetap berjalan, maka lain kali Anda membuka notebook itu, notebook itu akan dihubungkan dengan kernel yang sebelumnya. Klien yang lain juga bisa terhubung ke kernel yang sama (misalnya dengan menggunakan Qt console).
Anda bisa melihat status kernel di notebook Anda di sini:
Gambar di atas menunjukkan kernel Python 3 sedang aktif.
Anda juga bisa melihat bahwa notebooknya sedang berjalan di Notebook Dashboard:
Kernel-kernel yang sedang berjalan dapat dilihat di tab *Running* di Notebook Dashboard:
Ada juga opsi untuk menshutdown suatu kernel. Anda bisa melakukannya misalnya ketika notebooknya sudah Anda tutup tapi kernelnya masih tetap berjalan.
Mungkin nanti Anda akan mengalami situasi dimana koneksi dari notebook Anda ke kernel terputus, dan akan ada dialog seperti ini:
Dan/atau status kernel di notebook Anda tertulis *"Connecting to Kernel"* atau *"Not Connected"* disertai ikon rantai terputus seperti ini:
Tidak usah kuatir, Anda tinggal menjalankan ulang kernelnya dari menu *Kernel* --> *Restart*. Akan ada beberapa dialog peringatan, okein saja.
Kadang-kadang merestart kernel tidak berhasil menghubungkan notebook dengan kernel yang baru direstart. Kalau ini terjadi, Anda bisa mencoba menyambungkannya dengan menu *Kernel* --> *Reconnect. Kalau masih tidak bisa, kadang Kernel* --> *Restart & Clear Output* atau *Kernel* --> *Restart & Run All* lebih ampuh untuk merestart kernel. Tapi ada perbedaan dari menu-menu ini yang perlu Anda ketahui (akan dijelaskan di bagian selanjutnya).
Kalau masih tidak bisa juga, Anda bisa menyimpan notebook Anda, lalu menutup dan membuka ulang notebooknya. Kalau masih tidak bisa juga, Anda bisa restart Jupyter servernya dengan menekan Ctrl+C
pada terminal tempat jupyter notebook
berjalan, lalu jalankan ulang jupyter notebook
.
Seperti dijelaskan di atas, kode di notebook akan dieksekusi di kernel. Kernel menyimpan definisi variabel global, fungsi, dan perubahan nilai suatu variabel sebagai akibat dari eksekusi suatu sel. Dengan demikian, kalau kernelnya dijalankan ulang, baik karena suatu masalah ataupun dalam situasi normal ketika Anda menutup dan membuka notebook, maka state-nya pun akan hilang dan berawal lagi dari nol.
Akibatnya kalau Anda mengeksekusi suatu kode, mungkin akan berakhir dengan error, seperti pada contoh di bawah:
Pada gambar di atas, saya menambah sel baru untuk menampilkan variabel msg
, tapi ternyata kernel bilang bahwa variabel msg
tidak dikenal. Mungkin Anda melihat ini sebagai hal yang aneh, karena variabel msg
sudah didefinisikan di atasnya.
Tapi sebenarnya ini tidak aneh. Dua sel kode sebelum sel terakhir, itu dieksekusi oleh kernel sebelumnya. Outputnya memang masih tertulis di situ, karena memang notebook menampilkan output dari eksekusi terakhir kan. Sedangkan sel terakhir, itu dieksekusi oleh kernel yang sekarang. Anda bisa lihat di nomor urutan eksekusi di sel terakhir, tertulis [1]
. Artinya ini adalah eksekusi pertama dari kernel yang sekarang. Dua sel kode sebelumnya mempunya urutan eksekusi yang nilainya sama dan lebih besar dari 1, hal ini hanya mungkin terjadi kalau sel tersebut dijalankan oleh kernel sebelumnya dan belum dijalankan oleh kernel yang sekarang.