The Problem
Properties track eviction rates as percentage of move-outs. They don't track enforcement timing. A property with 3% eviction rate tells you nothing about how quickly it filed or how much delinquency accumulated per case.
Monthly delinquency reports show current balances. They don't show the resident's status last month or when status changed from "Current" to "Current (Eviction)". Without tracking status transitions, you can't measure time from first delinquency to filing.
This creates measurement gaps:
No enforcement baseline: Properties file when balances feel too high or when regional managers apply pressure. Without measuring months to filing, portfolio leadership can't distinguish properties with disciplined enforcement from properties tolerating extended non-payment.
Hidden capital losses: Recovery rates on eviction judgments run low. Most delinquency at filing becomes unrecovered loss. Properties filing early accumulate less delinquency per case. Properties filing late accumulate more. The per-case difference compounds across portfolio eviction volume but remains invisible in aggregate eviction metrics.
No lifecycle visibility: Evictions in first 6 months signal screening failures. Evictions after 12+ months signal life events. Standard reporting doesn't segment by lease stage, so properties can't distinguish fraud patterns from unavoidable resident circumstances.
The Measurement Framework
Eviction analysis requires tracking resident status changes through the lease lifecycle. The status transition from "Current" to "Current (Eviction)" marks when property formally initiated filing-the moment enforcement began.
Two questions drive the analysis:
Time to filing: How many months between first delinquency and eviction filing? Properties with consistent enforcement file within 60-90 days. Properties averaging 4-5 months signal systemic delays.
Delinquency at filing: Dollar amount owed when eviction filed. High averages ($15k-$25k) indicate properties letting balances compound rather than acting at jurisdictional thresholds ($3k-$5k).
Lifecycle Stage Analysis
When eviction occurs in the lease term reveals different failure modes:
0-6 months: Likely fraud or screening failure. Resident never intended to pay or falsified income verification. This is a collections problem masquerading as an eviction problem-points to application screening gaps.
6-12 months: Grey area. Could be job loss, could be emergent payment pattern. Requires case-by-case review of payment history prior to default.
12+ months: Life event. Long-term resident with established payment history hits financial hardship (job loss, medical emergency, divorce). These are genuinely unavoidable-but still shouldn't accumulate $20k in delinquency if enforcement is consistent.
The lifecycle stage doesn't excuse delayed filing. Even unavoidable life events should trigger swift enforcement once payment stops. The distinction matters for root cause analysis: properties with high 0-6 month evictions have screening problems, not enforcement problems.
The Code: Status Change Detection
Eviction timing measurement requires three data sources: monthly delinquency reports (current balance), move-in reports (lease start date), and rent roll (resident status). Resident status changes month-to-month as properties update their PMS: "Current" → "Current (Eviction)" → "Former" → "Evicted".
Detecting the Filing Event
The filing occurs when status shifts from "Current" to "Current (Eviction)". Previous month shows "Current", current month shows "Current (Eviction)"-that's when property initiated court filing:
df = df.sort_values(["Property", "Resident", "Post Month"]).reset_index(drop=True)
df["Prev_Status"] = df.groupby(["Property","Resident"])["Lease Status"].shift(1)
df["Eviction_Filed"] = (
(df["Prev_Status"] == "Current") &
(df["Lease Status"] == "Current (Eviction)")
)
This flags the exact month enforcement began. The delinquency amount at that row shows how much the resident owed when property filed.
Counting Backward Through Contiguous Months
Time to filing requires counting how many months passed between first appearance in delinquency reports and the filing month. The challenge: residents don't appear every month. A resident might show up January (delinquent), disappear February-March (no balance, not in report), reappear April (delinquent again), then get filed May.
Counting January → May would yield 4 months, but the resident wasn't continuously delinquent. The contiguous backward streak only counts unbroken months immediately preceding filing:
def minus_one_month(dt):
"""Return dt minus exactly one calendar month."""
y, m = dt.year, dt.month
if m == 1:
return pd.Timestamp(year=y-1, month=12, day=1)
return pd.Timestamp(year=y, month=m-1, day=1)
filing_month = filing_row["Post Month"]
streak_start = filing_month
expected_prev = minus_one_month(filing_month)
months_set = set(g["Post Month"].dropna().unique())
while expected_prev in months_set:
streak_start = expected_prev
expected_prev = minus_one_month(expected_prev)
months_to_eviction = month_diff(filing_month, streak_start)
Starting from filing month, walk backward one month at a time. If the prior month exists in the data, include it in the streak and move back again. Stop when hitting a gap. This counts only continuous delinquency immediately before filing.
If a resident shows up January, disappears February, reappears March-May, then filed May-the streak is March → May (3 months), not January → May (5 months). This prevents inflating time-to-filing with months the resident wasn't actually delinquent.
The Dashboard Output
The analysis produces two Excel sheets: resident-level detail and property-level summary.
Resident-Level Detail
One row per eviction filing showing:
- Streak Start Month: First month of continuous delinquency before filing
- Filing Month: When status changed to "Current (Eviction)"
- Months to Eviction: Count of contiguous months from streak start to filing
- Delinquency at Filing: Dollar amount owed when eviction filed
- Unit: Building-unit identifier for cross-referencing screening or maintenance issues
This detail sheet enables case-by-case review: was the $25k balance from a 6-month delay or a 2-month delay with high rent? Did multiple evictions occur in the same unit (turnover fraud pattern)?
Property-Level Summary
Aggregated metrics per property:
prop_summary = (
details.groupby("Property", dropna=False)
.agg(
filings=("Resident","count"),
residents=("Resident","nunique"),
avg_months=("Months_To_Eviction","mean"),
median_months=("Months_To_Eviction","median"),
avg_delinq_at_filing=("Delinq_At_Filing","mean"),
median_delinq_at_filing=("Delinq_At_Filing","median")
)
.reset_index()
)
Average and median months to eviction reveal enforcement consistency. Properties with median 2-3 months file promptly. Properties with median 4-5 months systematically delay. Average delinquency at filing quantifies the capital loss from those delays.
Interpreting the Metrics
Months to Eviction: Median 2-3 months indicates consistent enforcement at jurisdictional thresholds. Median 4-5 months signals systematic delays. The difference reveals whether properties file promptly or tolerate extended non-payment.
Lifecycle Stage Patterns: High eviction concentration in 0-6 months points to screening failures rather than enforcement problems. Residents who never intended to pay or falsified income slip through application review. Properties seeing this pattern need stricter income verification and employer callbacks, not faster eviction filing.
Evictions in the 12+ month range represent life events (job loss, medical emergency). These residents had established payment history before defaulting. The issue isn't whether to evict but how quickly properties act once payment stops. Even unavoidable life events shouldn't accumulate five months of delinquency if enforcement follows consistent thresholds.
Properties with flat eviction distribution across lifecycle stages (equal percentages 0-6, 6-12, 12+) likely have both screening gaps and enforcement delays. Properties with heavy 12+ month concentration but low delinquency at filing ($8k-$12k) are handling enforcement correctly despite unavoidable resident circumstances.
What We Found
Tracking status transitions revealed enforcement timing across the portfolio. Some properties filed consistently within 60-90 days of first delinquency. Others averaged 4-5 months before filing, well past jurisdictional minimums.
Time to filing variance: Properties in identical legal jurisdictions showed 2-3x differences in enforcement speed. The variance wasn't driven by complex court procedures but by operational tolerance of extended non-payment. Properties filing at 60-90 days followed jurisdictional thresholds. Properties filing at 120-150+ days were delaying beyond legal minimums.
Delinquency accumulation: Properties averaging $20,000+ delinquency at filing either had very high monthly rents or waited 5+ months to file. Moderate rent properties ($1,500-$2,000/month) reaching $20,000 required extended non-payment periods. High delinquency at filing indicated enforcement delays regardless of rent level.
Lifecycle patterns: Properties with multiple evictions in the 0-6 month range had screening gaps. Residents defaulting immediately likely falsified applications or never intended to pay. Properties with evictions concentrated after 12+ months were dealing with established residents hitting life events. Both patterns still showed variance in enforcement timing once payment stopped.
Operational Impact
The measurement framework creates enforcement visibility. Properties no longer hide delayed filing behind aggregate eviction rates. Time to filing and delinquency at filing become trackable KPIs.
Capital loss quantification: The measurement framework connects delinquency at filing to unrecovered losses. Properties filing at jurisdictional thresholds limit per-case losses. Properties delaying enforcement accumulate higher delinquency and higher unrecovered losses per eviction. The difference scales with portfolio eviction volume.
Screening vs enforcement separation: Lifecycle analysis distinguishes two failure modes. High 0-6 month eviction rates indicate screening gaps - residents who falsified applications or never intended to pay. High 12+ month rates with reasonable delinquency at filing ($8k-$12k) indicate proper enforcement of unavoidable life events. High 12+ month rates with excessive delinquency ($20k+) indicate enforcement delays even when dealing with established residents.
Enforcement accountability: Portfolio leadership gains visibility to properties tolerating extended non-payment. Properties filing at jurisdictional thresholds (60-90 days) versus properties waiting 120-150+ days become measurable. Leadership can mandate consistent filing thresholds and track compliance through monthly status transition reports.
The analysis doesn't prevent resident financial hardship. It prevents capital destruction from inconsistent enforcement. Properties with disciplined filing procedures minimize investor losses while still providing residents statutorily required notice periods.