Skip to content

Commit 18608c9

Browse files
committed
Streamlined logic for generating borrower characteristics
1 parent e4035f9 commit 18608c9

File tree

5 files changed

+56
-67
lines changed

5 files changed

+56
-67
lines changed

publication/src/main/scala/hmda/publication/reports/disclosure/D51.scala

Lines changed: 11 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ import hmda.model.publication.reports.ReportTypeEnum.Disclosure
1010
import hmda.model.publication.reports._
1111
import hmda.publication.reports.util.DateUtil._
1212
import hmda.publication.reports.util.DispositionType._
13-
import hmda.publication.reports.util.EthnicityUtil._
14-
import hmda.publication.reports.util.MinorityStatusUtil._
15-
import hmda.publication.reports.util.RaceUtil._
1613
import hmda.publication.reports.util.ReportUtil._
1714
import hmda.query.model.filing.LoanApplicationRegisterQuery
1815

@@ -90,71 +87,40 @@ object D51 {
9087
val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
9188

9289
val larsByIncome = larsByIncomeInterval(larsWithIncome, incomeIntervals)
90+
val borrowerCharacteristicsByIncomeF = borrowerCharacteristicsByIncomeInterval(larsByIncome, dispositions)
9391

9492
val dateF = calculateYear(larSource)
9593
val totalF = calculateDispositions(lars, dispositions)
9694

9795
for {
98-
races50 <- raceBorrowerCharacteristic(larsByIncome(LessThan50PercentOfMSAMedian), LessThan50PercentOfMSAMedian, dispositions)
99-
races50to79 <- raceBorrowerCharacteristic(larsByIncome(Between50And79PercentOfMSAMedian), Between50And79PercentOfMSAMedian, dispositions)
100-
races80to99 <- raceBorrowerCharacteristic(larsByIncome(Between80And99PercentOfMSAMedian), Between80And99PercentOfMSAMedian, dispositions)
101-
races100to120 <- raceBorrowerCharacteristic(larsByIncome(Between100And119PercentOfMSAMedian), Between100And119PercentOfMSAMedian, dispositions)
102-
races120 <- raceBorrowerCharacteristic(larsByIncome(GreaterThan120PercentOfMSAMedian), GreaterThan120PercentOfMSAMedian, dispositions)
103-
104-
ethnicity50 <- ethnicityBorrowerCharacteristic(larsByIncome(LessThan50PercentOfMSAMedian), LessThan50PercentOfMSAMedian, dispositions)
105-
ethnicity50to79 <- ethnicityBorrowerCharacteristic(larsByIncome(Between50And79PercentOfMSAMedian), Between50And79PercentOfMSAMedian, dispositions)
106-
ethnicity80to99 <- ethnicityBorrowerCharacteristic(larsByIncome(Between80And99PercentOfMSAMedian), Between80And99PercentOfMSAMedian, dispositions)
107-
ethnicity100to120 <- ethnicityBorrowerCharacteristic(larsByIncome(Between100And119PercentOfMSAMedian), Between100And119PercentOfMSAMedian, dispositions)
108-
ethnicity120 <- ethnicityBorrowerCharacteristic(larsByIncome(GreaterThan120PercentOfMSAMedian), GreaterThan120PercentOfMSAMedian, dispositions)
109-
110-
minorityStatus50 <- minorityStatusBorrowerCharacteristic(larsByIncome(LessThan50PercentOfMSAMedian), LessThan50PercentOfMSAMedian, dispositions)
111-
minorityStatus50to79 <- minorityStatusBorrowerCharacteristic(larsByIncome(Between50And79PercentOfMSAMedian), Between50And79PercentOfMSAMedian, dispositions)
112-
minorityStatus80to99 <- minorityStatusBorrowerCharacteristic(larsByIncome(Between80And99PercentOfMSAMedian), Between80And99PercentOfMSAMedian, dispositions)
113-
minorityStatus100to120 <- minorityStatusBorrowerCharacteristic(larsByIncome(Between100And119PercentOfMSAMedian), Between100And119PercentOfMSAMedian, dispositions)
114-
minorityStatus120 <- minorityStatusBorrowerCharacteristic(larsByIncome(GreaterThan120PercentOfMSAMedian), GreaterThan120PercentOfMSAMedian, dispositions)
96+
lars50BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(LessThan50PercentOfMSAMedian)
97+
lars50To79BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between50And79PercentOfMSAMedian)
98+
lars80To99BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between80And99PercentOfMSAMedian)
99+
lars100To120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between100And119PercentOfMSAMedian)
100+
lars120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(GreaterThan120PercentOfMSAMedian)
115101

