From b0bd928f90ba965d9252958b74b685a88863cfe7 Mon Sep 17 00:00:00 2001 From: Nasser Boan Date: Sat, 8 Aug 2026 06:45:26 -0300 Subject: [PATCH] fix: absolute image URLs in the README for the PyPI page --- CONTRIBUTING.md | 2 +- README.md | 16 ++++++++-------- docs/site/_templates/layout.html | 7 ++++--- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a947183..2ee1876 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,7 +25,7 @@ CI runs these four, and a pull request needs them green: ```bash uv run ruff check # lint uv run ruff format --check # formatting -uv run pytest # 238 tests +uv run pytest # the full suite uv run pytest --nbmake --nbmake-timeout=900 examples/ # notebooks execute ``` diff --git a/README.md b/README.md index fde415a..124c11c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@

- - + +    - - clvkit + + clvkit

@@ -123,8 +123,8 @@ one optional extra, `dask`, for logs too big to summarise in pandas. See - - + + @@ -287,7 +287,7 @@ Two honest caveats, both measured. The benchmark and its numbers are in with workers in their own processes, in front of the same call.

- Wall-clock of CustomerBase.from_transactions against log size, pandas versus dask, on log-log axes. pandas is faster below about 4 million transactions, dask above it. + Wall-clock of CustomerBase.from_transactions against log size, pandas versus dask, on log-log axes. pandas is faster below about 4 million transactions, dask above it.
Summarising wall-clock vs. log size. The one flag (engine="dask") only pays off past the ~4M-row crossover; below it pandas wins. Numbers from the benchmark.

@@ -407,7 +407,7 @@ business that never observes anyone leaving, with no contractual assumption borrowed.

- Cohort-retention heatmap on the Online Retail II log: a triangle of monthly retention rates, with the unobserved lower-right cells drawn in grey rather than zero. + Cohort-retention heatmap on the Online Retail II log: a triangle of monthly retention rates, with the unobserved lower-right cells drawn in grey rather than zero.
CohortMatrix.from_transactions(log, period="M").plot() on the Online Retail II log. The grey cells are periods a young cohort hasn't lived through yet; a hand-rolled pivot paints them as churn.

diff --git a/docs/site/_templates/layout.html b/docs/site/_templates/layout.html index b00baab..3b91568 100644 --- a/docs/site/_templates/layout.html +++ b/docs/site/_templates/layout.html @@ -1,12 +1,13 @@ {% extends "!layout.html" %} {# The home page's H1 is already "clvkit", and Sphinx appends the site title as - a suffix, so its browser tab reads "clvkit — clvkit". Drop the suffix on the - root page only; every other page keeps " — clvkit". #} + a suffix, so its browser tab would read "clvkit · clvkit". Drop the suffix on + the root page only. Every other page gets " · clvkit" - the middot is + ours; Sphinx's stock titlesuffix hardcodes an em dash. #} {%- block htmltitle %} {%- if pagename == 'index' %} {{ title|striptags|e }} {%- else %} -{{ super() }} +{{ title|striptags|e }} · {{ docstitle|e }} {%- endif %} {%- endblock %}
Scatter of every CDNOW customer by discounted expected transactions and expected spend, coloured by 52-week CLV, with equal-CLV curves overlaid.Scatter of P(alive) against weeks since last purchase for CDNOW customers, coloured by repeat-purchase count: heavy buyers gone quiet are judged dead faster than light ones.Scatter of every CDNOW customer by discounted expected transactions and expected spend, coloured by 52-week CLV, with equal-CLV curves overlaid.Scatter of P(alive) against weeks since last purchase for CDNOW customers, coloured by repeat-purchase count: heavy buyers gone quiet are judged dead faster than light ones.
CLV().fit(cb).predict(horizon=52) — where lifetime value comes from: how often × how much, along equal-CLV curves.