如何在Python中计算几何平均值并忽略0

时间:2020-04-10 13:39:20

标签: python pandas

我有一个熊猫数据框,其中包含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)

AAPL的几何平均值为.02 * -.001 * .05 * .43**(1/N),其中N为观察次数。

是否存在某种精巧的代码可以在忽略零的同时计算几何平均值?

4 个答案:

答案 0 :(得分:2)

一种方法是使用np.multiply.reducenp.where0替换为1,这样它们就不会修改结果,并除以非零值的数量每列:

a = df.values
m = (a!=0)
np.multiply.reduce(np.where(m, a, 1), axis=0)**(1/m.sum(0))

答案 1 :(得分:0)

几何平均值不适用于其中带有负值的列表(其中一些结果返回虚数),但是,这就是您对问题的一个答案:

import pandas as pd
import numpy as np


def 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])),因此如果列表的乘积为负,该函数现在将返回虚数。

答案 2 :(得分:0)

使函数具有一列中的所有元素并返回一个元素。将其应用于每一列(在axis = 0方向上)。

using Ocelot.Cache.CacheManager;

答案 3 :(得分:0)

我发现这是负数。如果我有一个带有负数的股票收益数据框,请执行以下操作:

from scipy.stats import gmean
gmean(1+df, axis = 0) - 1