Обновление CSV с созданными значениями - PullRequest
0 голосов
/ 21 октября 2019

У меня есть CSV-файл HDFC.csv при вызове в кадре данных, он выглядит как

ef={'Date':['20.3.2019','21.3.2019','22.3.2019','24.3.2019','25.5.2019','29.6.2019','30.6.2019'],
'Quantity Bought':[342.0,2330.0,'nan','nan',344,'nan','nan'],
'Buy Price':[21.0,45.0,'nan','nan',22,'nan','nan'],
'Sell Quantity':['nan','nan',110,221,'nan',455,566],
'Sell Price':['nan','nan',56,21,'nan',29,30]}
 ef=pd.DataFrame(ef)

Когда я запускаю приведенный ниже код

class Trade():
def __init__(self,date: pd.datetime, quantity: np.float32, price: np.float32):
    self.date = date
    self.quantity = quantity
    self.price = price
def printT(self):
    return print('Quantity: %i, Price: %f'%(self.quantity, self.price))

class Isin():
def __init__(self, isin, notinalPerQuantity, listOfTrades):
    self._isin = isin
    self._notinalPerQuantity = notinalPerQuantity
    self._listOfTrades = listOfTrades
def mtm(self, trade):
    return trade.quantity*trade.price*self._notinalPerQuantity
def __next__(self):
    return self._listOfTrades.__next__()
def __iter__(self):
    return self._listOfTrades.__iter__()

class transactionAccounting():
def __init__(self, isin):
    """
    Initiliase with first entry from left
    """
    print('Initialize trade que')
    self._Isin = isin
    self._notinalPerQuantity = isin._notinalPerQuantity
    self._trades = isin._listOfTrades
    t0 = self._trades[0]
    self._avgprice = 0
    self._quantity = 0
    self._pnl = 0
    self._bookvalue = 0
def printStat(self):
   quantity=self._quantity
   avg_price=self._avgprice
   pnl=self._pnl
   amount=self._bookvalue

def buy(self, trade):
    raise NotImplementedError

def sell(self, trade):
    raise NotImplementedError


class FifoAccount(transactionAccounting):
def __init__(self, trades):
    transactionAccounting.__init__(self, trades)
    self._deque = deque()
    for trade in self._trades:
        if trade.quantity>=0:
            self.buy(trade)
        else:
            self.sell(trade)
def buy(self, trade):
    print('Buy trade')
    trade.printT()
    self._deque.append(trade)
    self._bookvalue += self._Isin.mtm(trade) 
    self._quantity += trade.quantity
    self._avgprice = self._bookvalue / self._quantity / self._notinalPerQuantity
    avg_price=self._avgprice
    #buy_quant=self._quantity
    #bal=self._bookvalue
    #print(buy_quant)  
    #print(bal)




    self.printStat()
def sell(self, trade):
    print('Sell trade') 
    trade.printT()
    sellQuant = -trade.quantity
    while(sellQuant>0):
        lastTrade = self._deque.popleft()
        price = lastTrade.price
        quantity = lastTrade.quantity
        print('Cancel trade:')
        lastTrade.printT()
        if sellQuant >= quantity:
            self._pnl += -(price - trade.price)*quantity*self._notinalPerQuantity 
            self._quantity -= quantity
            self._bookvalue -= price * quantity * self._notinalPerQuantity
            sellQuant -= quantity
        else:
            self._pnl += -(price - trade.price)*sellQuant*self._notinalPerQuantity 
            self._quantity -= sellQuant
            self._bookvalue -= price * sellQuant * self._notinalPerQuantity
            lastTrade.quantity -= sellQuant
            self._deque.appendleft(lastTrade)
            sellQuant = 0 
        sell_quant=self._quantity
        bal_sell=self._bookvalue 
        pnl=self._pnl
        print(pnl)
        print(sell_quant)
        print(bal_sell)
        print(self._avgprice)
        self.printStat()
        assert(self._quantity > 0)

el = [Trade(pd.to_datetime('01.04.2016',format='%d.%m.%Y')+dt.timedelta(days=i), 5-i, 99.8+i) for i in range(0,100)]
#ef=pd.read_csv('D:\\PMS\\testport\\Portfolio Ledger\\Mutual Fund\\HDFC.csv')
#cols=[1,4,7,8,9,10,11]
#ef.drop(ef.columns[cols], axis=1,inplace=True)

ef.replace('nan', np.nan, inplace=True)

numberOfRows = len(ef.index)

el={'Date':[],
'Quantity':[],
'Price':[]}
el = list(el)

row = 0
i = 0

while i < numberOfRows:
if ef.isnull().iat[row,1] != True:
    Date=[ef.iat[row,0]]
    Quantity=ef.iat[row,1]
    Price=ef.iat[row,2]
    #el = el.append(adding, ignore_index=True)
    i += 1
    row += 1
    s=pd.Series([Date,Quantity,Price])
    el.append(Trade(pd.to_datetime(s[0],format='%d.%m.%Y'), s[1], s[2]))


else:
    Date=[ef.iat[row, 0]]
    Quantity=ef.iat[row, 3]*(-1)
    Price=ef.iat[row, 4]
    #el = el.append(adding, ignore_index=True)
    i += 1
    row += 1
    s=pd.Series([Date,Quantity,Price])
    el.append(Trade(pd.to_datetime(s[0],format='%d.%m.%Y'), s[1], s[2]))
del el[0]
del el[1]
del el[0]





b = Isin('bond', 1, el)
trans = FifoAccount(b)

Когда я запускаю приведенный выше код, он печатаетКоличество сальдо, Avg.Price, PnL, сумма сальдо в каждой строке, я не могу понять, как передать эти значения в csv, в котором приведенный выше кадр данных присутствует с теми же заголовками столбцов, что и количество сальдо, Avg.Price, PnL, сумма сальдо

1 Ответ

0 голосов
/ 21 октября 2019

Попробуйте:

  1. загрузить csv в pandas

  2. создать новые столбцы, используя pandas.apply(), чтобы вы могли использовать свои функции.

  3. сохранить расширенный фрейм данных в CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...