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检查交易参考栏的每一行并且:

  1. 添加一列 TRADE_TYPEDIRECTION(我当然已经涵盖了这部分)

  2. 如果 REF 是唯一的(列中没有重复项),那么 TRADE_TYPE 应该是 = "Flat" + df[Period](即 "Flat Apr-20 ") 和 DIRECTION 应该是该行的 = df[Type]

  3. 如果 REF 在两行中相同,则 Product 在这些行中相同,Period 在这些行中不同,并且 Type 不同(一个是卖出,另一个是买入),那么这些行中的 TRADE_TYPE 应该 = "Spread" 并且 DIRECTION 应该等于第一行的类型(即如果第一行2 中的一个说卖出,然后是卖出,反之亦然)

  4. 如果REF跨3行相同,Product跨这些行相同,Period跨这些行不同,总和这些行的 QTY 等于零,那么 TRADE_TYPE 应该是 = "Trio" 并且 DIRECTION 应该等于第一行的类型(即如果 3 的第一行是SELL 第二个是BUY 第三个是SELL,那么应该取第一个的值)

  5. 如果 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。从那里您可以获得按照您的描述计算列所需的所有信息。