Pregunta

numpy.average() tiene una opción de pesos, pero numpy.std() no lo hace. ¿Alguien tiene sugerencias para una solución?

¿Fue útil?

Solución

¿Qué hay de la siguiente "cálculo manual" corta?

def weighted_avg_and_std(values, weights):
    """
    Return the weighted average and standard deviation.

    values, weights -- Numpy ndarrays with the same shape.
    """
    average = numpy.average(values, weights=weights)
    # Fast and numerically precise:
    variance = numpy.average((values-average)**2, weights=weights)
    return (average, math.sqrt(variance))

Otros consejos

Hay una clase de statsmodels que hace que sea fácil de calcular estadísticas ponderadas: < a href = "http://www.statsmodels.org/dev/generated/statsmodels.stats.weightstats.DescrStatsW.html" rel = "noreferrer"> statsmodels.stats.weightstats.DescrStatsW .

Suponiendo este conjunto de datos y los pesos:

import numpy as np
from statsmodels.stats.weightstats import DescrStatsW

array = np.array([1,2,1,2,1,2,1,3])
weights = np.ones_like(array)
weights[3] = 100

inicializar la clase (en cuenta que tiene que pasar en el factor de corrección, el delta de libertad en este punto):

weighted_stats = DescrStatsW(array, weights=weights, ddof=0)

A continuación, se puede calcular:

  • .mean la media ponderada

    >>> weighted_stats.mean      
    1.97196261682243
    
  • .std la ponderado desviación estándar :

    >>> weighted_stats.std       
    0.21434289609681711
    
  • .var la varianza ponderada

    >>> weighted_stats.var       
    0.045942877107170932
    
  • .std_mean la href="https://en.wikipedia.org/wiki/Standard_error" rel="noreferrer"> error estándar de medias ponderada :

    >>> weighted_stats.std_mean  
    0.020818822467555047
    

    En caso de que esté interesado en la relación entre el error estándar y la desviación estándar: El error estándar es (por ddof == 0) cálculo de la desviación típica ponderada dividida por la raíz cuadrada de la suma de los pesos menos 1 ( fuente correspondiente para la versión statsmodels 0,9 en GitHub ):

    standard_error = standard_deviation / sqrt(sum(weights) - 1)
    

No parece existir una función de este tipo en numpy / scipy todavía, pero hay un billete proponer esta funcionalidad. Incluido allí encontrará Statistics.py que implementa típica ponderada desviaciones.

Esto es una opción más:

np.sqrt(np.cov(values, aweights=weights))

No es un muy buen ejemplo propuesto por gaborous :

import pandas as pd
import numpy as np
# X is the dataset, as a Pandas' DataFrame
mean = mean = np.ma.average(X, axis=0, weights=weights) # Computing the 
weighted sample mean (fast, efficient and precise)

# Convert to a Pandas' Series (it's just aesthetic and more 
# ergonomic; no difference in computed values)
mean = pd.Series(mean, index=list(X.keys())) 
xm = X-mean # xm = X diff to mean
xm = xm.fillna(0) # fill NaN with 0 (because anyway a variance of 0 is 
just void, but at least it keeps the other covariance's values computed 
correctly))
sigma2 = 1./(w.sum()-1) * xm.mul(w, axis=0).T.dot(xm); # Compute the 
unbiased weighted sample covariance

ecuación correcta para ponderado covarianza muestra no sesgada, URL (versión: 06.28.2016)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top