Understanding How The Index Is Built
The Visalia California Power Outage Index tracks reported outages across Tulare County and surrounding areas, typically sourced from utility outage maps, customer call logs, and field crew dispatch data. It aggregates raw counts into a normalized score that reflects severity and duration. The "excess enrollments" piece comes in when you overlay program sign-ups — things like emergency utility assistance, Medicaid spikes, or insurance claim filings — against the outage timeline. When I first tried to reconcile these two datasets, I hit a wall almost immediately. The outage data from the utility vendor updates every few minutes, but the enrollment feeds from the state systems batch-export once per day, sometimes with a lag of 48 hours. That mismatch alone will destroy your correlation if you are not accounting for it. I learned this the hard way after spending three days trying to explain why my index showed a flat line during a major August 2023 outage event. The enrollment data simply had not trickled through yet. The workaround was building a buffer window — I padded my enrollment lookups by 72 hours and flagged any records that arrived after the initial snapshot as post-event additions. It kept the index honest.
Visalia California Power Outage Index A Deep Dive Into Excess Enrollments
Here is how the whole process actually works on the ground, not the textbook version. You start with two primary data sources. The outage side comes from the utility's REST API or their public-facing outage dashboard, which typically provides address-level or transformer-level outage data. The enrollment side comes from the relevant state or county program database, which in California usually means accessing CalSAWS or your local social services portal. Both systems have different authentication methods and different data formats, which is the first friction point. I typically pull the outage data in five-minute intervals during an active event. You do not need fine granularity for historical analysis, but during an unfolding outage, the five-minute window catches flash events that hourly dumps smooth over. One thing nobody tells you: the utility API throttles aggressively after about 200 requests per minute. I wrote a simple queuing script that caps at 150 requests per minute with exponential backoff on 429 errors. Saved me from getting temporarily banned twice in one week.
On the enrollment side, you are looking for anomalies — enrollments that exceed the historical baseline for that zip code during a comparable weather event. The baseline matters more than the raw numbers. Visalia has seasonal patterns. Summer storm enrollments always spike because the same households re-enroll in assistance programs year after year. If you only look at absolute counts, you will flag normal behavior as suspicious every single time. The index calculation itself is straightforward arithmetic, but the normalization step is where people go wrong. Do not use a simple percentage change from baseline. Use a z-score approach, subtracting the rolling 90-day mean and dividing by the rolling standard deviation. This handles the variance better. An enrollment count that looks high in absolute terms might be completely normal if the standard deviation for that area is wide. Here is a practical workflow I use. First, I query the outage API for the target date range and aggregate by census tract. Second, I join the enrollment data by the same geographic unit, filtering for the specific program types you are tracking. Third, I calculate the z-score for each tract on each day. Fourth, I flag any tract-day combination where the z-score exceeds 1.8 — that is roughly the 96th percentile and catches genuine excess without flagging routine variation. Finally, I manually review the flagged records because the system produces false positives, especially in mobile home parks and multi-tenant buildings where address overlap skews the data.
Get the Full Details

I ran into a specific edge case last winter that took me two weeks to resolve. There was a large agricultural worker housing complex near the Visalia expanse that registered a massive enrollment surge during a brief 4-hour outage. The z-score blew past 4.0. At first glance it looked like coordinated fraud, but when I cross-referenced with the county's seasonal worker registration database, I found that the entire seasonal population rotated in during that exact week regardless of the outage. The index would have flagged it as anomalous without that secondary data source. The lesson is that geographic granularity alone is not enough. You need demographic context baked into your baseline calculations, or at least a manual review step for known high-turnover populations. Another thing that catches people off guard: the index breaks down completely during extended multi-day outages. The rolling mean and standard deviation get pulled toward the anomaly itself, which dampens the z-score precisely when you need it most. I solved this by maintaining a separate reference period using only non-outage days from the same month and year. When a multi-day event exceeded six hours of cumulative downtime, I switched the baseline to that reference period instead of the rolling window. The difference was significant — a tract that registered a z-score of 1.2 under the rolling method jumped to 2.7 when I used the reference baseline. If you are building this from scratch, start with Python and the pandas library. The geospatial joining can be done with geopandas, and the statistical calculations are trivial with numpy. For the API handling, requests with retry logic gets you most of the way there. I would recommend using SQLite for intermediate storage rather than keeping everything in memory. Once your date range expands beyond a single month, RAM becomes a constraint.
The main limitation of this approach is that it only measures correlation, not causation. A high excess enrollment index does not prove fraud or abuse. It flags a pattern worth investigating. The actual verification requires case-level review, which is where the manual work comes in and where the process slows down considerably. I have seen teams spend up to 40 person-hours per flagged tract when the outlier is complex enough to require document verification and resident interviews. A reasonable alternative if you do not have access to the utility API is to use publicly available outage data from the Electric Reliability Council of Texas or OpenEI, though the spatial resolution is coarser and the temporal updates are less frequent. For Visalia specifically, the local utility's public outage map gives you good coverage but no structured API, which means you are either scraping or manually transcribing. I have used both approaches and the scraping method is faster but more fragile — any change to the page layout breaks your parser until you fix it. The index works best when you treat it as an early warning system rather than a definitive diagnostic tool. It tells you where to look, not whether anything is wrong. The actual determination of excess enrollments being problematic or not requires the human review step that the automated process cannot replace.