выполнение более сложных вычислений над объектами groupby

#python #pandas-groupby

#python #pandas-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
  

Я подумал, может быть, если бы я мог сохранить каждое подмножество как новую переменную dataframe, тогда, возможно, это могло бы сработать, но я не смог этого сделать.

Я надеюсь, что это понятно, и я думаю, что публикация некоторых данных помогла бы, но я не уверен, как лучше всего загрузить их сюда.

Очень ценю вашу помощь!

ОБНОВЛЕНИЕ 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 туда, чтобы показать, к какой группе относились вычисления, но, похоже, на данный момент этого достаточно. Если есть какой-либо лучший способ, пожалуйста, дайте мне знать!