Library / SDK
scikit-bio/scikit-bio avatar
scikit-bio/scikit-bio

scikit-bio is the shared Python layer under QIIME 2, Qiita and Emperor

scikit-bio: a community-driven Python library for bioinformatics, providing versatile data structures, algorithms and educational resources.

1,254 stars359 forksPythonBSD-3-Clause

At a glance

What is it?
scikit-bio is a BSD-licensed Python 3 package of data structures, algorithms and educational resources for bioinformatics, descended from PyCogent and QIIME, and it is now the common layer that projects like QIIME 2, Qiita and Emperor build on. It fits a bioinformatics developer who wants sequence, phylogeny, statistics and omics primitives in one library, and it does not fit someone who only needs to read a FASTQ file.
Who is it for?
scikit-bio fits a bioinformatics developer or a platform team that needs sequence, phylogeny, compositional and statistical primitives in one maintained package, and it does not fit a project that only needs to read one file format.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

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

Editorial analysis

A library that started as two other projects and kept both licences

scikit-bio describes itself as an open-source, BSD-licensed Python 3 package providing data structures, algorithms and educational resources for bioinformatics, and the pre-history section explains where it came from.

It began from code derived from PyCogent and QIIME, and the contributors and copyright holders agreed to make the code they wrote for PyCogent and QIIME available under the BSD license. The README lists the contributors to the PyCogent and QIIME modules that were ported, a long list including Rob Knight, Gavin Huttley, Daniel McDonald, Greg Caporaso, Cathy Lozupone, Mike Robeson and Justin Kuczynski among many others.

That provenance explains the shape of the library. A project that absorbs two mature codebases inherits their domain model, their testing habits and their quirks, and it also inherits a long tail of algorithms that were useful in 2013 and are still there. The repository topics reflect the accumulated surface area, with compositional-data, computational-biology, metagenomics, microbiome, multivariate-analysis, omics, phylogenetics, sequence-alignment, and education and reproducibility as the standout entries.

The current release is 0.7.4 from 2026-09-21, with 0.7.3 in June 2026 and 0.7.2 in February 2026, and it is compatible with Python 3.10 and above. The last push was on 2026-10-15.

Installing it is a conda or pip line, and the dependency stack is heavy

The installation section offers conda as the first option:

code
conda install -c conda-forge scikit-bio

or pip:

code
pip install scikit-bio

The pyproject.toml declares the runtime dependencies, and the list explains the domain coverage. numpy at 2.0 or later and scipy at 1.9.0 or later cover the numerical core, pandas at 1.5.0 or later covers tabular data, statsmodels at 0.14.0 or later and patsy at 0.5.0 or later cover statistical modelling, h5py at 3.6.0 or later covers the HDF5 format, biom-format at 2.1.16 or later handles the BIOM format used for biological data tables, array-api-compat at 1.3 or later provides the array API compatibility layer, requests at 2.20.0 or later handles network access, and decorator at 3.4.2 or later provides the decorator machinery.

That is a large stack, and it is worth being honest about the consequence. Installing scikit-bio into an environment that already has a working scientific stack is unremarkable. Installing it into a minimal application environment pulls in pandas, scipy and statsmodels, which is a real cost in a container image or a serverless function.

The build system is also not pure Python. The build requires setuptools, wheel, numpy and cython, and the setup.py imports Cython's build tooling and cythonize, then does compiler detection including a check for OpenMP support with a note that Apple and macOS clang does not support omp. The library uses OpenMP during the build where the compiler supports it.

The classifiers list Python 3.10 through 3.14, and the operating systems are Unix, POSIX, MacOS X and Windows. The development status is 4 - Beta, which is a fair signal about the API stability a dependent project should expect.

The adoption list is the real argument for the library

The Adoption section lists projects known to use scikit-bio, and the names carry the argument better than any description of the feature set could.

QIIME 2 is the flagship, the microbiome analysis platform built on the QIIME framework that scikit-bio itself descends from. Qiita is the web platform for microbiome and genomics data analysis. Emperor is the 3D phylogenetic visualisation tool from the same BioCore organisation. tax2tree and ghost-tree are tree-building and tree-visualisation tools. Platypus-Conquistador is from BioCore as well, and An Introduction to Applied Bioinformatics is an educational resource that uses the library.

The pattern is that a small number of widely used platforms depend on it, and the dependency is mutual. QIIME 2 is the reason the library exists in its current form, and the library is what lets a dozen downstream tools share one implementation of sequence handling, alignment and phylogenetics instead of each writing its own.

For an engineer choosing a library, that is the most valuable information in the README. A bioinformatics package used by QIIME 2, Qiita and Emperor has a much longer expected life than one used by a single lab, because the platforms that depend on it have their own release cycles and their own users who file issues upstream.

The citation section backs this up. If you use scikit-bio for published research you are asked to cite Aton, McDonald, Canardo Alastuey and colleagues, Scikit-bio: a fundamental Python library for biological omic data analysis, published in Nature Methods in 2025, with a DOI and a full text link. A paper in a methods journal is a stronger durability signal than any number of commits.

The team is four people and the funding is one grant

The Team section names a small group, and the specificity is useful.

The core development team consists of three lead developers, Dr. Qiyun Zhu at Arizona State University, Dr. James Morton at Gutz Analytics, and Dr. Daniel McDonald at the University of California San Diego, plus one dedicated software engineer, Matthew Aton at ASU. Dr. Rob Knight at UCSD provides guidance on development and research, and Dr. Greg Caporaso at Northern Arizona University, the former leader of the project, serves as an advisor.

