【问题标题】:How to handle 2 widget events to control a dataframe?如何处理 2 个小部件事件来控制数据框?
【发布时间】:2019-06-17 19:01:29
【问题描述】:

我正在尝试使用 2 个 ipywidgets 来控制一个数据框并刷新作为 2 个 ipywidgets 的更改。

创建一个新列 (Check_value),将 Values 列向下移动小部件 A 中的值

通过小部件 B 中的值过滤并仅显示 Check_value 大于 Value 列的行

数据框:

日期 |价值观 第一天 | 5 第 2 天 | 9 第 3 天 | 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)

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

【问题讨论】:

    标签: python pandas ipywidgets


    【解决方案1】:

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

    原因是您的names 关键字需要是一个列表,而不是一个字符串。所以试试:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多