Mi Python es un poco oxidado (cualquiera puede sentirse libre para editar este código para hacer correcciones, si he estropeado la sintaxis Mehow), pero aquí va ....
def movingAverageExponential(values, alpha, epsilon = 0):
if not 0 < alpha < 1:
raise ValueError("out of range, alpha='%s'" % alpha)
if not 0 <= epsilon < alpha:
raise ValueError("out of range, epsilon='%s'" % epsilon)
result = [None] * len(values)
for i in range(len(result)):
currentWeight = 1.0
numerator = 0
denominator = 0
for value in values[i::-1]:
numerator += value * currentWeight
denominator += currentWeight
currentWeight *= alpha
if currentWeight < epsilon:
break
result[i] = numerator/denominator
return result
Esta función se mueve hacia atrás, desde el final de la lista para el inicio, el cálculo de la media móvil exponencial para cada valor trabajando hacia atrás hasta que el coeficiente de peso para un elemento es menor que el épsilon dado.
Al final de la función, invierte los valores antes de devolver la lista (para que estén en el orden correcto para la persona que llama).
(NOTA LATERAL: si estuviera usando un lenguaje que no sea Python, primero crearía una matriz vacía de tamaño completo y luego la rellenaría para que no tuviera que invertirla al final Pero no creo que puedas declarar una gran matriz vacía en Python. Y en las listas de Python, agregar es mucho menos costoso que anteponer, por lo que construí la lista en orden inverso. Corrígeme si me equivoco.)
El argumento 'alpha' es el factor de disminución en cada iteración. Por ejemplo, si se ha utilizado un alfa de 0,5, entonces el valor promedio móvil de hoy en día se compone de los siguientes valores ponderados:
today: 1.0
yesterday: 0.5
2 days ago: 0.25
3 days ago: 0.125
...etc...
Por supuesto, si usted tiene una enorme variedad de valores, los valores de diez o hace quince días no contribuirá mucho al promedio ponderado de hoy. El argumento 'épsilon' le permite establecer un punto de corte, debajo del cual dejará de preocuparse por los valores antiguos (ya que su contribución al valor actual será insignificante).
Se podría invocar la función de algo como esto:
result = movingAverageExponential(values, 0.75, 0.0001)
promedios en realidad no están en la biblioteca, porque es muy simple: suma (IQ)/len (IQ) da la media aritmética de IQ. – Kiv
Los promedios simples son ... simples. Pero algoritmos más complejos podrían haber sido útiles en la biblioteca estándar. – Jim
numpy y scipy tienen un gran número de funciones estadísticas, incluyendo promedios :) – Ryan