Python-投资组合未平仓标志
我在下面有一个数据框:Python-投资组合未平仓标志,python,pandas,Python,Pandas,我在下面有一个数据框: ticker date buy_fg sell_fg 50 ABC 2010-01-01 0.0 2.0 51 ABC 2010-01-08 0.0 2.0 52 ABC 2010-01-15 0.0 2.0 53 ABC 2010-01-22 0.0 2.0 1512 ABC 2010-01-29 1.0 0.0 54
ticker date buy_fg sell_fg
50 ABC 2010-01-01 0.0 2.0
51 ABC 2010-01-08 0.0 2.0
52 ABC 2010-01-15 0.0 2.0
53 ABC 2010-01-22 0.0 2.0
1512 ABC 2010-01-29 1.0 0.0
54 ABC 2010-02-05 0.0 2.0
55 ABC 2010-02-12 0.0 2.0
56 ABC 2010-02-19 0.0 2.0
57 ABC 2010-02-26 0.0 2.0
58 ABC 2010-03-05 0.0 2.0
59 ABC 2010-03-12 0.0 2.0
60 ABC 2010-03-19 0.0 2.0
61 ABC 2010-03-26 0.0 2.0
1417 ABC 2010-04-02 1.0 0.0
1409 ABC 2010-04-09 1.0 0.0
62 ABC 2010-04-23 0.0 2.0
63 ABC 2010-05-07 0.0 2.0
64 ABC 2010-05-14 0.0 2.0
65 ABC 2010-05-21 0.0 2.0
66 ABC 2010-05-28 0.0 2.0
我正试图开发一个专栏,提供我的脚本需要采取的行动的摘要。我曾尝试开发一种累积分数方法,但一直未能成功。我也尝试过lambda,但是逻辑不正确,因为它只是重复了buy\u fg
列
# Initiate the global, default buy flag
hold_flag = False
# Custom function to flick the global flag based on `buy_fg` column
def hold(value):
global hold_flag
if value == 1:
if hold_flag is False:
hold_flag = True
return '3'
if hold_flag is True:
hold_flag = False
return '1'
else:
return '0'
new_report['hold_fg'] = new_report['buy_fg'].apply(hold)
这将创建hold\u fg
列。但是现在我需要扩展这一点来考虑所有三个代码> *ffg< /Cord>列,以提供最终的动作。< /P>
ticker date buy_fg sell_fg action hold_fg
50 ABC 2010-01-01 0.0 2.0 0 0
51 ABC 2010-01-08 0.0 2.0 0 0
52 ABC 2010-01-15 0.0 2.0 0 0
53 ABC 2010-01-22 0.0 2.0 0 0
1512 ABC 2010-01-29 1.0 0.0 0 1
54 ABC 2010-02-05 0.0 2.0 0 0
55 ABC 2010-02-12 0.0 2.0 0 0
56 ABC 2010-02-19 0.0 2.0 0 0
57 ABC 2010-02-26 0.0 2.0 0 0
58 ABC 2010-03-05 0.0 2.0 0 0
59 ABC 2010-03-12 0.0 2.0 0 0
60 ABC 2010-03-19 0.0 2.0 0 0
61 ABC 2010-03-26 0.0 2.0 0 0
1417 ABC 2010-04-02 1.0 0.0 0 1
1409 ABC 2010-04-09 1.0 0.0 0 3
62 ABC 2010-04-23 0.0 2.0 0 0
63 ABC 2010-05-07 0.0 2.0 0 0
64 ABC 2010-05-14 0.0 2.0 0 0
65 ABC 2010-05-21 0.0 2.0 0 0
66 ABC 2010-05-28 0.0 2.0 0 0
我尝试了以下方法,但无效:
new_report['action'] = 0
buy_flag = False
def action(value):
global buy_flag
if new_report['hold_fg'] == 1:
buy_flag = True
return 'BUY'
if new_report['hold_fg'] == 3:
buy_flag = True
return 'HOLD'
if new_report['sell_fg'] == 2:
buy_flag = False
return 'SELL'
else:
return '0'
有没有办法解决这个问题
更新的预期产出:
ticker date buy_fg sell_fg action hold_fg
50 ABC 2010-01-01 0.0 2.0 NIL 0
51 ABC 2010-01-08 0.0 2.0 NIL 0
52 ABC 2010-01-15 0.0 2.0 NIL 0
53 ABC 2010-01-22 0.0 2.0 NIL 0
1512 ABC 2010-01-29 1.0 0.0 BUY 1
54 ABC 2010-02-05 0.0 2.0 SELL 0
55 ABC 2010-02-12 0.0 2.0 NIL 0
56 ABC 2010-02-19 0.0 2.0 NIL 0
57 ABC 2010-02-26 0.0 2.0 NIL 0
58 ABC 2010-03-05 0.0 2.0 NIL 0
59 ABC 2010-03-12 0.0 2.0 NIL 0
60 ABC 2010-03-19 0.0 2.0 NIL 0
61 ABC 2010-03-26 0.0 2.0 NIL 0
1417 ABC 2010-04-02 1.0 0.0 BUY 1
1409 ABC 2010-04-09 1.0 0.0 HOLD 3
62 ABC 2010-04-23 0.0 2.0 SELL 0
63 ABC 2010-05-07 0.0 2.0 NIL 0
64 ABC 2010-05-14 0.0 2.0 NIL 0
65 ABC 2010-05-21 0.0 2.0 NIL 0
66 ABC 2010-05-28 0.0 2.0 NIL 0
我认为您需要跟踪状态,并在此基础上应用所需的逻辑。下面是一个使用自定义函数来实现这一点的示例。希望这有帮助
# Initiate the global, default buy flag
>>> buy_flag = False
# Custom function to flick the global flag based on `buy_fg` column
>>> def sell_or_buy(value):
global buy_flag
if value == 1:
if buy_flag is False:
buy_flag = True
return 'BUY'
if buy_flag is True:
return 'HOLD'
if value == 0:
if buy_flag == 1:
buy_flag = False
return 'SELL'
if buy_flag == 0:
return 'NIL'
>>> df['action'] = df['buy_fg'].apply(sell_or_buy)
>>> df
ticker date buy_fg sell_fg action
0 50 ABC 2010-01-01 0.0 2.0 NIL
1 51 ABC 2010-01-08 0.0 2.0 NIL
2 52 ABC 2010-01-15 0.0 2.0 NIL
3 53 ABC 2010-01-22 0.0 2.0 NIL
4 1512 ABC 2010-01-29 1.0 0.0 BUY
5 54 ABC 2010-02-05 0.0 2.0 SELL
6 55 ABC 2010-02-12 0.0 2.0 NIL
7 56 ABC 2010-02-19 0.0 2.0 NIL
8 57 ABC 2010-02-26 0.0 2.0 NIL
9 58 ABC 2010-03-05 0.0 2.0 NIL
10 59 ABC 2010-03-12 0.0 2.0 NIL
11 60 ABC 2010-03-19 0.0 2.0 NIL
12 61 ABC 2010-03-26 0.0 2.0 NIL
13 1417 ABC 2010-04-02 1.0 0.0 BUY
14 1409 ABC 2010-04-09 1.0 0.0 HOLD
15 62 ABC 2010-04-23 0.0 2.0 SELL
16 63 ABC 2010-05-07 0.0 2.0 NIL
17 64 ABC 2010-05-14 0.0 2.0 NIL
18 65 ABC 2010-05-21 0.0 2.0 NIL
19 66 ABC 2010-05-28 0.0 2.0 NIL
编辑:
这是为了满足您的最新要求。由于您更新问题的方式现在有点混乱,我将修改我的答案以添加到上面的数据框中
>>> d={'NIL': 0, 'BUY': 1, 'SELL': 2, 'HOLD' : 3}
>>> df['hold_fg'] = df.action.map(d)
>>> df
ticker date buy_fg sell_fg action hold_fg
0 50 ABC 2010-01-01 0.0 2.0 NIL 0
1 51 ABC 2010-01-08 0.0 2.0 NIL 0
2 52 ABC 2010-01-15 0.0 2.0 NIL 0
3 53 ABC 2010-01-22 0.0 2.0 NIL 0
4 1512 ABC 2010-01-29 1.0 0.0 BUY 1
5 54 ABC 2010-02-05 0.0 2.0 SELL 2
6 55 ABC 2010-02-12 0.0 2.0 NIL 0
7 56 ABC 2010-02-19 0.0 2.0 NIL 0
8 57 ABC 2010-02-26 0.0 2.0 NIL 0
9 58 ABC 2010-03-05 0.0 2.0 NIL 0
10 59 ABC 2010-03-12 0.0 2.0 NIL 0
11 60 ABC 2010-03-19 0.0 2.0 NIL 0
12 61 ABC 2010-03-26 0.0 2.0 NIL 0
13 1417 ABC 2010-04-02 1.0 0.0 BUY 1
14 1409 ABC 2010-04-09 1.0 0.0 HOLD 3
15 62 ABC 2010-04-23 0.0 2.0 SELL 2
16 63 ABC 2010-05-07 0.0 2.0 NIL 0
17 64 ABC 2010-05-14 0.0 2.0 NIL 0
18 65 ABC 2010-05-21 0.0 2.0 NIL 0
19 66 ABC 2010-05-28 0.0 2.0 NIL 0
根据你的
行动
专栏,你的思路是正确的,但我无法理解你的问题,你现在到底错过了什么?有点困惑。你能详细说明一下吗?只有在“购买已注册”的情况下,才需要显示“卖出”
?您要查找的预期输出是什么?使用逻辑和预期输出进行了更新。既然您已经更新/更改了问题,您是否可以再次更新预期输出?更新-与您更新的解决方案的唯一区别是索引1417、1409和62谢谢,这让我更进一步,但是我已经用一些后续挑战更新了这个问题。嘿,不用担心,我会看一看,但是你不应该更新你的原始问题,因为它现在使我的答案完全无用,因为它做了你最初需要/要求的,并且基本上使我的答案无效(想象有人第一次读到这篇文章——我的答案对问题的内容完全无效)…我会看一看你的逻辑,但我会建议恢复你的问题并保留历史记录。这样,其他人可能会给你更好的整体解决方案。最好是每次保留一个问题。希望这有意义