DataFram中列之间的相关性

2024-05-15 20:12:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫很陌生,所以我想我做错了-

我有一个数据框:

     a     b
0  0.5  0.75
1  0.5  0.75
2  0.5  0.75
3  0.5  0.75
4  0.5  0.75

df.corr()给我:

    a   b
a NaN NaN
b NaN NaN

但是np.correlate(df["a"], df["b"])给出了:1.875

为什么? 我想得到数据帧的相关矩阵,并认为corr()可以做到这一点(至少根据文档)。为什么它返回NaN

正确的计算方法是什么?

非常感谢!


Tags: 数据文档dfnpnan计算方法corrcorrelate
1条回答
网友
1楼 · 发布于 2024-05-15 20:12:34

np.correlate计算两个一维序列之间的(未格式化的)cross-correlation

z[k] = sum_n a[n] * conj(v[n+k])

df.corr(默认情况下)计算Pearson correlation coefficient

相关系数(如果存在的话)总是介于-1和1之间。 互相关不是有界的。

这些公式有些相关,但请注意,在互相关公式(如上)中,没有减去平均数,也没有除以皮尔逊相关系数公式中的标准差。

df['a']df['b']的标准差为零,这就是导致df.corr处处为NaN的原因。


从下面的注释中,听起来您正在寻找Beta。它与皮尔逊相关系数有关,但不是除以标准差的乘积:

enter image description here

除以方差:

enter image description here


您可以使用np.cov计算Beta

cov = np.cov(a, b)
beta = cov[1, 0] / cov[0, 0]

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)


def geometric_brownian_motion(T=1, N=100, mu=0.1, sigma=0.01, S0=20):
    """
    http://stackoverflow.com/a/13203189/190597 (unutbu)
    """
    dt = float(T) / N
    t = np.linspace(0, T, N)
    W = np.random.standard_normal(size=N)
    W = np.cumsum(W) * np.sqrt(dt)  # standard brownian motion ###
    X = (mu - 0.5 * sigma ** 2) * t + sigma * W
    S = S0 * np.exp(X)  # geometric brownian motion ###
    return S

N = 10 ** 6
a = geometric_brownian_motion(T=1, mu=0.1, sigma=0.01, N=N)
b = geometric_brownian_motion(T=1, mu=0.2, sigma=0.01, N=N)

cov = np.cov(a, b)
print(cov)
# [[ 0.38234755  0.80525967]
#  [ 0.80525967  1.73517501]]
beta = cov[1, 0] / cov[0, 0]
print(beta)
# 2.10609347015

plt.plot(a)
plt.plot(b)
plt.show()

enter image description here

mu的比值为2,而beta的比值为~2.1。


你也可以用df.corr来计算它,虽然这是一种更全面的方法(但是很高兴看到它是一致的):

import pandas as pd
df = pd.DataFrame({'a': a, 'b': b})
beta2 = (df.corr() * df['b'].std() * df['a'].std() / df['a'].var()).ix[0, 1]
print(beta2)
# 2.10609347015
assert np.allclose(beta, beta2)

相关问题 更多 >