Lesson 8 — Optional: find the best buyer

Optional exercise: group purchases to find a product's best buyer, then follow a weak relation from the calculated ID to the customer.
Continue in the same console, or start fresh in this extracted folder:
    exec(open("start-here.py").read())
    exec(open("console.py").read())
    exec(open("checks.py").read())
Requires Python 3.11+ and asqueel[migration]==0.6.0.
The four fictional CSVs are included; the database and model stay in memory.
Reloading aliases and formulas needs no migration. SQLite numeric arithmetic
is not exact decimal arithmetic; ROUND controls displayed precision.
Mean selling prices in lesson 5 are unweighted invoice-row unit prices.
The best-buyer exercise is optional. Later lessons do not depend on it.
Commands and results were executed in a real Python REPL; timing is edited.
