我想用西皮·牛顿方法在熊猫数据帧中进行优化。在
首先,我的数据帧创建如下。 其次,创建函数Px。 第三,在我使用的地方创建另一个函数YieldCalc西皮·牛顿优化以找到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()
错误/输出:
^{pr2}$
这里的技巧之一是从
df['Face']
得到的不是一个值,甚至不是一个数组。它们仍然和熊猫有联系。在正如建议的那样,您可以通过
.values
获得对原始数据的访问,并将其馈送到函数中。在或者,pandas数据帧有一个
.apply
方法,它允许您获取一个函数并在每一行或每一列上运行它我把以下内容放在你发布的代码的末尾(首先注释掉有问题的行)
在这里,}。axis规范将此设置为按行执行(
.apply
方法将把df
中给定行中的所有条目作为一个序列传递给函数Foo
,参数{axis=0
将执行col)。在只需重新组织
Px
以接受'Rate'和df
中的一系列值(按该顺序)。然后让YieldCalc
也接受这个系列。另外,您还需要在newton
调用中使用一个args=
项,以便在Px
查找零时将该系列值传递给Px
。在流量应为:
.apply
从df
中的一行生成一个序列thing
,并将其传递给YieldCalc
。YieldCalc
在Px(Rate,thing)' to find
速率上运行newton
返回0。然后所有这些结果都会被放入你的新收益率col中相关问题 更多 >
编程相关推荐