在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"]
目前没有回答
相关问题 更多 >
编程相关推荐