我正在构建一个jupyter笔记本,它使用一些交互式小部件来帮助在一些数据帧中移动。我的jupyter和python经验有限,到目前为止,我笔记本上的大部分内容都是重新创建我之前在一系列Excel PivotTables中创建的合并和计算。
第一次尝试交互式窗口小部件的效果很好。它调用dataframe,使用一个滑动小部件根据列的结果限制返回的行数(一个任务打开了多少天):
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
@interact
def days_open_widget(column='days_open', x=(0,2000,5)):
return df.loc[df[column] > x]
接下来,我希望能够使用两个日期选择器分别探索DataFrame,以根据分配的创建日期限制结果。它的一部分是有效的,比如日期选择器填充了最早和最晚的日期,但它们并不绑定到数据帧。代码如下:
interact(df,
start_date=widgets.DatePicker(value=df.assignment_creation_date.min()),
end_date=widgets.DatePicker(value=df.assignment_creation_date.max()))
在Jupyter显示日期选择器之后,它会显示以下错误,然后显示未过滤的数据帧。
TypeError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\ipywidgets\widgets\interaction.py in update(self, *args)
254 value = widget.get_interact_value()
255 self.kwargs[widget._kwarg] = value
--> 256 self.result = self.f(**self.kwargs)
257 show_inline_matplotlib_plots()
258 if self.auto_display and self.result is not None:
TypeError: 'DataFrame' object is not callable
我不确定我错过了什么。我不确定为什么尝试访问DataFrame时会出现"object is not callable“错误,也不确定为什么DatePickers成功地读取了DataFrame列,但却断开了连接。
我试图创建的行为将调用整个dataframe,但让我过滤从datepicker中选择的日期之间的结果行。我遗漏了什么?
编辑:我知道代码很乱,事后看来,我不应该单独导入interact、interactive、fixed、interact_manual,然后再导入所有的ipywidget。
编辑2:我不能让AC24的解决方案工作,但我认为这更多地是因为我自己无法正确定义一个过滤数据帧的函数。我最终找到了QGrid,它有一个datepicker和其他过滤器。
有关QGrid的更多信息,请访问https://qgrid.readthedocs.io/en/latest/,但如果有人对如何定义函数以将数据帧作为函数传递有更明确的描述,请随时添加。
发布于 2020-02-17 16:29:00
请注意,interact
的行为与interactive
装饰器不同。在使用interact
时,第一个参数应该是一个函数/callable,当您更改任何小部件时都会调用该函数。您传入了数据帧df
作为第一个参数,因此interact
尝试使用start_date和end_date关键字将df
作为函数调用。因此出现了错误,因为数据帧是不可调用的。
请看文档中的示例,您可能希望构建一个简单的函数来过滤数据帧,并将该函数名用作interact
的第一个参数。
https://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html#Basic-interact
https://stackoverflow.com/questions/60255718
复制相似问题