2016-07-28 38 views

回答

5

我不知道任何實現這個功能的Python包,但它應該是相當直接的,可以用來實現自己的實現。使用維基百科文章的命名約定:

def m(x, w): 
    """Weighted Mean""" 
    return np.sum(x * w)/np.sum(w) 

def cov(x, y, w): 
    """Weighted Covariance""" 
    return np.sum(w * (x - m(x, w)) * (y - m(y, w)))/np.sum(w) 

def corr(x, y, w): 
    """Weighted Correlation""" 
    return cov(x, y, w)/np.sqrt(cov(x, x, w) * cov(y, y, w)) 

我試圖使上述功能儘可能地匹配在維基百科的公式,但也有一些潛在的簡化和性能改進。例如,正如@Alberto Garcia-Raboso指出的那樣,m(x, w)實際上只是np.average(x, weights=w),所以不需要爲它寫一個函數。

這些功能是相當簡單的,只是做了計算。在計算之前,您可能需要考慮強制輸入爲數組,即x = np.asarray(x),因爲如果通過列表,這些函數將不起作用。還可以執行用於驗證所有輸入具有相等長度,非空值等的附加檢查。

用法示例:

# Initialize a DataFrame. 
np.random.seed([3,1415]) 
n = 10**6 
df = pd.DataFrame({ 
    'x': np.random.choice(3, size=n), 
    'y': np.random.choice(4, size=n), 
    'w': np.random.random(size=n) 
    }) 

# Compute the correlation. 
r = corr(df['x'], df['y'], df['w']) 

有關於p值的討論here。它看起來並不像通用計算,而是取決於你如何獲得權重。

+1

'np.average'承認一個'weights'參數,這樣就可以將'm(x,w)'定義爲'np.average(x,weights = w)'等等。 –

+0

@ AlbertoGarcia-Raboso:謝謝,我爲此添加了一條評論。爲了保持一致性,我將代碼保持原樣,以便儘可能與鏈接維基百科文章中的公式匹配。 – root