4 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個贊
一種方法是使用 np.multiply.reduce
并替換它們,以便它們不會修改結(jié)果,并除以每列的非零值量: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貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個贊
創(chuàng)建一個函數(shù),該函數(shù)采用列中的所有元素并返回一個元素。將其應(yīng)用于每一列(在軸 = 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貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個贊
幾何均值不適用于包含負(fù)值的列表(其中一些結(jié)果返回虛數(shù)),但話雖如此,以下是您問題的一個答案:
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]))
編輯:我最初有.我將其更改為,因此如果列表的乘積為負(fù)數(shù),則該函數(shù)現(xiàn)在將返回虛數(shù)。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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個贊
對于負(fù)數(shù),我找到了這個。如果我有一個帶負(fù)數(shù)的股票回報(bào)數(shù)據(jù)框,我會執(zhí)行以下操作:
from scipy.stats import gmean
gmean(1+df, axis = 0) - 1
添加回答
舉報(bào)