как рассчитать среднее геоматическое значение с помощью nans?

Я хотел бы рассчитать среднее геометрическое некоторых данных (включая NaN), как мне это сделать?

Я знаю, как вычислить среднее значение с помощью NaN, мы можем использовать следующий код:

import numpy as np
M = np.nanmean(data, axis=2).

Итак, как это сделать с помощью Geomean?


person ERIC    schedule 04.06.2017    source источник
comment
stackoverflow .com/questions/19852586/ или stackoverflow.com/questions/5480694/ для более эффективной и немного более длинной версии, но замените mean на geomean   -  person Ry-♦    schedule 04.06.2017


Ответы (1)


Вы можете использовать идентификатор (я нашел его только в немецкой Википедии, но, вероятно, есть и другие источники):

введите здесь описание изображения

Это тождество можно построить, используя «правила логарифмирования» по нормальному определению среднего геометрического:

введите здесь описание изображения

База a может быть выбрана произвольно, поэтому вы можете использовать np.lognp.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)
person MSeifert    schedule 04.06.2017