seleccionar recorrer panda leer funciones documentacion datos data con columnas cargar python r pandas

python - recorrer - Groupby media ponderada y suma en el marco de datos pandas



recorrer data frame pandas (2)

Tengo un marco de datos,

Out[78]: contract month year buys adjusted_lots price 0 W Z 5 Sell -5 554.85 1 C Z 5 Sell -3 424.50 2 C Z 5 Sell -2 424.00 3 C Z 5 Sell -2 423.75 4 C Z 5 Sell -3 423.50 5 C Z 5 Sell -2 425.50 6 C Z 5 Sell -3 425.25 7 C Z 5 Sell -2 426.00 8 C Z 5 Sell -2 426.75 9 CC U 5 Buy 5 3328.00 10 SB V 5 Buy 5 11.65 11 SB V 5 Buy 5 11.64 12 SB V 5 Buy 2 11.60

Necesito una suma de ajustados lotes, precio que sea el promedio ponderado, de precios y ajusted_lots, agrupados por todas las demás columnas, es decir. agrupados por (contrato, mes, año y compras)

Se logró una solución similar en R siguiendo el código, usando dplyr, pero no se puede hacer lo mismo en los pandas.

> newdf = df %>% select ( contract , month , year , buys , adjusted_lots , price ) %>% group_by( contract , month , year , buys) %>% summarise(qty = sum( adjusted_lots) , avgpx = weighted.mean(x = price , w = adjusted_lots) , comdty = "Comdty" ) > newdf Source: local data frame [4 x 6] contract month year comdty qty avgpx 1 C Z 5 Comdty -19 424.8289 2 CC U 5 Comdty 5 3328.0000 3 SB V 5 Comdty 12 11.6375 4 W Z 5 Comdty -5 554.8500

¿Es lo mismo posible por groupby o cualquier otra solución?


Hacer el promedio ponderado por groupby (...). Apply (...) puede ser muy lento (100x de lo siguiente). Ver mi respuesta (y otros) en este hilo .

def weighted_average(df,data_col,weight_col,by_col): df[''_data_times_weight''] = df[data_col]*df[weight_col] df[''_weight_where_notnull''] = df[weight_col]*pd.notnull(df[data_col]) g = df.groupby(by_col) result = g[''_data_times_weight''].sum() / g[''_weight_where_notnull''].sum() del df[''_data_times_weight''], df[''_weight_where_notnull''] return result


Para pasar varias funciones a un objeto groupby, debe pasar un diccionario con las funciones de agregación correspondientes a las columnas:

# Define a lambda function to compute the weighted mean: wm = lambda x: np.average(x, weights=df.loc[x.index, "adjusted_lots"]) # Define a dictionary with the functions to apply for a given column: f = {''adjusted_lots'': [''sum''], ''price'': {''weighted_mean'' : wm} } # Groupby and aggregate with your dictionary: df.groupby(["contract", "month", "year", "buys"]).agg(f) adjusted_lots price sum weighted_mean contract month year buys C Z 5 Sell -19 424.828947 CC U 5 Buy 5 3328.000000 SB V 5 Buy 12 11.637500 W Z 5 Sell -5 554.850000

Puedes ver más aquí:

y en una pregunta similar aquí:

Espero que esto ayude