首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Dataframes中使用Ipywidget

在Dataframes中使用Ipywidget
EN

Stack Overflow用户
提问于 2020-08-06 10:24:43
回答 1查看 249关注 0票数 0

我正在努力学习如何创建与数据文件的交互。我已经阅读了Ipywidget 文档,试图尽可能地获取更多的信息,还有一些如何操作的博客,但是当涉及到现实世界时,我无法复制相同的结果。不过,我知道这很常见。

不管怎样,到目前为止我已经试过这样做了:

代码语言:javascript
复制
week = [value for value in canali_weekly.index.get_level_values(level=1).unique()]
values = [value for value in canali_weekly.columns]

@widgets.interact(
    
    x = widgets.IntSlider(min=0, max=canali_weekly["Self"].max(), step=10, description='N. Self minime vendute:'),
    
    s = widgets.IntRangeSlider(
        value = [max(week)-1, max(week)],
        min=min(week),
        max=max(week),
        step=1,
        description='Confronto settimane:'        
    ),
    
    m = widgets.SelectMultiple(
        options=values,
        #rows=10,
        description='Metriche:',
        disabled=False
    )
)

def filtra(x,s,m):
    
    return canali_weekly.loc[ (canali_weekly["Self"] > x,s), m]

这是相当好的,因为我有一个主要的目标,那就是允许交互。但是,这段代码不允许我更改布局(例如,我更喜欢水平显示小部件)。

所以我从这个新代码开始:

代码语言:javascript
复制
week = [value for value in canali_weekly.index.get_level_values(level=1).unique()]

s = widgets.IntRangeSlider(
        value = [max(week)-1, max(week)],
        min=min(week),
        max=max(week),
        step=1,
        description='Confronto settimane:'        
    )

def filtra(s):
    display(canali_weekly.loc[ (slice(None),s), ["Spending"]])

s.observe(filtra, 'value')

display(s)

问题是,在这种情况下,数据不显示。

增编:

在这里,我们将重新了解一下dataframe是如何实现的:

代码语言:javascript
复制
channel = ["A", "B", "C", "D"] 
week = [1,2,3,4,5,6,7,8,9]
columns = ["col1","col2","col3"]

index = pd.MultiIndex.from_product([channel,week], names=('channel', 'week'))
df = pd.DataFrame(np.random.randn(36, 3), columns=columns, index=index)

更新

我尝试使用这个新代码,非常类似于我粘贴在这里的第二个代码:

代码语言:javascript
复制
def crea_opzioni(array):
    unique = array.unique().tolist()
    unique.sort()
    unique.insert(0, "ALL")
    return unique

dropdown_week = widgets.Dropdown(options = crea_opzioni(canali_weekly.index.get_level_values(level=1)))


def filtra_dati(change):
    if (change.new == "ALL"):
        display(canali_weekly)
    else:
        display(canali_weekly.loc[(slice(None), change.new), ["Spending"]])

dropdown_week.observe(filtra_dati, names='value')

display(dropdown_week)

即使在记事本中没有呈现dataframe,我也可以在log选项卡中看到它。

EN

回答 1

Stack Overflow用户

发布于 2020-08-06 15:11:40

这是我的解决办法:

代码语言:javascript
复制
output = w`enter code here`idgets.Output()

def crea_opzioni(array):
    unique = array.unique().tolist()
    unique.sort()
    unique.insert(0, "ALL")
    return unique

week = [value for value in canali_weekly.index.get_level_values(level=1).unique()]

intRange_week = widgets.IntRangeSlider(value = [max(week)-1, max(week)], min=min(week), max=max(week), step=1, description='Confronto settimane:')
#widgets.Dropdown(options = crea_opzioni(canali_weekly.index.get_level_values(level=1)))
#dropdown_canali = widgets.Dropdown(options = crea_opzioni(canali_weekly.index.get_level_values(level=0)))


def filtra_dati(selezione):
    output.clear_output()
    df = canali_weekly.loc[(slice(None), slice(selezione[0],selezione[1])), ["Spending"]]  
    with output:
        display(df)
        
def dropdown_week_eventhandler(change):
    filtra_dati(change.new)       

intRange_week.observe(dropdown_week_eventhandler, names='value')

display(intRange_week`enter code here`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63281573

复制
相关文章

相似问题

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