2016-07-06 9 views
0

現在、複数のデータ列に対して半減寿命の結果を計算しようとしています。私は 'pythonforfinance.com'から得たコードを組み込もうとしましたLink平均復帰シリーズの半減期コードを実行

しかし、私はエラーがスローされているいくつかの編集を見逃しているようです。

これは以下のように私のDFがどのように見えるかです:スローされたエラーがある

import pandas as pd     
import numpy as np 
import statsmodels.api as sm 

df1=pd.read_excel('C:\\Users\Sai\Desktop\Test\Spreads.xlsx') 

Halflife_results={} 

for col in df1.columns.values: 

    spread_lag = df1.shift(periods=1, axis=1) 
    spread_lag.ix([0]) = spread_lag.ix([1]) 
    spread_ret = df1.columns - spread_lag 
    spread_ret.ix([0]) = spread_ret.ix([1]) 
    spread_lag2 = sm.add_constant(spread_lag) 
    md = sm.OLS(spread_ret,spread_lag2) 
    mdf = md.fit() 
    half_life = round(-np.log(2)/mdf.params[1],0) 
    print('half life:', half_life) 

Link

と私が実行しているコードのエラーに基づいて

File "C:/Users/Sai/Desktop/Test/Half life test 2.py", line 12 
    spread_lag.ix([0]) = spread_lag.ix([1]) 
    ^
SyntaxError: can't assign to function call 

メッセージは、私は非常に基本的な間違いをしたようですが、私は初心者ですから問題を解決できません。そうでない場合は、このコードを解決、コードのこれらの行への説明は、大きな助けになるでしょう:

spread_lag = df1.shift(periods=1, axis=1) 
spread_lag.ix([0]) = spread_lag.ix([1]) 
spread_ret = df1.columns - spread_lag 
spread_ret.ix([0]) = spread_ret.ix([1]) 
spread_lag2 = sm.add_constant(spread_lag) 

答えて

1

エラーメッセージで説明したように、pd.Series.ixは呼び出すことはできません:あなたはspread_lag.ix[0]spread_lag.ix([0])を変更する必要があります。

また、各列に沿った差異(axis=0、デフォルト値)に興味があるので、axis=1(行)に移動しないでください。

get_halflifeファンクションを定義すると、それを各カラムに直接適用することができ、ループの必要がなくなります。

def get_halflife(s): 
    s_lag = s.shift(1) 
    s_lag.ix[0] = s_lag.ix[1] 

    s_ret = s - s_lag 
    s_ret.ix[0] = s_ret.ix[1] 

    s_lag2 = sm.add_constant(s_lag) 

    model = sm.OLS(s_ret,s_lag2) 
    res = model.fit() 

    halflife = round(-np.log(2)/res.params[1],0) 
    return halflife 

df1.apply(get_halflife) 
+0

私は上記を試してみましたが、コードは別のエラー投げ - [リンク](http://prntscr.com/bpj4g4を)私は私はコード内の列を参照しています方法とは何かであることを理解することができます。しかしそれ以上のものはありません。ありがとうbtw! – Sam18J

+0

上記の編集済みの回答を参照 – jodoox

+0

完璧な結果を得ました。ありがとう! – Sam18J