我正在尝试使用2个ipywidgets来控制数据帧并刷新2个ipywidgets作为更改。
创建一个新列(Check_value),该列将值列向下移动小部件A中的值
过滤并仅显示Check_value比“值”列大按小部件B中的值的行
数据框:
日期|价值观 第一天| 5 第2天| 9 第三天14 第4天| 40 第5天| 80
## Widget A
A = widgets.IntSlider(
value=1,
min=1,
max=30,
step=1)
## Widget B
B = widgets.IntSlider(
value=1,
min=1,
max=30,
step=1)
out = widgets.Output()
## Processing
def common_processing(period, filters):
out.clear_output()
with out:
df = pd.read_csv(data.csv)
df['Dates'] = pd.to_datetime(df['Dates'])
df['check_value'] = df['Value'].shift(-period)
df['delta'] = df['check_value'] - df['Value']
display(df[df['delta'] > filters])
def A_eventhandler(change):
common_processing(change.new, B.value)
def B_eventhandler(change):
common_processing(A.value, change.new)
A.observe(A_eventhandler, names='value')
B.observe(B_eventhandler, names='value')
display(A)
display(B)
显示的数据框不会随着小部件值的改变而改变。
答案 0 :(得分:0)
我尝试运行您的代码,更改窗口小部件值时永远不会调用A_eventhandler函数(您可以通过在print(change)
调用之前运行common_processing
来进行检查。)
原因是您的names
关键字需要是列表,而不是字符串。因此,请尝试:
A.observe(A_eventhandler, names=['value'])
B.observe(B_eventhandler, names=['value'])
当我在窗口小部件上设置observe
时,我总是总是先不进行任何过滤,而只是将结果打印在观察到的函数中。然后,您可以添加关键字以仅过滤所需的事件和值。
此外,不要忘记在代码中的display(out)
处捕获捕获的输出。否则,您将永远看不到任何东西!