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