Lemuel Calinog

Open to data engineering roles

Lemuel Calinog

Hey, I’m Lemy! I build the layer the business reports from: the pipelines that bring data in, the models that make sense of it, and the reporting that sits on top.

My job is making that layer dependable: modelled so it answers real questions, and scheduled so it runs without anyone watching. The tests are what catch mistakes early.

2022in analytics since
2026building the warehouse since
Manilaphilippines · gmt+8

Two rows, both real. One I built alone and you can read the code; one is internal, so what is public is the design of it.

queryportfolio
        1 SELECT project, stack, context
        2 FROM   portfolio.project
        3 WHERE  shipped IS TRUE
        4 ORDER BY started_at DESC;
01

Formula 1 analytics pipeline

Every season since 1950, pulled from a rate-limited public API, landed immutably in S3, loaded into Postgres, and modelled into a tested Kimball star schema with dbt. Orchestrated nightly by Airflow, served through Metabase.

dbtAirflowS3PostgresMetabase

Built solo

A test that failed

One dbt test derives each championship total from the race and sprint facts and compares it against the official standings. It failed: 437 official points against 399 derived for 2024, because sprint points were missing entirely.

Why the full history mattered

Backfilling every season since 1950 takes about seven and a half hours against a 500-request-per-hour budget. DNF rates fall from 49% in the 1950s to 13% in the 2020s, with a bump in the 1980s exactly where the turbo era belongs.

Decisions are written down

Sprint results are a separate fact table rather than a session_type column, because a fact whose grain needs a filter to be correct is a reliable source of wrong numbers. The alternatives that lost are logged in the repo.

Read the full case

02

Data warehouse build on Google Cloud

My team is building our company’s first data warehouse. Management had planned to hire a data engineer for it; we took it on ourselves, because we already understood what the business needed from the data.

BigQueryDataformCloud RunMedallionZoho Analytics

At work

A loader that matched by position

Bronze loads moved from CSV to JSON Lines after a column-position mismatch. BigQuery’s CSV loader matches columns by position, so a column reordered upstream breaks the load. JSON Lines matches by name.

Design and governance

I contributed to the data models, the architecture, and the security and governance decisions before anything was built, including how access would be limited and how changes would be provisioned.

One domain, end to end

I built Python ingestion, Dataform transformations and Cloud Run scheduling for the first source system we took on, served through Zoho Analytics. Medallion layering throughout, from bronze raw declarations to mart and reporting tables.

Read the full case

-- internal work, so there is no public repository. the f1 pipeline is the code you can read.

two rows returned

02 — stack

languages
  • Python
  • SQL
cloud & storage
  • Google Cloud
  • BigQuery
  • Cloud Run
  • AWS S3
  • PostgreSQL
transform & orchestrate
  • Dataform
  • dbt
  • Airflow
serving
  • Zoho Analytics
  • Looker Studio
  • Metabase
workflow
  • Git
  • GitHub Actions
  • Docker
2022 —
Data Analyst
Data warehouse build · Makati
2020 — 2022
Team Leader
Finance operations · Makati
2019 — 2020
Senior AP/AR Specialist
Finance operations · Makati
2017 — 2019
AP/AR Specialist
Finance operations · Makati
2015 — 2017
Email Support Representative
Customer support · Bonifacio Global City

04 — contact

The quickest way to reach me is email. I read everything, and I reply.