Skip to content

Instantly share code, notes, and snippets.

@wolframalpha
Last active July 31, 2019 12:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wolframalpha/ff1aff8f4d58ef770cf9abc287170701 to your computer and use it in GitHub Desktop.
Save wolframalpha/ff1aff8f4d58ef770cf9abc287170701 to your computer and use it in GitHub Desktop.
import datetime
cf_history = [('CF_B_HST_MONTH_24', 'CF_B_HST_OS_AMOUNT_24', 'CF_B_HST_AC_DPD_24'),
('CF_B_HST_MONTH_23', 'CF_B_HST_OS_AMOUNT_23', 'CF_B_HST_AC_DPD_23'),
('CF_B_HST_MONTH_22', 'CF_B_HST_OS_AMOUNT_22', 'CF_B_HST_AC_DPD_22'),
('CF_B_HST_MONTH_21', 'CF_B_HST_OS_AMOUNT_21', 'CF_B_HST_AC_DPD_21'),
('CF_B_HST_MONTH_20', 'CF_B_HST_OS_AMOUNT_20', 'CF_B_HST_AC_DPD_20'),
('CF_B_HST_MONTH_19', 'CF_B_HST_OS_AMOUNT_19', 'CF_B_HST_AC_DPD_19'),
('CF_B_HST_MONTH_18', 'CF_B_HST_OS_AMOUNT_18', 'CF_B_HST_AC_DPD_18'),
('CF_B_HST_MONTH_17', 'CF_B_HST_OS_AMOUNT_17', 'CF_B_HST_AC_DPD_17'),
('CF_B_HST_MONTH_16', 'CF_B_HST_OS_AMOUNT_16', 'CF_B_HST_AC_DPD_16'),
('CF_B_HST_MONTH_15', 'CF_B_HST_OS_AMOUNT_15', 'CF_B_HST_AC_DPD_15'),
('CF_B_HST_MONTH_14', 'CF_B_HST_OS_AMOUNT_14', 'CF_B_HST_AC_DPD_14'),
('CF_B_HST_MONTH_13', 'CF_B_HST_OS_AMOUNT_13', 'CF_B_HST_AC_DPD_13'),
('CF_B_HST_MONTH_12', 'CF_B_HST_OS_AMOUNT_12', 'CF_B_HST_AC_DPD_12'),
('CF_B_HST_MONTH_11', 'CF_B_HST_OS_AMOUNT_11', 'CF_B_HST_AC_DPD_11'),
('CF_B_HST_MONTH_10', 'CF_B_HST_OS_AMOUNT_10', 'CF_B_HST_AC_DPD_10'),
('CF_B_HST_MONTH_9', 'CF_B_HST_OS_AMOUNT_9', 'CF_B_HST_AC_DPD_9'),
('CF_B_HST_MONTH_8', 'CF_B_HST_OS_AMOUNT_8', 'CF_B_HST_AC_DPD_8'),
('CF_B_HST_MONTH_7', 'CF_B_HST_OS_AMOUNT_7', 'CF_B_HST_AC_DPD_7'),
('CF_B_HST_MONTH_6', 'CF_B_HST_OS_AMOUNT_6', 'CF_B_HST_AC_DPD_6'),
('CF_B_HST_MONTH_5', 'CF_B_HST_OS_AMOUNT_5', 'CF_B_HST_AC_DPD_5'),
('CF_B_HST_MONTH_4', 'CF_B_HST_OS_AMOUNT_4', 'CF_B_HST_AC_DPD_4'),
('CF_B_HST_MONTH_3', 'CF_B_HST_OS_AMOUNT_3', 'CF_B_HST_AC_DPD_3'),
('CF_B_HST_MONTH_2', 'CF_B_HST_OS_AMOUNT_2', 'CF_B_HST_AC_DPD_2'),
('CF_B_HST_MONTH_1', 'CF_B_HST_OS_AMOUNT_1', 'CF_B_HST_AC_DPD_1')]
dpd_delinquency_1 = ['SMA-2', 'NPA',]
dpd_delinquency_2 = ['SMA-2', 'NPA', 'Other']
def check_if_valid_sma(row, dpd_delinquency, n_months=12):
def check_if_continuous_date_available(index):
delinquency_flag_inside = False
continuous_flag_inside = False
delinquency_flag_outside = False
next_n_months = index + n_months + 1
i = 0
for date_col, amount_col, dpd_col in cf_history[0: next_n_months]:
date = row[date_col]
amount = row[amount_col]
dpd = row[dpd_col]
if i < index:
if dpd in dpd_delinquency:
delinquency_flag_outside = True
i = i + 1
continue
if dpd in dpd_delinquency:
# print(dpd)
delinquency_flag_inside = True
if date == np.nan or dpd == '-' or dpd == '' or amount == np.nan or date < datetime.datetime(year=2015, month=1, day=1):
continuous_flag_inside = False
return False, delinquency_flag_inside, delinquency_flag_outside
i = i + 1
return True, delinquency_flag_inside, delinquency_flag_outside
break_flag = False
continuous_flag = False
delinquency_flag = False
delinquency_flag_outside = False
for i, (date_col, amount_col, dpd_col) in enumerate(cf_history):
n_month = i + 1
is_continuous, is_delinquent_inside, is_delinquent_outside = check_if_continuous_date_available(i)
if is_continuous:
continuous_flag = True
delinquency_flag = is_delinquent_inside
delinquency_flag_outside = is_delinquent_outside
break
if n_month > len(cf_history) - n_months:
break
# pass
return continuous_flag, delinquency_flag, is_delinquent_outside
df_cf['is_valid_1'] = df_cf.apply(lambda x: check_if_valid_sma(x, dpd_delinquency=dpd_delinquency_1), axis=1)
df_cf['is_valid_2'] = df_cf.apply(lambda x: check_if_valid_sma(x, dpd_delinquency=dpd_delinquency_2), axis=1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment