Summary#
Audit date: 2026-05-28
Lectures audited: 26
Categories audited: writing, math, code, figures, references, links, admonitions (JAX out of scope for this series)
Average overall score: 8.0 / 10
Average per-category scores: writing 7.2, math 7.3, code 8.5, figures 6.5, references — (none in scope), links 9.1, admonitions 8.7
Priority distribution#
Priority |
Count |
% |
|---|---|---|
HIGH |
3 |
11.5% |
MEDIUM |
0 |
0% |
LOW |
19 |
73.1% |
NONE |
4 |
15.4% |
The three HIGH-priority lectures all triggered the rule “any in-scope category ≤ 4” via the Figures category. Their overall scores are 7.0–7.5 (within the LOW band on its own), but a single-category floor of 4 (matplotlib, pandas_panel, workspace) raises priority.
Top systemic issues across the series#
[qe-writing-006] — appears in 24 / 26 lectures and remains the dominant style violation across the series. Multiple files exhibit 10–18 instances each.
[qe-fig-005] (missing
name:field on figure directives) — appears in ~20 / 26 lectures. Every{figure}/{image}directive observed lacks aname:field, preventing{numref}cross-referencing. This is the single largest gap in the Figures category.[qe-fig-003] (embedded matplotlib titles via
ax.set_title/plt.title/plt.suptitle) — appears in 5 lectures outside the exercise/solution exception:pandas_panel.md(×4),workspace.md(×2),matplotlib.md(×2 — but pedagogically motivated),jax_intro.md(×1).matplotlib.mdandworkspace.mduse it in demo code;pandas_panel.mduses it in non-exercise body code (clear violation).[qe-fig-001] (unnecessary
figsize=overrides) — appears in 9 / 26 lectures:matplotlib.md(×4 — pedagogical),numpy_vs_numba_vs_jax.md(×1 — 3D plot),jax_intro.md(×1),pandas.md(×2 in solutions),pandas_panel.md(none — pandas_panel uses default size),python_oop.md(×1),writing_good_code.md(×2),numpy.md(×4 historical leftovers — actually re-checked, mostly in matplotlib code samples). Total occurrences ~15.[qe-link-002] (direct URLs to sibling lecture series instead of
{doc}cross-references) — appears in 3 lectures:about_py.md(×1, jax),numba.md(×1, intro),sympy.md(×3, intro + intermediate).
Top strengths#
[qe-code-002] (Unicode Greek in code) — universally adopted in math-heavy lectures (α, β, γ, δ, ϵ, μ, ν, ρ, σ, λ, θ, ξ, η, Δ all appear). Programming-series exemplar.
[qe-code-003] (non-Anaconda installs at top with
hide-output) — 100 % compliant across 10 lectures with!pip installcells (autodiff, jax_intro, numba, need_for_speed, numpy, oop_intro, pandas, pandas_panel, numpy_vs_numba_vs_jax, scipy).[qe-code-004] (
qe.Timerfor benchmarking) — used exemplarily across 6 lectures (numba 8+ blocks, numpy_vs_numba_vs_jax 17+ blocks, need_for_speed, jax_intro, scipy, numpy). Notime.time()patterns and notic/toclegacy code anywhere.[qe-code-005] (no
%timeit/%%timeit) — 100 % compliant. Series consistently usesqe.Timerinstead.[qe-code-006] (binary-package warnings) — N/A. No graphviz / similar binary packages used in this series.
[qe-admon-002] (
:class: dropdownfor solutions) — 100 % compliant across all 17 lectures with solutions. Everysolution-startdirective observed in the audit corpus carries:class: dropdown.[qe-admon-005] (solutions cross-reference exercises via
:label:) — 100 % compliant. Everysolution-start <label>matches a correspondingexercise-start :label: <label>.[qe-link-002] (intra-series
{doc}cross-references) — used cleanly in ~13 lectures (autodiff, functions, jax_intro, numba, oop_intro, pandas_panel, python_advanced_features, python_by_example, python_oop, numpy, numpy_vs_numba_vs_jax, troubleshooting, writing_good_code).References category — no
{cite}used anywhere in the series, so qe-ref-001 is N/A across all 26 lectures. The series does not draw on bibliographic citations.
Lectures ranked by priority (lowest score first)#
# |
Lecture |
Writing |
Math |
Code |
Fig |
Ref |
Link |
Adm |
Overall |
Priority |
|---|---|---|---|---|---|---|---|---|---|---|
1 |
7 |
N/A |
7 |
4 |
N/A |
9 |
8 |
7.0 |
HIGH |
|
2 |
8 |
N/A |
7 |
4 |
N/A |
9 |
9 |
7.4 |
HIGH |
|
3 |
7.5 |
N/A |
8 |
3 |
N/A |
10 |
9 |
7.5 |
HIGH |
|
4 |
7.5 |
N/A |
8 |
6 |
N/A |
7 |
9 |
7.5 |
LOW |
|
5 |
6.5 |
N/A |
9 |
6 |
N/A |
9 |
N/A |
7.6 |
LOW |
|
6 |
7 |
6 |
8 |
N/A |
N/A |
7 |
8 |
7.2 |
LOW |
|
7 |
6.5 |
N/A |
8 |
7 |
N/A |
9 |
8 |
7.7 |
LOW |
|
8 |
6.5 |
7.5 |
8 |
7 |
N/A |
9 |
8 |
7.7 |
LOW |
|
9 |
7 |
8 |
9 |
8 |
N/A |
7 |
8 |
7.8 |
LOW |
|
10 |
7 |
N/A |
8 |
7 |
N/A |
8 |
9 |
7.8 |
LOW |
|
11 |
7 |
7.5 |
9 |
5 |
N/A |
10 |
9 |
7.9 |
LOW |
|
12 |
7 |
6 |
9 |
7 |
N/A |
10 |
9 |
8.0 |
LOW |
|
13 |
6.5 |
7.5 |
9 |
8 |
N/A |
9 |
8 |
8.0 |
LOW |
|
14 |
6.5 |
N/A |
8 |
9 |
N/A |
9 |
8 |
8.1 |
LOW |
|
15 |
6.5 |
N/A |
8 |
N/A |
N/A |
9 |
9 |
8.1 |
LOW |
|
16 |
7.5 |
N/A |
9 |
6 |
N/A |
9 |
9 |
8.1 |
LOW |
|
17 |
6.5 |
7 |
9 |
7 |
N/A |
10 |
9 |
8.1 |
LOW |
|
18 |
7.5 |
N/A |
N/A |
8 |
N/A |
9 |
N/A |
8.2 |
LOW |
|
19 |
7 |
8 |
9 |
7 |
N/A |
10 |
9 |
8.3 |
LOW |
|
20 |
7 |
N/A |
9 |
7 |
N/A |
10 |
9 |
8.4 |
LOW |
|
21 |
6.5 |
N/A |
9 |
N/A |
N/A |
9 |
9 |
8.4 |
LOW |
|
22 |
7 |
N/A |
8 |
N/A |
N/A |
10 |
9 |
8.5 |
LOW |
|
23 |
8 |
8 |
9 |
8 |
N/A |
10 |
9 |
8.7 |
NONE |
|
24 |
8.5 |
N/A |
9 |
N/A |
N/A |
N/A |
N/A |
8.8 |
NONE |
|
25 |
8 |
N/A |
9 |
N/A |
N/A |
10 |
9 |
9.0 |
NONE |
|
26 |
9 |
N/A |
N/A |
N/A |
N/A |
10 |
N/A |
9.5 |
NONE |
Series-level recommendations#
Heading sweep remains the highest-leverage action. a global pass converting all H2/H3/H4 section headings from Title Case to sentence case (qe-writing-006). This alone would lift most of the LOW-priority lectures into NONE.
Figure metadata pass. Add
name:fields (e.g.,fig-jp-demo,fig-htop-parallel-npmat,fig-pandas-vs-rest) to the ~50+{figure}and{image}directives across the series so they become{numref}-able (qe-fig-005). This is mechanical and high-impact.Remove non-pedagogical
plt.title/ax.set_title. Inpandas_panel.mdfour such calls appear in main-body code cells and should be replaced with figure-directive captions (qe-fig-003). Workspace.md needs itssine_wave.pydemo cleaned up similarly.matplotlib.mdandjax_intro.mdare borderline (one is a Matplotlib tutorial, the other diagrams a PRNG tree) and may warrant an explicit “this is a demonstration, don’t do this in production” callout.Cross-series link conversion. Replace the ~5 bare quantecon.org URLs in
about_py.md,numba.md, andsympy.mdwith{doc}cross-references using the appropriate intersphinx prefix (jax:,intro:,intermediate:) per qe-link-002.Normalize blackboard probability notation. Carried over:
\mathbb E→\mathbb{E},\mathbb P→\mathbb{P}innumba.md,numpy.md,scipy.md,writing_good_code.md(qe-math-010, proposed). Also:python_oop.mdshould switch\mathbf{1}→\mathbb{1};python_by_example.mdshould replace\pi * r^2with\pi r^2(qe-math-012, proposed);sympy.mdnarrative should switchE(X)to\mathbb{E}[X](the SymPy codeE(X)may remain since it is a SymPy function name).Gated-exercise consistency. Several lectures mix bare
{exercise}with{exercise-start}/{exercise-end}. Where the body contains only prose/math, bare{exercise}is technically allowed by qe-admon-001, but uniform gated syntax improves authoring consistency. Affected:numba.md,numpy.md,python_essentials.md,scipy.md,sympy.md.Preserve the strong Code-category baseline. The series already does extremely well on
qe-code-002(Greek unicode),qe-code-003(top-of-lecture installs withhide-output),qe-code-004(qe.Timer), andqe-code-005(no%timeit). Future contributions should keep this discipline.