statistics.mean y statistics.fmean en Python

Por el equipo de promedio.net · Actualizado el

statistics.mean(datos) devuelve la media aritmética calculada de forma exacta y respeta el tipo de los datos (int, float, Decimal, Fraction). statistics.fmean(datos) convierte todo a float, es más rápido y, desde Python 3.11, acepta pesos con weights=. Ambas están en la biblioteca estándar: solo necesitas import statistics.

Sintaxis

import statistics as st

st.mean(datos)                  # media exacta, conserva el tipo
st.fmean(datos)                 # media en float, más rápida
st.fmean(datos, weights=pesos)  # media ponderada (Python 3.11 o posterior)

datos puede ser una lista, una tupla o cualquier iterable, incluido un generador. mean no tiene parámetro de pesos: si lo necesitas en una versión anterior a la 3.11, calcula sum(x * w for x, w in zip(datos, pesos)) / sum(pesos).

mean frente a fmean

statistics.meanstatistics.fmean
Tipo del resultadoEl de los datos si es exacto: mean([1, 2, 3]) → 2Siempre float: fmean([1, 2, 3]) → 2.0
Decimal y FractionLos respeta y no pierde precisiónLos convierte a float
PesosNoweights= desde Python 3.11
Disponible desdePython 3.4Python 3.8
VelocidadMás lenta: suma con fracciones exactasMucho más rápida en listas largas

Paso a paso

  1. Importa el módulo: import statistics as st.
  2. Decide el tipo de dato. Para dinero con centavos exactos usa Decimal("12.30"); para mediciones, float.
  3. Llama a st.mean(datos) si importa la exactitud, o a st.fmean(datos) si importa la velocidad o necesitas pesos.
  4. Atrapa st.StatisticsError si la lista puede llegar vacía.

Ejemplos resueltos

Ejemplo 1: el mismo promedio con distinta precisión

import statistics as st

print(st.mean([0.1, 0.2, 0.4]))
print(st.fmean([0.1, 0.2, 0.4]))
print(sum([0.1, 0.2, 0.4]) / 3)
0.23333333333333334
0.23333333333333336
0.23333333333333336

mean suma los valores convirtiéndolos a fracciones exactas y redondea una sola vez al final, por eso su resultado es el float más cercano al valor real (0.2333…). fmean y sum()/len() acumulan el error de cada suma en coma flotante. La diferencia aparece en el decimal 17: no importa para mostrar una calificación, pero sí cuando comparas resultados con ==.

Ejemplo 2: dinero con Decimal y fracciones

from decimal import Decimal
from fractions import Fraction

print(st.mean([Decimal("0.1"), Decimal("0.2"), Decimal("0.4")]))
print(st.mean([Fraction(1, 3), Fraction(1, 6)]))
0.2333333333333333333333333333
1/4

Con Decimal el resultado sigue siendo Decimal, con la precisión del contexto decimal (28 dígitos por omisión). Con Fraction el promedio de 1/3 y 1/6 es exactamente 1/4, sin decimales periódicos.

Ejemplo 3: promedio ponderado con fmean

Un curso pondera tareas al 30 %, examen al 50 % y proyecto al 20 %. Las notas son 8, 9 y 6:

print(st.fmean([8, 9, 6], weights=[0.3, 0.5, 0.2]))
print(st.fmean([9.0, 7.5, 8.0], weights=[8, 6, 4]))
8.1
8.277777777777779

En el primer caso los pesos suman 1, así que 8 × 0.3 + 9 × 0.5 + 6 × 0.2 = 8.1. En el segundo los pesos son créditos (8, 6 y 4): fmean divide entre la suma de los pesos, 18, sin que tengas que normalizarlos. Puedes comprobar ambos con la calculadora de promedio ponderado.

Errores comunes

Para la mediana, la moda y las medias geométrica y armónica, el mismo módulo ofrece median, mode, geometric_mean y harmonic_mean, explicadas en las páginas de mediana, moda y media geométrica y armónica.

Fuentes

  1. Python Software Foundation, documentación del módulo statistics. statistics.mean, statistics.fmean (parámetro weights desde Python 3.11). Consultado el 11 de noviembre de 2026.