【问题标题】:Python - how to do complex IF iterations over all rows of a column and return a valuePython - 如何对列的所有行进行复杂的 IF 迭代并返回一个值
【发布时间】:2020-09-01 12:41:59
【问题描述】:

提前道歉,因为从技术上讲,我对我想用 python 解决的问题有几个问题,但由于它们是相关的,所以我将它们全部放在一篇文章中(至少我希望这对任何人来说都是一个值得挑战能帮我解决这个问题)。

我有以下名为 df 示例的 pandas 数据框:

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[该行的类型]

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

  4. 如果REF 在 3 行中相同,Product 在这些行中相同,Period 在这些行中不同,并且这些行的 QTY 之和等于零,则 @987654339 @ 应该是 = "Trio" 和 DIRECTION 应该等于第一行的类型(即如果 3 的第一行是 SELL,第二行是 BUY,第三行是 SELL,那么它应该选择第一行的值)

  5. 如果 REF 在 2 行中相同,但 Product 不同,则 TRADE_TYPE 应为 = "Arbitrage" 且 DIRECTION 应等于第一行的 Type(即,如果2 的第一行说 Sell 然后是 Sell,反之亦然)

如果以上表为例,最终结果应该是这样的:

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 条件等)。

非常感谢您提前提供的帮助!

【问题讨论】:

    标签: python pandas numpy dataframe data-analysis


    【解决方案1】:

    大致 - 你需要做一个df.groupby(["REF", "Product"]).count(),这会给你一个只包含参考、产品和计数的表格。从那里您可以使用where()select() 投射/加入RAW_TRADE_TYPE - “Flat”、“Spread”或“Trio”之一。

    你可以join()这个到原表。从那里您可以获得计算所描述的列所需的所有信息。

    【讨论】:

    • 谢谢马修。假设我想将期间保留在 1 行中,即如果它的三行在 3 行中的每一行中都有 9 月、10 月、11 月,我想在之前的第一行将 3 合并为 1 个“9 月 / 10 月 / 11 月”使用 df.drop_duplicates 消除欺骗。这可能吗?
    • 您可以这样做,请参阅:stackoverflow.com/questions/27298178/…
    猜你喜欢
    • 2020-06-13
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多