我正在尝试在一些复杂的计算上使用lambda函数。我在数据框中有一个列名“ time_periods_st”,想要创建一些新列,例如:dd1-dd10,z1-z10,z_s1-z_s10。从1到“ time_periods_st”,我们使用一种计算方法(dd1-dd(time_periods_st));对于“ time_periods_st”,到10,我们使用另一种计算方法(dd(time_periods_st)-dd10)。我们仅受两个不同的time_periods_st值限制(目前为1或5)。
我尝试通过lambda函数使用apply。我的代码正在运行,但数据框为空。
from scipy.stats import norm
import pandas as pd
import math
def delta_dd_cals(df,time_period=10):
if df['time_periods_st'] == 1:
for i in range(1,df['time_periods']+1):
if df['RHO'] > 0:
df['dd'+str(i)] = norm.ppf(df['CAST'+str(i-1)]) - norm.ppf(df['CAST'+str(i)])
df['z'+str(i)] = df['dd'+str(i)]/math.sqrt(df['RHO'])
df['z_s'+str(i)] = (df[['dd'+str(j) for j in range(i+1)]].sum() + df['DD'])/math.sqrt(df['RHO'])
elif df['RHO']<0 or df['CAST1']<0:
df['z'+str(i)] = np.nan
df['dd'+str(i)] = np.nan
df['z_s'+str(i)] = np.nan
else:
df['z'+str(i)] = 0
df['dd'+str(i)] = 0
df['z_s'+str(i)] = 0
for k in range(df['time_periods_st']+1,time_period+1):
if df['RHO'] > 0:
df['z'+str(k)] = (df['A1'] * (df['Z_NORM']-df['z_s'+str(k-1)])) + ((df['A2'] * df['z'+str(k-1)]))
df['dd'+str(k)] = math.sqrt(df['RHO']) * df['z'+str(k)]
df['z_s'+str(k)] = (df[['dd'+str(j) for j in range(k+1)]].sum() + df['DD'])/math.sqrt(df['RHO'])
elif df['RHO']<0 or df['CAST1']<0:
df['z'+str(i)] = np.nan
df['dd'+str(i)] = np.nan
df['z_s'+str(i)] = np.nan
else:
df['z'+str(i)] = 0
df['dd'+str(i)] = 0
df['z_s'+str(i)] = 0
else:
for i in range(1,df['time_periods']+1):
if df['RHO'] > 0:
df['dd'+str(i)] = norm.ppf(df['CAST'+str(i-1)]) - norm.ppf(df['CAST'+str(i)])
df['z'+str(i)] = df['dd'+str(i)]/math.sqrt(df['RHO'])
df['z_s'+str(i)] = (df[['dd'+str(j) for j in range(i+1)]].sum() + df['DD'])/math.sqrt(df['RHO'])
elif df['RHO']<0 or df['CAST1']<0:
df['z'+str(i)] = np.nan
df['dd'+str(i)] = np.nan
df['z_s'+str(i)] = np.nan
else:
df['z'+str(i)] = 0
df['dd'+str(i)] = 0
df['z_s'+str(i)] = 0
for k in range(df['time_periods_st']+1,time_period+1):
if df['RHO'] > 0:
df['z'+str(k)] = (df['A1'] * (df['Z_NORM']-df['z_s'+str(k-1)])) + ((df['A2'] * df['z'+str(k-1)]))
df['dd'+str(k)] = math.sqrt(df['RHO']) * df['z'+str(k)]
df['z_s'+str(k)] = (df[['dd'+str(j) for j in range(k+1)]].sum() + df['DD'])/math.sqrt(df['RHO'])
elif df['RHO']<0 or df['CAST1']<0:
df['z'+str(i)] = np.nan
df['dd'+str(i)] = np.nan
df['z_s'+str(i)] = np.nan
else:
df['z'+str(i)] = 0
df['dd'+str(i)] = 0
df['z_s'+str(i)] = 0
df_delta = df_delta.apply(lambda x: delta_dd_cals(x),axis=1)
我的代码正在运行,但数据帧为空。