Skip to content

Commit 3a9ac8b

Browse files
author
Nick Grippin
committed
aggregation methods
1 parent 9303e11 commit 3a9ac8b

File tree

4 files changed

+109
-61
lines changed

4 files changed

+109
-61
lines changed

model/shared/src/main/scala/hmda/model/publication/reports/BorrowerCharacteristic.scala

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,26 @@ package hmda.model.publication.reports
22

33
sealed trait BorrowerCharacteristic
44

5-
case class RaceBorrowerCharacteristic(races: List[RaceCharacteristic]) extends BorrowerCharacteristic
5+
case class RaceBorrowerCharacteristic(races: List[RaceCharacteristic]) extends BorrowerCharacteristic {
6+
def +(rbc: RaceBorrowerCharacteristic) = {
7+
val combined = races.map(r =>
8+
r + rbc.races.find(_.race == r.race).get)
9+
RaceBorrowerCharacteristic(combined)
10+
}
11+
}
612

7-
case class EthnicityBorrowerCharacteristic(ethnicities: List[EthnicityCharacteristic]) extends BorrowerCharacteristic
13+
case class EthnicityBorrowerCharacteristic(ethnicities: List[EthnicityCharacteristic]) extends BorrowerCharacteristic {
14+
def +(ebc: EthnicityBorrowerCharacteristic) = {
15+
val combined = ethnicities.map(e =>
16+
e + ebc.ethnicities.find(_.ethnicity == e.ethnicity).get)
17+
EthnicityBorrowerCharacteristic(combined)
18+
}
19+
}
820

9-
case class MinorityStatusBorrowerCharacteristic(minoritystatus: List[MinorityStatusCharacteristic]) extends BorrowerCharacteristic
21+
case class MinorityStatusBorrowerCharacteristic(minoritystatus: List[MinorityStatusCharacteristic]) extends BorrowerCharacteristic {
22+
def +(msbc: MinorityStatusBorrowerCharacteristic) = {
23+
val combined = minoritystatus.map(m =>
24+
m + msbc.minoritystatus.find(_.minorityStatus == m.minorityStatus).get)
25+
MinorityStatusBorrowerCharacteristic(combined)
26+
}
27+
}
Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
11
package hmda.model.publication.reports
22

3-
sealed trait Characteristic
3+
sealed trait Characteristic {
4+
def dispositions: List[Disposition]
5+
}
46

5-
case class RaceCharacteristic(race: RaceEnum, dispositions: List[Disposition]) extends Characteristic
7+
case class RaceCharacteristic(race: RaceEnum, dispositions: List[Disposition]) extends Characteristic {
8+
def +(rc: RaceCharacteristic) = {
9+
val combined = dispositions.map(d =>
10+
d + rc.dispositions.find(_.disposition == d.disposition).get)
11+
RaceCharacteristic(race, combined)
12+
}
13+
}
614

7-
case class EthnicityCharacteristic(ethnicity: EthnicityEnum, dispositions: List[Disposition]) extends Characteristic
15+
case class EthnicityCharacteristic(ethnicity: EthnicityEnum, dispositions: List[Disposition]) extends Characteristic {
16+
def +(ec: EthnicityCharacteristic) = {
17+
val combined = dispositions.map(d =>
18+
d + ec.dispositions.find(_.disposition == d.disposition).get)
19+
EthnicityCharacteristic(ethnicity, combined)
20+
}
21+
}
822

9-
case class MinorityStatusCharacteristic(minorityStatus: MinorityStatusEnum, dispositions: List[Disposition]) extends Characteristic
23+
24+
case class MinorityStatusCharacteristic(minorityStatus: MinorityStatusEnum, dispositions: List[Disposition]) extends Characteristic {
25+
def +(msc: MinorityStatusCharacteristic) = {
26+
val combined = dispositions.map(d =>
27+
d + msc.dispositions.find(_.disposition == d.disposition).get)
28+
MinorityStatusCharacteristic(minorityStatus, combined)
29+
}
30+
}

model/shared/src/main/scala/hmda/model/publication/reports/Disposition.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@ case class Disposition(
44
disposition: ActionTakenTypeEnum,
55
count: Int,
66
value: Int
7-
)
7+
) {
8+
def +(disp: Disposition): Disposition = {
9+
Disposition(disposition, count + disp.count, value + disp.value)
10+
}
11+
}

publication/src/main/scala/hmda/publication/reports/national/N52.scala

Lines changed: 58 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java.util.Calendar
44

55
import akka.NotUsed
66
import akka.stream.scaladsl.Source
7+
import hmda.census.model.MsaIncomeLookup
78
import hmda.model.publication.reports.ApplicantIncomeEnum._
89
import hmda.model.publication.reports.{ ApplicantIncome, Disposition, MSAReport }
910
import hmda.publication.reports._
@@ -16,13 +17,17 @@ import hmda.query.model.filing.LoanApplicationRegisterQuery
1617
import scala.concurrent.Future
1718

