Membuat dasbor analitik untuk keuangan pribadi menggunakan Panel
Saya mencatat keuangan pribadi saya menggunakan pendekatan plain-text accounting menggunakan [Hledger](https://hledger.org). Saya sempat bahas beberapa kali di [sini](?q=hledger). Meski nyaman dengan antarmuka command-line, saya merasa informasi yang saya dapatkan kurang berdampak. Sama seperti yang diungkapkan Allaman [rangkuman diskusi ini](https://hledger.org/visualising2023.html), saya juga tidak ingin jurnal-jurnal saya berguna sebagai "data sink" saja. Eksplorasi teknik dalam menarik insight dari jurnal keuangan saya dimulai sekitar satu semester sejak awal saya menggunakan Hledger. ## Perjalanan menemukan opsi yang tepat Setelah sekitar 6 bulanan mencatat keuangan, saya ingin sekali melihat performa keuangan saya secara visual, dan harapannya juga bisa menjadikannya sebagai pertimbangan keputusan masa depan. Hal pertama kali saya coba adalah GNUPlot. Sederhananya, saya menjalankan GNUPlot untuk menggambar grafik melalui output CSV `ledger` (saat itu belum ada `hledger` di Android). Ini saya lakukan di HP Android saya melalui Termux dan dipermudah dengan Termux:Widget. Pada saat yang sama, saya juga aktif membuat banyak convenience script untuk workflow harian saya, misalnya untuk mencatat pos menggunakan template, membatalkan transaksi, atau untuk melihat pengeluaran harian. Secara analitik, saya lebih banyak mendapat insight dari command-command hledger yang saya jalankan di Terminal. Script GNUPlot yang saya buat hanya terbatas pada visualisasi akun-akun balance sheet seperti aset dan liabilities. Selain karena merasa ini terbatas, saya juga merasa sistem ini sulit untuk di-extend. Jika saya ingin menambahkan sesuatu, saya harus membuat script Bash untuk mengekspor data dari ledger, mentransformasi data tersebut bila perlu, kemudian mengopernya ke GNUPlot untuk divisualisasikan. Secara pribadi, saya merasa sintaks GNUPlot sulit untuk dikuasai, bahkan saat ini saya masih belum sepenuhnya mahir menggunakan GNUPlot. Untuk bisa mendapatkan pengetahuan yang lebih baik tentang performa keuangan saya, saya berencana untuk memikirkan cara selain menggunakan script dan GNUPlot. Akhirnya, saya bisa menyimpulkan bahwa yang saya butuhkan adalah sistem analytics dengan kriteria berikut: 1. Punya kemampuan untuk menambahkan fungsi-fungsi dengan mudah tanpa harus merubah banyal hal yang sudah ada 2. Rapi, tidak tercecer seperti script Bash/GNUPlot 3. Mendukung eksplorasi data dari Hledger dengan cara yang sederhana, ini termasuk proses ekspor data, transformasi, hingga visualisasi. 4. Jika memungkinkan, dapat berjalan secara interaktif (pada kasus menampilkan plot net asset menggunakan GNUPlot di atas, saya tidak bisa dengan mudah mengecualikan suatu akun, harus edit scriptnya) Akhirnya, saya mencoba cara-cara berikut: 1. Jupyter Notebook. Saya membuat satu Python notebook dengan berbagai section untuk berbagai tujuan. Misal, ada section untuk menampilkan net asset, ada section untuk breakdown expenses dan income, dan sebagainya. Setiap pagi, output notebook ini diconvert dengan nbconvert lalu dikirim ke email saya. Pendekatan ini berjalan dengan baik dan saya rasa sangat fleksibel. Saya bisa menambah fungsinya dengan mudah, outputnya rapi, menggunakan Python, namun tidak interaktif. Jika ingin melakukan analisis, saya harus menjalankan jupyter server dan bereksperimen langsung dengan mengedit kode Python pada notebook. Untuk saya, ini bukan hal yang nyaman karena butuh waktu lama. Akan lebih cepat jika saya langsung saja menggunakan hledger untuk melakukan query yang sama mau. Saya butuh interaktivitas dan integrasi dengan Hledger yang tidak terlalu erat. 2. Bikin framework pakai PHP. Di sini saya mengeluh "ngapain capek-capek bikin adapter atau transform data di Python kalau hledger saja bisa menampilkan data yang saya butuhkan dengan baik dan fleksibel?" Saya bingung. Akhirnya, saya coba untuk membuat framework analytics Hledger menggunakan PHP yang menggunakan sistem modul. Setiap modul, yang dimuat dalam satu file tersendiri, setidaknya bisa menampilkan output command hledger menggunakan argumen-argumen yang diterima dari interface web. Sederhana seperti yang saya butuhkan. Jika ingin menambahkan modul, misalnya untuk menampilkan pengeluaran bensin bulanan, tinggal copy saja dari module yang sudah ada. Sampailah di titik saya merasa saya butuh visualisasi. Awalnya, saya kira saya bisa saja mengeksekusi GNUPlot lalu menampilkan outputnya ke web. Namun, ternyata ini lebih sulit dari yang saya kira. Input dari web harus diterjemahkan ke command hledger untuk menghasilkan output yang dapat diplot oleh GNUPlot. Artinya, data harus ditransformasi bila perlu. Di titik ini, saya merasa lebih nyaman jika Pandas ada di PHP. Ide framework PHP ini saya batalkan. ## Mungkin berakhir dengan Panel Sebenarnya, saya sudah lama melirik platform dashoard interaktif bernama [Panel](https://panel.holoviz.org/). Saya enggan mencoba karena khawatir akan diribetkan dengan maintenance atau update. Namun, setelah saya pikir-pikir kembali, Panel cukup stabil karena didukung oleh Anaconda. Juga, jika terjadi apa-apa, saya tinggal mengurus sendiri saja, toh juga software-nya open source. Akhirnya saya mencoba Panel. Pada contoh-contoh di website mereka, sebagian besar aplikasi adalah Single-Page Apps (SPA). Namun, saya menginginkan sistem yang multi-page agar modul analytics dapat punya halamannya masing-masing. Karena ini, saya membaca banyak sekali dokumentasi soal Panel dan Holoviz. Ternyata, fitur ini sudah ada dan didukung. Hanya saja, fitur multi-page bawaan tidak mendukung navigasi antar app dari dalam app. Hanya ada index page yang berisi daftar app terpisah yang dimuat. Agar lebih kohesif, saya memutuskan untuk membuat custom template saja. Menurut saya, API dan dokumentasi yang disediakan Panel pada websitenya sudah lengkap, meskipun terkadang masih harus membaca source code di GitHub. Custom template yang saya buat dibangun dengan Bootstrap 5. Perbedaan utama dari template bawaan hanya pada sidebar yang juga menampilkan aplikasi lain yang sedang di-serve sehingga mempermudah navigasi antar Panel app. Saya juga membuat search bar yang diperkaya dengan fuzzy search menggunakan Fuse.js sehingga mempermudah pencarian terutama ketika nanti jumlah modulnya sudah banyak. Sistem modul pada dashboard Panel yang saya kembangkan ini relatif sederhana. Suatu modul adalah suatu file Python dalam direktori 'modules'. Ketika dijalankan, script entry point akan membaca daftar modul serta metadatanya, membangun custom template untuk masing-masing modul, lalu [di-serve menggunakan `pn.serve()`](https://panel.holoviz.org/how_to/server/multiple.html). Di beberapa bulan mendatang, saya akan ulas kembali terkait pengalaman saya menggunakan Panel. Saya juga penasaran, apakah saya akan betah? Created: 2025-08-06 08:12:02, Updated: 2025-08-06 11:58:59, ID: 5bcdacaf-84d4-4adb-b030-bfad03b662b9