仅当依赖于另一个variab时才使用数据帧列乘法/除法

2024-04-25 19:27:48 发布

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

在pandas数据帧中,当前我使用数据框箭头()接近,但速度非常慢。我想使用numpy或类似的东西来加速两列的计算,所以lambda函数可能不会起作用,而且速度也会很慢。问题是,这是一个或多或少复杂的逻辑,因为计算依赖于另一个变量(“inmarket”),我不确定是否能以某种方式完成。你知道吗

基本上,代码的作用是:有4列;“money”、“shares”、“Close”、“position”,还有几个变量,“inmarket”和“numops”。你知道吗

最初“inmarket”为0。最初“numops”变量是0

这些列最初看起来像:

money   shares   Close   position
100      0        10.1     0
  0      0        11.7     1
  0      0        13.8     0
  0      0        9.1      1
  0      0        11.2     0
  0      0        10.7     0
  0      0        11.3     0

经过计算,它们应该是这样的:

money   shares   Close   position
100      0        10.1     0
0      9.9        11.7     1
136.62   0        13.8     0
0       15.01     9.1      1
168.11   0        11.2     0
168.11   0        10.7     0
168.11   0        11.3     0

numops变量=4

逻辑是:

如果“inmarket”为0(因此我们可以购买),则每次“position”列中有1时,“money”除以“Close”,结果存储在“Shares”列中,“money”变为0(因为我们购买了股票)。我们在某个地方存储了一个操作计数器(就像我的代码示例中的“numops”变量)

如果“inmarket”是1(因此我们已经有股份,但没有钱),每次有一个0,“股份”乘以“Close”,然后将结果放入“money”,然后“shares”变为0。我们在某处存放了一个营业柜台

代码如下:

    self.df.loc[0, "money"] = self.start_money
    self.df.loc[0, "shares"] = 0
    numops=0
    inmarket = 0

    for i, row in self.df.iterrows():
        if not inmarket:
            if self.df.loc[i, "position"] == 1: #buy
            self.df.loc[i, "shares"] = self.df.loc[i-1, "money"] / self.df.loc[i, "Close"]     
            self.df.loc[i, "money"]=0
                inmarket=1
                numops+=1
            elif i: #we copy the previous row
                self.df.loc[i, "shares"] = self.df.loc[i-1, "shares"]
                self.df.loc[i, "money"] = self.df.loc[i-1, "money"]
        elif inmarket:
            if row["position"] == 0:#sell
                self.df.loc[i, "money"]=self.df.loc[i-1, "shares"] * self.df.loc[i, "Close"]
                self.df.loc[i, "shares"] = 0
                inmarket=0
                numops+=1
            elif i:
                self.df.loc[i, "shares"] = self.df.loc[i-1, "shares"]
                self.df.loc[i, "money"] = self.df.loc[i-1, "money"]

Tags: 数据代码selfdfcloseifposition速度