如何处理2个小部件事件来控制数据框?

时间:2019-06-12 10:20:14

标签: python pandas ipywidgets

我正在尝试使用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)

显示的数据框不会随着小部件值的改变而改变。

1 个答案:

答案 0 :(得分:0)

我尝试运行您的代码,更改窗口小部件值时永远不会调用A_eventhandler函数(您可以通过在print(change)调用之前运行common_processing来进行检查。)

原因是您的names关键字需要是列表,而不是字符串。因此,请尝试:

    A.observe(A_eventhandler, names=['value'])
    B.observe(B_eventhandler, names=['value'])

当我在窗口小部件上设置observe时,我总是总是先不进行任何过滤,而只是将结果打印在观察到的函数中。然后,您可以添加关键字以仅过滤所需的事件和值。

此外,不要忘记在代码中的display(out)处捕获捕获的输出。否则,您将永远看不到任何东西!