Available · London, UK · Immediate start

Data Engineer
& Analyst
Strong
in Media

TV Director → Data Engineer and Analyst. 20 years of storytelling, now turned toward data. I design the systems that collect, move, and store it, and find the narrative the numbers are trying to tell — then communicate it so decisions actually get made.

Iuliia Bondarenko
IULIIA
BONDARENKO
IS LOOKING
FOR
interesting
projects
Iuliia — ready to reveal the data
PLOT TWIST:
TV DIRECTOR
→ DATA ENGINEER
& ANALYST

My journey isn't linear — and that's my greatest asset. After 20 years directing television, managing budgets, schedules, and cross-functional teams under live broadcast pressure, and 2 years in finance operations at a British company, reconciling invoices, managing AR/AP cycles, and building reports — I discovered that I have a massive interest in structured problem-solving, systems design, and data-driven decision making. I enjoy working with numbers and building clear, scalable solutions.

I spent 500+ hours learning and practising through intensive programmes, and now I confidently work with Excel, SQL, Python, FastAPI, BigQuery, Power BI, KPI dashboards.

Balance — like a data analyst on deadline
TECH SKILLS
ARE TABLE
STAKES.

MY SOFT
SKILLS AREN'T.
↓

20 years in TV directing taught me to:

/ toolkit

I confidently
work with

01
SQL

Comfortable going from ERD to working SQLAlchemy model. Querying, transforming and aggregating data to surface actionable insights from relational databases.

PostgreSQLBigQuerySQL ServerCTEsJOINsWINDOW functionsIndexing
02
Python

Building REST APIs with FastAPI, validating data with Pydantic schemas, structuring projects across models/schemas/CRUD layers. Data cleaning, EDA, statistical analysis, and custom visualisations.

PandasNumPyMatplotlibSeabornPydanticFastAPISOLID OOP
03
Dagster

Data pipeline orchestration and management.

DAGsAsset graphsOpinionated workflows
04
Power BI

Interactive dashboards that turn complexity into executive-ready visual narratives.

DAXData modellingPowerQuery
05
Excel

Data modelling, data cleaning, pivot tables, and trend analysis at scale.

Pivot tablesDAXKPI dashboards
/ portfolio

Selected Projects

Retail Sales Performance Q1 2025 – Power BI dashboard
01
Power BIDAXRetail
Retail Sales Performance Q1 2025

Interactive Power BI dashboard tracking £785K+ total revenue across 3 stores. Drillable categories, monthly trend line, best-seller rankings. Built with custom DAX and bookmark navigation.

// The Data

Three separate Excel files — one per store — containing daily transaction records for January through March 2025. Each file held columns for date, product category, SKU, units sold, unit price, and store ID. Around 4,800 rows total across all three stores before cleaning.

"Which store is driving the most revenue — and is that consistent month-to-month, or does performance shift? Which product categories are carrying the business, and which are underperforming? What does a single clear overview look like for a non-technical retail manager?"

// Cleaning & Preparation
  • Used Power Query to append the three store files into a single unified table, applying a Store Name column as a filter dimension.
  • Standardised date formats (mixed DD/MM/YYYY and YYYY-MM-DD across files) and converted unit price from text to decimal.
  • Removed 11 duplicate rows caused by system re-exports, and filtered out 3 rows with null SKUs.
  • Created a Calendar table in Power BI linked via date relationship to enable proper time intelligence functions.
// Analysis Approach
  • Wrote DAX measures for Total Revenue, Revenue MoM %, Units Sold YTD, and a Running Total using CALCULATE + DATESYTD.
  • Built a Top N product ranking using RANKX across the product table, filtered dynamically via a slicer.
  • Created store-level KPI cards showing revenue vs. a fixed Q1 target, with conditional formatting to flag underperformance.
// Visual Choices & Why
  • Clustered bar chart (revenue by category) — allows quick relative comparison; sorted descending so the top performers are immediately visible without scanning.
  • Line chart (monthly trend by store) — shows trajectory rather than a single snapshot, so a manager can see if a dip in February recovered or continued.
  • Matrix with conditional formatting — for SKU-level drill-down, colour-scaled by margin so the highest-value products stand out without needing to read every number.
  • Bookmark navigation buttons — replaced a tab interface the client already understood from Excel, reducing the learning curve for non-BI users.

