Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效运行牛顿算法_Python_Numpy_Pandas_Scipy - Fatal编程技术网

Python 高效运行牛顿算法

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

这与我先前提出的另一个问题有关。我想在一个大数据集上运行牛顿方法。下面是我使用循环创建的代码。我需要在大约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

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万张债券,但每一张债券在时间序列中,每天都有不同的价格、息票、到期时间等。