2017-07-06 9 views
3

こんにちは私はパンダの拡大ウィンドウの回帰ベータを計算しようとしています。私はパンダ拡大回帰ベータ

def beta(row, col1, col2): 
     return numpy.cov(row[col1],row[col2])/numpy.var(row[col1]) 

にベータ版を計算するには、次の機能を持っていると私はそれらのどれも動作しないただしdf

pandas.expanding_apply(df, beta, col1='col1', col2='col2') 
pandas.expanding_apply(df, beta, kwargs={'col1':'col1', 'col2':'col2'}) 
df.expanding.apply(...) 

私のデータフレームの拡大ベータ版を取得するには、次の試してみた、私はどちらかは述べている何かを得ますkwargsからは、通過した取得されていないか、私はbeta機能で列名をハードコーディングしている場合、私は取得

*** IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices 

おかげ

例:

def beta(row, col1, col2): 
    return numpy.cov(row[col1],row[col2])/numpy.var(row[col1]) 
df = pandas.DataFrame({'a':[1,2,3,4,5],'b':[.1,5,.3,.5,6]}) 
pandas.expanding_apply(compute_df, beta, col1='a', col2='b') 
pandas.expanding_apply(compute_df, beta, kwargs={'col1':'a', 'col2':'b'}) 

何をやっていると非常によく似た重回帰を、ローリングのためのベータ版を計算しようとしたとき、私はこの問題に遭遇しました

+0

最小の実例を教えてください。それで、推測の代わりにいくつかの仮定を確認することができます。 – CodeMonkey

+0

確か、上記を参照 – Michael

+0

あなたのベータ関数をインスツルメントすると、expanding_applyがあなたに行を与えないことがわかります。むしろbとaの列にプログレッシブ値を与えるように見えます。 [0.15] [0.15.3] [0.15 0.3 0.5] [0.15 0.3 0.5 6.] [1. 2.] [1. 2. 3.] [1。 2. 3. 4.] [1. 2. 3. 4. 5.]ドキュメント内でこの機能に関する多くの情報を見つけることができませんでした。 – CodeMonkey

答えて

1

これらのリターン・エラーの両方(hereを参照してください)。重要な問題はExpanding.apply(func, args=(), kwargs={})funcのparamで

は*引数と** kwargsからは が関数に渡されndarray入力から単一の値を生成しなければならないということである

[source]

そして、実際にはexpanding.applyを使用して調整する方法はありません。 (注:前述のとおり、expanding_applyは推奨されていません)

以下は回避策です。それは計算上高価です(メモリを消費します)が、あなたの出力にあなたを得るでしょう。これは、拡大ウィンドウNumPy配列のリストを作成し、それぞれにベータを計算します。

from pandas_datareader.data import DataReader as dr 
import numpy as np 
import pandas as pd 

df = (dr(['GOOG', 'SPY'], 'google')['Close'] 
     .pct_change() 
     .dropna()) 

# i is the asset, m is market/index 
# [0, 1] grabs cov_i,j from the covar. matrix 
def beta(i, m): 
    return np.cov(i, m)[0, 1]/np.var(m) 

def expwins(x, min_periods): 
    return [x[:i] for i in range(min_periods, x.shape[0] + 1)] 

# Example: 
# arr = np.arange(10).reshape(5, 2) 
# print(expwins(arr, min_periods=3)[1]) # the 2nd window of the set 
# array([[0, 1], 
     # [2, 3], 
     # [4, 5], 
     # [6, 7]]) 

min_periods = 21 
# Create "blocks" of expanding windows 
wins = expwins(df.values, min_periods=min_periods) 
# Calculate a beta (single scalar val.) for each 
betas = [beta(win[:, 0], win[:, 1]) for win in wins] 
betas = pd.Series(betas, index=df.index[min_periods - 1:]) 

print(betas) 
Date 
2010-02-03 0.77572 
2010-02-04 0.74769 
2010-02-05 0.76692 
2010-02-08 0.74301 
2010-02-09 0.74741 
2010-02-10 0.74635 
2010-02-11 0.74735 
2010-02-12 0.74605 
2010-02-16 0.78521 
2010-02-17 0.77619 
2010-02-18 0.79188 
2010-02-19 0.78952 

2017-06-19 0.97387 
2017-06-20 0.97390 
2017-06-21 0.97386 
2017-06-22 0.97387 
2017-06-23 0.97391 
2017-06-26 0.97389 
2017-06-27 0.97482 
2017-06-28 0.97508 
2017-06-29 0.97594 
2017-06-30 0.97584 
2017-07-03 0.97575 
2017-07-05 0.97588 
dtype: float64