El promedio es ambiguo: la moda y la mediana también son promedios de uso común
jtlz2
La moda y la mediana son otras medidas de tendencia central. No son promedios. El modo es el valor más común visto en un conjunto de datos y no es necesariamente único. La mediana es el valor que representa el centro de los puntos de datos. Como la pregunta implica, hay algunos tipos diferentes de promedios, pero todos son diferentes de los cálculos de mediana y moda. purplemath.com/modules/meanmode.htm
Jarom
@Jarom Ese enlace no está de acuerdo con usted: "La media, la mediana y la moda son tres tipos de" promedios ""
Marcelo Cantos
Respuestas:
285
No tengo conocimiento de nada en la biblioteca estándar. Sin embargo, podría usar algo como:
Numpy es una pesadilla para instalar en un virtualenv. Realmente deberías considerar no usar esta lib
vcarel
46
@vcarel: "numpy es una pesadilla para instalar en un virtualenv". No estoy seguro de por qué dices esto. Solía ser el caso, pero durante el último año o más ha sido muy fácil.
66
Debo secundar este comentario. Actualmente estoy usando numpy en un virtualenv en OSX, y no hay absolutamente ningún problema (actualmente uso CPython 3.5).
Juan Carlos Coto
44
Con sistemas de integración continua como Travis CI, la instalación de numpy lleva varios minutos adicionales. Si la construcción rápida y ligera es valiosa para usted, y solo necesita la media, considere.
Está disponible desde Python 3.4. Para los usuarios 3.1-3.3, una versión anterior del módulo está disponible en PyPI bajo el nombre stats. Solo cambia statisticsa stats.
Tenga en cuenta que esto es extremadamente lento en comparación con las otras soluciones. Compare timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")y timeit("statistics.mean(vec)")- este último es más lento que los demás por un factor enorme (> 100 en algunos casos en mi PC). Esto parece deberse a una implementación particularmente precisa del sumoperador statistics, ver PEP y Código . Sin embargo, no estoy seguro de la razón de la gran diferencia de rendimiento entre statistics._sumy numpy.sum.
jhin
10
@jhin esto se debe a que statistics.meanintenta ser correcto . Calcula correctamente la media de [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meantambién aceptará una expresión generadora de valores, que todas las soluciones que usan len()para el divisor se ahogarán.
entonces media ([2,3]) daría 2. ten cuidado con las carrozas. Mejor use float (sum (l)) / len (l). Mejor aún, tenga cuidado de verificar si la lista está vacía.
jesusiniesta
14
@jesusiniesta excepto en python3, donde la división hace lo que debe hacer: dividir
yota
11
Y en Python 2.2+ si está from __future__ import divisionen la parte superior de su programa
spiffytech
¿Qué pasa con los grandes números y el desbordamiento?
obayhan
¿Qué hay de a = list()? El código propuesto da como resultado ZeroDivisionError.
En lugar de lanzar para flotar, puedes hacer lo siguiente
def mean(nums):return sum(nums,0.0)/ len(nums)
o usando lambda
mean =lambda nums: sum(nums,0.0)/ len(nums)
ACTUALIZACIONES: 2019-12-15
Python 3.8 agregó la función fmean al módulo de estadísticas . Que es más rápido y siempre devuelve flotante.
Convierta datos en flotantes y calcule la media aritmética.
Esto se ejecuta más rápido que la función mean () y siempre devuelve un flotante. Los datos pueden ser una secuencia o iterables. Si el conjunto de datos de entrada está vacío, genera un StatisticsError.
La respuesta adecuada a su pregunta es usar statistics.mean. Pero por diversión, aquí hay una versión de mean que no usa la len()función, por lo que (like statistics.mean) se puede usar en generadores, que no admiten len():
from functools import reduce
from operator import truediv
def ave(seq):return truediv(*reduce(lambda a, b:(a[0]+ b[1], b[0]),
enumerate(seq, start=1),(0,0)))
Otros ya publicaron muy buenas respuestas, pero algunas personas aún podrían estar buscando una forma clásica de encontrar Mean (promedio), así que aquí publico esto (código probado en Python 3.6):
def meanmanual(listt):
mean =0
lsum =0
lenoflist = len(listt)for i in listt:
lsum += i
mean = lsum / lenoflist
return float(mean)
a =[1,2,3,4,5,6]
meanmanual(a)Answer:3.5
Respuestas:
No tengo conocimiento de nada en la biblioteca estándar. Sin embargo, podría usar algo como:
En numpy, hay
numpy.mean()
.fuente
[]
es0
, que puede hacerse porfloat(sum(l))/max(len(l),1)
.l
es un nombre de variable incorrecto porque se parece mucho a él1
. Además, usaría enif l
lugar deif len(l) > 0
. Ver aquímax
?NumPy tiene un
numpy.mean
que es una media aritmética. El uso es tan simple como esto:fuente
Uso
statistics.mean
:Está disponible desde Python 3.4. Para los usuarios 3.1-3.3, una versión anterior del módulo está disponible en PyPI bajo el nombre
stats
. Solo cambiastatistics
astats
.fuente
timeit("numpy.mean(vec))
,timeit("sum(vec)/len(vec)")
ytimeit("statistics.mean(vec)")
- este último es más lento que los demás por un factor enorme (> 100 en algunos casos en mi PC). Esto parece deberse a una implementación particularmente precisa delsum
operadorstatistics
, ver PEP y Código . Sin embargo, no estoy seguro de la razón de la gran diferencia de rendimiento entrestatistics._sum
ynumpy.sum
.statistics.mean
intenta ser correcto . Calcula correctamente la media de[1e50, 1, -1e50] * 1000
.statistics.mean
también aceptará una expresión generadora de valores, que todas las soluciones que usanlen()
para el divisor se ahogarán.Ni siquiera necesitas numpy o scipy ...
fuente
from __future__ import division
en la parte superior de su programaa = list()
? El código propuesto da como resultadoZeroDivisionError
.Use scipy:
fuente
En lugar de lanzar para flotar, puedes hacer lo siguiente
o usando lambda
ACTUALIZACIONES: 2019-12-15
Python 3.8 agregó la función fmean al módulo de estadísticas . Que es más rápido y siempre devuelve flotante.
fuente
por ejemplo
y el resultado es
fuente
Ejemplos:
fuente
fuente
Siempre supuse que
avg
se omite de builtins / stdlib porque es tan simple comoy cualquier advertencia ya se abordaría en el código de llamada para uso local .
Advertencias notables:
resultado no flotante: en python2, 9/4 es 2. para resolver, usar
float(sum(L))/len(L)
ofrom __future__ import division
división por cero: la lista puede estar vacía. resolver:
fuente
La respuesta adecuada a su pregunta es usar
statistics.mean
. Pero por diversión, aquí hay una versión de mean que no usa lalen()
función, por lo que (likestatistics.mean
) se puede usar en generadores, que no admitenlen()
:fuente
Otros ya publicaron muy buenas respuestas, pero algunas personas aún podrían estar buscando una forma clásica de encontrar Mean (promedio), así que aquí publico esto (código probado en Python 3.6):
fuente