Visualizing Border Patrol Encounters Under the Second Trump Administration

Summary: I just updated my Immigration Enforcement Streamlit App with Border Patrol data from the current administration. This post walks through what changed and why it matters.

Last week, I published Visualizing 25 Years of Border Patrol Data in Python, which explored long-term trends in Border Patrol “encounters” along the Southwest Land Border. At the time, the dataset ended in November 2024.

I’ve now extended the dataset to include the current fiscal year—and the results are striking.

What’s new?

The encounters module now integrates two sources:

  • A historic spreadsheet covering FY2000–FY2024, published by the Office of Homeland Security Statistics (OHSS). This dataset was the topic of my last post.
  • A CSV file from CBP’s Southwest Land Border Encounters page, which provides monthly data for FY2025. It currently includes data through August 2025.

You can view the updated visualization in my Immigration Enforcement Streamlit App.

What does the data show?

The lowest monthly encounter values in the entire 25-year dataset all occur after the start of President Trump’s second term, beginning in February 2025.

To visualize this, you can run:


import encounters

encounters.get_sw_border_encounters_graph()

The graph includes vertical lines marking presidential transitions, allowing readers to compare enforcement trends across administrations.

When sorting the dataset by monthly encounter totals, the seven lowest months all fall under the current administration. The next lowest values? They appear at the start of Trump’s first term in 2017.

This pattern echoes a point made by a DHS statistician during my earlier research: while the number of people attempting to cross the border is unknowable, it’s likely sensitive to changes in administration policy. The encounters dataset doesn’t capture causality, but it’s probably the best proxy we have—and it offers a clear visual correlation that invites further exploration.

To reproduce this analysis

You can sort the dataset by monthly encounter totals using:


df = encounters.get_sw_border_encounters()

df.sort_values('encounters').reset_index(drop=True).head(10)

This returns the ten lowest monthly values in the dataset:

date encounters
0 2025-07-01 4596
1 2025-06-01 6068
2 2025-08-01 6321
3 2025-03-01 7180
4 2025-02-01 8353
5 2025-04-01 8377
6 2025-05-01 8725
7 2017-04-01 11130
8 2017-03-01 12200
9 2017-05-01 14520

These values are not only historically low—they’re also tightly clustered, suggesting a sustained shift rather than a one-off anomaly.

Why this matters

By extending the dataset and updating the app, I hope to support more timely, transparent conversations about immigration enforcement. The code is open-source, the data sources are documented, and the graph is annotated to support hypothesis generation—not partisan conclusions.

This project doesn’t claim causality, but it does offer a reproducible lens for exploring how policy shifts may correlate with enforcement outcomes. It’s designed to empower journalists, educators, and analysts to ask better questions—not just accept surface-level narratives.

What’s next?

I’m exploring ways to surface encounter demographics and regional breakdowns—details that could help contextualize enforcement patterns and policy shifts.

If you have ideas, feedback, or use cases you’d like to see supported, I’d love to hear from you. Feel free to reach out.

Ari Lamstein

Ari Lamstein

I’m a software engineer who focuses on data projects.

I most recently worked as a Staff Data Science Engineer at a marketing analytics consultancy. While there I developed internal tools for our data scientists, ran workshops on data science and mentored data scientists on software engineering.

I have also created several open source projects.