Pandas的牛顿法

2024-06-01 08:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用西皮·牛顿方法在熊猫数据帧中进行优化。在

首先,我的数据帧创建如下。 其次,创建函数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}$

Tags: 数据函数importdfrate错误scipyprice
1条回答
网友
1楼 · 发布于 2024-06-01 08:13:22

这里的技巧之一是从df['Face']得到的不是一个值,甚至不是一个数组。它们仍然和熊猫有联系。在

正如建议的那样,您可以通过.values获得对原始数据的访问,并将其馈送到函数中。在

或者,pandas数据帧有一个.apply方法,它允许您获取一个函数并在每一行或每一列上运行它

我把以下内容放在你发布的代码的末尾(首先注释掉有问题的行)

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

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

在这里,.apply方法将把df中给定行中的所有条目作为一个序列传递给函数Foo,参数{}。axis规范将此设置为按行执行(axis=0将执行col)。在

只需重新组织Px以接受'Rate'和df中的一系列值(按该顺序)。然后让YieldCalc也接受这个系列。另外,您还需要在newton调用中使用一个args=项,以便在Px查找零时将该系列值传递给Px。在

流量应为:

.applydf中的一行生成一个序列thing,并将其传递给YieldCalcYieldCalcPx(Rate,thing)' to find速率上运行newton返回0。然后所有这些结果都会被放入你的新收益率col中

相关问题 更多 >