2017-10-19 21 views
0

J'ai un cadre df où les colonnes sont ['date', 'float', 'int'] pour simplifier. Les dates et les flotteurs ne sont pas uniques, donc je les groupe:nuage de points du cadre de séries temporelles groupées

dd = df.groupby(['date', 'float']).sum() 

La chose est, je dois rééchantillonner l'indice de date, que je dois faire via

dd = dd.unstack().resample('B').last() 

autrement sans dépilage il baissera un niveau. Maintenant, ce que je voudrais faire est de tracer une dispersion de la trame avec 'date' comme axe x, 'float' comme axe y, et 'int' comme la taille des points. Je me bats pour y parvenir avec le cadre que j'ai maintenant. Peut-être que le pré-traitement que je fais est le mauvais type et il y a un moyen plus propre d'y parvenir. Cordialement,

+0

Pouvez-vous fournir des données factices que vous utilisez? – pansen

Répondre

1

Il n'y a probablement pas besoin de unstack. Vous pouvez faire votre groupby et resample tout en maintenant une trame de données dans le format long via reset_index:

df.groupby(["date", "float"])\ 
    .sum()\ 
    .reset_index(-1)\ 
    .resample("B")\ 
    .last() 

Ensuite, vous pouvez utiliser la méthode ax.scatter normale avec l'argument s qui définit la taille des points, comme suit:

import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 

# mocking your dataframe 
dates = pd.date_range(start="2017-10-10", periods=20) 
values = np.random.random(20) 
sizes = np.random.randint(1, 80, 20) 

df = pd.DataFrame({"dates": dates, 
        "values": values, 
        "sizes": sizes}) 

# plot setup 
fig,ax= plt.subplots() 
fig.set_size_inches(15, 7) 

# scatter 
ax.scatter(x=df["dates"].values, 
      y=df["values"].values, 
      s=df["sizes"].values) 

# setting x axis bounds 
ax.set_xlim((df["dates"].min(), df["dates"].max())) 

enter image description here

+0

Merci beaucoup. J'ai encore besoin de travailler autour de la réindexation en général, car il semble y avoir la puissance des pandas! –