Voila를 사용해 Jupyter Notebook Dashboard 만들기


  • 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과 노트북을 같이 렌더링해줌
    • Dashjulyterlab-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 Architecture



Reference


카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.

PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다

이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.

Buy me a coffeeBuy me a coffee





© 2017. by Seongyun Byeon

Powered by zzsza