Key Insight: Store 2 led total revenue (£312K) but showed a 14% MoM decline in March — traced to a single category (home accessories) that outperformed in January due to a January sale, then normalised. Without the trend view, the store would have looked fine on a summary dashboard.

Bubble chart: Store Size vs Revenue vs Employees
02
SQLPythonAdventureWorks
Store Size, Employees & Revenue

SQL + Python analysis of AdventureWorks 2019 data revealing that staffing decisions outweigh physical footprint as a revenue driver — with a bubble chart exposing the "High Cost / Low Return" quadrant across hundreds of stores.

// The Data

Source: AdventureWorks 2019 — Microsoft's sample enterprise database, running on SQL Server. The question we were handed: "What is the relationship between the size of stores, number of employees, and revenue?" Data was spread across multiple tables: Sales.Store (store metadata), HumanResources.Employee (headcount), and Sales.SalesOrderHeader (transaction revenue). No single flat file existed — everything had to be assembled via SQL joins before any analysis could begin.

"Does a bigger store always earn more? Is it about the space, or the people staffing it? Where are the stores that cost the most but earn the least — and why?"

// Data Extraction (SQL)
  • Queried Sales.Store joined to Sales.SalesPerson and Sales.SalesOrderHeader to pull per-store annual revenue aggregated with SUM(TotalDue).
  • Joined HumanResources.Employee to count staff per store using COUNT(BusinessEntityID) grouped by territory.
  • Used Sales.Store.Demographics (XML column) to extract square footage — required CROSS APPLY and value() XQuery parsing, since the field is stored as XML in AdventureWorks.
  • Final query returned ~700 store-level rows with: store ID, sq footage, employee count, and total yearly revenue.
// Analysis (Python)
  • Loaded SQL output into pandas and binned employees into 4 bands (2–13, 14–30, 31–50, 51–100) using pd.cut() for categorical colouring on the scatter.
  • Built a bubble chart (matplotlib): X = store size (sq ft), Y = total yearly revenue, bubble size = employee count. This allowed all three dimensions to be read simultaneously — avoiding the need for a 3D plot that would be harder to interpret.
  • Identified the "High Cost / Low Return" quadrant: stores with large footprints and high headcount but below-median revenue — a clear signal of operational inefficiency.
  • Calculated Pearson r for size vs revenue: weak positive. For employee count vs revenue: stronger signal — confirming that staffing density is the more meaningful lever.
Scatter: Store Trading Duration vs Revenue (r = -0.23)

A related scatter revealed r = −0.23 for store trading duration vs revenue — stores open 15–25 years peak, while 35+ year locations show "Location Fatigue."

// Key Finding: The Staffing Paradox
  • Smaller stores with fewer employees often outperformed larger, heavily-staffed locations — disproving the assumption that bigger always means more revenue.
  • Mid-sized stores clustered at lower revenue despite adequate infrastructure — suggesting the problem isn't capacity but conversion efficiency.
  • Large low-revenue stores represent the highest operational risk: high overhead, low return, difficult to turn around without structural change.

Recommendations: Introduce labour-to-sales ratio caps for large-format stores. Flag underperforming large stores for potential "Showroom" format downsizing — reduced headcount, curated floor space, higher revenue per sq ft target.

// Data Analytics Takeaway

This project is a good example of why multi-table SQL extraction matters before any visualisation. A single flat CSV would have hidden the XML demographic fields and required manual joins that are better handled in SSMS. The bubble chart format was chosen specifically because it encodes three continuous variables without cluttering — something a bar chart or simple scatter would fail at. The "High Cost / Low Return" framing came from asking a business question first, then building the visual to answer it rather than the other way around.

Olist database schema — 8 tables joined by order_id, customer_id, seller_id
03
Power BIPythonNLPPandas
Olist: 100K Orders, End-to-End

From 9 raw Portuguese CSVs across 8 joined tables to a Power BI sentiment dashboard — data engineering, NLP cleaning, cross-table merges, and business recommendations for a Brazilian e-commerce platform.

// The Starting Point

The Olist Brazilian E-Commerce dataset (Kaggle, 2016–2018): 100,000 orders across multiple marketplaces, stored in 9 separate CSV files in Portuguese — reviews, orders, order items, products, sellers, customers, payments, geolocation, and category translations. No single flat file. No English. No clean joins. The schema above shows how the tables connect: olist_orders_dataset is the central fact table, linked outward to reviews, payments, items, customers, and geolocation via order_id, customer_id, and zip_code_prefix.

"What do customers actually feel about Olist — and why? Is it the product, the shipping, the seller, or the delivery window? Which categories are the biggest problem areas? And can we quantify how much freight cost damages satisfaction independently of product quality?"

// Data Engineering: Clean, Translate, Merge
  • Schema mapping first: studied the entity-relationship diagram to plan which tables were needed for each question before writing a single line of code — avoiding unnecessary joins later.
  • 7 individual cleaning passes: each raw CSV was cleaned separately: sellers, products, order items, payments, customer data, geolocation, and review text — outputting a cleaned/ folder of validated files before any merging.
  • Translation pipeline: review comments were in Portuguese. Translated olist_order_reviews_dataset → reviews_translated_Cleaned.xlsx to make NLP viable for an English-language analysis. Also mapped product_category_name_translation.csv to get English category names throughout.
  • Python NLP preprocessing (phrases.py): extracted recurring phrases from review text — stripping noise, normalising, and surfacing key terms that drove positive and negative sentiment. Output fed directly into the Power BI word cloud.
  • Feature engineering: created freight_ratio = freight_value / price — a derived column representing delivery cost as a proportion of product value, which turned out to be the most predictive variable for review score.
  • Final merge: joined all cleaned tables on order_id using pd.merge() in a left-join chain (orders → reviews → items → products → sellers), producing a flat working dataframe of ~87,000 complete records with review text, scores, freight data, and English category labels.
// Analysis: Sentiment, Freight & Category
  • Sentiment classification: bucketed review scores — Positive (4–5), Neutral (3), Negative (1–2) — as a calculated column in Power BI. Result: ~80% positive, avg score 4.09 (above the 4.0 benchmark). Temporal trend confirmed improving satisfaction over 2016–2018.
  • Category performance breakdown: stacked bar chart by category, sortable by volume. Top performers: CDs/DVDs, fashion, books. Worst: Security & Services — reflecting customer concerns around order reliability and transaction processes.
  • Word cloud (negative reviews only): stripped Portuguese stopwords, ran through phrases.py, surfaced: product damage, wrong items, long waits. Built as a custom visual in Power BI for stakeholder readability — non-analysts grasp recurring complaints immediately.
  • Freight impact analysis: binned freight_ratio into low / medium / high thirds. Computed Pearson and Spearman correlations (Spearman used as complement because review scores are ordinal). Finding: freight ratio correlated more strongly with low scores than absolute freight cost — a £5 delivery on an £8 item is more damaging than £15 on a £120 item.
  • Delivery window: order fulfilment ranged from 0 to 210 days. Extended delivery was the second most cited driver of negative reviews after freight cost ratio.
Power BI Feedback Sentiment Analysis dashboard — 77.16% positive, word cloud, score by category

Power BI dashboard: sentiment split (77.16% positive, avg 4.09), word cloud filtered to negative reviews, and score-by-category breakdown.

// Power BI Dashboard
  • Built a multi-page report in Power BI Service: overview KPI page, sentiment drill-through by category, freight analysis page, and word cloud page.
  • DAX measures: AVERAGEX(Reviews, Reviews[review_score]) for dynamic avg score; custom measures for positive/negative review counts filterable by category and date.
  • Drill-through page: clicking any category bar opens a filtered view of raw translated review comments for that segment — designed for operations teams to read actual customer language, not just numbers.
Python scatter analysis: Price vs Review Score, Freight Value vs Review Score, Freight Ratio vs Review Score

Python analysis: three scatter plots showing flat price-vs-score relationship, a negative freight value trend, and the strongest signal — freight ratio vs score — confirming the proportional cost is what damages satisfaction.

Business Recommendations: (1) Introduce freight cost caps or free delivery thresholds for high-ratio categories — customers don't separate "product" from "delivery cost" in their rating. (2) Audit the Security & Services category for process failures — it shows disproportionate negative sentiment relative to volume. (3) Surface 35+ day delivery orders as a priority queue for operations — they account for a measurable share of 1-star reviews and are preventable.

// Data Analytics Takeaway

The insight that freight ratio matters more than absolute freight cost only became visible because the feature was engineered before analysis — it didn't exist in the raw data. This project demonstrated that data preparation isn't just cleaning: it's designing the variables that make the real pattern findable. The schema diagram wasn't decoration — it was the map that made the multi-table join possible without guessing.

TinderHelper Telegram Bot – main screen
04
JavaTelegram APIOpenAIState Machine
TinderHelper Telegram Bot

A Telegram bot integrating ChatGPT-4 to coach users through online dating — profile writing, opening messages, and live conversation help. Currently offline as a running service due to AI API limits, but fully built and working. Try it: @TgTinderHelper_Bot

// The Idea

Built as a personal project to learn Java backend development and real-world API integration. The bot was designed to be a full AI-powered dating assistant inside Telegram — no app download, no account, just a conversation. Note: the GPT-4 integration is currently inactive due to paid API limits expiring, but the full architecture, state machine, and all six feature modes are complete and functional.

"Can I build a multi-user bot that handles six different conversation modes simultaneously, integrates a live AI service, and feels natural to use — entirely in Java, from scratch?"

// What It Does (6 Modes)
  • /profile — asks 5 questions about the user, sends answers to GPT-4 with a custom prompt, returns a polished Tinder bio
  • /opener — collects info about the match, generates a personalised first message that doesn't sound like a template
  • /message — pastes in a conversation history, bot suggests what to say next or how to ask them out
  • /date — roleplay chat with AI-simulated celebrity personas (Ariana Grande, Margot Robbie, Ryan Gosling…) for conversation practice
  • /gpt — open-ended ChatGPT chat directly in Telegram
  • /start — menu navigation with inline keyboard buttons
Opener mode — failed opener example Profile mode — emoji prompts
// How It's Built
  • Language: Java 17, built with Maven (pom.xml manages Telegram Bots API + HTTP client dependencies)
  • Multi-session handling: MultiSessionTelegramBot extends TelegramLongPollingBot and uses ThreadLocal<Update> to isolate each user's incoming message — multiple users handled concurrently without state collision
  • State machine: each user session tracks a DialogMode enum (MAIN / PROFILE / OPENER / MESSAGE / DATE / GPT) — the onUpdateEventReceived() dispatcher routes logic based on current mode, not just the message text
  • GPT integration: ChatGPTService sends HTTP requests to the OpenAI API, manages conversation history, and injects per-mode system prompts loaded from /resources/prompts/*.txt files
  • Prompt engineering: each mode has a hand-written prompt file defining persona, tone, and output format — e.g. the opener prompt instructs GPT to never sound like a template and to use the match's info naturally
  • Content: all bot messages, images, and prompts loaded from /resources/ at runtime — easy to swap without touching Java code
GPT-4 integration

Key Insight: The hardest part wasn't calling the API — it was the state machine. A bot that handles six different conversation flows for multiple users simultaneously needs to know not just what the user said, but what they were doing when they said it. DialogMode + ThreadLocal solved that cleanly.

Public vs Private Markets diagram
05
PythonDagsterRailwayFinTech
Peppercorn Solutions: ETL Pipelines for Financial Data

Production ETL pipelines for Custodial Data, Public and Private Funds at a US fintech platform. 4 vendor integrations, live in production.

// The Context

At Peppercorn Solutions I build data pipelines for a US-based fintech platform serving financial advisors and asset managers — the platform's name is under NDA. The core challenge: 4 custodians and fund data vendors each expose their data through different APIs, authentication schemes, and payload structures, and all of it needs to land in a unified internal data model reliably, on schedule, and without silent failures.

"How do you stop four vendors' completely different data contracts from turning into four different systems to maintain? How do you guarantee a scheduled load never fails silently?"

// What I Build
  • ETL pipelines for Custodial Data, Public and Private Funds — extracting raw financial data from vendor APIs, transforming it into the platform's core schema, and loading it into the database on a scheduled cadence.
  • Each pipeline handles a different vendor's data contract: different authentication flows, different response shapes (nested JSON, paginated endpoints, flat CSVs), and different update frequencies. My job is to make them all behave consistently downstream.
// Vendor Auth & API Integration
  • Built authentication and authorisation flows for all 4 vendors — OAuth2 token exchange, secure credential storage, token refresh logic, and retry handling on 401/429 responses.
  • Each vendor's auth pattern is encapsulated so pipeline logic stays clean and auth concerns stay separate from data handling.
// Core & Reusable Code
  • Shared logic lives in a core/ module — base HTTP client wrappers, common data validators, error handlers, and response normalisers.
  • New vendor integrations extend these rather than rewriting them, keeping the codebase consistent as the number of integrations grows.
// Orchestration & Deployment
  • Pipelines orchestrated with Dagster — assets and jobs define the dependency graph, sensors trigger runs on schedule or on external events, and the Dagster UI gives full visibility into what ran, when, and what failed.
  • Deployed on Railway, with environment config managed via Railway's variable system so credentials never touch the codebase.

Key Insight: The hardest part of financial data pipelines isn't the transformation — it's contract management. Every vendor changes their API eventually. Building around a stable core/ with vendor-specific adapters on top means a breaking change in one vendor's schema doesn't ripple through the whole system.

/ work history

Experience

June 2026 – Present
Peppercorn Solutions, USA/Remote
Software Engineer (Data Focus)
  • Develop data-focused software solutions using Python, SQL and PostgreSQL, working with APIs, relational data and structured data models.
  • Build and maintain data pipelines and ETL workflows using Dagster, transforming and validating data for reliable downstream use.
  • Use Git and code review processes within a collaborative software engineering environment.
  • Work closely with product and engineering teams to translate requirements into technical solutions and deliver iterative improvements.
  • Work with AWS S3 for data storage and deploy and manage services using Railway.
2025 – 2026
Generation UK
Data Analytics Training

400+ hour intensive programme focused on practical data analytics, business problem-solving, and professional readiness. Built 5+ dashboards, delivered professional-grade analytical reports across SQL, Python, Power BI, and Excel.

2022 – 2024
Emmyland, UK
Bookings Office Admin Assistant

Handled Accounts Receivable and Accounts Payable for 2 years. Reconciled invoices, tracked payment cycles, built reports.

2005 – 2022
StarLightMedia, Ukraine
TV Director, Producer & Editor

Led end-to-end video production across multiple simultaneous locations over 20 years. Grew audience engagement by 20% on key titles. Managed large-scale teams, sub-hire inventory, and editorial budgets. Credits include The Bachelor and Single Dad series.

/ education

Education &
Certifications

Microsoft Certification
PL-900: Power Platform Fundamentals
Microsoft
2026

Validates knowledge of Microsoft Power Platform — Power BI, Power Apps, Power Automate, and Power Virtual Agents — and how they enable data-driven business solutions.

Training Programme
Data Analytics Training
Generation UK
2025 – 2026

400+ hour intensive programme: practical analytics, business problem-solving, professional readiness.

Continuing Education
Python Developer
Genius.Space
2024
Degree
TV & Film Production
Lugansk State University
2000 – 2005
Ready to shake hands with your team
LOOKS LIKE US,
RIGHT?
READY FOR
FULL- OR
PART-TIME.
IMMEDIATE
START.
Don't let this motivated specialist die in poverty :)
© 2025 Iuliia (Julia) Bondarenko · Built with data · Designed with soul