Já postei essa pergunta antes, mas ela continua sendo fechada devido a perguntas semelhantes, mas essas soluções não me ajudaram aqui.
Tenho um dataframe que precisa ser agrupado por 3 colunas diferentes. A partir dos agrupamentos resultantes, preciso realizar cálculos e depois aplicar o resultado a cada linha em uma nova coluna.
Meus dados ficam assim:
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue
---- ----- ----- --------- --------- ------- ---------------- -------- ---------
J1 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00
J2 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00
J3 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 50.00
J4 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 5 25.00
Meu objetivo é agrupar os dados por [Deal, commodity, startdate] para que os dados resultantes fiquem assim:
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue
---- ----- ----- --------- --------- ------- ---------------- -------- ---------
J1 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00
J2 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue
---- ----- ----- --------- --------- ------- ---------------- -------- ---------
J3 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 50.00
J4 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 5 25.00
A partir disso, preciso usar uma fórmula para calcular um 'fprice' e adicioná-lo a cada linha assim:
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue fprice
---- ----- ----- --------- --------- ------- ---------------- -------- --------- -----
J1 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00 0
J2 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00 0
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue fprice
---- ----- ----- --------- --------- ------- ---------------- -------- --------- -----
J3 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 50.00 1.25
J4 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 25.00 1.25
Meu problema está na próxima etapa, quando tento adicionar o fprice de volta ao dataframe original, tenho esta linha de código:
df['fprice'] = df.groupby(['StartDate', 'Commodity', 'Deal']).apply(lambda group: -(group['MTMValue'].sum() - (group['FixedPriceStrike'] * group['Quantity']).sum()) / group['Quantity'].sum()).reset_index(drop=True)
que retorna este dataframe:
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue fprice
---- ----- ----- --------- --------- ------- ---------------- -------- --------- -----
J1 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00 0
J2 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00 1.25
J3 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 50.00
J4 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 25.00
quando o resultado deve ser parecido
ID Deal Party Commodity startdate enddate fixedpricestrike quantity mtmvalue fprice
---- ----- ----- --------- --------- ------- ---------------- -------- --------- -----
J1 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00 0
J2 Sell J (stock1, stock2) 01Jan23 01Feb23 10.00 10 100.00 0
J3 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 50.00 1.25
J4 Buy J (stock1, stock2) 01Jan23 01Feb23 5.00 10 25.00 1.25
Também sou relativamente novo no uso de pandas e não tenho certeza de por que meu resultado está saindo dessa maneira. Qualquer sugestão ajudaria
Em vez de fazer isso em uma única etapa, você pode primeiro calcular o 'fprice' e depois mesclá-lo de volta ao DataFrame original: