Voila를 사용해 Jupyter Notebook Dashboard 만들기
in Development on Python
- Jupyter notebook에서 voila를 사용해 대시보드 만드는 방법에 대해 작성한 글입니다
- R의 Shiny처럼 Python Jupyter Notebook에선 Voila를 사용하면 빠르게 웹에 대시보드를 띄울 수 있습니다
Voila를 사용하게 된 이유
- 대시보드는 다양한 대체 수단이 많음
- Tableau, 스프레드시트, Superset, Metabase 등
- 대부분의 경우엔 BI 도구를 활용해도 충분함
- 종종 발생하는 경우
- 1) 지도에 데이터를 뿌려야 할 경우, 지도 표현을 잘 제공한다면 문제되지 않지만 지도를 잘 지원해주는 BI 도구는 적음
- 2) 파이썬으로 전처리를 해야할 경우
- 위 두가지 경우 Jupyter Notebook에 코드를 작성하고 주기적으로 html으로 저장할 수 있음
- 그러나 html이 아닌 ipywidget 등을 사용해 특정 시점의 데이터를 볼 수 있도록 만들려면 노트북에서 결과를 한번 실행해야 함(html 추출시 ipywidget은 같이 추출되지 않음)
- 3) 노트북에서 시각화, 지표 확인을 모두 하고싶은 경우
- Voila를 사용하면 ipywidget과 노트북을 같이 렌더링해줌
- Dash나 julyterlab-dash도 있지만 쉬운 사용성은 아니라 생각해 Voila를 선택함
- 블로그 글에 따르면 Jupyter의 하위 프로젝트로 통합되었다고 함
- 아직 0.1.20 버전이지만 추후 더 발전할 가능성이 있다고 생각
Voila의 특징
- 1) Jupyter Notebook 결과를 쉽게 웹에 띄울 수 있음
- 2) Ipywidget, Ipyleaflet 등 사용 가능
- 3) Jupyter Notebook의 Extension 있음(=노트북에서 바로 대시보드로 변환 가능)
- 4) Python, Julia, C++ 코드 지원
- 5) 고유한 템플릿 생성 가능
설치
- Mac OS 기준
- jupyter client 업그레이드
- cannot import name ‘secure_write’ from ‘jupyter_core.paths’ 에러가 발생할 경우 jupyter_client 업그레이드
pip3 install --upgrade jupyter_client
pip로 설치
pip3 install voila
JupyterLab preview extension 설치(JupyterLab 사용시만)
jupyter labextension install @jupyter-voila/jupyterlab-preview
혹시
jupyter-labextension
not found Error가 발생한다면 jupyterlab을 설치하지 않은 것pip3 install jupyterlab
notebook이나 jupyter_server extension 설치
jupyter serverextension enable voila --sys-prefix
아래 명령어로 voila/extension이 enabled인지 확인
jupyter nbextension list # jupyter_server의 경우 jupyter serverextension list
사용 방법
간단한 Jupyter Notebook 파일 생성(이름 : voila_test)
import ipywidgets as widgets slider = widgets.FloatSlider(description='$x$', value=4) text = widgets.FloatText(disabled=True, description='$x^2$') def compute(*ignore): text.value = str(slider.value ** 2) slider.observe(compute, 'value') widgets.VBox([slider, text]) import pandas as pd iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') iris.tail()
1) voila로 노트북 렌더링(코드 안보임)
voila voila_test.ipynb
- localhost:8866로 접근하면 아래 결과를 확인할 수 있음
- 2) voila로 노트북 렌더링(코드 보임)
--strip_sources=False
조건을 주면 기존 노트북의 코드도 보임(셀 실행은 불가능)
voila voila_test.ipynb --strip_sources=False
3) voila 폴더 실행
voila
- 현재 폴더에 있는 파일을 voila로 실행할 수 있음
- 4) Notebook의 Extension 클릭
- 노트북 실행 후 Voila 클릭하면 1)과 같은 결과가 바로 보임
옵션이 더 궁금하다면 터미널에서 아래 명령어 입력
voila --help
사용하며 체득한 Tip
- Voila 실행시 셀 타임아웃 제한이 있음
- 기본적으로 한 셀을 실행하는데 30초 소요되면 Timeout Error 발생(터미널 로그에만 남고 웹은 계속 진행중 처럼 나옴)
- voila 실행시 아래 명령어를 사용해 타임아웃을 늘릴 수 있음
- 참고한 Github Pull request
voila --ExecutePreprocessor.timeout=180
- 보안 이슈 해결하기
- 해당 이슈를 보면 oauth 기능을 추가할 예정인듯
- oauthenticator를 사용해 직접 만들까 고민하다 Notebook의 암호를 사용하는 방법을 생각함
- 암호 생성
- 터미널에서 Python3 실행 후, 아래 커맨드 입력
from IPython.lib import passwd passwd()
- ‘sha1:~~’ 복사하기
jupyter_notebook_config.py 생성
vi ~/.jupyter/jupyter_notebook_config.py c = get_config() c.NotebookApp.password = 'sha1:~~~ 붙여넣기'
- notebook을 재실행하면 암호 입력하게 됨
- 특정 nbextension이 404 발생하는 경우
- voila로 직접 노트북 파일 실행시 특정 nbextension(pydeck쪽)이 404가 발생해서 아래 명령어로 해결
voila your_notebook.ipynb --enable_nbextensions=True
- jupyter notebook extension에서 voila를 실행할 경우엔 인자를 줄 수 없고, notebook 실행시 옵션을 줘야함. [참고 문서]
jupyter notebook --ExecutePreprocessor.timeout=180 --VoilaConfiguration.enable_nbextensions=True
사용 예시
- Voila Gallery에 여러 예시가 존재함
- machine-learning-interactive-visualization이 눈에 띄어서 소스를 clone한 후 실행해봄
- bqplot도 Voila를 사용해 쉽게 대시보드화 할 수 있음
- volia-vuetify엔 VuetifyJS를 사용한 대시보드 템플릿을 볼 수 있음
배포
- 공식 문서를 보면 mybinder.org, Heroku, Google App Engine 등에서 배포하는 방법이 간단히 나와있음
Voila Architecture
Reference
- Voila Github
- And voila
- Voilà is now a Jupyter subproject
- voila demo
- Dashboarding with Jupyter Notebooks, Voila and Widgets
- Turn any Notebook into a Deployable Dashboard : 이건 Panel 이야기긴한데, 비교할만한 대상인듯
카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.