Какой самый быстрый способ добавлять и удалять строки в кадре данных с учетом времени (для отслеживания акций в портфеле)? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть датафрейм, который содержит ряд акций, которые составляют портфель. С течением времени некоторые из этих акций продаются (следовательно, сбрасываются с 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

Есть ли лучший способ сделать это? Поскольку в конечном итоге я хочу рассчитать эффективность портфеля (т.е. добавить данные о ценах за каждый день), мне нужно иметь возможность просматривать портфель с течением времени и не могу просто отбросить все акции, которые когда-либо продавались, и добавить все эти которые куплены.

Большое спасибо!

...