如何在pandas数据帧上进行sumifs / vlookup -ish公式化

时间:2017-05-31 08:28:19

标签: python-2.7 pandas dataframe

这里的python非常初学者。我想对基本选项分析进行一些简单的计算,如三组DataFrame(spot_table,div_table,opt_table)所示。

我在这里寻找的是做类似于excel" sumifs"在python中运行以获得"期望的结果"表

  1. 应用股息(a_div)   例如对于opt_table中的每个期权合约,将从div_table中查找相应的und和Ex-date。期权到期前的任何股息都将包含在a_div列中。
  2. 应用点(a_spot)   例如对于opt_table中的每个期权合约,将从spot_table中查找相应的现货价格。
spot_table
     Spot  Trade_date  und
0  197.20  2017-05-29  AAA
1   67.75  2017-05-29  BBB
2  274.80  2017-05-29  CCC

div_table
   Div     Ex-date  und
0    1  2017-09-01  AAA
1    2  2017-10-01  AAA
2    4  2017-11-01  AAA
3   10  2017-10-01  BBB
4   20  2017-11-01  BBB
5  100  2017-09-01  CCC

opt_table
       Expiry  Opt  und
0  2017-10-15  ZZZ  AAA
1  2017-11-01  YYY  AAA
2  2017-10-30  XXX  BBB
3  2017-12-20  WWW  CCC

期望的结果

   a_Div    Expiry  Opt  und  a_Spot
0    3  2017-10-15  ZZZ  AAA  197.20
1    7  2017-11-01  YYY  AAA  197.20
2   10  2017-10-30  XXX  BBB   67.75
3  100  2017-12-20  WWW  CCC  274.80

1 个答案:

答案 0 :(得分:0)

这需要几个步骤。首先,将spot表加入底层的选项表:

opt_spot=pd.merge(opt_table, spot_table, how='left', on='und')

接下来,为红利表分配一个新列,以确定支付的最新红利(我认为这是您想要的?):

div_table['latest'] = div_table.sort_values(['und', 'Ex-date'], ascending=False).groupby('und').cumcount()+1

使用每个底层证券的最新股息加入新表格(不确定这是否是执行此操作的最佳方式):

desired_output = pd.merge(opt_spot, div_table[div_table['latest'] == 1], how='left', on='und')

重命名和删除您不想要的列:

final_output = desired_output.rename_axis({'Div':'a_Div', 'Spot': 'a_Spot'}, axis=1)[['a_Div', 'Expiry', 'Opt', 'und', 'a_Spot']]