gpt4 book ai didi

python - Pandas 中的牛顿法

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:35 24 4
gpt4 key购买 nike

我正在尝试使用 scipy.newton 方法在 pandas 数据框中进行优化。

首先,我的数据框创建如下。其次,创建函数 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().

最佳答案

这里的部分技巧是你从 df['Face'] 返回的内容。不是单个值,甚至不是数组。它们仍然与 Pandas 联系在一起。

您可以按照建议,开始通过.values访问原始数据。并将其输入到函数中。

或者,pandas 数据框有 .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接受“速率”和 df 中的一系列值(以该顺序)。然后有YieldCalc也接受该系列。此外,您还需要使用 args=条目 newton调用将该系列值传递给 Px当它寻找零时。

流程应该是:

.apply制作一系列thingdf 连续出现并将其传递给YieldCalcYieldCalc运行newtonPx(Rate,thing)' to find Rate` 返回 0。然后所有这些结果都会放入新的 Yield 列中。

关于python - Pandas 中的牛顿法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24760371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com