aufrufende Funktion mit dataframe Daten Fehler gibt (nicht in der Serie zu <class 'float'>)
Habe ich eine option-pricing-Modell (sehr einfache Black-Scholes -) das funktioniert auch mit Daten, die in dieser Weise:
In [18]:
BS2(100.,100.,1.,.001,.3)
Out[18]:
11.96762435837207
die Funktion ist hier:
Black Sholes Function
def BS2(S,X,T,r,v):
d1 = (log(S/X)+(.001+v*v/2)*T)/(v*sqrt(T))
d2 = d1-v*sqrt(T)
return (S*CND(d1)-X*exp(-.001*T)*CND(d2))
Ich glaube nicht, dass es darauf ankommt, für diese Frage, aber BS2 nennt dies:
Cumulative normal distribution function
def CND(X):
(a1,a2,a3,a4,a5) = (0.31938153, -0.356563782, 1.781477937,
-1.821255978, 1.330274429)
L = abs(X)
K = 1.0 / (1.0 + 0.2316419 * L)
w = 1.0 - 1.0 / sqrt(2*pi)*exp(-L*L/2.) * (a1*K + a2*K*K + a3*pow(K,3) +
a4*pow(K,4) + a5*pow(K,5))
if X<0:
w = 1.0-w
return w
Habe ich versucht zu ändern, der die Arbeit BS-Funktion zum annehmen von Daten aus einer df, aber scheinen etwas falsch gemacht haben:
def BS(df):
d1 = (log(S/X)+(.001+v*v/2)*T)/(v*sqrt(T))
d2 = d1-v*sqrt(T)
return pd.Series((S*CND(d1)-X*exp(-.001*T)*CND(d2)))
meine Daten ist sehr geradlinig:
In [13]:
df
Out[13]:
S X T r v
0 100 100 1 0.001 0.3
1 50 50 1 0.001 0.3
sind und alle float64
In [14]:
df.dtypes
Out[14]:
S float64
X float64
T float64
r float64
v float64
dtype: object
Ich auch versucht, die Zuordnung der df-Variablen einen Namen, bevor Sie an BS2 (ich habe auf diese Weise, und ohne diese Zuordnung:
S=df['S']
X=df['X']
T=df['T']
r=df['r']
v=df['v']
auf die Gefahr der übersendung zu viel info, hier ist die Fehlermeldung:
In [18]:
BS(df)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-745e7dd0eb2c> in <module>()
----> 1 BS(df)
<ipython-input-17-b666a39cd530> in BS(df)
3 def BS(df):
4 CallPutFlag='c'
----> 5 d1 = (log(S/X)+(.001+v*v/2)*T)/(v*sqrt(T))
6 d2 = d1-v*sqrt(T)
7 cp = ((S*CND(d1)-X*exp(-.001*T)*CND(d2)))
C:\Users\camcompco\AppData\Roaming\Python\Python34\site- packages\pandas\core\series.py in wrapper(self)
74 return converter(self.iloc[0])
75 raise TypeError(
---> 76 "cannot convert the series to {0}".format(str(converter)))
77 return wrapper
78
TypeError: cannot convert the series to <class 'float'>
jegliche Hilfe würde sehr geschätzt werden.
John
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es wäre einfacher zu verwenden, dataframe.apply()
http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html
dann wäre die syntax
df.apply(func, axis = 1)
anwenden der Funktion func, um jede Zeile.Die Antwort auf diese Frage ist ähnlich:
Anwenden der Funktion auf jede Zeile der pandas dataframe erstellen Sie zwei neue Spalten
@JonD s Antwort ist gut, aber hier ist eine Alternative Antwort, die werden schneller, wenn Sie dataframe hat mehr als ein paar Zeilen:
Änderungen:
sqrt
,log
, undexp
. Anderenfalls haben Sie nicht viel ändern, weil numpy/pandas Unterstützung von grundlegenden mathematischen Operationen elementweise Weise.norm.cdf
von scipy. Viel schneller b/c eingebauten Funktionen sind fast immer so schnell wie möglich.df.X
und andere, aberdf['T']
geschrieben werden müssen, dadf.T
würde interpretiert werden alsdf.transpose()
. Ich denke, dies ist ein gutes Beispiel dafür, warum sollten Sie es vermeiden, die Verknüpfung Schreibweise, aber ich bin faul...Btw, wenn Sie möchten, sogar mehr Geschwindigkeit, das nächste, was zu versuchen wäre, um es in numpy eher als pandas. Sie könnte auch prüfen, ob andere schon geschrieben haben Black-Scholes-Funktionen/Bibliotheken (wahrscheinlich, obwohl ich nicht wissen nichts über es).