Model or dataset
lukasmasuch/best-of-ml-python avatar
lukasmasuch/best-of-ml-python

best-of-ml-python: A Scored Index of 920 Python ML Projects

🏆 A ranked list of awesome machine learning Python libraries. Updated weekly.

23,807 stars3,154 forksUnknownCC-BY-SA-4.0

At a glance

What is it?
The repository is a generated catalogue, not a library. It ranks 920 open source Python machine learning projects across 34 categories using an automated project-quality score, and it publishes a dated release roughly every week. The value is in the scoring pipeline and the projects.yaml file, not in the rendered README.
Who is it for?
Adopt it as a discovery index if you need a category-scoped shortlist of Python ML libraries and you are willing to treat the ranking as a heuristic rather than a verdict. Do not adopt it as a dependency, a lockfile, or an authority on licence risk: the README itself flags entries with a warning icon for missing or risky licences, which means the list knowingly contains projects you still have to vet yourself.
Can I use it commercially?
Yes, with credit. CC-BY-SA-4.0 allows commercial use as long as you credit the authors and indicate what you changed. It is written for creative content, so check how it applies to any code.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
GitHub does not report a main language for this repository.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What a Ranked Index Solves That a Search Engine Does Not

The problem is not that Python machine learning libraries are hard to find. It is that the set is large enough that search results, blog posts and forum threads return whatever is currently popular rather than what is maintained. This repository takes a different position: it enumerates a fixed set of 920 open source projects, groups them into 34 categories, and orders them by a computed project-quality score rather than by editorial preference. The README states the total plainly: 920 projects, 5.1M stars combined, 34 categories.

The audience is narrow and specific. It is an engineer starting a new component who needs to know which of several plausible libraries is actually alive, or a reviewer who wants a category-scoped shortlist instead of a blank page. It is also useful for the reverse case: confirming that a library you already depend on is flagged as inactive or dead, which the explanation section defines as six months and twelve months without activity respectively. That definition is the most operationally useful thing in the README, because it converts a vague feeling about a dependency into a dated threshold.

It is not a tutorial, not a comparison of APIs, and not a benchmark. Nothing in the material suggests the ranking reflects runtime performance, accuracy, or ease of use. It reflects collected repository and package-manager metrics.

How the Project-Quality Score and the Badge Set Work Together

The mechanism described is a generated list. Metrics are collected automatically from GitHub and from different package managers, combined into a project-quality score, and the projects are sorted by that score within each category. The README does not publish the weights or the formula, so the ordering is a black box from the outside. That is the central limitation of the whole project and it deserves to be stated up front rather than buried.

What is published is the badge vocabulary, and it is more informative than the score itself. Each entry can carry a medal for the combined quality score, a star count, a new-project marker for anything under six months old, an inactive marker at six months, a dead marker at twelve months, a trending-up or trending-down arrow, a recently-added marker, and a warning icon for a missing or risky licence. Contributor count, fork count, issue count, last package-manager update timestamp, download count and dependent-project count are all listed per project.

The per-project detail block is where the real data lives. In the Tensorflow entry, for example, the README shows three separate install routes with their own numbers: a git clone from GitHub, a pip install from PyPI, and a conda install from conda-forge, each with its own last-update timestamp and download figure. That structure is repeated across entries, and it is the part worth reading. The rank tells you where a project sits. The timestamps and the dependent-project count tell you whether it is still moving.

The Weekly Release Cadence and What a Dated Tag Means

Releases are named by date rather than by semantic version. The recent tags in the material are 2025.10.30, 2025.10.23 and 2025.10.16, each published within a day or two of the date in its name. That is a snapshot convention, not a versioning scheme, and it has a practical consequence: pinning to a tag pins the entire catalogue as it stood that week, including every score and every inactivity flag.

This matters if you consume the list programmatically. A tag named 2025.10.30 tells you the state of the data on that date. It does not tell you anything about compatibility, and there is no notion of a breaking change, because nothing in the repository is a runtime dependency. The weekly interval also sets the resolution of the inactivity markers. A project that went quiet five weeks ago will not be flagged inactive yet, and one that crossed the six-month line will flip on the next run. If you are using the flags to make a decision, the flag is only as fresh as the most recent tag.

The repository has not been archived and the last push recorded is 2026-09-10, which is consistent with a project that is still being regenerated on schedule rather than one that was published once and abandoned.

Contributing Through projects.yaml Instead of the README

The README is generated output. The editable source is projects.yaml, and the README links directly to an edit URL for it on the main branch. That distinction shapes how you contribute and how you review changes. Editing the rendered README would be editing a build artifact; the intended path is to change the YAML, or to open an issue or a pull request against the repository.

This is a sensible design for a list of this size. A YAML file is diffable, it can be validated, and it is the natural input for a generator that pulls metrics and emits the markdown. It also means the categories, the descriptions and the membership of the list are all reviewable in one place rather than scattered across hundreds of README edits.

The cost is that the README alone does not tell you why a project sits where it does. The YAML holds the input, the score holds the output, and the formula connecting them is not documented in the material available. If you disagree with a ranking, you cannot point at a weight and argue about it. You can only add a project, correct its metadata, or argue that the underlying metrics are the wrong ones. That is a real gap for a project whose entire premise is a ranking.

Category Coverage Is Uneven, and the Counts Show It

