2014-07-15 64 views
1

我試圖使用scipy.newton法在大熊貓數據幀進行優化。牛頓法在大熊貓

首先,我的數據幀創建如下。 二,創建函數Px。 第三,創建另一個函數YieldCalc,其中我使用scipy.newton來優化以找到Rate的值,使得Px = 0。然後我試圖將該值添加到新列'Yield',但得到以下錯誤。任何幫助將非常感激。提前致謝。

from pandas import * 
import pandas as pd 
from scipy import * 
import scipy 
import timeit 
#In: 
#Creating Dataframe 
df = DataFrame(list([100,2,34.1556,9,100])) 
df = DataFrame.transpose(df) 
df = df.rename(columns={0:'Face',1:'Freq',2:'N',3:'C',4:'Mkt_Price'}) 
df2= df 
df = concat([df, df2]) 
df 

#Out: 
Face Freq N   C Mkt_Price 
100 2  34.1556  9 100 
100 2  34.1556  9 100 


#In: 
Face = df['Face'] 
Freq = df['Freq'] 
N = df['N'] 
C = df['C'] 
Mkt_Price = df['Mkt_Price'] 


def Px(Rate): 
    return Mkt_Price - (Face * (1 + Rate/Freq) ** (- N) + (C/Rate) * (1 - (1 + (Rate/Freq)) ** -N)) 

def YieldCalc(): 
    return scipy.optimize.newton(Px, .1, tol=.0001, maxiter=100) 
df['Yield'] = YieldCalc() 

錯誤/輸出:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-89-f4961d3f817b> in <module>() 
    12 def YieldCalc(Rate): 
    13  return scipy.optimize.newton(Px, .1, tol=.0001, maxiter=100) 
---> 14 df['Yield'] = YieldCalc(.05) 

<ipython-input-89-f4961d3f817b> in YieldCalc(Rate) 
    11 
    12 def YieldCalc(Rate): 
---> 13  return scipy.optimize.newton(Px, .1, tol=.0001, maxiter=100) 
    14 df['Yield'] = YieldCalc(.05) 

C:\Users\rebortz\Anaconda\lib\site-packages\scipy\optimize\zeros.pyc in newton(func, x0, fprime, args, tol, maxiter, fprime2) 
    145   q1 = func(*((p1,) + args)) 
    146   for iter in range(maxiter): 
--> 147    if q1 == q0: 
    148     if p1 != p0: 
    149      msg = "Tolerance of %s reached" % (p1 - p0) 

C:\Users\rebortz\Anaconda\lib\site-packages\pandas\core\generic.pyc in __nonzero__(self) 
    674   raise ValueError("The truth value of a {0} is ambiguous. " 
    675       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 676       .format(self.__class__.__name__)) 
    677 
    678  __bool__ = __nonzero__ 

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 
+1

是否加入'.values'到您的列(如'Mkt_price.values')修復錯誤? Iirc,熊貓數據框的標準布爾操作與numpy矩陣不同。 – FooBar

+0

剛剛嘗試過。不工作。 –

+0

此外,如果您插入'df ['Yield'] = Px(.05)',它會爲該Rate創建具有Px()的新列。所以我認爲這與YieldCalc公式有關。 –

回答

1

這裏的竅門的部分就是你從df['Face']後面是不是一個單一的值甚至數組。他們仍然與熊貓綁在一起。

您可以按照建議,開始由.values方式獲得訪問原始數據,並且把這個變成一個功能。

另外,熊貓的數據幀有.apply方法,讓您拍攝功能,並運行它在每行或山坳。

我把在你發佈的代碼的末尾以下(註釋掉的那一行第一)

def Foo(thing, Rate): 
    return thing[0]*Rate 

df['Yield'] = df.apply(Foo,axis=1,args=(0.1,)) 
df.head() 

在這裏的.apply方法將通過功能Foo所有條目在給定行作爲一系列的df,以及參數0.1。軸的規格是按行設置的(axis=0將執行此操作)。

只需重新組織Px即可接受'Rate'和從df(按該順序)的一系列值。然後有YieldCalc也接受這個系列。此外,您需要在調用newton時使用args=條目,以在尋找零時將該系列值傳遞給Px

流程應該是:

.apply提出了一系列thing出一排從df並將它傳遞給YieldCalcYieldCalc運行newton on Px(Rate,thing)' to find費率返回0.然後,所有這些結果將被放入您的新收益列。