【问题标题】:How to create a dataframe column based on a conditional calculation如何基于条件计算创建数据框列
【发布时间】:2020-03-30 06:20:22
【问题描述】:

我正在尝试创建一个新列,该列将根据 df['Call/Put'] 列中的行中的值执行一个或另一个函数。我在根据某些行值执行计算以及确定要执行哪个函数时遇到困难。下面是我尝试的最后一个函数,但它似乎没有正确执行公式。我尝试了几种方法都无济于事,但这是我尝试的最后一种方法。

我正在尝试创建一个名为“Black Scholes”的新列,如果 df['Call/Put']=='Call' 在该行中执行 bs_call,或者如果 df['Call/Put']= 执行 bs_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}]

【问题讨论】:

    标签: python pandas dataframe finance stock


    【解决方案1】:

    我认为你可以申请:

    df["Black Scholes"] = df.apply(lambda r : bs_call(r) if r["Call/Put"] == "Call" else bs_put(r),axis=1)
    

    如果“看涨/看跌”列只有两个可能的值,那将可以正常工作,但如果您打算拥有更多值,则应定义一个执行此操作的函数:

    def foo(row) :
       if row["Call/put"] == "value_1" : 
            return func_1(r)
       elif ...
    df["Black Scholes"] = df.apply(foo,axis=1)
    

    【讨论】:

    • 我尝试了一个 lambda 函数,但是由于我在 bs_call 函数和 bs_put 函数中有 5 个参数,因此在传递值为 df 的列时总是给我错误
    • 你在传递另一个参数吗?像 lambda 中的 bs_call(r,..,..,..) ?如果是这样的话,错误是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 2013-01-01
    • 2020-11-21
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多