[英]How to create a dataframe column based on a conditional calculation
我正在嘗試創建一個新列,它將根據 df['Call/Put'] 列中行中的值執行一個或另一個函數。 我在執行基於某些行值的計算以及確定要執行的功能時遇到困難。 下面是我嘗試的最后一個函數,但它似乎沒有正確執行公式。 我嘗試了幾種方法都無濟於事,但這是我嘗試的最后一種方法。
我正在嘗試創建一個名為“Black Scholes”的新列,並在該行中執行 bs_call 如果 df['Call/Put']=='Call' 或執行 bs_put if df['Call/Put']=='Put '在那一行。
for index, value in df.iterrows():
df['Black Scholes'][index]=np.where((df['Call/Put']=='Call')|(df['Call/Put']==' Put'),bs_call(df['Close'][index],df['Strike Price'][index],df['Days to Expiry'][index],rf,df['Volatility'][index]),bs_put(df['Close'][index],df['Strike Price'][index],df['Days to Expiry'][index],rf,df['Volatility'][index]))
以下是我用於計算的函數以及包含 3 行的數據框
def bs_call(S,K,T,r,sigma):
T=T/365
d1=(log(S/K)+(r+sigma**2/2)*T)/(sigma*sqrt(T))
d2= d1-sigma*sqrt(T)
ans = S*norm.cdf(d1)-K*exp(-r*T)*norm.cdf(d2)
return ans
def bs_put(S,K,T,r,sigma):
T=T/365
d1=(log(S/K)+(r+sigma**2/2)*T)/(sigma*sqrt(T))
d2= d1-sigma*sqrt(T)
ans = S*norm.cdf(d1)-K*exp(-r*T)*norm.cdf(d2)
return K*exp(-r*T)-S+ans
df = [{'Close': 27.3,
'Company': 'Barrick Gold Corporation (ABX)',
'Ticker': 'ABX',
'Yahoo Ticker': 'ABX.TO',
'Expiry Date': Timestamp('2020-03-01 00:00:00'),
'Strike Price': 19.5,
'Call/Put': 'Put',
'Days to Expiry': 2,
'Volume': 1,
'Bid Price': 0.0,
'Ask Price': 0.11,
'Open Interest': 24,
'Implied Volatility': 2.4757,
'Spread %': 100.0,
'Volatility': 0.41140252083455864},
{'Close': 27.3,
'Company': 'Barrick Gold Corporation (ABX)',
'Ticker': 'ABX',
'Yahoo Ticker': 'ABX.TO',
'Expiry Date': Timestamp('2020-03-01 00:00:00'),
'Strike Price': 23.0,
'Call/Put': 'Call',
'Days to Expiry': 2,
'Volume': 5,
'Bid Price': 4.1,
'Ask Price': 5.9,
'Open Interest': 5,
'Implied Volatility': 3.0017,
'Spread %': 30.508474576271194,
'Volatility': 0.41140252083455864},
{'Close': 27.3,
'Company': 'Barrick Gold Corporation (ABX)',
'Ticker': 'ABX',
'Yahoo Ticker': 'ABX.TO',
'Expiry Date': Timestamp('2020-03-01 00:00:00'),
'Strike Price': 24.0,
'Call/Put': 'Put',
'Days to Expiry': 2,
'Volume': 5,
'Bid Price': 0.06,
'Ask Price': 0.17,
'Open Interest': 5,
'Implied Volatility': 1.3371,
'Spread %': 64.70588235294117,
'Volatility': 0.41140252083455864}]
我認為您可以使用 apply :
df["Black Scholes"] = df.apply(lambda r : bs_call(r) if r["Call/Put"] == "Call" else bs_put(r),axis=1)
如果“Call/Put”列只有兩個可能的值,那會很好用,但是如果您打算擁有更多值,則應該定義一個執行此操作的函數:
def foo(row) :
if row["Call/put"] == "value_1" :
return func_1(r)
elif ...
df["Black Scholes"] = df.apply(foo,axis=1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.