32

私はパンダにかなり慣れていないので、何か間違っていると思います-

私はデータフレームを持っています:

     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

何故ですか?私は自分の DataFrame の相関行列を持ちたいと思っていて、それができると考えてcorr()いました (少なくともドキュメントによると)。なぜ戻るのNaNですか?

正しい計算方法は?

どうもありがとう!

4

1 に答える 1

72

np.correlateは、 2 つの 1 次元シーケンス間の (正規化されていない)相互相関を計算します。

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

一方、df.corr (デフォルト) はピアソン相関係数を計算します。

相関係数 (存在する場合) は、常に -1 から 1 の間です。相互相関は制限されません。

数式は多少関連していますが、相互相関の数式 (上記) では、平均の減算も、ピアソン相関係数の数式の一部である標準偏差による除算も行われていないことに注意してください。

df['a']との標準偏差df['b']がゼロであるという事実が、df.corrどこでも NaN になる原因です。


以下のコメントから、 Betaを探しているように聞こえます。これは、ピアソンの相関係数に関連していますが、標準偏差の積で割る代わりに:

ここに画像の説明を入力

分散で割ります:

ここに画像の説明を入力


np.covBetaを使用して計算できます

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()

ここに画像の説明を入力

sの比率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)
于 2013-04-06T21:03:04.647 に答える