【问题标题】:pandas how to fill a cell based on if condition熊猫如何根据if条件填充单元格
【发布时间】:2020-03-19 20:52:41
【问题描述】:

我正在为我的算法构建一个回测器,如果它是买入或卖出信号,我希望它用 0 或 1 填充新列

生成买入信号:
1-如果两个不同列中的两个单元格超过某个阈值 [ Q5> 7 & Q7>7 ] :
填充新列 ['BuySignal'] = 1
else 在规则一和规则二中不满足的条件填写 BuySignal = 0

2-如果有两个买入信号,但在第一个买入信号之后没有卖出信号,不要用 1 填充 BuySignal,保持为 0(如您在第 6 行中看到的黄色。)我们只能有一个买入信号,直到下一个卖出信号

产生卖出信号:

1-如果只有一个单元格值超过某个阈值 [TCN > 8],则卖出
P.S:如果同时满足买入和卖出条件,我只想将 BuySignal 标记为 1 和 Sell = 0


我期待的是:在第 1 行买入,在第 6 行忽略买入,在第 10 行卖出,在第 13 行再次买入
为您的参考输入数据:https://drive.google.com/file/d/16qqrcvxJuTgd41233RNjwhaNVNREqWWe/view?usp=sharing

【问题讨论】:

  • 一般你可以通过使用 df.loc 来实现,例如: df.loc[ (df['Q5'] > 7) & (df['Q7'] > 7) , 'BuySignal '] = 1 这里loc的第一项描述了条件,第二项描述了你要写入的列。
  • 我期待的是:在第 1 行买入,在第 6 行忽略买入,在第 10 行卖出,在第 13 行再次买入

标签: python pandas


【解决方案1】:

首先,我认为您的输出表中有错误 - 根据买入信号的规则 2,我认为第 1 行和第 13 行的买入信号也应该为 0,因为第 2 行没有卖出信号和 14. 这是我根据您的描述得到的,不确定这是否正是您的意思,但 defo 是一个很好的起点。为了简化问题,我创建了两个 BuySignal 列 - 第一个显示应用第一个规则后的状态,第二个显示应用第二个规则到第一个规则后的状态。您可以在最终解决方案中删除第一列。

# buy rule 1
data['BuySignal1'] = (data['Q5']>7) & (data['Q7']>7)

# sell rule 1
data['SellSignal'] = data['TCN']>8

# buy rule 2
data['BuySignal2'] = (data['BuySignal1']==1)&(data['SellSignal'].shift(-1)==1)

# PS basically - if BuySignal==1 then SellSignal==0
data.loc[data['BuySignal2']==1,'SellSignal'] = 0

# change booleans to types (just for display)
cols = ['BuySignal1','BuySignal2','SellSignal']
data[cols] = data[cols].astype(int)

这是输出:

【讨论】:

  • Blazej,我要感谢您在回答中付出的努力,非常感谢您抽出时间来回答它,我很感激。我有一个问题,buySignal2 是买入信号的最终输出吗?现在我例外的是:在第 1 行买入,在第 6 行忽略买入,在第 10 行卖出,在第 13 行再次买入
猜你喜欢
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2017-08-17
  • 2023-01-28
  • 2015-10-06
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多