smc_cet_cibil_py/services/DpdCalculationService.py
2023-10-06 16:44:28 +05:30

220 lines
11 KiB
Python

from datetime import datetime
from collections import Counter
import re
class DpdCalculationService:
def dpdCalculation(accountTranDetailsID=None,Consumer_dpd_details=None,dpd_month_bucket_master=None):
# print('dpdCalculation called',accountTranDetailsID,len(Consumer_dpd_details))
# print(dpd_month_bucket_master)
# month_index = 0
currentDPD = 0;
DPD0_6,DPD7_12,DPD13_24,DPD25_36 = [],[],[],[]
# DPD0_6_BUCKET,DPD7_12_BUCKET,DPD13_24_BUCKET,DPD25_36_BUCKET = [{'name':'20-30','from':20,'to':30},{'name':'31-40','from':31,'to':40},{'name':'41-50','from':41,'to':60}],[],[],[]
for idx,dpd in enumerate(Consumer_dpd_details):
# if accountTranDetailsID == '388857':
# print('#########################BREAK')
# break
#in future introduce if condition like idx <=36
if dpd['AccountTranDetailsID'] == accountTranDetailsID:
# month_index+=1
# if month_index == 37:break
# month = (datetime.strptime((dpd['StartDate'].split(" ")[0]), "%Y-%m-%d")).month
month_bucket_index = int(dpd['month_bucket_index'])
if month_bucket_index == 1: currentDPD = month_bucket_index
month_bucket = '0_6' if month_bucket_index <= 6 else '7_12' if month_bucket_index >= 7 and month_bucket_index <= 12 else '13_24' if month_bucket_index >=13 and month_bucket_index <= 24 else '25_36' if month_bucket_index >= 25 and month_bucket_index <= 36 else None
currentDPDcode = (int(dpd['Code'])) if dpd['Code'].isnumeric() else 0
dynamic_dpd_month_bucket = None if month_bucket is None else 'DPD'+month_bucket
# dynamic_dpd_month_range_bucket = dynamic_dpd_month_bucket + '_BUCKET'
# print(vars()[dynamic_dpd_month_bucket],vars()[dynamic_dpd_month_range_bucket])
# if len(vars()[dynamic_dpd_month_range_bucket]) > 0:
# for single_date_range in vars()[dynamic_dpd_month_range_bucket]:
# if currentDPDcode != 0 and currentDPDcode >= int(single_date_range['from']) and currentDPDcode <= int(single_date_range['to']):
# print(currentDPDcode,'-',single_date_range['name'])
# vars()[dynamic_dpd_month_bucket].append(single_date_range['name'])
# break
currentDPDMonth = 0
if dynamic_dpd_month_bucket is not None:
currentDPDMonth = DpdCalculationService.dpdFindDaysBucket(dpd_month_bucket_master,currentDPDcode)
if currentDPDMonth != 0:
vars()[dynamic_dpd_month_bucket].append(currentDPDMonth)
# print(vars()[dynamic_dpd_month_bucket])
# print(idx,dpd['AccountTranDetailsID'],dpd['StartDate'],month,month_bucket,dynamic_dpd_month_bucket,currentDPDMonth,currentDPDcode)
# print(DPD0_6,DPD7_12,DPD13_24,DPD25_36)
DPD0_6 = DpdCalculationService.findMaxCountofDPDDays(DPD0_6);
DPD7_12 = DpdCalculationService.findMaxCountofDPDDays(DPD7_12);
DPD13_24 = DpdCalculationService.findMaxCountofDPDDays(DPD13_24);
DPD25_36 = DpdCalculationService.findMaxCountofDPDDays(DPD25_36);
# print('final*****',DPD0_6)
DPD0_6 = DPD0_6['days_range'] +'(' + DPD0_6['count'] +')' if 'days_range' in DPD0_6 else '0'
DPD7_12 = DPD7_12['days_range'] +'(' + DPD7_12['count'] +')' if 'days_range' in DPD7_12 else '0'
DPD13_24 = DPD13_24['days_range'] +'(' + DPD13_24['count'] +')' if 'days_range' in DPD13_24 else '0'
DPD25_36 = DPD25_36['days_range'] +'(' + DPD25_36['count'] +')' if 'days_range' in DPD25_36 else '0'
return {'currentDPD':currentDPD,'DPD0_6':DPD0_6,'DPD7_12':DPD7_12,'DPD13_24':DPD13_24,'DPD25_36':DPD25_36}
def monthDiffBWDates(fromDate,endDate):
# start = datetime.strptime((fromDate.split(" ")[0]), "%Y-%m-%d")
# end = datetime.strptime((endDate.split(" ")[0]), "%Y-%m-%d")
# months = (end.year - start.year) * 12 + (end.month - start.month )
# print('monhs',months)
# print('')
# return months
str = 'xxx'
try:
val = int(str)
print(type(val))
except IOError:
print(type(str))
def dpdFindDaysBucket(month_bucket_master,factor):
#DPD month bucket calculation start
# print(dpd_month_bucket_master)
for dpd_month_bucket in month_bucket_master:
# print(dpd_month_bucket)
# print(type(dpd_month_bucket['range_from']),'***',dpd_month_bucket['range_from'].isnumeric())
# print(type(dpd_month_bucket['range_to']),'***',dpd_month_bucket['range_to'].isnumeric())
range_from = int(dpd_month_bucket['range_from']) if (type(dpd_month_bucket['range_from']) is str and dpd_month_bucket['range_from'].isnumeric()) else None
range_to = int(dpd_month_bucket['range_to']) if (type(dpd_month_bucket['range_to']) is str and dpd_month_bucket['range_to'].isnumeric()) else None
# range_to = int(dpd_month_bucket['range_to']) if (dpd_month_bucket['range_to'] is str and dpd_month_bucket['range_to'].isnumeric()) else dpd_month_bucket['range_to']
factor = int(factor) if isinstance(factor,str) and factor.isnumeric() else factor if isinstance(factor,int) else 0
if range_from != None and range_to != None:
# print((range_from),'###',(range_to),range_from != None,currentDPDcode)
if factor >= (range_from) and factor <= (range_to):
# vars()[dynamic_dpd_month_bucket].append(dpd_month_bucket['name'])
return dpd_month_bucket['name']
# break
elif range_to == None:
if factor >= (range_from):
# vars()[dynamic_dpd_month_bucket].append(dpd_month_bucket['name'])
return dpd_month_bucket['name']
# break
elif range_from == None:
if factor >= (range_to):
# vars()[dynamic_dpd_month_bucket].append(dpd_month_bucket['name'])
return dpd_month_bucket['name']
# break
else:
return 0
# break
#DPD month bucket calculation end
def findMaxCountofDPDDays(listOfDaysCount):
# print('findMaxCountofDPDDays******',listOfDaysCount)
UniquelistOfDaysCount = Counter(listOfDaysCount)
days_count_list = (list(UniquelistOfDaysCount.values()))
if len(days_count_list) > 0:
return {'days_range':(listOfDaysCount[days_count_list.index(max(days_count_list))]),'count': str(max(days_count_list))}
else:
return {}
# DpdCalculationService.monthDiffBWDates('2014-02-03 00:00:00','2022-01-14 11:16:55.097000')
def commercialDpdCalculation(creditFacilitySno = None,com_dpd_details=None,dpd_month_bucket_master=None):
# print('dpdCalculation called',creditFacilitySno,len(com_dpd_details))
# print(dpd_month_bucket_master)
month_index = 0
currentDPD = 0;
DPD0_6,DPD7_12,DPD13_24,DPD25_36 = [],[],[],[]
# DPD0_6_BUCKET,DPD7_12_BUCKET,DPD13_24_BUCKET,DPD25_36_BUCKET = [{'name':'20-30','from':20,'to':30},{'name':'31-40','from':31,'to':40},{'name':'41-50','from':41,'to':60}],[],[],[]
for idx,dpd in enumerate(com_dpd_details):
if creditFacilitySno[16:] == 2:
print('#########################BREAK')
break
#in future introduce if condition like idx <=36
if dpd['BorrowerCurrentDetailsID'] == creditFacilitySno[16:]:
month_index+=1
#find number in string i.e 25 in 25 days past
tempDPD = re.findall('[0-9]+', dpd['CFHistory24MonthsACorDPD'])
tempDPD = tempDPD[0] if len(tempDPD) > 0 else 0
if month_index == 1: currentDPD = tempDPD
if month_index == 37:break
# month = (datetime.strptime((dpd['StartDate'].split(" ")[0]), "%Y-%m-%d")).month
month = month_index
month_bucket = '0_6' if month <= 6 else '7_12' if month >= 7 and month <= 12 else '13_24' if month >=13 and month <= 24 else '25_36' if month >= 25 and month <= 36 else 'None'
currentDPDcode = (int(tempDPD)) if tempDPD is not str else 0
dynamic_dpd_month_bucket = 'DPD'+month_bucket
currentDPDMonth = DpdCalculationService.dpdFindDaysBucket(dpd_month_bucket_master,currentDPDcode)
if currentDPDMonth != 0:
vars()[dynamic_dpd_month_bucket].append(currentDPDMonth)
# print(vars()[dynamic_dpd_month_bucket])
# print(idx,dpd['BorrowerCurrentDetailsID'],dpd['CFHistory24Monthsmonth'],month,month_bucket,dynamic_dpd_month_bucket,currentDPDMonth,currentDPDcode)
# print(DPD0_6,DPD7_12,DPD13_24,DPD25_36)
DPD0_6 = DpdCalculationService.findMaxCountofDPDDays(DPD0_6);
DPD7_12 = DpdCalculationService.findMaxCountofDPDDays(DPD7_12);
DPD13_24 = DpdCalculationService.findMaxCountofDPDDays(DPD13_24);
DPD25_36 = DpdCalculationService.findMaxCountofDPDDays(DPD25_36);
# print('final*****',DPD0_6)
DPD0_6 = DPD0_6['days_range'] +'(' + DPD0_6['count'] +')' if 'days_range' in DPD0_6 else '0'
DPD7_12 = DPD7_12['days_range'] +'(' + DPD7_12['count'] +')' if 'days_range' in DPD7_12 else '0'
DPD13_24 = DPD13_24['days_range'] +'(' + DPD13_24['count'] +')' if 'days_range' in DPD13_24 else '0'
DPD25_36 = DPD25_36['days_range'] +'(' + DPD25_36['count'] +')' if 'days_range' in DPD25_36 else '0'
return {'currentDPD':currentDPD,'DPD0_6':DPD0_6,'DPD7_12':DPD7_12,'DPD13_24':DPD13_24,'DPD25_36':DPD25_36}
def checkDateInLatest36Months(date,latest_36months_skeleton):
print('checkDateInLatest36Months')
temp_dpd_date = (datetime.datetime.strptime(date, "%Y-%m-%d"))
# print(temp_dpd_date.month)
return_data = 0
for month_index,skeleton_date in enumerate(latest_36months_skeleton):
if (temp_dpd_date.year == skeleton_date.year) and (temp_dpd_date.month == skeleton_date.month):
print(month_index,':',date, ' - is in - ', (month_index + 1), ' bucket')
return_data = (month_index + 1)
break
return return_data
def generateMonthSkeleton(date,month_size = 36,):
latest_36months_skeleton = []
print('generateMonthSkeleton')
date = datetime.datetime.strptime(date, "%Y-%m-%d")
month_count = 1
while month_count <= 36 :
day = date - relativedelta(months=month_count)
latest_36months_skeleton.append((day))
month_count += 1
return latest_36months_skeleton