The Funding section says the development is currently supported by the U.S. Department of Energy, Office of Science under award number DE-SC0024320, awarded to Dr. Qiyun Zhu at ASU as lead PI, Dr. James Morton at Gutz Analytics, and Dr. Rob Knight at UCSD. A single federal grant with three named recipients is a different funding shape from a company with a commercial product, and it has a different implication: the timeline of the grant is the timeline of the project, and when it ends, the maintenance question is a question for the individuals rather than for a company with revenue.

The collaboration section points collaboration inquiries at Dr. Qiyun Zhu at an ASU address and states that academic and industrial partnerships are welcome, which is the more honest framing of what a research-funded library can offer. The logo was created by Alina Prassas, with the vector and bitmap files in the logos directory, and the README closes by welcoming contributors and pointing at the contributor's guidelines.

The test setup simulates a user install, which is the interesting part

The Makefile is short and one of its targets has a comment that explains a testing philosophy rather than a command.

The test target does this:

code
test:
	cd ci && $(TEST_COMMAND)

The comment explains why. It changes into a directory that is different from the scikit-bio root directory to simulate a user's install and testing of scikit-bio. Running from the root directory will find the skbio subpackage, and not necessarily the installed one, because cwd is considered in Python's search path. It is important to simulate a user's install and test process this way to find package data that did not install correctly.

That is a small piece of engineering discipline that avoids a common packaging failure. A library whose data files are not installed correctly works perfectly when tested from its own source tree and breaks the moment somebody installs it from a wheel. The CI deliberately runs from outside the tree to catch exactly that.

The rest of the Makefile covers the usual ground. The TEST_COMMAND is python -m skbio.test, or a coverage run when WITH_COVERAGE is TRUE, and both point at the pyproject.toml for the coverage configuration. The lint target runs ruff check on skbio, setup.py and checklist.py, then runs the project's own checklist.py script, then check-manifest, which verifies that the MANIFEST.in covers everything in the distribution. The doc and web targets build the Sphinx documentation in doc/ and the website in web/. The install and dev targets are pip install . and pip install -e .

The repository layout matches: skbio/ is the package, doc/ and web/ are the two documentation builds, licenses/ holds the third-party licences, and checklist.py is the project's own convention checker.

Where scikit-bio is the wrong tool

The first wrong-tool case is a narrow script. If the job is to parse a FASTQ file, count reads, or pull a few fields out of a BAM file, the scientific stack that scikit-bio pulls in is a large price for a small task. The standard library and a format-specific reader will do it with a fraction of the dependencies, and a script that runs in a CI container benefits from that.

The second is a project where API stability across the 0.x line is the deciding factor. The development status is 4 - Beta, the version is 0.7.4, and the release cadence is a few per year with changes across the package. Anything that depends on scikit-bio is depending on a package that has not committed to a stable interface, and a platform team supporting many downstream users has to plan for that. The version history shows steady progress rather than churn, which is a fair sign, but it is still pre-1.0.

The third is the scope mismatch in either direction. A domain with a mature, specialised package, say one focused on metagenomics or on variant calling, will usually have better coverage in the specialist tool, and scikit-bio is a general layer rather than a deep one. The same applies on the other side, where a general data science stack already includes pandas, scipy and statsmodels and only needs the biological data structures on top.

The fourth is the funding shape again. One Office of Science award with three recipients is real money and real credibility, and it is also a single point of failure for the maintenance of a library that a dozen other platforms depend on. A team adopting it should be comfortable with that, and should watch the release history rather than assume the current version is a stable base.

Editorial conclusion

scikit-bio fits a bioinformatics developer or a platform team that needs sequence, phylogeny, compositional and statistical primitives in one maintained package, and it does not fit a project that only needs to read one file format. Before adopting it, check that the algorithms you need are in scope for the current release rather than assuming the API is stable, because the project is at 0.7.4 and is classified as Beta, and note that the installation pulls in a substantial scientific stack including numpy, scipy, pandas, statsmodels and h5py.

Frequently asked questions

How do I install scikit-bio?

Install the latest release with conda install -c conda-forge scikit-bio, or with pip install scikit-bio. The latest release is 0.7.4, compatible with Python 3.10 and above, and further platform instructions are on the project install page.

Which projects use scikit-bio?

The project lists QIIME 2, Qiita, Emperor, tax2tree, ghost-tree, Platypus-Conquistador and An Introduction to Applied Bioinformatics among the projects known to use it. Its own pre-history is code derived from PyCogent and QIIME, released under the BSD licence.

What does scikit-bio depend on?

The runtime dependencies include numpy 2.0 or later, scipy, pandas, statsmodels, patsy, h5py, biom-format, array-api-compat, requests and decorator. The build also requires setuptools, wheel, numpy and cython, and the setup.py uses Cython and enables OpenMP where the compiler supports it.

Is scikit-bio's API stable?

The project is classified as Development Status 4 - Beta and is at version 0.7.4, released 2026-09-21. For published research the project asks you to cite the Nature Methods paper, Scikit-bio: a fundamental Python library for biological omic data analysis.

Official sources

  1. License: BSD-3-Clause
  2. Project website
  3. README
  4. Releases
  5. scikit-bio/scikit-bio on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/scikit-bio-scikit-bio.svg)](https://hysenlabs.com/projects/scikit-bio-scikit-bio)

Was this useful?