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 이야기긴한데, 비교할만한 대상인듯
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)