У меня есть следующий код, который я использую, чтобы определить, какая часть каждого погашения идет в каждый сегмент просроченных платежей (т. Е. Просроченные на 0-7 дней, просроченные на 7-15 дней ... и т. Д.)
Например, сумма погашения равна 100. 20 получает повторный срок раньше, а затем клиент пропускает дату погашения.Следовательно, 80 входит в сегмент 0-7dpd и так далее.Точно так же, если клиент не погашает в течение 7 дней, 80 входит в скобку 7-15dpd.
Код работает, но занимает много времени.Мне было интересно, есть ли способ заставить код работать быстрее.
repayments['principal_0_7_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 2.0), repayments.amount_principal - (repayments.child_principal_repaid_early), 0)
repayments['principal_7_15_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 7.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days), 0)
repayments['principal_15_30_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 15.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days + repayments.child_principal_repaid_7_15_days), 0)
repayments['principal_30_45_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 30.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days + repayments.child_principal_repaid_7_15_days + repayments.child_principal_repaid_15_30_days), 0)
repayments['principal_45_60_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 45.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days + repayments.child_principal_repaid_7_15_days + repayments.child_principal_repaid_15_30_days + repayments.child_principal_repaid_30_45_days), 0)
repayments['principal_60_90_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 60.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days + repayments.child_principal_repaid_7_15_days + repayments.child_principal_repaid_15_30_days + repayments.child_principal_repaid_30_45_days + repayments.child_principal_repaid_45_60_days), 0)
repayments['principal_90_120_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 90.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days + repayments.child_principal_repaid_7_15_days + repayments.child_principal_repaid_15_30_days + repayments.child_principal_repaid_30_45_days + repayments.child_principal_repaid_45_60_days + repayments.child_principal_repaid_60_90_days), 0)
repayments['principal_120_plus_dpd'] = np.where((repayments.paid_y_n == 'no') & (repayments.days_since_due >= 120.0), repayments.amount_principal - (repayments.child_principal_repaid_early + repayments.child_principal_repaid_1_7_days + repayments.child_principal_repaid_7_15_days + repayments.child_principal_repaid_15_30_days + repayments.child_principal_repaid_30_45_days + repayments.child_principal_repaid_45_60_days + repayments.child_principal_repaid_60_90_days + repayments.child_principal_repaid_90_120_days), 0)
Вы можете использовать следующие тестовые данные.Ожидаемый результат также включен ниже:
df = pd.DataFrame({
'amount_principal':[456.6459958, 456.6459958],
'days_since_due':[1068, 1061],
'paid_y_n':['yes', 'no'],
'child_principal_repaid_early':[0, 0],
'child_principal_repaid_1_7_days':[0, 0],
'child_principal_repaid_7_15_days':[0, 0],
'child_principal_repaid_15_30_days':[0, 180.2126753],
'child_principal_repaid_30_45_days':[0, 0],
'child_principal_repaid_45_60_days':[0, 0],
'child_principal_repaid_60_90_days':[0, 0],
'child_principal_repaid_90_120_days':[0, 0],
'child_principal_repaid_120_plus_days':[0, 0]}, index = [0,1])
