주피터 노트북에서 Interactive Widget 사용하기
주피터 노트북에서 Interactive Widget 사용하기¶
by JunPyo Park
- Reference: Interactive Controls in Jupyter Notebooks
데이터를 분석하거나 분석된 결과를 확인할 때 input parameter 들을 조금씩 바꿔가면서 같은 코드셀을 여러번 반복적으로 실행하느라 시간을 많이 쓴 경험이 있으신가요? 이런
노가다(?)를 조금 더 효율적으로 할 수 있도록 IPython Widgets(ipywidgets)을 활용하는 방법을 정리해 보았습니다.
Requirement¶
먼저 IPython Widgets를 설치합니다. 지금 사용하시는 주피터 환경에 바로 설치하신다면 아래 명령어를 실행하여 바로 설치가 가능합니다.
!pip install ipywidgets
설치가 완료되었다면 아래의 명령어를 실행시켜 주피터 노트북에서 위젯이 사용가능하도록 설정하여 줍니다.
!jupyter nbextension enable --py widgetsnbextension
주피터 랩을 사용하신다면 아래 명령어로 실행하여 주세요.
!jupyter labextension install @jupyter-widgets/jupyterlab-manager
IPython Widgets Tutorial¶
import numpy as np
import pandas as pd
from sklearn import datasets
import ipywidgets as widgets
from ipywidgets import interact, interact_manual
import cufflinks as cf
cf.go_offline(connected=True)
예재로 사용할 난수 데이터프레임을 하나 만들어 줍니다.
df = pd.DataFrame(np.random.random([100,3]) * 10)
df.columns = ['Feature1','Feature2','Feature3']
df.head()
데이터 필터링¶
위의 임시 데이터를 활용하여 가장 간단한 데이터 필터링(슬라이더) 위젯을 만들어 보겠습니다. 아래와 같이 @interact 데코레이터를 활용하여 손쉽게 구현이
가능합니다.
@interact
def show_data_more_than(column=['Feature2','Feature3'],
x=(0,10,1)):
return df.loc[df[column] > x]

리스트로 넘겨준 Feature2, Feature3 column중 하나를 선택 가능하고 선택된 곳의 데이터가 스크롤한 x 값 보다 큰곳만 반환되어 출력됩니다. 스크롤바의 범위는 (0,10,1)의 형태로 주어지는데 (최소, 최대, 간격)을 의미합니다.
위젯을 활용한 시각화¶
@interact 데코레이터를 사용하여 시각화를 조금더 편리하게 할 수 있습니다. 원하는 피쳐를 선택하여 scatter plot을 그리도록 만들어 보겠습니다.
@interact
def scatter_plot(x=list(df.select_dtypes('number').columns),
y=list(df.select_dtypes('number').columns),
theme=list(cf.themes.THEMES.keys()),
colorscale=list(cf.colors._scales_names.keys())):
if x.title() == y.title():
print('Can Not Use Same Value')
else:
title=f'{y.title()} vs {x.title()}'
df.iplot(kind='scatter', x=x, y=y, mode='markers',
xTitle=x.title(), yTitle=y.title(),
#text='title',
title=f'{y.title()} vs {x.title()}',
theme=theme, colorscale=colorscale)

DatePicker 활용하기¶
시계열 데이터를 활용할 경우 유용하게 사용될 수 있는 DatePicker 기능을 사용해 보도록 하겠습니다. 이번에는 함수를 먼저 만들고 interact 명령어를 따로
활용하여 보겠습니다.
import datetime
def days_between(start_dt,end_dt):
# 시작일과 종료일 사이에 몇일이 있는지 계산합니다.
print((end_dt-start_dt))
interact(days_between,
start_dt=widgets.DatePicker(value=datetime.date(2018,1,1)),
end_dt=widgets.DatePicker(value=datetime.date(2019,1,1)));

위젯끼리 연관되어 있을 때¶
어떤 위젯에 변동이 있을 때 다른 위젯이 같이 변해야 한다면 이를 observe 명령어를 활용해 구현이 가능합니다. 아래 예재는 x,y 값의 합이 100을 유지해야
하는 조건을 구현해 보았습니다. x의 value가 변하면 y의 value도 그에 맞게 변해야 하고 반대로 y의 value가 변하면 x의 value도 그에 맞게 변해야 합니다.
observe 명령어와 update 함수를 만들어 쉽게 구현이 가능합니다.
x = widgets.IntSlider(min=0, max=100, step=5, value=50)
y = widgets.IntSlider(min=0, max=100, step=5, value=50)
def update_y_range(*args):
y.value = 100 - x.value
def update_x_range(*args):
x.value = 100 - y.value
y.observe(update_x_range, 'value')
x.observe(update_y_range, 'value')
def printer(x,y):
print(x,y)
interact(printer,
x=x,
y=y);

Conclusion¶
주피터 노트북에서 간단한 위젯 사용법에 대해 정리해 보았습니다. 더욱 자세한 부분은 Documentation을 참고해 주세요! 이 글이 여러분들의 효율적인 노가다(?)에 조금이라도 기여한다면 좋을것 같습니다. 읽어주셔서 감사합니다.