Python 用熊猫/蟒蛇加速牛顿·拉斐逊

Python 用熊猫/蟒蛇加速牛顿·拉斐逊,python,pandas,newtons-method,Python,Pandas,Newtons Method,我目前正在迭代一组非常大的数据,约85GB(约600M行),并简单地使用newton raphson计算一个新参数。到目前为止,我的代码非常慢,有没有关于如何加速的建议?来自BSCallClass和BSPutClass的方法是封闭形式的,因此没有什么真正需要加速的。谢谢 class NewtonRaphson: def __init__(self, theObject): self.theObject = theObject def solve(self, T

我目前正在迭代一组非常大的数据,约85GB(约600M行),并简单地使用newton raphson计算一个新参数。到目前为止,我的代码非常慢,有没有关于如何加速的建议?来自BSCallClass和BSPutClass的方法是封闭形式的,因此没有什么真正需要加速的。谢谢

class NewtonRaphson:

    def __init__(self, theObject):
        self.theObject = theObject

    def solve(self, Target, Start, Tolerance, maxiter=500):
        y = self.theObject.Price(Start)
        x = Start
        i = 0
        while (abs(y - Target) > Tolerance):
            i += 1
            d = self.theObject.Vega(x)
            x += (Target - y) / d
            y = self.theObject.Price(x)
            if i > maxiter:
                x = nan
                break
        return x

    def main():
        for row in a.iterrows():
            print row[1]["X.1"]
            T = (row[1]["X.7"] - row[1]["X.8"]).days
            Spot = row[1]["X.2"]
            Strike = row[1]["X.9"]
            MktPrice = abs(row[1]["X.10"]-row[1]["X.11"])/2
            CPflag = row[1]["X.6"]

            if CPflag == 'call':
                option = BSCallClass(0, 0, T, Spot, Strike)
            elif CPflag == 'put':
                option = BSPutClass(0, 0, T, Spot, Strike)

            a["X.15"][row[0]] = NewtonRaphson(option).solve(MktPrice, .05, .0001)
编辑:


对于那些好奇的人,我最终通过使用scipy建议以及多处理模块大大加快了整个过程。

不要用Python编写自己的Newton-Raphson方法。使用诸如或之类的选项之一可以获得更好的性能。 (假设,如果您有
pandas
,您也应该安装
scipy


信封背面计算:

在标准硬件上,向brentq拨打6亿个电话应该是可以管理的:

import scipy.optimize as optimize
def f(x):
    return x**2 - 2

In [28]: %timeit optimize.brentq(f, 0, 10)
100000 loops, best of 3: 4.86 us per loop
因此,如果每次调用
optimize.brentq
需要4.86微秒,600万次调用将需要4.86*600~3000秒~1小时


newton
速度可能较慢,但仍易于管理:

def f(x):
    return x**2 - 2
def fprime(x):
    return 2*x

In [40]: %timeit optimize.newton(f, 10, fprime)
100000 loops, best of 3: 8.22 us per loop

逐行迭代不是特别有效,因为必须创建系列对象。所以我不确定如何将其矢量化,这就是问题所在。那么,好了,您无法使用scipy的牛顿函数设置目标。使用brentq的结果不太令人满意(我昨晚用它做了一些东西)。目标值是一个常数,所以你不必试图找到f(x)=0的根,你应该定义g(x)=f(x)-Target,并将牛顿应用到g。