4 回答

TA贡献1772条经验 获得超8个赞
一种方法是使用 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))

TA贡献1804条经验 获得超8个赞
创建一个函数,该函数采用列中的所有元素并返回一个元素。将其应用于每一列(在轴 = 0 方向上)。
from functools import reduce
def 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.

TA贡献1891条经验 获得超3个赞
几何均值不适用于包含负值的列表(其中一些结果返回虚数),但话虽如此,以下是您问题的一个答案:
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]))

TA贡献1829条经验 获得超6个赞
对于负数,我找到了这个。如果我有一个带负数的股票回报数据框,我会执行以下操作:
from scipy.stats import gmean
gmean(1+df, axis = 0) - 1
添加回答
举报