Saltar al contenido

Python: algoritmo de mediana ponderada con pandas

Esta es la solución más correcta que encomtrarás compartir, pero estúdiala detenidamente y analiza si es compatible a tu proyecto.

Solución:

Si quieres hacer esto en pandas puros, aquí hay una manera. Tampoco interpola. (@svenkatesh, te faltaba la suma acumulada en tu pseudocódigo)

df.sort_values('impwealth', inplace=True)
cumsum = df.indweight.cumsum()
cutoff = df.indweight.sum() / 2.0
median = df.impwealth[cumsum >= cutoff].iloc[0]

Esto da una mediana de 925000.

¿Has probado el paquete wquantiles? Nunca lo había usado antes, pero tiene una función de mediana ponderada que parece dar al menos una respuesta razonable (probablemente querrá volver a verificar que esté usando el enfoque que espera).

In [12]: import weighted

In [13]: weighted.median(df['impwealth'], df['indweight'])
Out[13]: 914662.0859091772

Esta función generaliza la solución del corrector:

def weighted_median(df, val, weight):
    df_sorted = df.sort_values(val)
    cumsum = df_sorted[weight].cumsum()
    cutoff = df_sorted[weight].sum() / 2.
    return df_sorted[cumsum >= cutoff][val].iloc[0]

En este ejemplo sería weighted_median(df, 'impwealth', 'indweight').

Puedes estimular nuestra faena ejecutando un comentario o dejando una puntuación te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *