Change-aware loads, not repeated rewrites.
Set-based SQL compares business attributes before updating. Normalizing pandas/NumPy values into suitable Python/SQL parameters avoids mismatched nulls and types at the loading boundary.
A reliable analytical foundation for a messy public e-commerce dataset.
Individual internship capstone · Atos
Atos internship · Jul–Sep 2026
Python / SQL Server / ETL / Power BI
Attributes change. The history stays.
Illustrative recordsThe public Brazilian Olist dataset spans orders, products, payments, reviews, and locations. Those files need consistent types, trustworthy relationships, and traceable transformations before they can support useful reporting.
I built this individual data engineering capstone during my Atos internship. It processes CSV files and locally exposed paginated API feeds into SQL Server analytical tables, product history, and reporting views.
The geolocation source alone contains 1,000,163 raw rows, including 261,831 duplicates in the inspected report. That scale describes input records, not unique customers or trusted output rows.
I implemented the capstone’s entity pipelines, SQL loading logic, product history, API consumer, scheduler, audit/data-quality persistence, tests, and a populated four-page Power BI report.
The API feeds serve supplied payments/reviews data locally. They demonstrate pagination and ingestion behavior; they are not a live commerce-provider integration.
Set-based SQL compares business attributes before updating. Normalizing pandas/NumPy values into suitable Python/SQL parameters avoids mismatched nulls and types at the loading boundary.
When product attributes change, the old version expires and a new current version is created. Missing products may be soft-deleted only because master-entity inputs are treated as complete snapshots; partial feeds would need a different policy.
Each pipeline has a business transaction, while audit and data-quality logging use separate persistence. A rollback can therefore preserve the diagnostic record explaining the failure.
API ingestion uses pagination, timeouts, and bounded retries. Scheduling controls are process-local; they are not a distributed scheduling guarantee.
Order items and payments can each contain multiple rows per order. Joining both directly can multiply facts. Reporting requires an explicit grain and suitable aggregation before combining those relationships.
The source and saved artifacts support implemented pipelines, history tracking, transaction handling, and a four-page Power BI report. Existing tests cover change detection, parameter normalization, API behavior, scheduling, and transaction failures.
The portfolio review did not rerun SQL Server pipelines, refresh Power BI, or execute the original test suite. Historical reports and the CV contain different test counts, so no exact passing count is published here. Numerical speedup claims are also omitted because their benchmark context was not reproduced.
This is internship/capstone work using a public dataset. It is not a production customer deployment, and dataset sales totals are not commercial revenue I generated.
Select a snapshot to see why unchanged inputs preserve the same version and changed business attributes create history. The table remains available as a text equivalent.
Illustrative example — no live database connection. Product P-001, with three prepared snapshots.
| Version | Category | Weight | Valid from | Valid until | State |
|---|---|---|---|---|---|
| 01 | Home | 500g | 2026-01-01 | Open | Current |
The first snapshot creates one current product version.
The source repository is private. This public case study explains the implementation without exposing the project’s source code.
Questions about the work, an engineering opportunity, or an idea to explore? I’d like to hear it.
Get in touch