·6 min read
What people actually install
I pulled 30 days of PyPI and npm download counts for 26 data tools and the newest ones are smaller next to the incumbents than any conference talk would have you believe.
- tools
- python
- method
Every week someone tells me pandas is finished, dbt has lost, and Airflow is legacy. So I asked the registries. Thirty days of downloads for 19 Python packages and 7 JavaScript chart libraries, fetched on 8 September 2026. pandas was downloaded 1,225 times for every one download of sqlmesh. The discourse and the install logs are describing different industries.
Downloads in 30 days, log axis
Log axis. Each gridline is ten times the last. Top to bottom here is 1,225 to 1.
Hover a bar for its daily series. Colours: PyPI and npm. Fetched 2026-09-08, mirrors excluded on PyPI.
The axis has to be log
dbt against sqlmesh
Three orchestrators
The new engines, as a share of pandas
JavaScript charts on npm
Your turn
What a download is
A download is a machine fetching a file. That is all. pypistats excludes known mirrors, which I used, but it cannot exclude the things that inflate every count: CI pipelines that rebuild a virtualenv on each push, Docker images that install pandas fresh forty times a day, dependency resolvers that pull pyarrow because something else wanted it, and bots scanning the index. npm is worse; it does not separate mirrors at all, and it reported zero downloads for every package on 14 August and 3 September, and for four of the seven on 11 August too. Those days are in the totals as zeros.
So the number does not measure people. It measures how often a package is installed by anything, and most of that anything is automation. Hover any bar: downloads drop on the weekend, when humans stop pushing commits and the cron jobs keep running. pandas weekends run at 73 percent of weekdays. dagster runs at 36 percent.
What a download does measure, roughly, is how many pipelines a package sits inside. That is a real thing, and it is the thing the discourse forgets.
1,225 to 1
pandas over sqlmesh
30-day PyPI downloads, mirrors excluded
114 to 1
dbt-core over sqlmesh
59.5M against 521K
9.9%
polars as a share of pandas
duckdb is 9.4%
The honest ratios
The top of the Python list is the boring part of the stack. pandas 638 million, pyarrow 382 million, sqlalchemy 372 million, matplotlib 187 million. Those four are 68 percent of everything I fetched from PyPI, and none of them has been the subject of a hot take in years. The log axis in the first scene is not a stylistic choice. On a linear axis sqlmesh is less than one pixel wide next to pandas at any width this page renders.
Transformation is the clearest case. dbt-core did 59.5 million downloads. sqlmesh did 521 thousand. That is 114 to 1, and dbt itself is only a tenth of pandas. I like sqlmesh. The gap is not a verdict on the software. It is a measure of how many pipelines exist that were built before sqlmesh had a 1.0, and pipelines do not migrate because a tool is better.
Orchestrators are the one place the challengers are close. apache-airflow 13.6 million, prefect 10.3 million, dagster 9.0 million. Airflow leads, but the two newer tools together out-download it. I read that as orchestration being the least sticky layer: it holds the least data, so it gets swapped most. It is also the smallest group here. The three combined are under a tenth of pandas.
The new engines are the story I expected to find and did not. polars did 63.4 million and duckdb 60.2 million. Against pandas in the same window that is 9.9 percent and 9.4 percent. Together they are under a fifth of pandas. Both are growing, but “replacing pandas” is a sentence about GitHub stars, not installs.
The JavaScript side
npm tells the same story with different names. recharts did 225 million downloads, d3 76.6 million, chart.js 46.9 million, echarts 18.8 million. Then a cliff: vega-lite 3.4 million, plotly.js 2.7 million, @observablehq/plot 2.3 million.
Recharts out-downloading d3 by about three to one is the CI effect in its purest form. Recharts is a React component library, installed by every dashboard scaffold that lists it, on every build. d3 is what people reach for when they want to draw the chart themselves. The tools with the most careful design thinking, vega-lite and Plot, are 30 to 70 times behind the leader. Quality of grammar is not what gets a library into a lockfile.
The pattern
Put the scenes together and the shape is always the same. The tool people are arguing about is one to two orders of magnitude below the tool it is supposed to replace. The gap closes slowly because downloads follow the installed base of pipelines, and that base only turns over when a pipeline is rewritten. Most are not.
The discourse over-weights novelty because novelty is what there is to say. The registry over-weights incumbency because incumbency is what runs at three in the morning. Neither is the truth, but if I had to bet on which tool will still be maintained and hireable for in five years, I would bet with the registry.
What to do
- Before adopting a tool because the conversation says it has won, pull its download series and the incumbent’s. Look at the ratio, then decide.
- Use the weekend dip as a rough human signal. A package whose weekend downloads collapse is mostly CI. One that holds is being installed by people.
- Treat 30-day totals as a ranking, not a count. The order is reliable. The magnitudes are inflated for everything, and unevenly.
- Re-run scripts/fetch-installs.mjs in six months. The interesting number is not the level. It is whether the ratios moved.
One visual essay, every week.
No roundups, no sponsors. Unsubscribe in one click.