Skip to content

WeatherForge: Minnesota Severe Weather Risk Analytics Dashboard

WeatherForge originated as a collaborative University of St. Thomas SEIS 745 project with Odin Lee and Jannah ElNemr. David Braun served as the lead developer and primary implementer, writing more than 90% of the application code, while the project as a whole was completed collaboratively by the three-person team.

Context

Prototype / Academic Project

Current state

Applied dashboard prototype

Role

Lead developer and primary implementer

Problem

Public weather data is large, messy, and hard to use directly for decision support. NOAA archives contain valuable severe-weather and daily-observation records, but the raw files need filtering, cleaning, unit conversion, county joins, and clear dashboard views before they become useful for Minnesota risk analysis.

Core Constraint

Data trust: the dashboard has to make large public datasets usable while clearly labeling historical completeness issues and contextual weather averages.

Solution / Implementation

As lead developer and primary implementer, I wrote more than 90% of the WeatherForge application code across its data pipeline, analytics, and dashboard layers. My implementation work included filtering, cleaning, transforming, and packaging NOAA Storm Events and GHCN-Daily data into Minnesota-focused analytics layers and developing dashboard views for statewide trends, county-level impacts, historical time progression, weather context, methods, and live-alert exploration.

Results

I led implementation of the code that curated 55,384 cleaned Minnesota storm-event records and 9,008,748 station-day observations into reusable Parquet layers and a Python Shiny + Plotly dashboard spanning all 87 Minnesota counties.

Project data and checks

Dataset sizes and recorded checks within this project’s stated scope.

~35 GB

raw NOAA source archive

used in the working project

55,384

cleaned Minnesota storm-event records

9,008,748

Minnesota station-day weather observations

87

Minnesota counties mapped

1950-06-15 through 2025-12-28

storm-event range

1877-08-05 through 2026-03-22

weather-observation range

Architecture

The pipeline is shown as explicit stages so the system boundary is inspectable.

  1. 1

    Raw NOAA files

    Storm Events and GHCN-Daily source files collected as the raw archive.

  2. 2

    Minnesota filtering

    Records scoped to Minnesota events, counties, and station observations.

  3. 3

    Cleaning and unit conversion

    Fields normalized, weather units converted, and records prepared for analysis.

  4. 4

    Parquet outputs

    Curated analytics layers stored for faster dashboard and analysis use.

  5. 5

    County joins and population normalization

    County boundaries and population anchors support mapped and normalized comparisons.

  6. 6

    Shiny and Plotly dashboard

    Interactive views expose overview, county, temporal, methods, and alert surfaces.

Technical Stack

PythonShinyPlotlyParquetNOAA Storm EventsNOAA GHCN-DailyGeoJSON

Data sources

  • NOAA Storm Events
  • NOAA GHCN-Daily
  • Minnesota county boundary GeoJSON
  • County population anchors

Applied Relevance

Where the pattern matters

  • Severe-weather awareness
  • County-level risk comparison
  • Public-data productization
  • Dashboard reporting
  • Executive summaries

Dashboard Views

WeatherForge is organized as a decision-support dashboard rather than a single chart export.

Overview
County Impacts
Weather Context
Time Progression
Methods/Pipeline
Live Alerts

Implementation and evidence

Implementation details and the artifacts available for review.

Dashboard Views

Linked artifacts

The dashboard source and guide describe how the curated Minnesota data is explored.

  • Overview, County Impacts, Weather Context, Time Progression, Statewide Trends, Methods/Pipeline, and Live Alerts views.
  • Historical views read local Parquet files; Live Alerts uses the National Weather Service API.

Architecture / Pipeline

Linked artifacts

The pipeline runs from raw public archives through filtering, cleaning, Parquet outputs, county joins, and an interactive Shiny/Plotly surface.

  • Raw NOAA files -> Minnesota filtering -> cleaning/unit conversion -> Parquet outputs.
  • County joins and population normalization make county-level comparisons possible.
  • Shiny and Plotly expose the curated analytics layers through dashboard views.

Applied Decision-Support Surfaces

Implementation notes

The project demonstrates how public data can be productized into reporting surfaces without claiming forecasting or actuarial precision.

  • County-level severe-weather comparisons.
  • Historical trend and time-progression views.
  • Methods view that explains the data pipeline and caveats.

Artifacts & Evidence

Linked artifacts

The public repository includes the curated data, data dictionary, and instructions for running the academic dashboard.

  • ~35 GB raw NOAA source archive used in the working project.
  • 55,384 cleaned Minnesota storm-event records and 9,008,748 station-day observations.
  • Public GitHub repository linked for code review.

Scope and limitations

Interpreting this work

  • Pre-1996 NOAA Storm Events data is less complete.
  • Older records are biased toward better-monitored and more populated areas.
  • Same-day statewide weather averages are context, not exact event-local station readings.
  • The current version is Minnesota-focused.
  • This is a decision-support prototype, not a forecasting or actuarial model.
  • Rebuilding the packaged data requires the raw NOAA inputs and adjustments to paths preserved from the original working environment.

Further technical work

Possible next steps

  • Parameterize raw-data paths so a rebuild can use an explicit input and output layout.
  • Extend validation of county and zone joins, population anchors, and historical coverage.
  • Compare statewide weather context with event-local station matching before drawing more local conclusions.

Related Case Studies

More portfolio context.

Prototype / Academic ProjectLocal RAG prototype

RAGeATM

A small explainable Retrieval-Augmented Generation prototype that retrieves local evidence first, applies a relevance threshold, and refuses unsupported questions when the corpus does not justify an answer.

PythonTF-IDFCosine SimilarityLocal Retrieval
Read case study
R&DActive Build

DGM

Workflow orchestration layer in active development for managing state, decision flow, and human review inside StormIQ.

PythonFastAPIWorkflow GraphsQueue-backed Jobs
Read case study
Back to all work