Мне нужна помощь в применении приведенных ниже функций оператора case к одному и тому же столбцу одновременно или параллельно? Не уверен, что делаю это наиболее эффективным способом, есть ли альтернативные способы сделать это?
#Accrued Calc for ACT/360
def bbb(bb):
if bb["Basis"] == "ACT/360" and bb['Type'] == 'L' and bb['Current Filter'] == 'Current CF':
return 1 * bb['Principal/GrossAmount'] * (bb['All in Rate']/100)* (bb['Number of days'])/360
elif bb["Basis"] == "ACT/360" and bb['Type'] == 'D':
return -1 * bb['Principal/GrossAmount'] * (bb['All in Rate']/100)* (bb['Number of days'])/360
else:
return ''
kf['Accrued Calc'] = kf.apply(bbb, axis = 1)
#Accrued Calc for ACT/365
def ccc(cc):
if cc["Basis"] == "ACT/365" and cc['Type'] == 'L' and cc['Current Filter'] == 'Current CF':
return 1 * cc['Principal/GrossAmount'] * (cc['All in Rate']/100)* (cc['Number of days'])/365
elif cc["Basis"] == "ACT/365" and cc['Type'] == 'D':
return -1 * cc['Principal/GrossAmount'] * (cc['All in Rate']/100)* (cc['Number of days'])/365
else:
return ''
kf['Accrued Calc'] = kf.apply(ccc, axis = 1)
#Accrued Calc for 30/360 Basis
{def ppp(ll):
if ll["Basis"] == "30/360" and ll['Type'] == 'L' and ll['Current Filter'] == 'Current CF':
return 1 * ll['Principal/GrossAmount'] * (ll['All in Rate']/100)* (360 *(Settlement.year - ll['Start Date YEAR']) + 30 * (Settlement.month - ll['Start Date MONTH']) + Settlement.day - ll['Start Date DAYS'])/360
elif ll["Basis"] == "30/360" and ll['Type'] == 'D':
return -1 * ll['Principal/GrossAmount'] * (ll['All in Rate']/100)* (360 *(Settlement.year - ll['Start Date YEAR']) + 30 * (Settlement.month - ll['Start Date MONTH']) + Settlement.day - ll['Start Date DAYS'])/360
else:
return ''
kf['Accrued Calc'] = kf.apply(ppp, axis = 1)}
Я попробовал ниже
kf['Accrued Calc'] = kf['Accrued Calc'].apply(bbb) & kf['Accrued Calc'].apply(ccc) & kf['Accrued Calc'].apply(ppp)
Не уверен, что это хорошая идея, чтобы все мои функции были в одной большой функции?
Пожалуйста, также прочитайте описания тегов, прежде чем добавлять их. кейс кажется не относящимся к вашему вопросу
Только что обновил, теперь должно быть нормально
Это похоже на фрейм данных pandas. Если это правда, пожалуйста, добавьте тег pandas






У вас должна быть одна функция, чтобы решить, какую функцию вызывать. Примените эту функцию к вашему фрейму данных. В зависимости от ваших условий эта функция может вызвать правильную функцию, которая будет содержать суть ваших вычислений. Кроме того, в интересах удобочитаемости переименуйте свои функции и переменные во что-то, что имеет смысл:
#Accrued Calc for ACT/360
def accrued_act_360(row):
if row['Type'] == 'L' and row['Current Filter'] == 'Current CF':
return 1 * row['Principal/GrossAmount'] * (row['All in Rate']/100)* (row['Number of days'])/360
elif row['Type'] == 'D':
return -1 * row['Principal/GrossAmount'] * (row['All in Rate']/100)* (row['Number of days'])/360
else:
return ''
#Accrued Calc for ACT/365
def accrued_act_365(row):
if row['Type'] == 'L' and row['Current Filter'] == 'Current CF':
return 1 * row['Principal/GrossAmount'] * (row['All in Rate']/100)* (row['Number of days'])/365
elif row['Type'] == 'D':
return -1 * row['Principal/GrossAmount'] * (row['All in Rate']/100)* (row['Number of days'])/365
else:
return ''
#Accrued Calc for 30/360 Basis
def accrued_30_360(row):
if row['Type'] == 'L' and row['Current Filter'] == 'Current CF':
return 1 * row['Principal/GrossAmount'] * (row['All in Rate']/100)* (360 *(Settlement.year - row['Start Date YEAR']) + 30 * (Settlement.month - row['Start Date MONTH']) + Settlement.day - row['Start Date DAYS'])/360
elif row['Type'] == 'D':
return -1 * row['Principal/GrossAmount'] * (row['All in Rate']/100)* (360 *(Settlement.year - row['Start Date YEAR']) + 30 * (Settlement.month - row['Start Date MONTH']) + Settlement.day - row['Start Date DAYS'])/360
else:
return ''
def accrued_calc(row):
if row["Basis"] == "ACT/360":
return accrued_act_360(row)
elif row["Basis"] == "ACT/365":
return accrued_act_365(row)
elif row["Basis"] == "30/360":
return accrued_30_360(row)
else:
return ""
kf['Accrued Calc'] = kf.apply(accrued_calc, axis = 1)
Однако этот подход не позволяет использовать потрясающие возможности векторной обработки pandas.
Вы можете использовать логическое индексирование, чтобы выяснить, какие строки соответствуют определенным условиям, и установить эти строки только для всего фрейма данных одним выстрелом вместо применения вашей функции построчно. Этот подход, вероятно, будет значительно быстрее, чем .apply
def accrued_act_360_vec(df):
# Find which rows match your condition
type_l_rows = (df["Basis"] == "ACT/360") & (df["Type"] == "L") & (df["Current Filter"] == "Current CF")
# Set the value for those rows
df.loc[type_l_rows, "Accrued Calc"] = df.loc[type_l_rows, 'Principal/GrossAmount'] * (df.loc[type_l_rows, 'All in Rate']/100)* (df.loc[type_l_rows, 'Number of days'])/360
type_d_rows = (df["Basis"] == "ACT/360") & (df["Type"] == "D")
df.loc[type_d_rows, "Accrued Calc"] = -1 * df.loc[type_d_rows, 'Principal/GrossAmount'] * (df.loc[type_d_rows, 'All in Rate']/100)* (df.loc[type_d_rows, 'Number of days'])/360
# No need to consider the else condition: Those rows never get set.
def accrued_act_365_vec(df):
type_l_rows = (df["Basis"] == "ACT/365") & (df['Type'] == 'L') & (df['Current Filter'] == 'Current CF')
df.loc[type_l_rows, "Accrued Calc"] = 1 * df.loc[type_l_rows, 'Principal/GrossAmount'] * (df.loc[type_l_rows, 'All in Rate']/100)* (df.loc[type_l_rows, 'Number of days'])/365
type_d_rows = (df["Basis"] == "ACT/365") & (df['Type'] == 'D')
df.loc[type_d_rows, "Accrued Calc"] = -1 * df.loc[type_d_rows, 'Principal/GrossAmount'] * (df.loc[type_d_rows, 'All in Rate']/100)* (df.loc[type_d_rows, 'Number of days'])/365
def accrued_30_360_vec(df):
type_l_rows = (df["Basis"] == "30/360") & (df['Type'] == 'L') & (df['Current Filter'] == 'Current CF')
df.loc[type_l_rows, "Accrued Calc"] = 1 * df.loc[type_l_rows, 'Principal/GrossAmount'] * (df.loc[type_l_rows, 'All in Rate']/100)* (360 *(Settlement.year - df.loc[type_l_rows, 'Start Date YEAR']) + 30 * (Settlement.month - df.loc[type_l_rows, 'Start Date MONTH']) + Settlement.day - df.loc[type_l_rows, 'Start Date DAYS'])/360
type_d_rows = (df["Basis"] == "30/360") & (df['Type'] == 'D')
df.loc[type_d_rows, "Accrued Calc"] = -1 * df.loc[type_d_rows, 'Principal/GrossAmount'] * (df.loc[type_d_rows, 'All in Rate']/100)* (360 *(Settlement.year - df.loc[type_d_rows, 'Start Date YEAR']) + 30 * (Settlement.month - df.loc[type_d_rows, 'Start Date MONTH']) + Settlement.day - df.loc[type_d_rows, 'Start Date DAYS'])/360
Обратите внимание, что эти функции включают условие для df["Basis"] == ..., потому что все они являются автономными функциями. Чтобы запустить их, вы просто выполните:
accrued_act_360_vec(kf)
accrued_act_365_vec(kf)
accrued_30_360_vec(kf)
Please re-check the accuracy of the formulas in my code, I might have accidentally messed them up during copy/paste
Пожалуйста правильно отформатируйте код. Вам нужно три обратных кавычки в строках до и после вашего кода, чтобы определить барьеры кода. Я пытался сделать это для вас, но ваши последующие правки перезаписали мои правки, поэтому я подожду, пока вы сделаете это сами.