我对熊猫很新,所以我猜我做错了 -
我有一个DataFrame:
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
Run Code Online (Sandbox Code Playgroud)
df.corr()
给我:
a b
a NaN NaN
b NaN NaN
Run Code Online (Sandbox Code Playgroud)
但np.correlate(df["a"], df["b"])
给出:1.875
这是为什么?我想拥有我的DataFrame的相关矩阵,并认为这样corr()
做(至少根据文档).为什么会回来NaN
?
什么是正确的计算方法?
非常感谢!
unu*_*tbu 69
np.correlate计算两个1维序列之间的(非标准化)互相关:
z[k] = sum_n a[n] * conj(v[n+k])
Run Code Online (Sandbox Code Playgroud)
而df.corr(默认情况下)计算Pearson相关系数.
相关系数(如果存在)始终在-1和1之间(包括1和1).互相关不受限制.
这些公式有些相关,但请注意,在互相关公式(上文)中,没有平均值的减法,也没有除以标准差,这是Pearson相关系数公式的一部分.
事实上,标准偏差df['a']
和df['b']
为零是什么原因df.corr
是NaN的无处不在.
从下面的评论中,听起来你正在寻找Beta.它与Pearson的相关系数有关,而不是除以标准偏差的乘积:
你除以方差:
您可以Beta
使用np.cov进行计算
cov = np.cov(a, b)
beta = cov[1, 0] / cov[0, 0]
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
mu
s 的比率为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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
55910 次 |
最近记录: |