2014-07-15 4 views
1

Я пытаюсь использовать метод scipy.newton для оптимизации в кадре данных pandas.Newton Method in Pandas

Во-первых, мое создание фреймворка ниже. Во-вторых, создайте функцию Px. В-третьих, создайте еще одну функцию YieldCalc, где я использую scipy.newton для оптимизации, чтобы найти значение для Rate, такое, что Px = 0. Затем я пытаюсь добавить это значение в новый столбец «Выход», но получить следующую ошибку. Любая помощь приветствуется. Заранее спасибо.

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(). 
+1

Записывает ли значение '.values' в ваши столбцы (как в' Mkt_price.values')? Iirc, стандартные булевы операции с файловыми кадрами pandas не совпадают с матрицами numpy. – FooBar

+0

Просто попробовал. Не работал. –

+0

Кроме того, если вы вставляете 'df [' Yield '] = Px (.05)', он создает новый столбец с Px() для этой скорости. Поэтому я думаю, что это как-то связано с формулой YieldCalc. –

ответ

1

Часть трюк здесь является то, что вы получите обратно от 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 будет передать функции Foo все записи в данной строке df, а также аргумент 0.1. Спецификация оси - это то, что устанавливает это для строки (axis=0 выполнит команду col).

Просто реорганизовать Px, чтобы принять «Оценить» и ряд значений от df (в указанном порядке). Затем добавьте YieldCalc эту серию. Кроме того, вам нужно будет использовать запись args= в вызове newton для передачи этой серии значений до Px, когда она охотится за нулями.

Поток должен быть:

.apply делает серию thing из строки из df и передает его в YieldCalc. YieldCalc работает newton по Px(Rate,thing)' to find Rate` возвращает 0. Затем все эти результаты попадают в ваш новый доход.