我有一个熊猫数据框,其中包含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为观察次数。
是否存在某种精巧的代码可以在忽略零的同时计算几何平均值?
答案 0 :(得分:2)
一种方法是使用np.multiply.reduce
和np.where
将0
替换为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