Как рассчитать среднее значение геоматических с нанс?
Я хотел бы рассчитать среднее геометрическое некоторых данных (в том числе NaN), как я могу это сделать?
Я знаю, как рассчитать среднее значение с помощью NaN, мы можем использовать следующий код:
import numpy as np
M = np.nanmean(data, axis=2).
Так как же это сделать с Geomean?
1 ответ
Вы можете использовать эту идентификацию (я нашел ее только в немецкой Википедии, но, возможно, есть и другие источники):
Эта идентичность может быть построена с использованием "правил логарифма" нормального определения среднего геометрического:
База a
можно выбрать произвольно, чтобы вы могли использовать np.log
(а также np.exp
как обратная операция):
import numpy as np
def nangmean(arr, axis=None):
arr = np.asarray(arr)
inverse_valids = 1. / np.sum(~np.isnan(arr), axis=axis) # could be a problem for all-nan-axis
rhs = inverse_valids * np.nansum(np.log(arr), axis=axis)
return np.exp(rhs)
И это похоже на работу:
>>> l = [[1, 2, 3], [1, np.nan, 3], [np.nan, 2, np.nan]]
>>> nangmean(l)
1.8171205928321397
>>> nangmean(l, axis=1)
array([ 1.81712059, 1.73205081, 2. ])
>>> nangmean(l, axis=0)
array([ 1., 2., 3.])
В NumPy 1.10 также np.nanprod
был добавлен, так что вы также можете использовать обычное определение:
import numpy as np
def nangmean(arr, axis=None):
arr = np.asarray(arr)
valids = np.sum(~np.isnan(arr), axis=axis)
prod = np.nanprod(arr, axis=axis)
return np.power(prod, 1. / valids)