Tengo la siguiente tabla. Quiero calcular un promedio ponderado agrupado por cada fecha según la fórmula siguiente. Puedo hacer esto usando algún código convencional estándar, pero suponiendo que estos datos estén en un marco de datos de pandas, ¿hay alguna manera más fácil de lograr esto en lugar de a través de la iteración?
Date ID wt value w_avg
01/01/2012 100 0.50 60 0.791666667
01/01/2012 101 0.75 80
01/01/2012 102 1.00 100
01/02/2012 201 0.50 100 0.722222222
01/02/2012 202 1.00 80
01/01/2012 w_avg = 0.5 * (60 / I (60,80,100)) + .75 * (80 / I (60,80,100)) + 1.0 * (100 / I (60,80,100))
01/02/2012 w_avg = 0.5 * (100 / suma (100,80)) + 1.0 * (80 / suma (100,80))
Creo que haría esto con dos groupbys.
Primero para calcular el "promedio ponderado":
In [11]: g = df.groupby('Date')
In [12]: df.value / g.value.transform("sum") * df.wt
Out[12]:
0 0.125000
1 0.250000
2 0.416667
3 0.277778
4 0.444444
dtype: float64
Si configura esto como una columna, puede agrupar sobre ella:
In [13]: df['wa'] = df.value / g.value.transform("sum") * df.wt
Ahora la suma de esta columna es la deseada:
In [14]: g.wa.sum()
Out[14]:
Date
01/01/2012 0.791667
01/02/2012 0.722222
Name: wa, dtype: float64
o potencialmente:
In [15]: g.wa.transform("sum")
Out[15]:
0 0.791667
1 0.791667
2 0.791667
3 0.722222
4 0.722222
Name: wa, dtype: float64
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras