【发布时间】:2020-04-16 19:49:25
【问题描述】:
我有一个 Pandas 数据框,其中列出了多家公司、他们在当月收到的消费者投诉数量以及收到投诉的月份:
我正在尝试创建一个交互式图,其中“公司”下的所有值都显示在下拉菜单中,当用户选择公司字符串时,线图将自动更新以查看公司有多少投诉随着时间的推移收到。我在某种程度上构建了单独的组件:
dropdown = widgets.Dropdown(options = sorted(list(set(df['company']))))
会显示
然后我可以执行以下代码以显示带有dropdown.value 的绘图,或者使用df.plot 或df.iplot:
df.plot 示例:
def line_plot(df, company):
df = df[df['company'] == company]
df.set_index('month').plot()
line_plot(df, dropdown.value)
df.iplot 示例:
df1 = df[df['company'] == dropdown.value]
df1.iplot(kind = 'line', x = 'month', y = 'complaints')
我遇到的问题实际上是弄清楚如何使用公司名称作为我想要生成的绘图的输入。我一直在阅读 ipywidgets 和我发现的所有示例都使用数据框列本身作为下拉菜单值,而不是特定的列值。我尝试了以下方法:
@interact
def line_plot(company = sorted(df['company'].unique())):
df = df[df['company'] == company]
df.iplot(kind = 'line', x = company)
并获得此回溯:
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
/Applications/anaconda3/lib/python3.7/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:
<ipython-input-1040-3e3ff8e76afe> in line_plot(company)
2 def line_plot(company = sorted(df['company'].unique())):
3
----> 4 df = df[df['company'] == company]
5
6 df.iplot(kind = 'line', x = company)
UnboundLocalError: local variable 'df' referenced before assignment
还有:
interactive_plot = interactive(line_plot, df = df, company = sorted(list(set(df['company']))))
interactive_plot
然后接收
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Applications/anaconda3/lib/python3.7/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:
<ipython-input-1026-e7a7c82e3c6b> in line_plot(df, company)
1 def line_plot(df, company):
2
----> 3 df = df[df['company'] == company]
4
5 df.set_index('month').plot()
TypeError: string indices must be integers
我是否朝着正确的方向前进,或者我正在尝试通过 ipywidgets 实现什么?我将继续研究这可能如何工作。
【问题讨论】:
-
为什么要将 line_plot 函数的公司参数的默认值设置为列表:sorted(df['company'].unique())?而且我认为此时可能是 df 尚未初始化。注意默认函数参数,对于列表这样的容器总是很棘手。
标签: python pandas matplotlib ipywidgets