Python - 如何对列的所有行和 return 值进行复杂的 IF 迭代
Python - how to do complex IF iterations over all rows of a column and return a value
提前致歉,因为技术上我有几个关于我想用 python 解决的问题,但由于它们是相关的,我将它们全部放在一个 post 中(至少我我希望这对任何能够帮助我的人来说都是一个有价值的挑战。
我有以下 pandas 数据框,称为 df
示例:
REF Period Product Price Type QTY
T001 Jan-20 EQ 69.87 Sell -10
T001 Feb-21 EQ 69.77 Buy 10
T002 Apr-20 BN 10.77 Buy 15
T003 Jul-20 EQ 71.25 Sell -20
T003 Aug-20 EQ 70.89 Buy 40
T003 Sep-20 EQ 70.69 Sell -20
T004 Nov-20 BN 20.83 Buy 10
T004 Dec-20 EQ 40.01 Sell 12
T005 Sep-20 FD 31.25 Buy -20
T005 Mar-21 FD 36.89 Sell 40
T005 Sep-21 FD 40.69 Buy -20
如您所见,REF
列指的是我要分析的投资组合的交易参考。
我一直在努力寻找以下数据分析问题的解决方案:
我想python检查交易参考栏的每一行并且:
添加一列 TRADE_TYPE
和 DIRECTION
(我当然已经涵盖了这部分)
如果 REF
是唯一的(列中没有重复项),那么 TRADE_TYPE
应该是 = "Flat" + df[Period](即 "Flat Apr-20 ") 和 DIRECTION
应该是该行的 = df[Type]
如果 REF
在两行中相同,则 Product
在这些行中相同,Period
在这些行中不同,并且 Type
不同(一个是卖出,另一个是买入),那么这些行中的 TRADE_TYPE
应该 = "Spread" 并且 DIRECTION
应该等于第一行的类型(即如果第一行2 中的一个说卖出,然后是卖出,反之亦然)
如果REF
跨3行相同,Product
跨这些行相同,Period
跨这些行不同,总和这些行的 QTY
等于零,那么 TRADE_TYPE
应该是 = "Trio" 并且 DIRECTION
应该等于第一行的类型(即如果 3 的第一行是SELL 第二个是BUY 第三个是SELL,那么应该取第一个的值)
如果 2 行的 REF
相同但 Product
不同,则 TRADE_TYPE
应该是 =“套利”和 DIRECTION
应该等于第一行的 Type
(即,如果 2 的第一行表示卖出,则它是卖出,反之亦然)
如果以上面的table为例,最后的结果应该是这样的:
REF Period Product Price Type QTY TRADE_TYPE DIRECTION
T001 Jan-20 EQ 69.87 Sell -10 Spread Sell
T001 Feb-21 EQ 69.77 Buy 10 Spread Sell
T002 Apr-20 BN 10.77 Buy 15 Flat Apr Buy
T003 Jul-20 EQ 71.25 Sell -20 Trio Sell
T003 Aug-20 EQ 70.89 Buy 40 Trio Sell
T003 Sep-20 EQ 70.69 Sell -20 Trio Sell
T004 Nov-20 BN 20.83 Buy 10 Arbitrage Buy
T004 Dec-20 EQ 40.01 Sell 12 Arbitrage Buy
T005 Sep-20 FD 31.25 Buy -20 Trio Buy
T005 Mar-21 FD 36.89 Sell 40 Trio Buy
T005 Sep-21 FD 40.69 Buy -20 Trio Buy
任何人都可以帮助解决这个问题或指出正确的方向吗? (如何在行和列等上同时迭代和使用 if 条件)。
非常感谢您的提前帮助!
大致 - 您需要执行 df.groupby(["REF", "Product"]).count()
,这将为您提供 table,其中仅包含参考、产品和计数。从那里你可以 project/join in RAW_TRADE_TYPE
- “Flat”“Spread”或“Trio”之一,使用 where()
或 select()
.
你可以join()
这个到原来的table。从那里您可以获得按照您的描述计算列所需的所有信息。
提前致歉,因为技术上我有几个关于我想用 python 解决的问题,但由于它们是相关的,我将它们全部放在一个 post 中(至少我我希望这对任何能够帮助我的人来说都是一个有价值的挑战。
我有以下 pandas 数据框,称为 df
示例:
REF Period Product Price Type QTY
T001 Jan-20 EQ 69.87 Sell -10
T001 Feb-21 EQ 69.77 Buy 10
T002 Apr-20 BN 10.77 Buy 15
T003 Jul-20 EQ 71.25 Sell -20
T003 Aug-20 EQ 70.89 Buy 40
T003 Sep-20 EQ 70.69 Sell -20
T004 Nov-20 BN 20.83 Buy 10
T004 Dec-20 EQ 40.01 Sell 12
T005 Sep-20 FD 31.25 Buy -20
T005 Mar-21 FD 36.89 Sell 40
T005 Sep-21 FD 40.69 Buy -20
如您所见,REF
列指的是我要分析的投资组合的交易参考。
我一直在努力寻找以下数据分析问题的解决方案:
我想python检查交易参考栏的每一行并且:
添加一列
TRADE_TYPE
和DIRECTION
(我当然已经涵盖了这部分)如果
REF
是唯一的(列中没有重复项),那么TRADE_TYPE
应该是 = "Flat" + df[Period](即 "Flat Apr-20 ") 和DIRECTION
应该是该行的 = df[Type]如果
REF
在两行中相同,则Product
在这些行中相同,Period
在这些行中不同,并且Type
不同(一个是卖出,另一个是买入),那么这些行中的TRADE_TYPE
应该 = "Spread" 并且DIRECTION
应该等于第一行的类型(即如果第一行2 中的一个说卖出,然后是卖出,反之亦然)如果
REF
跨3行相同,Product
跨这些行相同,Period
跨这些行不同,总和这些行的QTY
等于零,那么TRADE_TYPE
应该是 = "Trio" 并且DIRECTION
应该等于第一行的类型(即如果 3 的第一行是SELL 第二个是BUY 第三个是SELL,那么应该取第一个的值)如果 2 行的
REF
相同但Product
不同,则TRADE_TYPE
应该是 =“套利”和DIRECTION
应该等于第一行的Type
(即,如果 2 的第一行表示卖出,则它是卖出,反之亦然)
如果以上面的table为例,最后的结果应该是这样的:
REF Period Product Price Type QTY TRADE_TYPE DIRECTION
T001 Jan-20 EQ 69.87 Sell -10 Spread Sell
T001 Feb-21 EQ 69.77 Buy 10 Spread Sell
T002 Apr-20 BN 10.77 Buy 15 Flat Apr Buy
T003 Jul-20 EQ 71.25 Sell -20 Trio Sell
T003 Aug-20 EQ 70.89 Buy 40 Trio Sell
T003 Sep-20 EQ 70.69 Sell -20 Trio Sell
T004 Nov-20 BN 20.83 Buy 10 Arbitrage Buy
T004 Dec-20 EQ 40.01 Sell 12 Arbitrage Buy
T005 Sep-20 FD 31.25 Buy -20 Trio Buy
T005 Mar-21 FD 36.89 Sell 40 Trio Buy
T005 Sep-21 FD 40.69 Buy -20 Trio Buy
任何人都可以帮助解决这个问题或指出正确的方向吗? (如何在行和列等上同时迭代和使用 if 条件)。
非常感谢您的提前帮助!
大致 - 您需要执行 df.groupby(["REF", "Product"]).count()
,这将为您提供 table,其中仅包含参考、产品和计数。从那里你可以 project/join in RAW_TRADE_TYPE
- “Flat”“Spread”或“Trio”之一,使用 where()
或 select()
.
你可以join()
这个到原来的table。从那里您可以获得按照您的描述计算列所需的所有信息。