[英]Jupyter Notebook + iPython Widgets - Dynamic Number of Widgets
我正在編寫一個腳本,最終將允許使用 ipywidgets 進行數據探索。 我已經為某些人可能有興趣過濾的動態數量的列做了一些工作,但事實證明以動態方式實現交互功能很困難。 下面是我在 Jupyter 中運行的示例代碼:
import ipywidgets as widgets
from ipywidgets import interact
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/yankev/testing/master/datasets/nycflights.csv')
df = df.drop(df.columns[[0]], axis=1)
filter_cols = list(['origin','dest','carrier']) #list N columns we want to filter on
filter_df = df[filter_cols] #pull selected N columns from dataframe
filter_df.drop_duplicates(inplace=True) #remove duplicates
#loop through columns and create variables/widgets
for idx, val in enumerate(filter_cols):
#creates N variables (filter0, filter1, filter2) with unique values for each column with an All option
globals()['filter{}'.format(idx)] = ['All']+sorted(filter_df[val].unique().tolist())
#creates N widgets (widget0, widget1, widget2) for interact function below
globals()['widget{}'.format(idx)] = widgets.SelectMultiple(
options=globals()['filter{}'.format(idx)],
value=['All'],
description=val,
disabled=False
)
#looking to make this function dynamic based on the number of columns we want to filter by
#filters down source dataframe based on widget value selections
def viewer(a, b, c = list()):
#if widget selection is 'All', pass the full filter list, else filter only to what is selected in the widget
return df[df['origin'].isin(filter0 if a==('All',) else a)
& df['dest'].isin(filter1 if b==('All',) else b)
& df['carrier'].isin(filter2 if c==('All',) else c)].shape[0]
#displays N filters
#returns record count for filter combination
interact(viewer, a=widget0, b=widget1, c=widget2)
代碼的后半部分,在循環之后,是我想要動態化的。 就目前而言,我必須更改列名稱標注並添加/刪除任何其他過濾器的代碼。 將操作量限制在腳本中的幾個點會很好。
任何建議都非常感謝。 謝謝!
我不太詳細地遵循您的代碼,但總的來說,可以使用關鍵字參數顯示動態數量的小部件並與之交互:
n_widgets = 3
widget_args = {"widget{}".format(i): widgets.IntSlider() for i in range(n_widgets)}
def viewer(**args):
print([v for v in args.values])
interact(viewer, **widget_args)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.