Easier to read with cream paper, a tint, more contrast or larger text? Choose your colours and text, once, for every page.

Free lesson

From source to report: pipelines

After this lesson: I can describe how data moves from its source to a report.

45 min lessonNo commands

The report is ready at 7

A shop chain's managers open a sales report at 7 every morning. Nobody built it by hand overnight.

The tills recorded each sale. A program copied the sales, tidied them and stored them. The report read the stored rows.

That chain of steps is a pipeline. Building and fixing pipelines is the daily work of a data engineer.

By the end of this lesson

Note

I can describe how data moves from its source to a report.

Key words

WordWhat it meansExample
Sourcethe system where data is first recordeda till
Pipelinesteps that move data from source to report
Extractto copy data out of a source
Transformto clean and reshape data
Loadto write data into the store a report reads
ETLextract, transform, load, in that order

The cells students fill in are left blank in this preview.

Three steps: extract, transform, load

Extract copies the data out of the source. The till system stays as it was.

Transform cleans and reshapes the copy. It tidies names, turns text into numbers and leaves out bad rows.

Load writes the clean rows into a store built for reports. The report reads only that store.

A pipeline is code you can read

Real pipelines run in tools built for the job. Underneath, each step is still a small program.

The block below is a whole pipeline in a few lines. Find the three steps by their comments. Then run it and count the rows that reach the store.

Run a small pipeline

Code: python
# EXTRACT: the till system exports text, one sale a line.
export = """2026-10-01,Leeds, 12.50
2026-10-01,york,8.00
2026-10-01,Leeds,
2026-10-01,York ,4.50"""

# TRANSFORM: split each line, tidy the city, skip a sale with no amount.
clean = []
for line in export.split("\n"):
    parts = line.split(",")
    if parts[2].strip() == "":
        continue
    clean.append({"day": parts[0], "city": parts[1].strip().title(),
                  "amount": float(parts[2])})

# LOAD: add the clean rows to the store the report reads.
store = []
for row in clean:
    store.append(row)

print("Rows loaded:", len(store))
for row in store:
    print(row)

# Add a line "2026-10-01,hull,3.20" to the export, then press Run.

A common mistake

Warning

Many people think a pipeline runs once. It runs on a schedule, every night or every hour, for years. So each step has to cope with new rows and bad rows by itself, with nobody watching.

Teaching a class? Set this module for your students with a teacher guide, marked assignments and a lab for every student.