Inspiration

The job market was cooked, and I was about to graduate into it without knowing what I was actually signing up for. I built Bounded Rationality to turn scattered headlines into real metrics so I could make a smarter call with limited information.

What it does

Bounded Rationality pulls 16 labor-market metrics from 8 APIs (BLS, FRED, Census, World Bank, layoffs.fyi, and others) across personal finance, career security, macro health, and growth opportunity. It stores everything in MySQL, optionally forecasts 3 steps ahead with an LSTM, and publishes live JSON to a frontend via AWS S3/CDN.

How I built it

I wrote a config-driven Python orchestrator that runs 16 metric modules in parallel with ThreadPoolExecutor, syncs incrementally to a normalized MySQL schema, and transforms rows into frontend-ready JSON. Predictions go through a separate Flask + PyTorch microservice (Bearer auth, 202 queuing, webhook callbacks) before results get merged and uploaded to S3.

Challenges I ran into

Every API uses different formats, cadences, and geographic codes, matching cities like Austin or SF across BLS, Census ACS, and layoffs.fyi was mostly reconciliation, not joins. Async ML across two services also forced me to design a real callback contract instead of just calling a training function inline.

Accomplishments that I'm proud of

I shipped the full stack end-to-end: 16 pipelines, 8 APIs, MySQL, S3 publishing, and ML forecasting, not just a chart on a CSV. Adding a new metric is basically one module plus one line in metric_config.txt.

What I learned

Most of the work was integration, getting eight government APIs to agree on time periods and geography, not the model. Treating the predictor as a real microservice with auth, task IDs, and callbacks taught me more about production ML than any notebook ever did.

Built With

Share this project:

Updates