首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: ipywidget没有显示输出

Python: ipywidget没有显示输出
EN

Stack Overflow用户
提问于 2022-05-25 21:56:53
回答 1查看 701关注 0票数 0

我编写了一个python脚本,它应该有一个数据框架作为输出,但是它没有显示任何输出。下面是python代码:

代码语言:javascript
复制
import pandas as pd
import numpy as np
import ipywidgets as widgets
import datetime
from ipywidgets import interactive
from IPython.display import display, Javascript
from datetime import date, timedelta
from random import choices
  

books = ["Book_1","Book_2","Book_3","Book_4","Book_5"]
counterparties = ["Counterparty_1","Counterparty_2","Counterparty_3","Counterparty_4","Counterparty_5"]

book = choices(books, k = 100)
counterparty = choices(counterparties, k = 100)


date1, date2 = date(2018, 8, 1), date(2023, 8, 3)
  
res_dates = [date1]
  
while date1 != date2:
    date1 += timedelta(days=1)
    res_dates.append(date1)
  
ldd = choices(res_dates, k=100)

dict = {'book': book, 'counterparty': counterparty, 'last_trading_date': ldd} 

df = pd.DataFrame(dict)



books = pd.Categorical(df['book'])
books = books.categories

books_dropdown = widgets.Dropdown(
    options=books,
    value=books[0],
    description='Book:',
    disabled=False,
)


counterparty = pd.Categorical(df['counterparty'])
counterparty = counterparty.categories

counter_dropdown = widgets.Dropdown(
    options=counterparty,
    value=counterparty[0],
    description='Counterparty:',
    disabled=False,
)


date_picker = widgets.DatePicker(
    description='Pick a Date',
    disabled=False,
)
date_picker.add_class("start-date")

script = Javascript("\
                const query = '.start-date > input:first-of-type'; \
                document.querySelector(query).setAttribute('min', '2020-12-01'); \
                document.querySelector(query).setAttribute('max', '2025-01-01'); \
        ")


box = widgets.VBox([books_dropdown, counter_dropdown, date_picker])
display(box)

def filter_function(bookcode, cpartycode, datecode):
        
    filtered = df[(df['book'] == bookcode) & (df['counterparty'] == cpartycode)]
    
    x = datetime.date(datecode.value)
    
    filtered = filtered[filtered['last_trading_date'] < x]
    
    with report_output:
        report_output.clear_output()
        display(filtered)
        
interactive(filter_function, bookcode=books_dropdown, cpartycode=counter_dropdown, datecode=date_picker) 

report_output = widgets.Output()
display(report_output)

这样做基本上是根据两个变量的类别将所述数据帧子集为较小的数据帧,并根据用户选择的日期截断结果数据帧。

我在什么地方犯了错吗?如果是的话,有人能指点我在哪里吗?提前谢谢你。

编辑:

经过多次尝试,我得出结论,这个问题与DatePicker小部件有关。所以当你试图解决这个问题时,你可以集中精力解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 06:10:11

下面是我用来重现问题的代码,如果我理解正确的话:

代码语言:javascript
复制
from datetime import date, timedelta
from random import choices 
import pandas as pd
import ipywidgets as widgets
import datetime
from ipywidgets import interactive
from IPython.display import display, Javascript

books = ["Book_1","Book_2","Book_3","Book_4","Book_5"]
counterparties = ["Counterparty_1","Counterparty_2","Counterparty_3","Counterparty_4","Counterparty_5"]

book = choices(books, k = 100)
counterparty = choices(counterparties, k = 100)


date1, date2 = date(2018, 8, 1), date(2023, 8, 3)
  
res_dates = [date1]
  
while date1 != date2:
    date1 += timedelta(days=1)
    res_dates.append(date1)
  
ldd = choices(res_dates, k=100)

dict = {'book': book, 'counterparty': counterparty, 'last_trading_date': ldd} 

df = pd.DataFrame(dict)

df['last_trading_date'] = pd.to_datetime(df['last_trading_date'], format = '%Y-%m-%d').dt.date


books = pd.Categorical(df['book'])
books = books.categories

books_dropdown = widgets.Dropdown(
    options=books,
    value=books[0],
    description='Book:',
    disabled=False,)

counterparty = pd.Categorical(df['counterparty'])
counterparty = counterparty.categories

counter_dropdown = widgets.Dropdown(
    options=counterparty,
    value=counterparty[0],
    description='Counterparty:',
    disabled=False,
)

date_picker = widgets.DatePicker(
    description='Pick a Date',
    disabled=False,
)

date_picker.add_class("start-date")

script = Javascript("\
                const query = '.start-date > input:first-of-type'; \
                document.querySelector(query).setAttribute('min', '2020-12-01'); \
                document.querySelector(query).setAttribute('max', '2025-01-01'); \
        ")

def filter_function(bookcode, cpartycode, datecode):
        
    filtered = df[(df['book'] == bookcode) & (df['counterparty'] == cpartycode)]
    
    filtered = filtered[filtered['last_trading_date'] < datecode]
    
    with report_output:
        report_output.clear_output()
        display(filtered)  
        
w = interactive(filter_function, bookcode=books_dropdown, cpartycode=counter_dropdown, datecode=date_picker) 

display(w)
report_output = widgets.Output()
display(report_output)

使用在朱庇特笔记本中运行代码时显示的小部件,我得到以下输出:

我在您提供的代码中所做的更改只有:

  1. 将VBox.
  2. Store交互式小部件的代码作为变量删除,并使用display()显示。
  3. 直接使用datecode参数来filtered_function来创建< code >D11,而不是使用VBox
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72384574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档