猿问

如何计算几何平均值并忽略python中的0

我有一个熊猫数据框架,其中包含某些股票的13列每日股票回报率。我想计算每列的几何平均值,但有些列中有零,因为这些业务在不同时间在股票市场上实现。

我知道numpy的算术平均值会忽略NaN。有没有办法计算几何平均值并同时忽略零?

示例 df:

import pandas as pd
dictA = {'AAPL': [.02, -.001, .05, .43], 'ABC':[.03, -.02, -.05, 0], 'DEF': [.045, 0, -.10, .63]}
df = pd.DataFrame(dictA)

的几何平均值是其中 N 是观测值的数量。AAPL.02 * -.001 * .05 * .43**(1/N)

是否有某种光滑的代码可以在忽略零的情况下计算几何平均值?


德玛西亚99
浏览 376回答 4
4回答

料青山看我应如是

一种方法是使用 np.multiply.reduce 并替换它们,以便它们不会修改结果,并除以每列的非零值量:np.where01a = df.values m = (a!=0) np.multiply.reduce(np.where(m, a, 1), axis=0)**(1/m.sum(0))

胡说叔叔

创建一个函数,该函数采用列中的所有元素并返回一个元素。将其应用于每一列(在轴 = 0 方向上)。from functools import reducedef g_mean(n):    """Find the geometric mean for iterable n."""    # Make a list with every element in n that != 0.    l = [e for e in n if e !=0]    tot = reduce(lambda a,b: a*b, l) # Multiply all elements in l.    return tot**(1/(len(l)))df.apply(g_mean) # Apply g_mean(column) to every column.

万千封印

几何均值不适用于包含负值的列表(其中一些结果返回虚数),但话虽如此,以下是您问题的一个答案:import pandas as pdimport numpy as npdef geometric_mean(values):    return float(np.prod([x for x in values])) ** (1 / len([x for x in values]))dictA = {'AAPL': [.02, -.001, .05, .43], 'ABC': [.03, -.02, -.05, 0], 'DEF': [.045, 0, -.10, .63]}df = pd.DataFrame(dictA)cols = ['AAPL', 'ABC', 'DEF']for col in cols:    # exclude 0s from being passed to the function    print(geometric_mean(df.loc[df[col] != 0, col]))编辑:我最初有.我将其更改为,因此如果列表的乘积为负数,则该函数现在将返回虚数。return np.prod([x for x in values]) ** (1 / len([x for x in values]))return float(np.prod([x for x in values])) ** (1 / len([x for x in values]))

肥皂起泡泡

对于负数,我找到了这个。如果我有一个带负数的股票回报数据框,我会执行以下操作:from scipy.stats import gmeangmean(1+df, axis = 0) - 1
随时随地看视频慕课网APP

相关分类

Python
我要回答