J'ai les pandas suivants DataFrame:
time Group blocks
0 1 A 4
1 2 A 7
2 3 A 12
3 4 A 17
4 5 A 21
5 6 A 26
6 7 A 33
7 8 A 39
8 9 A 48
9 10 A 59
.... .... ....
36 35 A 231
37 1 B 1
38 2 B 1.5
39 3 B 3
40 4 B 5
41 5 B 6
.... .... ....
911 35 Z 349
Il s'agit d'un cadre de données avec plusieurs données chronologiques, de min=1
à max=35
. Chaque Group
a une série chronologique comme celle-ci.
J'aimerais tracer chaque série temporelle individuelle de A à Z par rapport à un axe des abscisses compris entre 1 et 35. L'axe des ordonnées serait la blocks
à chaque fois.
Je pensais utiliser quelque chose comme un complot de Andrews Curves , qui tracerait chaque série les unes contre les autres. Chaque "teinte" serait définie sur un groupe différent. (D'autres idées sont les bienvenues.)
Mon problème: comment formater cette base de données pour tracer plusieurs séries? Les colonnes doivent-elles être GroupA
, GroupB
, etc.?
Comment obtenez-vous le dataframe pour être au format:
time GroupA blocksA GroupsB blocksB GroupsC blocksC....
Est-ce le format correct pour un tracé Andrews comme indiqué?
MODIFIER
Si j'essaye:
df.groupby('Group').plot(legend=False)
l'axe des x est complètement incorrect. Toutes les séries chronologiques doivent être tracées de 0 à 35, en une seule série.
Comment résoudre ce problème?
Regardez ces variantes. La première correspond aux courbes d'Andrews et la seconde à un graphe multiligne regroupé dans une colonne Month
. La structure de données data
comprend trois colonnes Temperature
, Day
et Month
:
import pandas as pd
import statsmodels.api as sm
import matplotlib.pylab as plt
from pandas.tools.plotting import andrews_curves
data = sm.datasets.get_rdataset('airquality').data
fig, (ax1, ax2) = plt.subplots(nrows = 2, ncols = 1)
data = data[data.columns.tolist()[3:]] # use only Temp, Month, Day
# Andrews' curves
andrews_curves(data, 'Month', ax=ax1)
# multiline plot with group by
for key, grp in data.groupby(['Month']):
ax2.plot(grp['Day'], grp['Temp'], label = "Temp in {0:02d}".format(key))
plt.legend(loc='best')
plt.show()
Lorsque vous tracez la courbe d'Andrews, vos données récupérées dans une fonction. Cela signifie que les courbes d'Andrews représentées par des fonctions proches suggèrent que les points de données correspondants seront également proches.
Vous pouvez restructurer les données sous forme de tableau croisé dynamique:
df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()