У меня есть датафрейм, который содержит ряд акций, которые составляют портфель. С течением времени некоторые из этих акций продаются (следовательно, сбрасываются с df), а другие покупаются (следовательно, добавляются к df), поэтому с течением времени кадр данных меняется. Я хотел бы отслеживать портфель с его акциями с течением времени, когда акции добавляются и опускаются.
import pandas as pd
import itertools as it
initial_pf = pd.DataFrame({"name": ["stock1", "stock2", "stock3", "stock4", "stock5"]})
transactions = pd.DataFrame({"date": ["2016-11-24", "2016-12-22", "2017-02-09", "2017-02-09", "2017-02-09",
"2017-02-14", "2017-02-22"],
"name": ["stock7", "stock1", "stock2", "stock4", "stock8", "stock9", "stock3"],
"type": ["buy", "sell", "sell", "sell", "buy", "buy", "sell"]})
trade_dates = transactions.date.unique()
>>> initial_portfolio
name
0 stock1
1 stock2
2 stock3
3 stock4
4 stock5
>>> transactions
date name type
0 2016-11-24 stock7 buy
1 2016-12-22 stock1 sell
2 2017-02-09 stock2 sell
3 2017-02-09 stock4 sell
4 2017-02-09 stock8 buy
5 2017-02-14 stock9 buy
6 2017-02-22 stock3 sell
Мой текущий подход работает, но слишком медленный, так как у меня есть торговые данные за несколько сотен дней.
current_pf = initial_pf
for date in trade_dates:
current_pf = current_pf.reset_index(drop=True)
# add stocks that are bought on this date
buys = transactions[(transactions.date == date) & (transactions.type == "buy")][["name"]]
current_pf = pd.concat([current_pf, buys])
# drop stocks that are sold on this date
sells = transactions[(transactions.date == date) & (transactions.type == "sell")][["name"]]
current_pf = current_pf[~current_pf.ISIN.isin(list(it.chain.from_iterable(sells.values.tolist())))]
Это должно вернуть:
>>> current_pf
name
1 stock5
2 stock7
3 stock8
4 stock9
Есть ли лучший способ сделать это? Поскольку в конечном итоге я хочу рассчитать эффективность портфеля (т.е. добавить данные о ценах за каждый день), мне нужно иметь возможность просматривать портфель с течением времени и не могу просто отбросить все акции, которые когда-либо продавались, и добавить все эти которые куплены.
Большое спасибо!