Cálculo porcentual en pandas de tabla dinámica con columnas

Tengo un conjunto de datos que contiene varios registros de ventas de diferentes proveedores, ubicaciones, fechas y productos. El conjunto de datos es así:

local categoria fabricante tipo consistencia peso pacote ordem vendas_kg AREA I SABAO ASATP DILUIDO LIQUIDO 1501 A 2000g PLASTICO 1 10 AREA I SABAO TEPOS DILUIDO LIQUIDO 1501 A 2000g PLASTICO 1 20 AREA I SABAO ASATP CAPSULA LIQUIDO 1501 A 2000g PLASTICO 1 20 AREA I SABAO TEPOS CAPSULA LIQUIDO 1501 A 2000g PLASTICO 1 30 AREA I SABAO ASATP DILUIDO LIQUIDO 1501 A 2000g PLASTICO 2 20 AREA I SABAO TEPOS DILUIDO LIQUIDO 1501 A 2000g PLASTICO 2 30 AREA I SABAO ASATP CAPSULA LIQUIDO 1501 A 2000g PLASTICO 2 20 AREA I SABAO TEPOS CAPSULA LIQUIDO 1501 A 2000g PLASTICO 2 30 AREA II SABAO ASATP DILUIDO LIQUIDO 1501 A 2000g PLASTICO 1 10 AREA II SABAO TEPOS DILUIDO LIQUIDO 1501 A 2000g PLASTICO 1 15 AREA II SABAO ASATP CAPSULA LIQUIDO 1501 A 2000g PLASTICO 1 25 AREA II SABAO TEPOS CAPSULA LIQUIDO 1501 A 2000g PLASTICO 1 35 AREA II SABAO ASATP DILUIDO LIQUIDO 1501 A 2000g PLASTICO 2 20 AREA II SABAO TEPOS DILUIDO LIQUIDO 1501 A 2000g PLASTICO 2 25 AREA II SABAO TEPOS CAPSULA LIQUIDO 1501 A 2000g PLASTICO 2 20 AREA II SABAO TEPOS CAPSULA LIQUIDO 1501 A 2000g PLASTICO 2 30 

Estoy girando este conjunto de datos usando el siguiente código:

 temp_df = pd.pivot_table(df,index=['local','tipo','ordem'], values=['vendas_kg'] , aggfunc=[np.sum], columns=['fabricante'], fill_values=0, margins=True, margins_name= 'Total') 

y me sale esta salida:

  sum sum vendas_kg vendas_kg fabricante ASATP TEPOS Total local tipo ordem AREA I DILUIDO 1 10 20 30 2 20 30 50 CAPSULA 1 10 20 30 2 20 30 50 AREA II DILUIDO 1 10 15 25 2 20 25 45 CAPSULA 1 25 35 55 2 20 30 50 

Quiero calcular el porcentaje para cada [‘ordem’] y para el porcentaje para cada segmento.g. Ordem, tipo y local, así:

  sum sum vendas_kg vendas_kg fabricante ASATP TEPOS % segment Total local tipo ordem AREA I DILUIDO 1 33% 66% 50% 30 2 40% 60% 50% 50 CAPSULA 1 33% 66% 50% 30 2 40% 60% 50% 50 AREA II DILUIDO 1 40% 60% 31.25% 25 2 44.44% 55.56% 47.37% 45 CAPSULA 1 43.64% 57.36% 53.63% 55 2 40% 60% 53.63% 50 

Por lo tanto, las ventas totales para AREA I DILUIDO 1 son 30, las ventas de ASATP representan el 33% y TEPOS el 66%, y de las ventas totales de AREA I 1 las ventas de DILUIDO representan el 50% y así sucesivamente.

También quiero comparar la diferencia de ventas entre [‘ordem’], por ejemplo, el crecimiento porcentual del segmento y [‘fabricante’] y almacenar en una nueva tabla como esta:

  % change in % change in vendas_kg vendas_kg % change in % change in fabricante ASATP TEPOS % segment Total AREA I DILUIDO 1 0 0 0 0 2 +7% -6% 0 20 3 0 0 0 0 AREA I CAPSULA 1 0 0 0 0 2 +7% -6% 0 20 3 0 0 0 0 AREA II DILUIDO 1 0 0 0 0 2 +4.44% -4.44% +16.12% 20 3 0 0 0 0 AREA II CAPSULA 1 0 0 0 0 2 -3.64% +3.64% 0 5 3 0 0 0 0 

Estoy atascado en esto durante los últimos 5 días, tengo muchas más categorías en [‘fabricante’] [‘tipo’] y [‘local’], por lo que debe funcionar para más de dos categorías en cada una. Gracias por la ayuda de antemano, no dude en ponerse en contacto conmigo en caso de dudas.

Para tomar los porcentajes:

 df_percent = temp_df.iloc[:, [0,1]].apply(lambda x: round(x / x.sum() * 100, 2), axis = 1) 

para tomar la variación, use diff

 df_diff_percent = df_percent.groupby(level=[0,1]).diff().fillna(0) sum vendas_kg fabricante ASATP TEPOS local tipo ordem AREA I CAPSULA 1 0.00 0.00 2 0.00 0.00 DILUIDO 1 0.00 0.00 2 6.67 -6.67 AREA II CAPSULA 1 0.00 0.00 2 -41.67 41.67