当我试图获取Ui\u MainWindow类中的值时,df是空的

2024-05-23 23:42:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,其中一个函数返回一个df,当我试图获取Ui\u MainWindow类中的值时,df是空的。你知道吗

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():
    print('dbhfjf')
    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():
   print('plpl')
   def __init__(self, isin):
       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
       self.quantity=[]
       self.pnl=[]
       self.amount=[]
       self.average=[]
       global oo
       oo = pd.DataFrame(columns = ['Balance quantity', 'Balance Amount','Average Price','Realized Profits']) 
   def printStat(self):
       print('Balance Quantity: %i, AvgPrice: %f, Profit & Loss: %f, Balance amount: %f'%(self._quantity, 
                                                       self._avgprice,
                                                       self._pnl,
                                                   self._bookvalue))
       for x in range(1):
           self.quantity.append(self._quantity)
           last=self.quantity
           s=pd.Series(last)
           s=list(s)
           print(s)
        #oo['Balance quantity']=s
       for j in range(1):
           self.amount.append(self._bookvalue)
           am=self.amount
           amount=pd.Series(am)
           amount=list(amount)
           print(amount)
        #oo['Balance Amount']=amount
       for k in range(1):
           self.average.append(self._avgprice)
           ap=self.average
           app=pd.Series(ap)
           app=list(app)
           print(app)
        #oo['Average Price']=app
       for i in range(1):
           self.pnl.append(self._pnl)
           pl=self.pnl
           p=pd.Series(pl)
           p=list(p)
           print(p)
        #oo['Realized Profits']=p
        #df=pd.DataFrame(s,columns=['Balance Quantity'])
        #df=pd.DataFrame(amount,columns=['Balance Amount'])
        #df=pd.DataFrame(app,columns=['Average Price'])
        #df=pd.DataFrame(p,columns=['Realized Profits'])
        #print(df)
       self.dff = pd.DataFrame({'Balance Quantity': s,'Balance Amount': amount,'Average Price ': app,'Realized Profit':p})
        print(self.dff)
        return self.dff
    def buy(self, trade):
        raise NotImplementedError

    def sell(self, trade):
        raise NotImplementedError
    def dff(self):
        return self.dff

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_buy=self._bookvalue 
         pnl=self._pnl

         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 

                self.printStat()
                assert(self._quantity > 0)
class Ui_MainWindow(object):
  self.ef=pd.read_excel('D:\\PMS\\Port 5\\Portfolio Ledger\\Mutual Fund\\AXIS.xlsx')


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

    numberOfRows = len(self.ef.index)

    e={'Date':[],'Quantity':[],'Price':[]}
    e = pd.DataFrame(e)
    el=[]
    row = 0
    i = 0

    while i < numberOfRows:
        if self.ef.isnull().iat[row,1] != True:
            adding = pd.DataFrame({"Date":[self.ef.iat[row,0]],
                           "Quantity":[self.ef.iat[row,1]],
                           "Price":[self.ef.iat[row,2]]})
            e = e.append(adding, ignore_index=True)
            f=e['Date'].iloc[-1]
            i += 1
            row += 1
            Date=e['Date'].iloc[-1]
            Quantity=e['Quantity'].iloc[-1]
            Price=e['Price'].iloc[-1]
            print(Date)
            print(Quantity)
            print(Price)

    #s=pd.Series(['Date','Quantity','Price'])
    #print(s[0])
            el.append(Trade(pd.to_datetime(Date,format='%d.%m.%Y'), Quantity, Price))
        else:
            adding = pd.DataFrame({"Date": [self.ef.iat[row, 0]],
                           "Quantity": [self.ef.iat[row, 3]*(-1)],
                           "Price": [self.ef.iat[row, 4]]})
            e = e.append(adding, ignore_index=True)
    #print(e.tail(1))
            i += 1
            row += 1
            Date=e['Date'].iloc[-1]
            Quantity=e['Quantity'].iloc[-1]
            Price=e['Price'].iloc[-1]
            print(Date)
            print(Quantity)
            print(Price)
    #s=pd.Series(['Date','Quantity','Price'])
    #print(s[0])
            el.append(Trade(pd.to_datetime(Date,format='%d.%m.%Y'), Quantity, Price))
    b = Isin('bond', 1, el)
    #print('111111')
    trans = FifoAccount(b)
    #print(self.dff)
    avds=transactionAccounting(b)
    fff=avds.printStat()
    print(fff)

当我试图打印(fff)在Ui\u主窗口它是空的,我不知道如何调用自我.dff在Ui\u主窗口中,甚至函数printStat()都返回df,当我在df中打印时,有四列填充了FIFO逻辑


Tags: selfdatedefamountpricequantitypdprint
1条回答
网友
1楼 · 发布于 2024-05-23 23:42:24

Ui_MainWindow无权访问dff变量。请注意,transactionAccounting()类位于Isin()类内部。你知道吗

您已经在Ui_MainWindow内的以下行中定义了一个Isin()类:

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

从技术上讲,您可以这样初始化transactionAccounting()类:

b = Isin('bond', 1, el)
b.transactionAccounting(your_arguments)
self.dff = b.dff

#or

ta = IsIn.transactionAccounting(your_arguments)
self.dff = b.dff

然而,我不相信transactionAccounting()的缩进是故意的。因此,我建议将transactionAccounting()中的所有代码按一个空格进行制表,并在Ui_MainWindow中对其进行初始化:

ta = transactionAccounting(your_arguments)
self.dff = ta.dff

但是,不需要:

def dff(self):
    return self.dff

大提示:让你的工作空间成为一个标签,而不是一些n数量的空格。像我怀疑的那样,如果这确实是一个间隔错误,那么这样的问题将变得更加明显。你知道吗

相关问题 更多 >