2017-10-20 17 views
1

Je dispose d'un fichier csv qui ressemble à ceci:Comment regrouper une base de données et accumuler les valeurs d'un colume?

date      price  volume 
2017-10-17 01:00:11.031 51.91  1 
2017-10-17 01:00:11.828 51.91  1 
2017-10-17 01:00:12.640 51.91  1 
2017-10-17 01:00:13.140 51.90  -9 
2017-10-17 01:00:15.328 51.90  -5 
2017-10-17 01:00:16.531 51.90  1 
2017-10-17 01:00:16.531 51.89  -2 
2017-10-17 01:00:19.937 51.90  1 
2017-10-17 01:00:24.546 51.90  1 
2017-10-17 01:00:25.250 51.90  1 
2017-10-17 01:00:32.843 51.89  -9 
2017-10-17 01:00:42.859 51.89  -5 
2017-10-17 01:00:43.453 51.89  -1 
2017-10-17 01:00:43.546 51.90  1 
2017-10-17 01:00:45.953 51.90  7 
... 

Je veux faire une trame de données qui montre combien de volumes ont été accumulées dans toutes les 5 minutes, à chaque niveau de prix.

Par exemple, si les plus hauts et les plus bas entre 17.10.2017 00:00 ~ 17/10/2017 00:05 étaient 51,21 et 51,11, le résultat serait:

datetime     price  pos_volume  neg_volume 
2017-10-17 00:00   51.21  3    4 
         51.20  21    23 
         51.19  44    21 
         51.18  31    33 
         ... 
         51.14  14    21 
         51.13  30    29 
         51.12  2    3 
         51.11  5    1 

Il y a deux colonnes pour différencier les volumes positifs et négatifs.

Je pense que je pourrais le faire si j'utilise beaucoup de boucles conditionnelles, mais je voudrais savoir s'il y a plus de façons simples de faire cela. Merci d'avoir lu ceci!

+1

Avez-vous vu 'df.resample'? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Oh, merci! Je vais le chercher – maynull

Répondre

2

Vous pouvez séparer les valeurs positives et négatives à l'aide np.where, puis utilisez le tableau croisé dynamique avec l'index comme grouper avec fréq en 5 minutes, puis utiliser aggfunc comme count (il ne tient pas compte des valeurs nan).

df['pos_vol'] = np.where(df['volume']>0,df['volume'],np.nan) 
df['neg_vol'] = np.where(df['volume']<0,df['volume'],np.nan) 

ndf = df.pivot_table(values=['pos_vol','neg_vol'],index=[pd.Grouper(key='date', freq='5min'),'price'],aggfunc='count') 

Sortie:

 
          neg_vol pos_vol 
date    price     
2017-10-17 01:00:00 51.89  4  0 
        51.90  2  6 
        51.91  0  3 

Pour index trié, vous pouvez utiliser ndf = ndf.sort_index(level=1,ascending=False)

Sortie:

 
          neg_vol pos_vol 
date    price     
2017-10-17 01:00:00 51.91  0  3 
        51.90  2  6 
        51.89  4  0 
+1

Nice, en utilisant 'pd.Grouper'. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Thankyou, a répondu à un type similaire de qn il y a une semaine. Donc, cela à l'esprit. – Dark

+1

@Bharath shetty Merci beaucoup pour votre aide! :) – maynull