我有两个使用pandas read_excel的数据帧。目前,我正面临着一项挑战,即尝试根据列标题和列值在两个数据框架中应用函数。
Dataframe A(bondDf)是债券数据,其中第一列是索引(也尝试使用多索引头但失败了)
ISIN ABCDE123 DEFGHI245 ASKDNA123 AJSNDJAKS2
Issue Date 18/01/2005 31/01/2008 15/02/2000 15/02/2007
Maturity 15/01/2010 31/01/2010 15/02/2010 15/02/2010
First Coupon Date 15/07/2005 31/07/2008 15/08/2000 15/08/2007
Cpn 3.9875 2.3375 7.15 5.225
31/12/2008 103.515625 101.875 106.609375 104.796875
30/01/2009 102.9375 101.546875 106.109375 104.28125
27/02/2009 102.546875 101.234375 105.453125 103.796875
31/03/2009 102.453125 101.296875 105.140625 103.609375
30/04/2009 102.3125 101.28125 104.796875 103.40625
Dataframe B(futuresDf)是期货数据,其中第一列的索引类似
Index FUT_DLV_DT_FIRST
31/12/2008 02/03/2009
30/01/2009 02/03/2009
27/02/2009 02/03/2009
31/03/2009 01/06/2009
30/04/2009 01/06/2009
我试图在bonddf(103.51,101.875等)中为每个债券价格应用以下函数
def inBasket(b_issueDate, b_maturityDate, f_firstDeliveryDate, currentDate):
if b_issueDate < currentDate:
DateDiffMonths = (f_firstDeliveryDate - b_maturityDate).days
# other simple computation below
到目前为止,我尝试的是:
bondDf.iloc[6:].apply(lambda x: inBasket(f_contract, x.loc['Issue Date'],
x.loc['Maturity'], futuresDf.iloc[:]['FUT_DLV_DT_FIRST'],
bondDf.index.values[6:]), 0))
非常感谢任何帮助!
答案 0 :(得分:0)
我不知道你如何链接你的两个帧(显然,按日期,但是一个示例输出可以很好地清除它),但我想如果你想使用日期作为输入,那么你必须使用futuresDf作为输入。我的猜测是在BondDf上使用布尔索引,例如
bondDf[bondDf.index==futuresDf] and perform the assignation from there. Or use a where method.
但我认为你选择了一种不好的方式在你的框架中表示你的数据,因为它们不适合自然。如果在数据框架中明确了这种关系,则可以轻松地加入/操作它们。在这里它无法完成。我甚至无法预测对应于与债券第二列相比较的五个日期的未来预测行的标题。
如果我手头有这样的问题,我会将数据重构为每个原始的bondsDf列的一个帧,其中五行与每个futuresDf行匹配,或者转置原始数据帧并加入它们。这种比较会更容易。
编辑: 我的看法如下:拿你的df bondsDF并计算指数的每个日期(如#34;当前日期&#34;)是否会低于&#34;发行日期&#34;):
df
Out[53]:
1 2 3 4
0
ISIN ABCDE123 DEFGHI245 ASKDNA123 AJSNDJAKS2
Issue Date 18/01/2005 31/01/2008 15/02/2000 15/02/2007
Maturity 15/01/2010 31/01/2010 15/02/2010 15/02/2010
First Coupon Date 15/07/2005 31/07/2008 15/08/2000 15/08/2007
Cpn 3.9875 2.3375 7.15 5.225
31/12/2008 103.515625 101.875 106.609375 104.796875
30/01/2009 102.9375 101.546875 106.109375 104.28125
27/02/2009 102.546875 101.234375 105.453125 103.796875
31/03/2009 102.453125 101.296875 105.140625 103.609375
30/04/2009 102.3125 101.28125 104.796875 103.40625
sd=df.loc("Issue Date",:)
truth =sd.apply(lambda x: x<df.index[5:])
从这里开始,你根据相同的原理用所有df的其他日期执行计算,然后根据真值分配,然后通过切片正确的方式处理相应的值并使用元素执行操作两个数据帧。例如df.loc [5:,:] * values_df_based_on_truth *标量......