与熊猫的加权相关系数

Yeh*_*sky 9 python correlation pandas pearson-correlation

有没有办法用熊猫计算加权相关系数?我看到R有这样的方法.另外,我想获得相关性的p值.我没有在R.链接到维基百科中找到有关加权相关性的解释:https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient#Weighted_correlation_coefficient

roo*_*oot 13

我不知道任何实现此功能的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))
Run Code Online (Sandbox Code Playgroud)

我尝试使上面的函数尽可能地与维基百科中的公式匹配,但是有一些潜在的简化和性能改进.例如,正如@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'])
Run Code Online (Sandbox Code Playgroud)

有一个讨论,在这里关于p值.它看起来不像通用计算,它取决于你实际获得权重的方式.

  • np.average接受一个weights参数,因此您可以将m(x,w)定义为np.average(x,weights = w),依此类推。 (2认同)

dre*_*cko 7

statsmodels包有一个加权相关的实现