-
Notifications
You must be signed in to change notification settings - Fork 0
/
readData.py
112 lines (91 loc) · 2.68 KB
/
readData.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import csv
import matplotlib.pyplot as plt
import numpy as np
#{0: 'ID', 1: 'GMI', 2: 'CCP', 3: 'CP', 4: 'SLP', 5: 'AV', 6: 'DP', 7: 'LA', 8: 'MMP', 9: 'CS'}
factors = {'ID': [], 'GMI': [], 'CCP': [], 'CP': [], 'SLP': [], 'AV': [], 'DP': [], 'LA': [], 'MMP': [], 'CS': []}
def judgeDTI(row):
# calculate DTI
ID = int(row[0])
GMI = row[1]
CCP = row[2]
CP = row[3]
SLP = row[4]
MMP = row[8]
DTI = (CCP + CP + SLP + MMP) / GMI
FEDTI = MMP / GMI
# if DTI too high, then increment related factors
if DTI > 0.43:
factors['CCP'].append(ID)
factors['GMI'].append(ID)
factors['CP'].append(ID)
factors['SLP'].append(ID)
factors['MMP'].append(ID)
elif FEDTI > 0.28:
factors['MMP'].append(ID)
def judgeLTV(row):
ID = row[0]
AV = row[5]
DP = row[6]
LA = row[7]
LTV = LA / AV
if LTV > 0.8:
factors['DP'].append(ID)
factors['LA'].append(ID)
factors['AV'].append(ID)
#LTV = loan amount / appraisal value
def judgeCredit(row):
# extract and view credit score
ID = int(row[0])
if row[9] < 640:
factors['CS'].append(ID)
def criteria(row):
res = []
judgeDTI(row)
judgeCredit(row)
judgeLTV(row)
# list of reasons for failure
return res
i = 0
with open('data.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
header = next(csv_reader)
for row in csv_reader:
formattedRow = [float(x) for x in row]
formattedRow[0] = int(formattedRow[0])
ID = row[0]
# check all reasons
failures = criteria(formattedRow)
# always append id to factors['ID']
factors['ID'].append(ID)
# append to factors['reason'] if check fails
for factor in failures:
factors[factor].append(ID)
print(factors)
###
### PLOTTING
###
numOfClients = len(factors['ID'])
factorsList = list(factors.keys())
x = np.arange(len(factors) - 1)
width = 0.25
multiplier = 0
fig, ax = plt.subplots(layout='constrained')
results = {'Y': [], 'N': []}
i = 0
for factor in factorsList[1:]:
results['N'].append(len(factors[factor]) / numOfClients * 100)
results['Y'].append(100 - results['N'][i])
i += 1
for attribute, measurement in results.items():
offset = width * multiplier
rects = ax.bar(x + offset, measurement, width, label=attribute)
ax.bar_label(rects, padding=3)
multiplier += 1
# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Percentage')
ax.set_title('Y/N for each factor')
ax.set_xticks(x + width, factorsList[1:])
ax.legend(loc='upper left', ncols=2)
ax.set_ylim(0, 250)
plt.show()
plt.savefig('data.png')