2017-10-18 8 views
1

Je orders.csv comme dataframe appelé orders_df:opérations vectorisés sur deux Pandas dataframe pour créer une nouvelle trame de données

  Symbol Order Shares 
Date       
2011-01-10 AAPL BUY 100 
2011-01-13 AAPL SELL 200 
2011-01-13 IBM BUY 100 
2011-01-26 GOOG SELL 200 

Je finissent par le tri de la trame de données avec orders_df = orders_df.sort_index().

Puis-je créer un symbols comme ceci:

symbols = np.append(orders_df.loc[:, 'Symbol'].unique(), 'SPY') 

vient ici mon deuxième dataframe df_prices.

df_prices = get_data(symbols, orders_df.index, addSPY=False) 
df_prices.loc[:, 'CASH] = 1.0 

qui imprime:

  AAPL IBM GOOG XOM SPY CASH 
Date             
2011-01-10 150 100 50 400 100 1.0 
2011-01-13 250 200 500 100 100 1.0 
2011-01-13 250 200 500 100 100 1.0 
2011-01-26 100 150 100 300 50 1.0 

Maintenant, j'initialiser une troisième trame de données: »

df_trades = pd.DataFrame(0, df_prices.index, columns=list(df_prices)) 

je dois remplir cette trame de données avec les valeurs correctes à l'aide des deux précédentes cadres de date. Si je BUYAAPL, je veux multiplier Shares de orders_df avec les prix de AAPL fois -1. Si c'était SELL, je ne multiplierais pas par -1. J'ai mis cette valeur dans la colonne CASH correcte. Pour les autres colonnes, je copie simplement les Shares de chaque action les jours où elles ont été échangées.

  AAPL IBM GOOG XOM SPY CASH 
Date             
2011-01-10 100 0 0 0 0  -15000 
2011-01-13 -200 0 0 0 0  50000 
2011-01-13 0 100 0 0 0  -20000 
2011-01-26 0  0 -200 0 0  20000 

Comment puis-je obtenir à l'aide df_trades opérations vectorisés?

MISE À JOUR

si je ne:

df_prices = get_data(symbols, orders_df.index, addSPY=False) 
df_prices.loc[:, 'CASH] = 1.0 

qui imprime

  AAPL  IBM GOOG XOM  SPY CASH 
2011-01-10 340.99 143.41 614.21 72.02 123.19 1.0 
2011-01-11 340.18 143.06 616.01 72.56 123.63 1.0 
2011-01-12 342.95 144.82 616.87 73.41 124.74 1.0 
2011-01-13 344.20 144.55 616.69 73.54 124.54 1.0 
2011-01-14 346.99 145.70 624.18 74.62 125.44 1.0 
2011-01-18 339.19 146.33 639.63 75.45 125.65 1.0 
2011-01-19 337.39 151.22 631.75 75.00 124.42 1.0 

Comment pourrais-je produire le df_trades alors?

Les valeurs d'exemple ne sont plus valables fyi.

+0

peut vous montrer votre code non vectorisé? – Quickbeam2k1

+0

Je n'ai pas encore construit 'df_trades'. Ce sont exactement ce que la valeur est supposée être. – dirtysocks45

+0

Je ne comprends pas vraiment la logique de vos df_trades. La première valeur CASH ne devrait-elle pas être de -15000 si j'achète 100 APPL pour un prix de 150? Voulez-vous que df_trades ressemble à votre inventaire ou au changement d'inventaire? S'il y a plusieurs prix pour un jour dans le fichier price_df, quelle valeur doit-on utiliser pour chaque transaction? –

Répondre

2

vectorisé Solution

j = np.array([df_trades.columns.get_loc(c) for c in orders_df.Symbol]) 
i = np.arange(len(df_trades)) 
o = np.where(orders_df.Order.values == 'BUY', -1, 1) 
v = orders_df.Shares.values * o 
t = df_trades.values 
t[i, j] = v 

df_trades.loc[:, 'CASH'] = \ 
    df_trades.drop('CASH', 1, errors='ignore').mul(prices_df).sum(1) 
df_trades 

      AAPL IBM GOOG XOM SPY  CASH 
Date           
2011-01-10 -100 0  0 0 0 -15000.0 
2011-01-13 200 0  0 0 0 50000.0 
2011-01-13  0 -100  0 0 0 -30000.0 
2011-01-26  0 0 200 0 0 20000.0 
+0

Belle réponse, pourrait 'orders_df [['Symbol', 'Shares']]. Pivot (colonnes = 'Symbole', valeurs = 'Partages'). Fillna (0) .astype (int)' aussi travailler ici? –

+0

Le problème est que OP a des données avec un index non unique.Afin d'atteindre le résultat souhaité, j'avais besoin de croire que les indices sont alignés et les ignorer. OMI, il serait préférable de distinguer entre les deux valeurs de l'indice '2011-01-13' avec un horodatage, ou une énumération. Mais je me suis dit que je répondrais simplement à la question de l'OP au lieu de ré-architecturer son scénario. Je soupçonne que le pivot échouerait en raison de la non-unicité ... pas votre code ... c'est du bon code ... je veux dire échouer dans le sens de ne pas atteindre la sortie de l'OP. – piRSquared

+0

@pi Je vous suis. En fait, j'ai été surpris qu'il n'y ait pas de paramètre dans 'pivot' ou' pivot_table' qui maintient l'index plutôt que de le consolider à un index unique. –