2 votes

Erreur avec les tracés multiples dans plotly python

J'ai ce cadre de données

    Id  Timestamp               Data    Group
0   1   2013-08-12 10:29:19.673 40.0    1
1   2   2013-08-13 10:29:20.687 50.0    2
2   3   2013-09-14 10:29:20.687 40.0    3
3   4   2013-10-14 10:29:20.687 30.0    4
4   5   2013-11-15 10:29:20.687 50.0    5
                    ...

Je pourrais tracer un seul graphique en utilisant

import plotly.express as px
df1 = df[df['Group'] ==1]
fig = px.line(df1, 'Timestamp', 'Data',width=1000, height=500)
fig.show()

Ensuite, je veux regrouper les données par Group et de tracer un graphique pour chaque Group . J'ai utilisé

import plotly.express as px
df1 = df.groupby(df['Group'])
fig = px.line(df1, 'Timestamp', 'Data',width=1000, height=500)
fig.show()

et a encouru une erreur

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-f8ccd9a83ce9> in <module>()
      2 df1 = df.groupby(df['Group'])
      3 
----> 4 fig = px.line(df1, 'Timestamp', 'Data',width=1000, height=500)
      5 fig.show()

4 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/groupby.py in _make_wrapper(self, name)
    602                 "using the 'apply' method".format(kind, name, type(self).__name__)
    603             )
--> 604             raise AttributeError(msg)
    605 
    606         self._set_group_selection()

AttributeError: Cannot access attribute 'columns' of 'DataFrameGroupBy' objects, try using the 'apply' method

J'ai fait référence à quelques postes et j'ai essayé plusieurs choses mais ça n'a pas marché. Comment dois-je m'y prendre ? Merci

1voto

Celius Stingher Points 11977

Le problème que vous rencontrez est dû au fait que l'objet que vous générez à partir de votre groupby() . qui est un DataFrameGroupBy. Dans ce cas, vous ne passez aucune colonne pour effectuer l'agrégation, et vous ne nous passez pas non plus la fonction en tant que agg .

En fonction de ce que vous voulez faire spécifiquement, vous devriez résoudre le problème avec votre groupby() d'abord. Voici un exemple qui devrait fonctionner :

import plotly.express as px
df1 = df.groupby(['Group'])['Data'].sum()
fig = px.line(df1, 'Timestamp', 'Data',width=1000, height=500)
fig.show()

Bien sûr, adaptez ce code à vos besoins, ou précisez-les dans la question/le commentaire et je modifierai ce message en conséquence.

EDIT:

Sur la base de la discussion dans les commentaires, je propose deux solutions différentes :

1) Il s'agit d'une méthode plus simple, mais plus difficile à individualiser les paramètres :

import pandas as pd 
import matplotlib.pyplot as plt
data = {'group':[1,2,3,4,5,1,2,3,4,5],'Timestamp':['2013-08-12','2013-08-13','2013-08-14','2013-08-15','2013-08-16','2013-08-17','2013-08-18','2013-08-18','2013-08-19','2013-08-19'],'Data':[40,50,40,30,50,20,20,10,40,30]}
df = pd.DataFrame(data)

for i in df['group'].value_counts().reset_index()['index'].tolist():
    plt.plot('Timestamp','Data',data=df[df['group'] == i],marker='',color='red')
plt.show()

2) Il s'agit de l'option la plus longue, mais très personnalisable :

import pandas as pd 
import matplotlib.pyplot as plt
data = {'group':[1,2,3,4,5,1,2,3,4,5],'Timestamp':['2013-08-12','2013-08-13','2013-08-14','2013-08-15','2013-08-16','2013-08-17','2013-08-18','2013-08-18','2013-08-19','2013-08-19'],'Data':[40,50,40,30,50,20,20,10,40,30]}
df = pd.DataFrame(data)

plt.plot('Timestamp','Data',data=df[df['group'] ==1],marker='',color='blue')
plt.plot('Timestamp','Data',data=df[df['group'] ==2],marker='',color='red')
plt.plot('Timestamp','Data',data=df[df['group'] ==3],marker='',color='green')
plt.plot('Timestamp','Data',data=df[df['group'] ==4],marker='',color='yellow')
plt.plot('Timestamp','Data',data=df[df['group'] ==5],marker='',color='olive')
plt.show()

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