2016-07-06 28 views
0

我目前正在嘗試計算多列數據的半衰期結果。我試圖合併我從'pythonforfinance.com'的代碼Link運行半衰期代碼的平均回覆系列

但是,我似乎錯過了一些導致錯誤被引發的編輯。

這是我的DF的樣子:Link

和代碼我運行:

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) 

正被拋出的錯誤是:基於錯誤

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=1(行)上移動(axis=0,默認值)。

定義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