116102
date <- dateF
117103
total <- totalF
118104
} yield {
119105
val income50 = ApplicantIncome(
120106
LessThan50PercentOfMSAMedian,
121-
List(
122-
RaceBorrowerCharacteristic(races50),
123-
EthnicityBorrowerCharacteristic(ethnicity50),
124-
MinorityStatusBorrowerCharacteristic(minorityStatus50)
125-
)
107+
lars50BorrowerCharacteristics
126108
)
127109
val income50To79 = ApplicantIncome(
128110
Between50And79PercentOfMSAMedian,
129-
List(
130-
RaceBorrowerCharacteristic(races50to79),
131-
EthnicityBorrowerCharacteristic(ethnicity50to79),
132-
MinorityStatusBorrowerCharacteristic(minorityStatus50to79)
133-
)
111+
lars50To79BorrowerCharacteristics
134112
)
135113
val income80To99 = ApplicantIncome(
136114
Between80And99PercentOfMSAMedian,
137-
List(
138-
RaceBorrowerCharacteristic(races80to99),
139-
EthnicityBorrowerCharacteristic(ethnicity80to99),
140-
MinorityStatusBorrowerCharacteristic(minorityStatus80to99)
141-
)
115+
lars80To99BorrowerCharacteristics
142116
)
143117
val income100To120 = ApplicantIncome(
144118
Between100And119PercentOfMSAMedian,
145-
List(
146-
RaceBorrowerCharacteristic(races100to120),
147-
EthnicityBorrowerCharacteristic(ethnicity100to120),
148-
MinorityStatusBorrowerCharacteristic(minorityStatus100to120)
149-
)
119+
lars100To120BorrowerCharacteristics
150120
)
151121
val income120 = ApplicantIncome(
152122
GreaterThan120PercentOfMSAMedian,
153-
List(
154-
RaceBorrowerCharacteristic(races120),
155-
EthnicityBorrowerCharacteristic(ethnicity120),
156-
MinorityStatusBorrowerCharacteristic(minorityStatus120)
157-
)
123+
lars120BorrowerCharacteristics
158124
)
159125

160126
D51(

publication/src/main/scala/hmda/publication/reports/util/EthnicityUtil.scala

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package hmda.publication.reports.util
22

33
import akka.NotUsed
44
import akka.stream.scaladsl.Source
5-
import hmda.model.publication.reports.{ ApplicantIncomeEnum, EthnicityCharacteristic, EthnicityEnum }
5+
import hmda.model.publication.reports.{ ApplicantIncomeEnum, EthnicityBorrowerCharacteristic, EthnicityCharacteristic, EthnicityEnum }
66
import hmda.model.publication.reports.EthnicityEnum._
77
import hmda.publication.reports.util.DispositionType.DispositionType
88
import hmda.publication.reports.util.ReportUtil.calculateDispositions
@@ -43,7 +43,7 @@ object EthnicityUtil {
4343
larSource: Source[LoanApplicationRegisterQuery, NotUsed],
4444
applicantIncomeEnum: ApplicantIncomeEnum,
4545
dispositions: List[DispositionType]
46-
): Future[List[EthnicityCharacteristic]] = {
46+
): Future[EthnicityBorrowerCharacteristic] = {
4747

4848
val larsHispanic = filterEthnicity(larSource, HispanicOrLatino)
4949
val larsNotHispanic = filterEthnicity(larSource, NotHispanicOrLatino)
@@ -62,11 +62,13 @@ object EthnicityUtil {
6262
jointDispositions <- dispJointF
6363
} yield {
6464

65-
List(
66-
EthnicityCharacteristic(HispanicOrLatino, hispanicDispositions),
67-
EthnicityCharacteristic(NotHispanicOrLatino, notHispanicDispositions),
68-
EthnicityCharacteristic(NotAvailable, notAvailableDispositions),
69-
EthnicityCharacteristic(Joint, jointDispositions)
65+
EthnicityBorrowerCharacteristic(
66+
List(
67+
EthnicityCharacteristic(HispanicOrLatino, hispanicDispositions),
68+
EthnicityCharacteristic(NotHispanicOrLatino, notHispanicDispositions),
69+
EthnicityCharacteristic(NotAvailable, notAvailableDispositions),
70+
EthnicityCharacteristic(Joint, jointDispositions)
71+
)
7072
)
7173

7274
}

publication/src/main/scala/hmda/publication/reports/util/MinorityStatusUtil.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ object MinorityStatusUtil {
5959
larSource: Source[LoanApplicationRegisterQuery, NotUsed],
6060
applicantIncomeEnum: ApplicantIncomeEnum,
6161
dispositions: List[DispositionType]
62-
): Future[List[MinorityStatusCharacteristic]] = {
62+
): Future[MinorityStatusBorrowerCharacteristic] = {
6363

6464
val larsWhite = filterMinorityStatus(larSource, WhiteNonHispanic)
6565
val larsOther = filterMinorityStatus(larSource, OtherIncludingHispanic)
@@ -72,9 +72,11 @@ object MinorityStatusUtil {
7272
otherDispositions <- dispOtherF
7373
} yield {
7474

75-
List(
76-
MinorityStatusCharacteristic(WhiteNonHispanic, whiteDispositions),
77-
MinorityStatusCharacteristic(OtherIncludingHispanic, otherDispositions)
75+
MinorityStatusBorrowerCharacteristic(
76+
List(
77+
MinorityStatusCharacteristic(WhiteNonHispanic, whiteDispositions),
78+
MinorityStatusCharacteristic(OtherIncludingHispanic, otherDispositions)
79+
)
7880
)
7981

8082
}

publication/src/main/scala/hmda/publication/reports/util/RaceUtil.scala

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package hmda.publication.reports.util
22

33
import akka.NotUsed
44
import akka.stream.scaladsl.Source
5-
import hmda.model.publication.reports.{ ApplicantIncomeEnum, RaceCharacteristic, RaceEnum }
5+
import hmda.model.publication.reports.{ ApplicantIncomeEnum, RaceBorrowerCharacteristic, RaceCharacteristic, RaceEnum }
66
import hmda.model.publication.reports.RaceEnum._
77
import hmda.publication.reports._
88
import hmda.publication.reports.util.ReportUtil.calculateDispositions
@@ -105,7 +105,7 @@ object RaceUtil {
105105
(lar.coRace5 != "" && lar.coRace5 != "5"))
106106
}
107107

108-
def raceBorrowerCharacteristic[as: AS, mat: MAT, ec: EC](larSource: Source[LoanApplicationRegisterQuery, NotUsed], applicantIncomeEnum: ApplicantIncomeEnum, dispositions: List[DispositionType]): Future[List[RaceCharacteristic]] = {
108+
def raceBorrowerCharacteristic[as: AS, mat: MAT, ec: EC](larSource: Source[LoanApplicationRegisterQuery, NotUsed], applicantIncomeEnum: ApplicantIncomeEnum, dispositions: List[DispositionType]): Future[RaceBorrowerCharacteristic] = {
109109

110110
val larsAlaskan = filterRace(larSource, AmericanIndianOrAlaskaNative)
111111
val larsAsian = filterRace(larSource, Asian)
@@ -144,15 +144,17 @@ object RaceUtil {
144144
val jointCharacteristic = RaceCharacteristic(Joint, dispJoint)
145145
val notProvidedCharacteristic = RaceCharacteristic(NotProvided, dispNotProvided)
146146

147-
List(
148-
alaskanCharacteristic,
149-
asianCharacteristic,
150-
blackCharacteristic,
151-
hawaiianCharacteristic,
152-
whiteCharacteristic,
153-
twoOrMoreMinorityCharacteristic,
154-
jointCharacteristic,
155-
notProvidedCharacteristic
147+
RaceBorrowerCharacteristic(
148+
List(
149+
alaskanCharacteristic,
150+
asianCharacteristic,
151+
blackCharacteristic,
152+
hawaiianCharacteristic,
153+
whiteCharacteristic,
154+
twoOrMoreMinorityCharacteristic,
155+
jointCharacteristic,
156+
notProvidedCharacteristic
157+
)
156158
)
157159
}
158160

publication/src/main/scala/hmda/publication/reports/util/ReportUtil.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import hmda.model.publication.reports.ApplicantIncomeEnum._
77
import hmda.model.publication.reports._
88
import hmda.publication.reports.{ AS, EC, MAT }
99
import hmda.publication.reports.util.DispositionType._
10+
import hmda.publication.reports.util.RaceUtil.raceBorrowerCharacteristic
11+
import hmda.publication.reports.util.EthnicityUtil.ethnicityBorrowerCharacteristic
12+
import hmda.publication.reports.util.MinorityStatusUtil.minorityStatusBorrowerCharacteristic
1013
import hmda.query.model.filing.LoanApplicationRegisterQuery
1114
import hmda.util.SourceUtils
1215

@@ -56,6 +59,20 @@ object ReportUtil extends SourceUtils {
5659
)
5760
}
5861

62+
def borrowerCharacteristicsByIncomeInterval[ec: EC, mat: MAT, as: AS](larsByIncome: Map[ApplicantIncomeEnum, Source[LoanApplicationRegisterQuery, NotUsed]], dispositions: List[DispositionType]): Map[ApplicantIncomeEnum, Future[List[BorrowerCharacteristic]]] = {
63+
larsByIncome.map {
64+
case (income, lars) =>
65+
val characteristics = Future.sequence(
66+
List(
67+
raceBorrowerCharacteristic(lars, income, dispositions),
68+
ethnicityBorrowerCharacteristic(lars, income, dispositions),
69+
minorityStatusBorrowerCharacteristic(lars, income, dispositions)
70+
)
71+
)
72+
income -> characteristics
73+
}
74+
}
75+
5976
def calculateYear[ec: EC, mat: MAT, as: AS](larSource: Source[LoanApplicationRegisterQuery, NotUsed]): Future[Int] = {
6077
collectHeadValue(larSource).map(lar => lar.actionTakenDate.toString.substring(0, 4).toInt)
6178
}

0 commit comments

Comments
 (0)