首页 > 解决方案 > 对 groupby 对象执行更复杂的计算

问题描述

我目前正在寻找对大型期权数据集进行一些计算,我想首先根据执行价格和到期日拆分数据,然后对每个子组执行如下所示的一组计算。我已经能够分离数据groupby来获得我想要的拆分,我还编写了我想要做的计算,当在子组上测试时它会起作用。我唯一的问题是将两者结合在一起。

这是我用来分组数据的代码:

grouped =df.groupby(['Expiry','Strike'])

我在线阅读,他们提到了该apply函数的使用,但示例仅包括简单的函数,例如求和或平均值。

这是我想对每个子组数据执行的计算,其中x,y,z,u,R每个子集中的列对于所有子组都相同:

 def p(d, S, B, c):
     return d * S + B - c


 def b_t(r, b_old, S, d, d_old, t):
     return np.exp(r * t) * b_old + S * (d_old - d)


 def e_t(d_old, S, c, r, t, b_old):
     return d_old * S - c + np.exp(r * t) * b_old
 
 P_results = []
 B_results = []
 E_results = []
 
 for i,(d,S,c,t,r) in enumerate(zip(x,y,z,u,R)):
    B = b_t(r, b_old, S, d, d_old, t)
    P = p(d, S, B, c)
    E = e_t(d_old, S, c, r, t, b_old)
    print('i={},P={},B={},E={}'.format(i,P,B,E))
    B_results.append(B)
    P_results.append(P)
    E_results.append(E)
    b_old = B
    d_old = d

我想也许如果我可以将每个子集保存为一个新的变量数据框,那么它也许可以工作,但我无法做到这一点。

我希望这很清楚,我认为发布一些数据会有所帮助,但我不确定如何最好地在此处上传。

非常感谢您的帮助!

更新 1:找到了一个可行的解决方案

    grouped =df.groupby(['Expiry','Strike'])

    lg = list(grouped)


    P_results = []
    l_results =[]
    B_results = []
    E_results = []
    
    for l in range(len(lg)):
      df2=lg[l][1]
      d_old = df2.iloc[0, 4]
      S_old = df2.iloc[0, 8]
      c_old = df2.iloc[0, 10]
      b_old = c_old - d_old * S_old
      x = df2.iloc[1:, 4]
      y = df2.iloc[1:, 8]
      z = df2.iloc[1:, 10]
      u = df2.iloc[1:, 9]
      R = df2.iloc[1:, 7]

        for i, (d, S, c, t, r) in enumerate(zip(x, y, z, u, R)):
           B = b_t(r, b_old, S, d, d_old, t)
           P = p(d, S, B, c)
           E = e_t(d_old, S, c, r, t, b_old)
           print('i={},P={},B={},E={}'.format(i, P, B, E))
           l_results.append(l)
           B_results.append(B)
           P_results.append(P)
           E_results.append(E)
           b_old = B
           d_old = d

    BB = pd.DataFrame(np.column_stack([l_results, P_results, 
    E_results,B_results]),columns=['l','P','E','B'])

我所做的只是转换grouped成一个可调用列表,然后使用 for 循环调用每个部分,然后使用另一个 for 循环来执行计算。这不是最漂亮的输出,我放在l_results那里是为了显示计算所指的组,但现在似乎已经足够了。如果有更好的方法请告诉我!

标签: pythonpandas-groupby

解决方案


推荐阅读