The category list is the most concrete evidence of where the maintainers have invested effort, and it is not balanced. Text Data and NLP has 103 projects. Machine Learning Frameworks has 64, Data Visualization has 55, Model Interpretability has 55, and Hyperparameter Optimization and AutoML has 52. Then the tail drops sharply: Data Containers and Structures has 1 project, Data Loading and Extraction has 1, Web Scraping and Crawling has 1, and Database Clients has 1. Data Pipelines and Streaming has 2.

A category with a single entry is not a ranking. It is a placeholder, and treating it as a recommendation would be a mistake. The explanation section notes that entries can be marked as recently added, which suggests those thin categories are being grown incrementally rather than deliberately kept small. But as of the current README, a reader looking for a database client or a data-loading library gets one option and no basis for comparison, while a reader looking for an NLP library gets 103 options sorted by an undisclosed score.

The imbalance is worth knowing before you browse. The useful part of this list is the dense middle: frameworks, visualization, NLP, image data at 64, workflow and experiment tracking at 40, distributed machine learning at 36, and PyTorch utilities at 32. Those are the categories where a ranked shortlist actually saves time.

Where the Index Breaks Down as a Decision Tool

The score is computed from collected metrics, and metrics favour projects that are already large. Star count, fork count, contributor count and dependent-project count all correlate with age and visibility. A well-designed library that is two years old and used inside one company will rank below a sprawling project with a wide dependency footprint. The new-project marker partly compensates by labelling anything under six months, but labelling is not the same as weighting, and the README does not say whether new projects are scored differently.

The licence warning is the second failure mode, and it cuts the other way. The explanation section defines the warning icon as covering a missing or risky licence, which means the list deliberately includes projects whose licensing you cannot take for granted. A reader who skims for a high-ranked entry and installs it has skipped the one signal that most needs a follow-up. The badge is a prompt to check, not a clearance.

The third case is the wrong-tool case: if you already know which library you want and you need to know whether it handles a specific workload, this repository will not help. It has no API comparisons, no performance data, and no notes on which framework a project integrates with beyond a set of small framework icons for Tensorflow, Sklearn, PyTorch, MxNet, Spark, Jupyter, PaddlePaddle, Pandas and Jax. Those icons tell you ecosystem alignment. They do not tell you whether the library does what you need.

How It Differs From a Hand-Curated Awesome List

The obvious alternative is a conventional awesome list: a markdown file of links, grouped by topic, maintained by hand. The difference in approach is the ranking. A hand-curated list asserts that everything on it is worth knowing and leaves the ordering to the author's taste or to alphabetical accident. This repository asserts an ordering, computes it from metrics, and republishes it weekly so the ordering changes over time.

That is a genuine trade. You gain a signal about maintenance activity that a static link list does not carry, and you gain the dated snapshots that let you see the list change. You lose the editorial judgement that comes from someone having actually used the libraries, and you inherit the metric bias described above. A hand-curated list can tell you that a library is elegant but under-documented. A computed score cannot, because neither elegance nor documentation quality is in the badge set.

The other structural difference is scale. A hand-maintained list of 920 entries across 34 categories would rot quickly. Automating the collection is what makes the size sustainable, and the weekly release cadence is the evidence that it is being sustained. The trade is coverage and freshness in exchange for a ranking you cannot inspect.

Licence, Maintenance Cost, and What to Check Before Relying on It

The repository is licensed CC-BY-SA-4.0. That is a content licence, which fits a catalogue, and it carries a share-alike condition: if you republish or adapt the list, the adapted material is expected to carry the same licence. The individual projects listed are not covered by that licence. Each has its own, shown per entry as a short identifier such as Apache-2 in the Tensorflow block, and the warning icon exists precisely because some entries are missing one or carry one the maintainers consider risky. Checking the licence of a listed project is your responsibility, and nothing here is legal advice.

Maintenance cost on your side is close to zero if you read the rendered list, because the upstream project regenerates it weekly and publishes dated tags. If you consume it programmatically, the cost is the cost of tracking a snapshot format that is named by date and has no compatibility contract. There is no library to upgrade and no API to break.

The cost on the upstream side is the interesting one, and the material only lets you infer it. Collecting metrics from GitHub and multiple package managers for 920 projects, then regenerating and releasing weekly, is a scheduled pipeline that has to keep working. The dated releases through late 2025 and the push recorded in September 2026 are the only evidence available that it has. Before relying on a specific category, open projects.yaml on main and read the entries directly, then cross-check the per-project timestamps and the inactive or dead markers against the current tag. If a category you need is one of the single-entry ones, this list is not the tool for that decision.

Editorial conclusion

Adopt it as a discovery index if you need a category-scoped shortlist of Python ML libraries and you are willing to treat the ranking as a heuristic rather than a verdict. Do not adopt it as a dependency, a lockfile, or an authority on licence risk: the README itself flags entries with a warning icon for missing or risky licences, which means the list knowingly contains projects you still have to vet yourself. Before trusting a category, open projects.yaml on main, find the entries you care about, and check the per-project package-manager timestamps and the inactive or dead markers, because the score is computed from collected metrics and the badges are the only place those raw signals surface.

Official sources

  1. License: CC-BY-SA-4.0
  2. lukasmasuch/best-of-ml-python on GitHub
  3. Project website
  4. README
  5. Releases
Community notes

Community notes