Python 高效运行牛顿算法
这与我先前提出的另一个问题有关。我想在一个大数据集上运行牛顿方法。下面是我使用循环创建的代码。我需要在大约5000万条线路上运行它,而且循环相当笨拙。有没有更有效的方法使用Pandas/Numpy/ect来运行它?提前谢谢Python 高效运行牛顿算法,python,numpy,pandas,scipy,Python,Numpy,Pandas,Scipy,这与我先前提出的另一个问题有关。我想在一个大数据集上运行牛顿方法。下面是我使用循环创建的代码。我需要在大约5000万条线路上运行它,而且循环相当笨拙。有没有更有效的方法使用Pandas/Numpy/ect来运行它?提前谢谢 In: from pandas import * from pylab import * import pandas as pd import pylab as plt import numpy as np from scipy import * import scipy
In:
from pandas import *
from pylab import *
import pandas as pd
import pylab as plt
import numpy as np
from scipy import *
import scipy
df = DataFrame(list([100,2,34.1556,9,105,-100]))
df = DataFrame.transpose(df)
df = df.rename(columns={0:'Face',1:'Freq',2:'N',3:'C',4:'Mkt_Price',5:'Yield'})
df2= df
df = concat([df, df2])
df = df.reset_index(drop=True)
df
Out:
Face Freq N C Mkt_Price Yield
0 100 2 34.1556 9 105 -100
1 100 2 34.1556 9 105 -100
In:
def Px(Rate):
return Mkt_Price - (Face * ( 1 + Rate / Freq ) ** ( - N ) + ( C / Rate ) * ( 1 - (1 + ( Rate / Freq )) ** -N ) )
for count, row in df.iterrows():
Face = row['Face']
Freq = row['Freq']
N = row['N']
C = row['C']
Mkt_Price = row['Mkt_Price']
row['Yield'] = scipy.optimize.newton(Px, .1, tol=.0001, maxiter=100)
df
Out:
Face Freq N C Mkt_Price Yield
0 100 2 34.1556 9 105 0.084419
1 100 2 34.1556 9 105 0.084419
我脑海中闪现的一种可能性是,你可以把它矢量化。但是,您必须抛弃所有条件代码,只运行所需的迭代次数 Newton Raphson中的基本步骤始终相同,因此不需要任何条件代码。您的函数
Px
看起来好像无需任何额外的努力就可以对其进行矢量化
步骤大致如下:
def Px(Rate, Mkt_Price, Face, Freq, N, C):
return Mkt_Price - (Face * ( 1 + Rate / Freq ) ** ( - N ) + ( C / Rate ) * ( 1 - (1 + ( Rate / Freq )) ** -N ) )
# initialize the iteration vector
y = 0.1 * np.zeros(num_rows)
# just a guess for the differentiation, might be smaller
h = 1e-6
# then iterate for a suitable number of iterations
for i in range(100):
f = Px(y, Mkt_Price, Face, Freq, N, C)
fp = Px(y+h, Mkt_Price, Face, Freq, N, C)
y -= h * f / (fp - f)
在此之后,迭代结果将显示在y
中。我假设Mkt\u Price
,Face
等是5000万行向量
将会有数十亿次的计算,所以这可能还需要十几秒。而且,没有错误检查,所以如果某个东西发生剧烈振荡,就没有什么可以警告您的
一种更好的方法是用解析方法计算第一个微分,这是可以做到的。然而,实际的改进可能很小。您必须进行实验,以找到最佳的迭代次数。如果函数收敛得很快(如我所想),20次迭代就足够了
这段代码完全没有经过测试,但它应该能说明这一点。你真的有5000万条独特的纽带吗?如果你将你的票面、价格、息票转换成一个标准单位并进行分组,这会减少问题的规模吗?大约有4万张债券,但每一张债券在时间序列中,每天都有不同的价格、息票、到期时间等。