Hi, I'm Stephanie Choi

Python Software & Data Engineer 👩🏻‍💻

I build scalable data pipelines and backend services. Passionate about writing clean, maintainable code, automating processes, and helping clients modernize their tech stack with efficient, future-ready solutions.

PythonSnowflakeDBTApache AirflowPostgreSQLDockerAWSDagsterPolarsESP32MQTT

Featured Projects

A collection of personal projects showcasing my work in data engineering and software development.

Data Pipeline Orchestrator (DBT+Airflow+Snowflake)
Scalable ETL pipeline for processing large datasets utilising DBT+Airflow+Snowflake, includes data quality checks and monitoring.
PythonDBTApache AirflowSQLAWS S3CosmosSnowflake
Data Pipeline Orchestrator (Dagster)
Scalable ETL pipeline for processing large datasets from Dagster, includes data quality checks and monitoring.
PythonDagsterSQLDockerAWS S3Polars
Log Analysis Tool
CLI tool for parsing and analyzing application logs. Features pattern matching, anomaly detection, and automated report generation.
PythonRegexBash Scripts
Taiwan Stock Exchange Data
Extract daily information from TWSE and pre-process before ingesting the information to database.
PythonposgresqlRabbitMQCeleryPydanticmatplotlibfastAPIDigitalOceanPandas
Trading Journal Application
Day trading journal platform where users can log, track, analyze trade performance with visual dashboard using plotly Dash and tagging trade comments feature.
PythonPlotly DashSQLDjango

Latest Blog Posts

Recent thoughts and technical articles

The views I express here are mine alone and do not necessarily reflect the opinions or official position of my employer.

View all
A join between two values that looked byte-for-byte identical on screen kept failing silently. The cause was a Windows-style carriage return hiding at the end of a product_code, invisible in every grid viewer I checked. Here's how to catch it with LENGTH() and HEX_ENCODE(), and the TRIM fix that guards against it recurring.
How I stopped maintaining three copies of the same AI agent instructions by centralizing AGENTS.md, skills, and commands into one directory and symlinking every tool back to it.
TIMESTAMP_NTZ, LTZ, or TZ: picking the wrong one doesn't throw an error, it renders a different time per session and can drop rows out of a join without warning. Here's what actually distinguishes them, and the schema-migration gotcha that can break a pipeline changing between them.

Work Experience

Professional experience in data engineering and software development.

Filter by:
AI
Backend
Cloud
Data Engineering
Frontend
Software Engineering
Data Engineer II
CRU Group International • London, United Kingdom • Hybrid
Sep 2025 – Present1 year

Building scalable data infrastructure and ETL pipelines for global commodity market intelligence, processing massive datasets to deliver actionable insights for strategic decision-making.

Python
git
Apache Airflow
DBT
Snowflake
AI
Data Engineering
Docker
Sigma
Terraform
Rudderstack
NocoDB
Software Engineer I
Suade Labs • London, United Kingdom • Hybrid
Sep 2023 – Sep 20252 years

Engineered and maintained software solutions for regulatory risk reporting in the financial sector, with a focus on ETL pipelines to ensure compliance, accuracy, and reliability for major banks.

Python
Linux
git
Clickhouse
Dagster
Docker
FastAPI
PostgreSQL
CI/CD
Bash Scripts