2017-10-20 38 views
2

Je orders_df:Comment obtenir les lignes où une certaine valeur se produit?

 Symbol Order Shares 
Date       
2011-01-10 AAPL BUY 1500 
2011-01-13 AAPL SELL 1500 
2011-01-13 IBM BUY 4000 
2011-01-26 GOOG BUY 1000 
2011-02-02 XOM SELL 4000 
2011-02-10 XOM BUY 4000 
2011-03-03 GOOG SELL 1000 
2011-03-03 IBM SELL 2200 
2011-05-03 IBM BUY 1500 
2011-06-03 IBM SELL 3300 
2011-08-01 GOOG BUY  55 
2011-08-01 GOOG SELL  55 

Je veux avoir une variable qui mappe Date au nombre de SELLS à cette date. Je veux aussi une variable symétrique pour BUY.

J'ai essayé de le faire pour tous Orders en faisant

num_orders_per_day = orders_df.groupby(['Date']).size() 

et obtenu:

Date 
2011-01-10 1 
2011-01-13 2 
2011-01-26 1 
2011-02-02 1 
2011-02-10 1 
2011-03-03 2 
2011-05-03 1 
2011-06-03 1 
2011-08-01 2 

mais ce n'est pas la sortie désirée.

Ce que je veux est sells_on_a_day:

2011-01-13 1 
2011-02-02 1 
2011-03-03 2 
2011-06-03 1 
2011-08-01 1 

puis une même variable de buys_on_a_day.

Répondre

3

Premier filtre par boolean indexing puis obtenir count:

num_sells_per_day = orders_df[orders_df['Order'] == 'SELL'] 
         .groupby(level=0).size().reset_index(name='count') 
print (num_sells_per_day) 
     Date count 
0 2011-01-13  1 
1 2011-02-02  1 
2 2011-03-03  2 
3 2011-06-03  1 
4 2011-08-01  1 

Alternative:

num_sells_per_day = orders_df.query("Order == 'SELL'") 
          .groupby(level=0) 
          .size() 
          .reset_index(name='count') 
print (num_sells_per_day) 
     Date count 
0 2011-01-13  1 
1 2011-02-02  1 
2 2011-03-03  2 
3 2011-06-03  1 
4 2011-08-01  1 

est également possible de créer 2 colonnes ensemble, obtenir seulement NaN s si certaines valeurs manquantes:

df1 = orders_df.groupby(['Date','Order']).size().unstack() 
print (df1) 
Order  BUY SELL 
Date     
2011-01-10 1.0 NaN 
2011-01-13 1.0 1.0 
2011-01-26 1.0 NaN 
2011-02-02 NaN 1.0 
2011-02-10 1.0 NaN 
2011-03-03 NaN 2.0 
2011-05-03 1.0 NaN 
2011-06-03 NaN 1.0 
2011-08-01 1.0 1.0 
+0

Je changerais le nom en 'num_sells_per_day' pour plus de clarté, mais ça marche. – dirtysocks45