J'ai un cadre de données Pandas qui répertorie un certain nombre d'entreprises, le nombre de plaintes de consommateurs qu'elles ont reçues au cours du mois, et le mois où elles ont été reçues :
J'essaie de créer un graphique interactif dans lequel toutes les valeurs de la rubrique "entreprise" sont affichées dans un menu déroulant. Lorsqu'un utilisateur choisit une chaîne d'entreprise, un graphique linéaire se met automatiquement à jour pour indiquer le nombre de plaintes reçues par l'entreprise au fil du temps. J'ai construit les différents composants dans une certaine mesure :
dropdown = widgets.Dropdown(options = sorted(list(set(df['company']))))
affichera
Ensuite, je peux exécuter le code suivant pour afficher un graphique avec l'attribut dropdown.value
soit avec df.plot
o df.iplot
:
df.plot
exemple :
def line_plot(df, company):
df = df[df['company'] == company]
df.set_index('month').plot()
line_plot(df, dropdown.value)
df.iplot
exemple :
df1 = df[df['company'] == dropdown.value]
df1.iplot(kind = 'line', x = 'month', y = 'complaints')
Là où j'ai des difficultés, c'est que je ne sais pas comment utiliser le nom de la société comme entrée pour le graphique que je veux générer. Je me suis renseigné sur ipywidgets et tous les exemples que j'ai trouvés utilisent les colonnes du cadre de données elles-mêmes comme valeurs du menu déroulant plutôt que des valeurs de colonnes particulières. J'ai essayé ce qui suit :
@interact
def line_plot(company = sorted(df['company'].unique())):
df = df[df['company'] == company]
df.iplot(kind = 'line', x = company)
Et j'obtiens ce retour de trace :
---------------------------------------------------------------------------
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
Ainsi que :
interactive_plot = interactive(line_plot, df = df, company = sorted(list(set(df['company']))))
interactive_plot
Et recevez
---------------------------------------------------------------------------
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
Est-ce que je suis dans la bonne direction, ou est-ce que ce que j'essaie de faire est possible avec ipywidgets ? Je vais continuer à chercher comment cela pourrait fonctionner.