我不知道有任何 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。看起来没有通用计算,这取决于您实际获得权重的方式。