1819
case class N52(
19-
year: Int,
20-
reportDate: String,
21-
applicantIncomes: List[ApplicantIncome],
22-
total: List[Disposition],
20+
year: Int = 0,
21+
reportDate: String = "",
22+
applicantIncomes: List[ApplicantIncome] = List(),
23+
total: List[Disposition] = List(),
2324
table: String = N52.metaData.reportTable,
2425
description: String = N52.metaData.description
25-
) extends NationalAggregateReport
26+
) extends NationalAggregateReport {
27+
def +(a52: A52): N52 = {
28+
29+
}
30+
}
2631

2732
object N52 {
2833
val metaData = ReportsMetaDataLookup.values("N52")
@@ -39,61 +44,61 @@ object N52 {
3944
(lar.propertyType == 1 || lar.propertyType == 2) &&
4045
(lar.purpose == 1)
4146
}
42-
4347
val larsWithIncome = lars.filter(lar => lar.income != "NA")
44-
val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
45-
46-
val larsByIncome = larsByIncomeInterval(larsWithIncome, incomeIntervals)
47-
val borrowerCharacteristicsByIncomeF = borrowerCharacteristicsByIncomeInterval(larsByIncome, dispositions)
4848

49+
val fipsList = MsaIncomeLookup.values.map(_.fips)
4950
val yearF = calculateYear(larSource)
5051
val totalF = calculateDispositions(lars, dispositions)
5152

52-
for {
53-
lars50BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(LessThan50PercentOfMSAMedian)
54-
lars50To79BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between50And79PercentOfMSAMedian)
55-
lars80To99BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between80And99PercentOfMSAMedian)
56-
lars100To120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between100And119PercentOfMSAMedian)
57-
lars120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(GreaterThan120PercentOfMSAMedian)
5853

59-
year <- yearF
60-
total <- totalF
61-
} yield {
62-
val income50 = ApplicantIncome(
63-
LessThan50PercentOfMSAMedian,
64-
lars50BorrowerCharacteristics
65-
)
66-
val income50To79 = ApplicantIncome(
67-
Between50And79PercentOfMSAMedian,
68-
lars50To79BorrowerCharacteristics
69-
)
70-
val income80To99 = ApplicantIncome(
71-
Between80And99PercentOfMSAMedian,
72-
lars80To99BorrowerCharacteristics
73-
)
74-
val income100To120 = ApplicantIncome(
75-
Between100And119PercentOfMSAMedian,
76-
lars100To120BorrowerCharacteristics
77-
)
78-
val income120 = ApplicantIncome(
79-
GreaterThan120PercentOfMSAMedian,
80-
lars120BorrowerCharacteristics
81-
)
54+
fipsList.foreach(fipsCode => {
55+
val incomeIntervals = calculateMedianIncomeIntervals(fipsCode)
56+
val larsByIncome = larsByIncomeInterval(larsWithIncome, incomeIntervals)
57+
val borrowerCharacteristicsByIncomeF = borrowerCharacteristicsByIncomeInterval(larsByIncome, dispositions)
58+
59+
for {
60+
lars50BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(LessThan50PercentOfMSAMedian)
61+
lars50To79BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between50And79PercentOfMSAMedian)
62+
lars80To99BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between80And99PercentOfMSAMedian)
63+
lars100To120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(Between100And119PercentOfMSAMedian)
64+
lars120BorrowerCharacteristics <- borrowerCharacteristicsByIncomeF(GreaterThan120PercentOfMSAMedian)
65+
} yield {
66+
val income50 = ApplicantIncome(
67+
LessThan50PercentOfMSAMedian,
68+
lars50BorrowerCharacteristics
69+
)
70+
val income50To79 = ApplicantIncome(
71+
Between50And79PercentOfMSAMedian,
72+
lars50To79BorrowerCharacteristics
73+
)
74+
val income80To99 = ApplicantIncome(
75+
Between80And99PercentOfMSAMedian,
76+
lars80To99BorrowerCharacteristics
77+
)
78+
val income100To120 = ApplicantIncome(
79+
Between100And119PercentOfMSAMedian,
80+
lars100To120BorrowerCharacteristics
81+
)
82+
val income120 = ApplicantIncome(
83+
GreaterThan120PercentOfMSAMedian,
84+
lars120BorrowerCharacteristics
85+
)
8286

83-
val applicantIncomes = List(
84-
income50,
85-
income50To79,
86-
income80To99,
87-
income100To120,
88-
income120
89-
)
87+
val applicantIncomes = List(
88+
income50,
89+
income50To79,
90+
income80To99,
91+
income100To120,
92+
income120
93+
)
9094

91-
N52(
92-
year,
93-
formatDate(Calendar.getInstance().toInstant),
94-
applicantIncomes,
95-
total
96-
)
97-
}
95+
N52(
96+
year,
97+
formatDate(Calendar.getInstance().toInstant),
98+
applicantIncomes,
99+
total
100+
)
101+
}
102+
})
98103
}
99104
}

0 commit comments

Comments
 (0)