2 votes

Création d'un graphique interactif avec pandas et ipywidgets, en utilisant les valeurs de la colonne du cadre de données comme entrées.

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 :

Company complaints

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

dropdown

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.plot example

df.iplot exemple :

df1 = df[df['company'] == dropdown.value]
df1.iplot(kind = 'line', x = 'month', y = 'complaints')

df.iplot example

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.

0voto

njrob Points 75

J'ai trouvé un moyen d'y parvenir (en quelque sorte), même si, dans l'idéal, j'aimerais que la liste déroulante "colonne" ne soit pas visible :

Possible solution

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X