python - 熊猫如何根据if条件填充单元格
问题描述
我正在为我的算法构建一个回测器,如果它是买入或卖出信号,我希望它用 0 或 1 填充新列
BUY 信号生成:
1-如果两个不同列中的两个单元格超过某个阈值 [Q5> 7 & Q7>7]:
填充新列 ['BuySignal'] = 1
否则规则一和规则二中不满足条件下面填充 BuySignal = 0
2-如果有两个买入信号,但在第一个买入信号之后没有卖出信号,不要用 1 填充 BuySignal,保持为 0(如您在第 6 行中看到的黄色。)我们只能有一个买入信号,直到下一个卖出信号
产生卖出信号:
如果只有一个单元格值超过某个阈值,则 1-卖出 [TCN > 8]
PS:如果同时满足买入和卖出条件,我只想将 BuySignal 标记为 1 并且 Sell = 0
我期望的是:买入在第 1 行,忽略第 6 行的买入,在第 10 行卖出,在第 13 行再次买入
为您的参考输入数据:https ://drive.google.com/file/d/16qqrcvxJuTgd41233RNjwhaNVNREqWWe/view?usp=sharing
解决方案
首先,我认为您的输出表中有一个错误 - 根据买入信号的规则 2,我认为第 1 行和第 13 行的买入信号也应该为 0,因为第 2 行和第 14 行没有卖出信号。这是我根据您的描述得到的,不确定这是否正是您的意思,但这是一个很好的起点。为了简化问题,我创建了两个 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)
推荐阅读
- python - 嵌套的可迭代映射/过滤
- javascript - JavaScript Array 类,相同的行为,但那不是 Array?
- airflow - 气流:如何从任务实例访问正在运行的任务?
- ios - iOS 反应原生应用程序不会从 CodePush 服务器更新
- java - 如何等到文件从系统目录复制到具有root访问权限的外部存储
- java - 为什么类的一个不可序列化的静态字段在实例被序列化时会抛出 NotSerializableException?
- google-apps-script - 关于如何继续使用 Google 表单/表格的指南
- php - 以正确的方式在 cURL 中发出 HTTP 请求
- wpf - Resizable ScrollViewer with the limited MaxHeight
- java - ListView showing only one Item from JSON