I'm a data analyst and BI / analytics engineer in Vancouver. For 4+ years, Finance, Sales and Operations brought me the report that didn't tie out — most recently as the sole analyst at a specialty food distributor, before that as a financial analyst running month-end GL/P&L reconciliations. I find the cause, fix it at the source, and build the SQL, pipelines (Microsoft Fabric, Azure Data Factory, PySpark) and Power BI reporting that keep it fixed.
📫 dharma.patel552@gmail.com · 🔗 LinkedIn · 📍 Vancouver, BC · ✅ open to Data Analyst · BI / Power BI Developer · Analytics Engineer roles across Canada, available immediately
Hiring for one of those? The portfolio ties each role's usual requirements to evidence, line by line: data analyst · BI developer · analytics engineer. Where reporting and data quality are the core of the job, the same view exists for supply chain, data engineering, business analysis, finance and data science roles. Each view offers a résumé written for that role.
- GrowthOps OS · ▶ 72-second tour: ad platforms claimed $3.72M in revenue; the business collected $3.06M. I explained every dollar between the two, and a seven-page Power BI report and a formula-driven Excel workbook reach that answer independently, to the cent. Workbook ↓ · Power BI hand-off · case study
- Supply Chain Control Tower · ▶ 72-second tour: OTIF sits at 90.4% against a 95% target, and the problem is where the stock sits, not how much there is. A contract-tested PySpark and Delta Lake pipeline, run as a Databricks job, under an eight-page Power BI control tower. Case study · live decision studio
- B.C. Local-Government Finance · ▶ 64-second tour: real public data. Ninety official provincial files held to written contracts, a dbt model with 31 data tests, and the finding that the 68 municipalities investing below renewal need are $570M a year short. Workbook ↓ · board pack
These are public projects in personal free or trial accounts, separate from my paid experience: Snowflake Streams/Tasks, Snowpark and access checks, GA4 analysis executed in BigQuery, MLflow model registry and prospective monitoring, lululemon DCF, Jira/Confluence delivery evidence, and a KYC privacy impact assessment.
Everything here was built under one rule: no claim without a number, and no number without a check that fails if it stops being true. Four projects include real public data: B.C. municipal filings, company and utility filings, Canada's fire and weather records, and Google's obfuscated GA4 ecommerce export in BigQuery. Transaction Monitoring also evaluates a public sanctions list; its customers and transactions are synthetic. Other projects generate data from a fixed seed, with reproducible checks in GitHub Actions. I build with AI coding assistants. The questions, metric definitions, tests and findings are mine, and I'm glad to walk through any project, or rebuild one of its queries live, in an interview.
Sixteen have hosted demos you can click, linked in the table. The retail platform, Inventory Analytics and Portfolio Intelligence are prerendered and open at once; the Streamlit apps are kept awake by a job every three hours but can still take 30–60 seconds on a first load.
Hiring for business analysis or asset management? Start with the Inventory Analytics decision studio and its requirements-to-UAT case, then the asset-management decision board and its capital business case. The asset data is synthetic; it shows methods, not municipal employment.
One of these repos, Ask Your Data, used to be a Raspberry Pi voice assistant I built years ago. I rebuilt it into the capstone of this portfolio and kept the git history, because a portfolio that pretends its author sprang fully formed is lying.
| Project | The one thing to know | Stack |
|---|---|---|
| 📣 GrowthOps OS · live ▶ · Power BI + Excel · workbook ↓ | Ad platforms claimed $3.72M; the business collected $3.06M. Two bridges — platform claims to warehouse cash, CRM bookings to cash — explain every dollar with $0 left over, and Meta's 7.3× ROAS is 3.3× on collected cash. Its checks find all six planted incidents with the right root cause: a rolling-baseline monitor with shift-share decomposition catches the broad Meta campaign that cut the MQL rate nine points and the UTMs a landing-page release stripped, and a deliverability check, the payment workflow, a short-link audit and a migration audit catch the deadline emails from an unwarmed domain, the nine buyers who paid and never got access, the mis-tagged links and the CRM migration damage. The seven-page Power BI report is generated from a spec (215 described DAX measures, SVG KPI tiles, a summary written in DAX) and was opened, refreshed and queried in Desktop; the Excel workbook runs off one reporting-window control with a campaign scorecard and 14 audit checks at zero. Both read one governed snapshot, name the same weakest campaign on their own, and agree to the cent. Around it: dbt on DuckDB held to a Python reference, HubSpot run as a production integration in a developer test account (a two-way sync under a field-ownership contract, approved change sets that are re-checked before and read back after every write, signed webhooks, renewal tasks, and the product catalog, line items and support tickets), an idempotent payment-to-access workflow, and keyless ask-your-data that reads the period, platform and measure a question names, with no wrong answers on 182 questions. | Python, SQL, dbt, DuckDB, Power BI (PBIR/TMDL, DAX), Excel, FastAPI, Streamlit |
| 🏗️ Supply Chain Control Tower · live ▶ | Medallion pipeline with a three-tier data defense — schema contracts before Bronze, row quarantine with replay, a DQ gate on Gold — each tier proven by CI injecting failures. The live Network Risk Decision Assurance Studio opens with an executive decision brief and adds governed GIS evidence: 34 synthetic WGS 84 reference points, QGIS/ArcGIS-ready GeoJSON, nearest-node screening, traceable requirements and UAT, accountable handoff, and a reproducible evidence pack. The map deliberately labels straight-line proximity as screening rather than route, capacity, or execution approval. 10M-row Delta benchmarks and dynamic RLS/OLS verified by impersonated DAX. The PySpark notebooks ran as a Databricks job and tie to the local pipeline to the cent. | Fabric patterns, PySpark, Delta, Power BI, Streamlit, GIS |
| 🏛️ B.C. Local-Government Finance · workbook ↓ | Every B.C. municipality, 2019–2024, from the Province's official filings. 90 files held to written contracts, a dbt model with 31 data tests, and an Excel plan for any of 161 municipalities. The 68 municipalities investing below renewal need are $570M a year short, and the pipeline catches the Province's own data defects. | Python, dbt, DuckDB, data contracts, Excel, Power Query, public-sector finance |
| 💬 Ask Your Data · live ▶ | Grounded text-to-SQL over 71 tables in 11 business domains, asked by voice or text, with two engines. The live demo has no API key and needs none: a deterministic compiler profiles the warehouse (column roles, grains, join graph, a 797-phrase value lexicon read straight out of the data) and binds your words to it, so it answers questions nobody pre-registered. On its 58-question contract it is 46 right, 0 wrong, 12 refused — refusing is the feature. Add a key and Claude writes the SQL instead, through the same read-only guard, structural verifier and default-deny access policy; its prose is then checked back against the returned rows, so a sentence cannot quote a number the query never produced. Six certified metrics carry an owner and a CI-asserted value. Speech runs in-process on open models — faster-whisper and Piper, checksum-pinned — so it listens and answers aloud with no account. I found half its early answers wrong by attacking my own eval four times over, and the README says so. | Python, DuckDB, ONNX, Claude API, Streamlit |
| 🧩 HubSpot CRM Platform · live evidence · runbook | One codebase that runs four businesses' CRMs in HubSpot, each from another project on this page: Meridian Supply's quote book (pricing), a meat distributor's next-best offers (recommendations), AML investigation cases, and GrowthOps. A CRM-neutral model declares the custom objects, pipelines and association labels each one needs; a schema engine plans the difference, applies it and plans again until nothing is left, and never deletes, renames or retypes. Records are loaded by the source system's key, so 2,977 records and 3,393 associations went in once and every rerun planned zero writes. Each business gets a private app generated from one shared set of React CRM cards and app functions: a margin guardrail that names who has to sign, an offer you can accept into a deal (a unique key on the deal makes HubSpot itself refuse a duplicate, checked live), a case that only moves along its pipeline with a logged reason, and a custom workflow action that never moves a contact backwards. All four cards were used on real records, a HubSpot workflow ran the action and a HubSpot-delivered webhook was verified against its v3 signature. The real API rewrote the design more than once (a personal access key can read the CRM but not write it, so the loader writes through a signed function inside each app). An OAuth connector covers the install flow and token refresh. The same model compiles to Salesforce metadata, and the guardrail is written a third time in Apex, with a Lightning Web Component and a Flow (checked on every push). It runs in a Salesforce Developer Edition org with Batch Apex, an Apex REST API, custom metadata and a Lightning record page: all 25 Apex tests pass there, the same 1,379 records are loaded by key and re-planned to zero, and every deal scores through the REST API exactly as Python scores it. Developer test accounts and synthetic data throughout. | HubSpot (UI extensions, app functions, workflow actions, webhooks, CRM APIs), React, TypeScript, Node.js, Python, OAuth 2.0, Salesforce (Apex, LWC, SFDX) |
| 💵 Pricing & Costing Analytics · live ▶ | The list price is not the price: 18.2% of it never arrives, once every rebate, payment term, freight allowance and return is counted. Margin is expressed on pocket price throughout, because a margin quoted on list is the number that lets a deal look healthy while losing money. The output is not an elasticity, it is a sentence — six ordered actions across 240 products worth $2.65M of annual gross margin, each carrying the reason and a confidence about the evidence rather than the size of the prize. The part worth asking about: the dataset is built so the analysis can be caught being wrong. Elasticity, cost pass-through and segment price sensitivity are seeded deliberately and taken back out through the real code — estimated category elasticities preserve the seeded ordering at rank correlation 0.95, every pass-through estimate attenuated toward zero. Underneath, an SAP-shaped ERP extract with defects injected on purpose: all twelve quality rules find something and the reconciliation balances to $0.00 unexplained. Six marts computed a second time in DuckDB and held to the pandas ones at 1e-8 — which is how the price-band median was caught five percent apart under the same column name. A nineteen-page Power BI project generated from spec — opened in Desktop, refreshed and exported page by page with 0 broken visuals, which is how nine defects no structural test could see were found and fixed, each one now a check in the generator. A governed decision room registers all 240 proposals, routes each material one to a named authority and leaves 161 decisions for a human; of 2,075 approved historical changes, 1,132 stay on an explanation queue rather than becoming a benefit claim. | Python, DuckDB, Power BI (PBIR/TMDL), Streamlit |
| 🛣️ Corridor Decision Intelligence · live ▶ | Which of 17,059 eligible toll-road customers should get which of nine offers this month, inside a $10,000 budget and the road's capacity, and what is that plan actually worth? A simulator with known ground truth makes the second question answerable. Calibrated propensity and churn models (AUC 0.91) and S/T/X/DR uplift learners trained on a ten-arm randomized offer trial feed one mixed-integer program over 112,563 customer-offer decisions, proven optimal (gap 1.5e-7) and re-solved independently in Gurobi. Scored against the simulator's true responses, the plan creates $64,774, 75% of the perfect-knowledge ceiling. The obvious alternative, discounting the most frequent travellers, creates $6,278, because the customers most likely to travel are not the ones an offer moves (rank correlation −0.47). Then the targeting policy itself is randomized against business as usual on a fresh population: +$1.40 per customer, 95% CI $0.23 to $2.57. It ships as a 12-page Streamlit workspace, a FastAPI decision service, a Power BI model and a Databricks job where PySpark recomputes all 39 features to within 2.2e-11 of DuckDB. Synthetic data, fictional operator. | Python, DuckDB, causal ML, HiGHS/Gurobi, FastAPI, Streamlit, Power BI, Databricks |
| ⚡ Finance Decision Models in Excel and Power BI · utility workbook ↓ · Kestrel Bay ↓ · Power BI | Two models: Portland General Electric actuals against an independently modelled plan from EIA, FERC and NOAA, published in Excel and a seven-page PBIP/TMDL report, with a backtested load forecast; and the preserved Kestrel Bay distributor model for channel economics, PVM and working capital, taken through its FY2027 budget cycle: top-down targets, bottom-up submissions, a challenge round, three linked monthly statements with a revolver, and a 3+9 reforecast, 73 tests holding the workbook to a pandas twin. | Excel, Power Query, Power Pivot, DAX, LINEST, scenario modelling, Power BI (PBIP/TMDL) |
| 🔎 Transaction Monitoring · live ▶ | A flat $10,000 reporting threshold finds 38 of 60 planted cases and raises 555 alerts doing it. Five explainable rules over an unsupervised model find all 60 on a third fewer alerts, at 2.4× the precision. The honest half: ablation shows the anomaly model lifts ranking 49% but saves 1.8% at the operating point — so the README says it earns its place on triage order, not on the accept/reject decision. 17 SQL features proven equal to their Python twins on all 100,299 rows. Customer names are also screened against Canada's real sanctions list, downloaded at run time and never committed: the threshold is set on one half of the list by a fixed rule, and on the held-out half it caught 97.2% of the name variants customers type (Cyrillic, reordered, a dropped patronymic, a typo) at 10 alerts per 10,000 synthetic customers. KYC rates every customer at onboarding and at a yearly refresh and traces beneficial owners through holding companies to the 25% line. Two rules also run on a Kafka stream: Terraform deploys the monitor to a Kubernetes cluster in CI, a pod is killed mid-stream, and the run passes only if the stream flags exactly what the batch flags. | Python, SQLite, scikit-learn, Streamlit, Kafka, Terraform, Kubernetes |
| 🏪 Retail Analytics Platform · live ▶ | Sixteen pages that between them printed three different HHI values at the same time, because every page did its own arithmetic. One catalogue now governs 62 definitions: 47 implemented and 15 explicitly unavailable without a named source system. Every implemented metric carries a formula, grain, source table, owner page and gross-or-net basis, pinned by a hand-computed test. The demand planner used to produce a forecast nobody scored; it now leads with WAPE 11.6% and a 40% hit rate from a rolling-origin backtest, and demotes MAPE to a labelled diagnostic because small SKU-month denominators make it least reliable where it looks most alarming. Finance adds statements whose revenue and COGS are read from the sales fact (net margin 2.8%, current ratio 1.02×, ROA 2.3%); marketing adds CAC $17,667 on an 11.0-month payback. Inventory turnover appears twice on two honest bases, and ROMI is withheld outright — spend and wins exist, exposure and a counterfactual do not. Prerendered: 100 charts frozen to SVG, every page verified with networking blocked. Its governed dbt marts first ran on Snowflake, where loading the app's data exposed three defects a parse never could; 48 of 48 nodes green and 107 of 107 measures reconciled with an independent pandas build. | Python, Flask, DuckDB, dbt on Snowflake, Plotly, Playwright, Docker |
| 📦 Inventory Analytics · live ▶ · BA case | A six-workspace operations decision studio that turns nine WMS/ERP extracts into demand forecasts, replenishment decisions, ABC-XYZ policy, network-transfer screening, supplier performance, inventory-accuracy controls, and a financially ranked action register. Seven forecasting methods compete in rolling-origin backtests; Python calculations are held to DuckDB marts by 14 parity tests; every page ends in a decision, export, or named handoff rather than another chart. The deterministic demo covers 420 SKUs across 7 nodes and produces 1,170 prioritized actions. Its reviewable BA case adds stakeholders, current/future state, 13 traced requirements, 12 UAT scenarios, a pilot/adoption plan, and a nine-minute interview walkthrough. The demo is a static copy that opens instantly; the full Flask app is linked from it. | Python, Flask, DuckDB, forecasting, inventory planning, BA delivery, Render |
| 🛒 Customer Recommendation Engine · live ▶ | The fancy two-stage ranker scored 81.2% recall@10; plain collaborative filtering scored 84.9%. The simple model ships, the loss is documented, and CI enforces that the winner keeps winning. The live rep console turns that into what a salesperson actually needs: what to pitch next, why, and what it's worth. A decision room now scores it on seven objectives, not one — relevance, reach, novelty, diversity, calibration, eligibility — breaks results out by five slices (the weakest warm slice sits at 67.6%), audits all 791 served items against the eligibility rules, and falls back to a labelled regional default that invents no dollar opportunity. It recommends a human-reviewed pilot and a pre-registered experiment, because offline recall does not measure sales lift. FastAPI + Docker serving, 9-page Power BI. | Python, scikit-learn, FastAPI, MLflow |
| 📈 Marketing Attribution & Incrementality · live ▶ | Attribution is the one analytics discipline where everyone argues and nobody can check the answer, because the counterfactual isn't in the data. So I generated one: each user carries a fixed random draw, and a channel's true contribution is measured by re-running that draw with its touches deleted. Six models compete against it and none wins — the exact Shapley value and a Markov chain both lose to a heuristic that fits in a CASE expression. Last-touch hands direct 24.5% of conversions against a true 1.9%. Then a geo holdout settles it: naive pre/post reads 11.0% against a planted 5.5%, difference-in-differences returns 4.0% with an interval that covers it. A second act asks the same questions of a B2B SaaS motion — CRM pipeline, ARR waterfall, NRR vs GRR, quota and capacity, a LookML semantic layer — and finds the segment with the fastest cycle and the best pipeline coverage is the one that loses money on every customer. The investment decision room on top chooses between attribution, a lift test and experiment-calibrated MMM per question, refuses to fit MMM to twelve months of data, and reallocates a constant $37.2K budget across diminishing-return curves — with only one of four channel moves experiment-calibrated, and the other three shown as test-gated. |
Python, SQL, causal inference, LookML, Streamlit |
| 🔥 Canada Wildfire Risk · live ▶ · this week ▶ | A live forecast built on real public fire and weather data. It began as a 2024 hackathon win — a random forest on hectares burned per month — and is now a daily seven-day ignition forecast for Canada's 753 one-degree cells, over 4.0M cell-days of the National Fire Database and 3,198 CWFIS stations. The Fire Weather Index is implemented from Van Wagner and replayed against CWFIS's own published codes. Two boosters (a classifier and a Poisson count) are averaged and isotonically calibrated, trained to 2016, tuned on 2017–2019 and scored once on 2020–2024: ROC-AUC 0.881 against 0.822 for each cell's own rate for the month, with 57.5% of 27,147 fires inside the riskiest tenth re-ranked every morning. The part I would read first is the bug behind those numbers: a pandas index misalignment had put 97.7% of fires in another fire's cell, and the model trained, calibrated and scored 0.807 on the scrambled record without an error anywhere. The one score it could not fake — this season, graded against satellites — was the one where the plain Fire Weather Index beat it; a map of the grid's provinces, with Nova Scotia's fires in the Yukon, gave it away. Fixed, it beats FWI there too, 0.743 to 0.724. GitHub Actions rebuilds the forecast twice a day, and a weekly job grades every forecast it published against the satellite detections that followed: over the first 30 days, ROC-AUC 0.734 (95% CI 0.691–0.777), ahead of both baselines on ranking, with its top-10% edge reported as not yet distinguishable from zero. An eight-page Power BI project is generated from spec. | Python, XGBoost, FWI System, GIS, Power BI, GitHub Actions |
| 🧑🤝🧑 HR Attrition Analytics · live ▶ | People analytics with the guardrails real employee data demands: k-anonymity masking, a disparate-impact CI gate (four-fifths rule + Fisher's exact), survival analysis with honest censoring. The flight-risk model uses zero protected attributes — and scores better without them. The live workforce decision room shows none of it per person: six cohort-level proposals, each with an owner, approval path and rollback trigger, small cohorts suppressed, and a release docket held at review required while two of its eight controls wait for named human review. | T-SQL, Python, lifelines, Power BI |
| 🔄 Supply Chain Analytics (dbt) | dbt Core, staging → marts built on DuckDB in CI, on Databricks and inside Snowflake with dbt Projects on Snowflake (all 41 mart totals equal on all three): incremental loads, SCD2 snapshots, MetricFlow semantic layer, Airflow running nightly under its scheduler in CI. A bounded AWS Athena / S3 / Glue Data Catalog run reconciles 32 warehouse measures to independent Python totals, with private encrypted storage, a 10 MiB scan cap and a recorded query ID. 6 unit tests run the model SQL against fixed inputs, so a change to the OTIF threshold or a partly shipped line priced on the wrong quantity fails the build — the data tests would not notice either. 157 dbt data tests across 15 models. | dbt, DuckDB, Databricks, Snowflake, MetricFlow, Airflow |
| 🏥 Health System Decision Support | Two health systems, one standard. Canadian side: CIHI-DAD-shaped activity (CMG+/RIW, cost per weighted case, ALC, risk-adjusted readmission), SPC with Laney correction — where I found the metric everyone reports is 4.6× overdispersed and fires 41 signals in 19 of 24 months — and a health-economic evaluation that comes out dominant on one costing perspective and $192k/QALY on the other. Ends in a briefing note and a costed business case. US side: an NRV model pricing $5.2M of open AR at the ~$2.2M it will actually collect. Plus Safe Harbor + k-anonymity de-identification with a measured re-identification risk. The Canadian layer now leads the Power BI report — activity and the ALC/flow/SPC page come first, because that is the order a health authority reads them in. No PHI. | Python, Power BI, DAX, SPC, HTA |
| 🧪 Clinical Data Management · live ▶ | A trial database as code: CDASH CRF metadata, an executable Data Validation Specification, SDTM DM/AE/VS with conformance checks, MedDRA/WHODrug coding, and a UAT plan generated from the spec. The generator writes an exhaustive defect manifest — 49 injected, 49 detected, 0 missed, 0 false positives — and that reconciliation caught a real bug where four protocol deviations went silently undetected. The status board is hand-generated SVG, because "stdlib only" is a claim and a chart is not a good enough reason to break it. | Python, CDISC, CDASH/SDTM |
| 💰 GL/P&L Reconciliation · Tableau Public ▶ | ERP-vs-subledger reconciliation that detects four discrepancy classes and proves every dollar of variance ties to source — then re-runs the same engine, unmodified, over a FOCUS-format cloud bill for FinOps chargeback. | T-SQL, SQLite, Power BI, DAX, Tableau |
| 📊 Portfolio Intelligence · public case study ▶ · owner dashboard | Two separate data paths: a public, reproducible dbt/DuckDB case study over a labelled 90-day fixture of 1,460 delivered events, with ordered journeys, first-touch acquisition, censored weekly retention and independent Python reconciliation, and private live GoatCounter analytics for real portfolio visits, active section/project time and approximate countries. The public case requires no sign-in; the owner view uses a read-only site-scoped key kept in the owner’s browser. Real visitor retention and Core Web Vitals remain unavailable, and new attention collection cannot recover historical dwell time. The separate Marketing Attribution project executes public GA4 analysis in BigQuery. | JavaScript, GoatCounter, dbt, DuckDB, event contracts |
| 🏗️ Asset Management & Legacy-to-Fabric · live decision board ▶ · capital business case | The live board connects a governed 96-record, six-service asset/GIS portfolio to three investment postures, a cash- and capacity-constrained ten-year plan, capital PV, cost/funding sensitivities, indicative funding, owned risk/benefit/requirement registers and delivery gates. Nine bad source records stay blocked. The wider repo adds SSIS/SSRS → Fabric parallel-run validation, requirements/process/RAID/UAT/adoption evidence, a 16-story backlog loaded into Jira Cloud through the REST API, Microsoft 365 design and public-sector procurement controls. The recommendation authorizes validation—not spending, engineering approval or a municipal claim. | Asset management, capital business case, BA delivery, GIS, Streamlit, Fabric, SSIS/SSRS, Python |
The two-stage ranker lost to plain collaborative filtering — documented, and the simple model ships. The gradient-boosted forecaster lost to a moving average — documented, and the moving average ships.
Synthetic snapshot 2026-06-30: Non-binary: 17 of 85 high-risk flags, versus 149 of 1,125 in the Male reference group (ratio 1.510; Fisher p = 0.0999). A non-significant result does not establish the absence of bias. Unresolved disparities remain visible for monitoring and human review.
The health-economics model came out dominant under one costing perspective and not worth funding under the other — so the business case recommends approval explicitly not as a savings initiative, because saying both is what makes the first half believable.
The layered transaction-monitoring detector is the same shape: blending an anomaly model into the score lifts ranking by 49%, and saves 1.8% at the threshold you would actually run. Both numbers are in the README, because only quoting the first one is how a model gets credit for work the rules did.
The biggest loss is the attribution project, where I built a dataset with a known answer and then watched every model fail to find it — including the exact Shapley value and a Markov chain, both beaten by a 40/20/40 heuristic. The reason turned out to be structural rather than fixable: every model that reads only a journey log can see how often a channel was present, never whether it caused anything. That is also where the nicest piece of nuance in the portfolio lives — last-touch is the worst model in the table and the least damaging one for splitting paid budget, because its catastrophic error lands on a channel nobody can buy.
And three bugs found by reconciliation rather than by a person: a visit-window check keyed on the wrong record, which let four protocol deviations through silently; a control chart whose contaminated baseline flagged the stable months instead of the shifted ones; and a p′ chart that rendered completely empty while passing every test it had — the tests checked the maths, and nothing checked that the thing drew. None of them crashed. All three are now tests.
Each repo also has a "things I deliberately didn't build" section: no vector search over business rows where SQL is the right tool (Ask Your Data embeds only schema descriptions), no deep learning on 38 SKUs, no cloud cosplay. Knowing when a technique would be decoration is, I think, the actual skill.
The repos above aren't hypotheticals — they're sharpened versions of problems I've worked professionally:
Two Rivers Specialty Meats — Data Analyst: Operations, Logistics & Enterprise Reporting (Vancouver)
- Defined governed KPIs for P&L/GL and operations (OTIF, inventory turns, days on hand) with Sales, Finance, and Supply Chain; built the Power BI star-schema models and DAX behind them.
- Developed Fabric / ADF / Synapse pipelines (SQL, PySpark) on Bronze→Silver→Gold patterns while owning the legacy SSIS/SSRS estate — the same modernization my migration repo rehearses with a GO/NO-GO parallel-run gate.
- Automated data-quality and reconciliation controls with logging and exception reporting — cutting recurring discrepancies by ~45% and reporting errors by ~30%. FEFO/expiry-risk and lot-traceability analytics for perishable inventory — the direct ancestor of my control tower.
- Secure-by-design delivery: RLS/RBAC, column-level security, masking for cost/margin and people data.
Shivam Investments — Financial Analyst, Data & Reporting (Vadodara, India, hybrid)
- GL/P&L reconciliations across sources — the discipline my reconciliation repo turns into a tested engine.
- Automated recurring analysis with Python + SQL feeding Power BI, cutting manual effort ~40%.
BI & semantic modeling — Power BI (DAX, star schema, RLS/OLS, calculation groups, TMDL/PBIR-as-code, VertiPaq tuning), SSRS · Pipelines — Microsoft Fabric, ADF/Synapse, PySpark, Delta Lake, dbt, Airflow, T-SQL, Python (pandas, scikit-learn) — ETL/ELT patterns that carry directly to Talend and equivalent enterprise integration platforms · Health analytics — CIHI DAD/CMG+/RIW, cost per weighted case, ALC and patient flow, risk adjustment by indirect standardisation, SPC (p/u charts, Western Electric, Laney), health economics (ICER, budget impact, PSA/CEAC), CDISC CDASH/SDTM · Decision science — causal uplift (S/T/X/DR learners), randomized experiments (CUPED, sequential tests, FDR control), mixed-integer optimization (HiGHS, Gurobi), price elasticity · LLM apps — Claude API, grounded text-to-SQL, eval-driven development · Governance — Kimball modeling, metric dictionaries, data contracts, reconciliation controls, HIPAA Safe Harbor and k-anonymity de-identification, PHI/PII-safe pipeline design · Legacy MSBI — SSIS, SQL Agent, and moving all of it forward without breaking month-end · Business analysis — stakeholder and requirements work, current/future-state process, business cases, charters, traceability, RAID/status, UAT, change/adoption, executive decision briefs and vendor-option evaluation · Asset and spatial information (portfolio evidence) — governed asset registers, lifecycle, condition, criticality, inspections, renewal need, multi-year options, capital affordability/PV, sensitivity, funding, risk, benefits, delivery gates, GIS reconciliation, GeoJSON and WGS 84 · Microsoft 365 — Word, Excel, PowerPoint and Teams; SharePoint information architecture and Power Automate workflow design are clearly labelled portfolio blueprints, not production administration
- 🎓 MPS in Analytics (Applied Machine Intelligence), Northeastern University, Vancouver, Sep 2022 – Jun 2024 — GPA 3.76
- 🎓 B.Eng. Computer Science, Gujarat Technological University
- 📜 Preparing for the Microsoft DP-600 (Fabric Analytics Engineer) exam
- 🏆 First prize at a wildfire-prediction hackathon — Python + Azure + live sensor data (DHT22/LM393), because sometimes the dashboard needs hardware
📚 More certifications & coursework
- Google Data Analytics
- IBM Python for Data Science, AI and Development
- Power BI Data Modelling with DAX · Advanced SQL
- SQL for Data Science: Data Pipelines, DBMS, Data Modeling
If you only have five minutes: read the GrowthOps OS case study, then download its workbook and check that the Excel figures match the Power BI report. Or open Ask Your Data, ask a question of your own and read the SQL it ran. Everything else here works the same way.
