I build AI systems that read risk out of messy supplier data; frontier models paired with classical and deep learning.
Then I ship them to production: cloud pipelines, dashboards, and agentic workflows that quietly remove the redundant work.
On the side, I do content creation to help machine learning become more accessible to people trying to pivot their career, while also combatting the fear mongering around AI :>
AI systems that surface supply-chain risk hiding inside complex supplier-portfolio data. A deliberately mixed approach leveraging frontier LLMs reasoning over unstructured signals, alongside traditional statistical and deep-learning models where scale and explainability demand precision.
import statsmodels.api as sm import statsmodels.formula.api as smf model = smf.logit("disrupted ~ cfr_score + leverage_ratio", data=df) res = model.fit(disp=0) print(res.summary().tables[1]) ==================================================== coef std err z P>|z| ---------------------------------------------------- Intercept 1.4208 0.312 4.554 0.000 cfr_score -0.8942 0.141 -6.342 0.000 leverage 0.5137 0.183 2.807 0.005 ====================================================
Data-analysis pipelines deployed on Cloud Run and orchestrated by Cloud Scheduler, so they run reliably and on time. BigQuery is the analytical warehouse; results surface as living dashboards in Looker Studio (Data Studio).
$ gcloud builds submit --tag gcr.io/supply-risk/engine:v2.1 $ gcloud run deploy risk-pipeline-service \ --image gcr.io/supply-risk/engine:v2.1 \ --region europe-west2 --no-allow-unauthenticated Deploying container to Cloud Run service [risk-pipeline-service]... ✓ Service deployed successfully. URL: https://risk-pipeline-service-uk-an.a.run.app $ gcloud scheduler jobs create http daily-risk-evaluation \ --schedule="0 6 * * 1-5" --location=europe-west2 \ --uri="https://risk-pipeline-service-uk-an.a.run.app/run"
Agentic systems in LangGraph that automate the redundant, repetitive work spread across departments in supply-chain risk management; chaining tools and models into reliable workflows, so human attention is reserved for the judgement calls that need it.
from langgraph.graph import StateGraph, END workflow = StateGraph(SupplierState) workflow.add_node("fetch_news", scrape_unstructured_signals) workflow.add_node("assess_risk", model_reasoning_node) workflow.add_node("escalate", human_in_the_loop_approval) workflow.set_entry_point("fetch_news") workflow.add_edge("fetch_news", "assess_risk") workflow.add_conditional_edges( "assess_risk", lambda state: "escalate" if state["score"] > 0.75 else END ) app = workflow.compile()
A guided map through the maths, data science, and deep learning you actually need, paired with the best free resources on the internet, in the right order.
No jargon, no paywall. Built for complete beginners who want to learn it for themselves.