sirna-data-grabber
A standalone siRNA knockdown-efficacy dataset: the raw data files, full
provenance/license documentation, and a small reusable Python package
(sirna_data) for loading it -- and, since pip install sirna-data-grabber
alone can't ship most of this non-commercial data, a bundled sirna-data-fetch
command that re-fetches it from its original sources. Any project that wants
this dataset can depend on this repo (or just the PyPI package) rather than
vendoring a copy of the data or the loading code.
Currently: 18,072 siRNA records across 113 genes (load_records()
default). Every source is individually toggleable via its own include_<data-source>
flag -- see data/DATA_SOURCES.md for the
per-source breakdown and audit.
Data sources at a glance
| Source | Published | siRNAs | Genes | License |
|---|---|---|---|---|
| siRNAEfficacyDB (Zhang et al.) | 2024 | 3,532 | 41 | CC BY-NC |
| CMsiRNAdb (He et al.) | 2026 | 12,357 | 13 | CC BY-NC-ND 4.0 |
| Shabalina, Spiridonov & Ogurtsov | 2006 | 269 | 41 | CC BY 2.0 |
| Martinelli / sirna-reproduction | 2023 | 577 | 12 | CC BY-NC 4.0 |
| Davis, Monopoli et al. (NAR gkaf479) | 2025 | 966 | 4 | CC BY 4.0 |
| Monopoli, Korkin & Khvorova | 2023 | 20 | 4 | CC BY 4.0 |
| PDCD1 panel (Xu, Zhao et al. / siRNABERT) | 2024 | 8 | 1 | none stated -- unresolved1 |
| OligoGraph repo (Sciabola 2013 + Harborth 2001) | 2013/2001 | 343 | 3 | none stated -- unresolved1 |
| Total | 18,072 | 113 |
"Published" is the year of the paper/database each source comes from, not
when it was added here -- see data/DATA_SOURCES.md
for full citations, license terms, and how each source's data was verified.
"Genes" is how many distinct genes/reporters that source contributes to this
dataset; some genes (e.g. APP, MAPT) are covered by more than one
source, so the per-source counts don't sum to the 113 total. CMsiRNAdb's
count combines its PCSK9 subset and the other-12-genes addition (same
underlying paper) -- see the gene-level table below for the split. Davis
2025 and Monopoli 2023 are from the same lab and cover the same 4 genes
(APP/MAPT/BACE1/SNCA) -- Davis 2025's 966 is already net of
deduping against Monopoli 2023 and CMsiRNAdb (full) by exact sequence.
Genes in this dataset
All 113 genes currently in load_records()'s default output, the source
dataset(s) each came from, how many siRNA records target that gene, and the
length of the real mRNA/GenBank transcript its target sites were located in.
Computed directly from the fetched data/raw/ files, not hand-maintained --
for genes with more than one distinct transcript accession across records
(marked 2), the length shown is for the one used by the most records.
Show all 113 genes
| Gene | Source dataset | siRNAs | Transcript length (nt) |
|---|---|---|---|
| ACP5 | Martinelli 2023 / sirna-reproduction | 32 | 1,683 |
| AGT | CMsiRNAdb (full) | 872 | 2,148 2 |
| AKT1 | Shabalina 2006 | 5 | 3,008 |
| AKT2 | Shabalina 2006 | 4 | 5,250 |
| ALPG | Shabalina 2006 | 11 | 2,492 |
| ANGPTL3 | CMsiRNAdb (full) | 551 | 2,926 2 |
| APOB | Martinelli 2023 / sirna-reproduction | 34 | 14,121 |
| APP | CMsiRNAdb (full) + Monopoli 2023 + Davis 2025 | 1,244 | 3,358 2 |
| BACE1 | Monopoli 2023 + Davis 2025 | 183 | 5,835 |
| C6orf110 | siRNAEfficacyDB | 145 | 3,465 |
| Cacnb1 | siRNAEfficacyDB | 46 | 3,393 |
| CASR_rhesus | Martinelli 2023 / sirna-reproduction | 68 | 3,144 |
| CBL | Shabalina 2006 | 5 | 11,168 |
| CBLB | Shabalina 2006 | 5 | 3,354 |
| CDC34 | siRNAEfficacyDB | 57 | 1,418 |
| CDKN1A | Shabalina 2006 | 5 | 2,117 |
| CDKN1B | Martinelli 2023 / sirna-reproduction | 60 | 2,410 |
| CSK | Shabalina 2006 | 5 | 2,743 |
| CTNNB1 | CMsiRNAdb (full) | 352 | 3,488 |
| Cyclophilin B | siRNAEfficacyDB | 90 | 851 |
| DAD1 | Shabalina 2006 | 5 | 684 |
| DBI | siRNAEfficacyDB | 9 | 675 |
| EGFP | Martinelli 2023 / sirna-reproduction | 74 | 1,470 |
| EGFP3 | siRNAEfficacyDB | 702 | N/A 4 |
| EIF4EBP1 | Shabalina 2006 | 4 | 827 |
| F3_human | Shabalina 2006 | 14 | 2,104 |
| F3_mouse | Shabalina 2006 | 10 | 1,821 |
| Firefly luciferase | siRNAEfficacyDB | 87 | 2,387 |
| FireflyLuc | siRNAEfficacyDB | 46 | 2,387 2 |
| FLJ11011 | siRNAEfficacyDB | 78 | 8,412 |
| FLJ16071 | Shabalina 2006 | 14 | 2,773 |
| FOXO1 | Shabalina 2006 | 5 | 5,779 |
| FOXO4 | Shabalina 2006 | 5 | 3,644 |
| Fxyd6 | siRNAEfficacyDB | 72 | 1,766 |
| FYN | Shabalina 2006 | 5 | 3,628 |
| GAPDH | siRNAEfficacyDB | 20 | 1,285 |
| GSK3A | Shabalina 2006 | 5 | 2,193 |
| GSK3B | Shabalina 2006 | 5 | 7,782 |
| HIF1A | OligoGraph repo (Sciabola 2013) | 100 | 3,946 |
| HIP2 | siRNAEfficacyDB | 79 | 5,153 |
| HK2 | OligoGraph repo (Sciabola 2013) | 95 | 5,624 |
| HPSE | OligoGraph repo (Sciabola 2013) | 105 | 4,669 |
| HRAS | Shabalina 2006 | 10 | 570 |
| HSD17B13 | CMsiRNAdb (full) | 1,985 | 2,260 2 |
| HSPC150 | siRNAEfficacyDB | 77 | 878 |
| ICAM-1 | siRNAEfficacyDB | 40 | 2,986 |
| IGF1R | Shabalina 2006 | 21 | 12,235 |
| ILK | Shabalina 2006 | 5 | 1,759 |
| INHBE | CMsiRNAdb (full) | 670 | 2,460 2 |
| IRS1 | Shabalina 2006 | 5 | 9,771 |
| ITGB1 | Shabalina 2006 | 5 | 3,735 |
| KAZRIN | Martinelli 2023 / sirna-reproduction | 39 | 2,641 |
| Lamin A | siRNAEfficacyDB + OligoGraph repo (Harborth 2001) | 87 | 9,756 2 |
| LPA | CMsiRNAdb (full) | 556 | 6,431 2 |
| Luciferase_firefly | Martinelli 2023 / sirna-reproduction | 122 | 6,047 2 |
| Luciferase_renilla | Martinelli 2023 / sirna-reproduction | 43 | 1,969 |
| LYPD1 | Shabalina 2006 | 14 | 3,458 |
| MAPK14 | Shabalina 2006 | 8 | 4,222 |
| MAPT | CMsiRNAdb (full) + Monopoli 2023 + Davis 2025 | 917 | 6,816 2 |
| MARC1 | CMsiRNAdb (full) | 823 | 1,020 2 |
| MIR155HG | Martinelli 2023 / sirna-reproduction | 42 | 1,500 |
| MMAC1 | siRNAEfficacyDB | 36 | 3,160 |
| Mmp7 | siRNAEfficacyDB | 150 | 1,043 |
| MSTN | CMsiRNAdb (full) | 9 | 2,705 2 |
| MYC | Shabalina 2006 | 5 | 3,721 |
| MyoD | Shabalina 2006 | 5 | 1,833 |
| NOG | siRNAEfficacyDB | 71 | 1,913 |
| NPY | Martinelli 2023 / sirna-reproduction | 8 | 567 |
| P2rx2 | siRNAEfficacyDB | 77 | 1,833 |
| P2RX3 | siRNAEfficacyDB | 90 | 3,792 |
| PAC | Shabalina 2006 | 10 | 906 |
| PCSK9 | CMsiRNAdb (PCSK9) | 2,756 | 3,637 |
| PDCD1 | siRNABERT PDCD1 panel (Xu/Zhao 2024) | 8 | 2,097 |
| PDPK1 | Shabalina 2006 | 5 | 7,184 |
| PIK3CA | Shabalina 2006 | 5 | 9,259 |
| PIK3R1 | Shabalina 2006 | 5 | 3,371 |
| PIK3R2 | Shabalina 2006 | 5 | 3,980 |
| PLK | siRNAEfficacyDB | 10 | 2,123 |
| PLN | CMsiRNAdb (full) | 135 | 2,480 |
| PNPLA3 | CMsiRNAdb (full) | 2,066 | 2,753 2 |
| PSKH1 | Shabalina 2006 | 4 | 3,460 |
| RAB13 | Shabalina 2006 | 5 | 1,164 |
| RAB6IP1 | siRNAEfficacyDB | 126 | 4,991 |
| RB1 | Shabalina 2006 | 5 | 4,768 |
| RPS6 | Shabalina 2006 | 5 | 1,369 |
| RPS6KA1 | Shabalina 2006 | 5 | 3,192 |
| RPS6KA3 | Shabalina 2006 | 5 | 7,987 |
| SEAP | siRNAEfficacyDB | 17 | 2,754 2 |
| SEPTIN2 | Shabalina 2006 | 5 | 3,251 |
| SKP1 | Shabalina 2006 | 5 | 2,616 |
| SNCA | Monopoli 2023 + Davis 2025 | 224 | 3,177 |
| SOD2_chimp | Martinelli 2023 / sirna-reproduction | 51 | 600 |
| SOST | siRNAEfficacyDB | 75 | 2,296 |
| TC10 | siRNAEfficacyDB | 67 | 4,780 |
| TCAP | siRNAEfficacyDB | 144 | 1,532 |
| TSC1 | Shabalina 2006 | 5 | 8,598 |
| TSC2 | Shabalina 2006 | 5 | 6,415 |
| UBE2B | siRNAEfficacyDB | 79 | 2,241 |
| UBE2C | siRNAEfficacyDB | 76 | 777 |
| UBE2D3 | siRNAEfficacyDB | 78 | 3,976 |
| UBE2E3 | siRNAEfficacyDB | 79 | 1,555 |
| UBE2G1 | siRNAEfficacyDB | 79 | 4,167 |
| UBE2H | siRNAEfficacyDB | 70 | 5,162 |
| UBE2I | siRNAEfficacyDB | 64 | 2,850 |
| UBE2J1 | siRNAEfficacyDB | 49 | 4,164 |
| UBE2L3 | siRNAEfficacyDB | 53 | 2,861 |
| UBE2L6 | siRNAEfficacyDB | 72 | 1,219 |
| UBE2M | siRNAEfficacyDB | 76 | 1,159 |
| UBE2N | siRNAEfficacyDB | 79 | 4,877 |
| UBE2S | siRNAEfficacyDB | 79 | 2,559 |
| UBE2V1 | siRNAEfficacyDB | 74 | 2,539 |
| Ufc1 | siRNAEfficacyDB | 70 | 888 |
| VEGFA | Martinelli 2023 / sirna-reproduction | 4 | 3,660 |
License
The code in this repo (sirna_data, tests/) is MIT licensed — see
LICENSE. Use it, modify it, ship it commercially, whatever you
want.
The data in data/raw/ is NOT covered by that license. It's redistributed
under each original source's own terms, and most of those sources are
non-commercial only (CC BY-NC / CC BY-NC-ND). Loading the data with this
permissively-licensed code does not lift those restrictions — you still have
to comply with them separately. See NOTICE.md for the
per-source summary and data/DATA_SOURCES.md for
full terms before using the data itself, especially commercially.
The same per-source table is available in code (sirna_data.list_sources()),
and load_records(licenses=[...]) loads only the sources carrying the
licenses you name -- see Loading only the licenses you can
use.
What's here
LICENSE MIT license -- covers the code only, not data/raw/
NOTICE.md per-source data license summary (see License section above)
data/
raw/ fetched CSVs + FASTA transcripts (the actual dataset)
DATA_SOURCES.md full provenance, license terms, and trainable-data
audit for every source (including CMsiRNAdb full-
database retrieval and the siRecords dedup analysis)
POTENTIAL_DATA_SOURCES.md landscape of sources investigated
data_source_ledger.csv machine-readable companion to DATA_SOURCES.md
*.png figures referenced by the docs above
src/sirna_data/
raw_loader.py load + merge every source into SiRNARecord rows
genes.py list_genes / describe_genes -- what genes are available to load
licenses.py machine-readable per-source data-license table (load_records(licenses=...))
ncbi_fetch.py fetch a gene's RefSeq mRNA transcript by symbol
sequence_utils.py DNA/RNA sequence helpers (to_rna, to_dna, transcribe_template_to_mrna)
splitting.py train_test_split / leave_n_genes_out dataset splitters
evaluation.py evaluate_predictions + PredictionMetrics/GeneCorrelation
rank_confidence.py probability/confidence model for "how many top-K predictions to check"
rank_confidence_cli.py `sirna-rank-confidence` entry point ([project.scripts])
rank_confidence_plot.py optional matplotlib plotting for rank_confidence (requires [plot] extra)
rank_confidence_plot_cli.py `sirna-rank-confidence-plot` entry point ([project.scripts], requires [plot] extra)
__init__.py public API
fetch/ sirna-data-fetch CLI + per-source fetchers (see Install below)
cli.py `sirna-data-fetch` entry point ([project.scripts])
sirna_efficacy.py siRNAEfficacyDB + NCBI -> sirna_efficacy.csv, mrna_transcripts.fasta
monopoli.py Monopoli et al. 2023 supplementary data -> monopoli_*
shabalina.py Shabalina et al. 2006 supplementary data -> shabalina_*
cmsirnadb.py CMsiRNAdb + NCBI -> cmsirnadb_full_raw.tsv, cmsirnadb*_transcripts.fasta
tests/
test_raw_loader.py unit tests for raw_loader.py (fixtures, no real data needed)
test_genes.py unit tests for genes.py
test_licenses.py unit tests for licenses.py (incl. registry/loader sync check)
test_ncbi_fetch.py unit tests for ncbi_fetch.py (mocked HTTP calls)
test_fetch_cli.py unit tests for fetch/cli.py
test_sequence_utils.py unit tests for sequence_utils.py
test_splitting.py unit tests for splitting.py
test_evaluation.py unit tests for evaluation.py
test_rank_confidence.py unit tests for rank_confidence.py
test_rank_confidence_cli.py unit tests for rank_confidence_cli.py
test_rank_confidence_plot.py unit tests for rank_confidence_plot.py (skipped without the [plot] extra)
test_rank_confidence_plot_cli.py unit tests for rank_confidence_plot_cli.py (skipped without the [plot] extra)
conftest.py shared pytest fixtures
Start with data/DATA_SOURCES.md for what's in the
dataset, where it came from, and the bottom-line audit (7,505 trainable
records across 103 genes, 7 sources — 18,072 records / 113 genes if the
optional CMsiRNAdb full-database retrieval and Davis2025 are also
included). Primary source is siRNAEfficacyDB (Zhang et al. 2024, CC
BY-NC); see the docs for the rest and their individual license terms
before reusing this data outside this project.
Install
sirna-data-grabber is on PyPI,
so most users just need:
pip install sirna-data-grabber
That installs the sirna_data package plus the sirna-data-fetch command
(no extras needed). Since the PyPI package can't ship most of this
non-commercial data, use sirna-data-fetch to reconstruct it from its
original sources into a local directory:
sirna-data-fetch --dest ./my_data
Then point sirna_data at that directory. Two equivalent ways to do this --
pass it directly, no env var needed:
from sirna_data import load_records
records = load_records(data_dir="./my_data")
or export it once as SIRNA_DATA_DIR and call load_records() with no
arguments:
export SIRNA_DATA_DIR=./my_data
sirna-data-fetch --only sirna_efficacy monopoli fetches a subset instead of
all four sources; see sirna-data-fetch --help.
From a git checkout
If you're working from this repo instead (e.g. to browse data/raw/ and the
provenance docs alongside the code, or to contribute):
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
This installs sirna_data in editable mode, so it resolves data/raw/
relative to the checkout automatically -- no sirna-data-fetch,
SIRNA_DATA_DIR, or data_dir needed if data/raw/ already has the files.
If you copy the data/ folder somewhere else, point at it with either
data_dir or SIRNA_DATA_DIR as shown above.
Usage
from sirna_data import load_records, fetch_mrna_by_gene
records = load_records() # reads from data_dir / SIRNA_DATA_DIR / default data/raw/, in that order
print(len(records), "records across", len({r.gene for r in records}), "genes")
r = records[0]
r.guide_seq # siRNA antisense strand
r.mrna_window # local mRNA context around the real target site
r.label # experimental %knockdown / %inhibition
r.source # provenance, e.g. "siRNAEfficacyDB"
# Chemical modification (most records are standard/unmodified; a minority
# -- currently CMsiRNAdb, Monopoli2023, Martinelli_sirna_reproduction, and
# Davis2025 -- are chemically modified):
r.is_modified # bool
r.modification_chemistry # short summary, e.g. "2'-OMe/2'-F/PS-backbone (per-position, CMsiRNAdb)"
r.sense_modifications # per-position modified-nucleoside name or None; CMsiRNAdb only
r.antisense_modifications # same, for the guide strand
# Look up any gene's RefSeq transcript live from NCBI:
transcript = fetch_mrna_by_gene("TP53")
transcript.accession, transcript.sequence
load_records() takes include_sirna_efficacy / include_monopoli /
include_pdcd1 / include_shabalina / include_martinelli /
include_cmsirnadb / include_cmsirnadb_full / include_davis2025 flags
(all default True) to include or exclude any individual source.
data_dir (a Path or str) points every source at a specific directory of
fetched files, as a plain function argument -- no SIRNA_DATA_DIR export
required. It falls back to SIRNA_DATA_DIR if set, then the package's
default relative data/raw/ location, in that order.
Listing the genes available to load
from sirna_data import list_genes, describe_genes
list_genes() # ['ACP5', 'AGT', 'AKT1', ...] -- all 113, sorted
len(list_genes()) # 113
# same thing with per-gene detail:
for info in describe_genes():
info.gene # 'APP'
info.n_records # 1244
info.sources # ('CMsiRNAdb_full', 'Davis2025', 'Monopoli2023')
info.licenses # ('CC BY 4.0', 'CC BY-NC-ND 4.0') -- mixed: see below
info.accessions # ('NM_000484', 'NM_001198823', ...)
Both are computed from the actual fetched data files rather than a
hardcoded table, so they can't go stale, and both accept every
load_records() argument -- list_genes(licenses=["CC BY 4.0"]),
list_genes(include_cmsirnadb_full=False), list_genes(data_dir="./my_data")
-- so you can ask what a given subset contains before loading it. Since
that means a full load under the hood, pass records you already have to
skip it: list_genes(records).
Gene strings are the raw sources' own, not normalized -- "EGFP" and
"EGFP " stay two entries, for the reason in the gene-table footnote above.
Loading only the licenses you can use
The data's licenses vary per source and most are non-commercial (see
License below). That table is also available in code, so
"load only what my project is allowed to use" doesn't mean maintaining your
own list of include_* flags:
from sirna_data import load_records, list_licenses, list_sources, license_for_source
list_licenses()
# ['CC BY 2.0', 'CC BY 4.0', 'CC BY-NC', 'CC BY-NC 4.0', 'CC BY-NC-ND 4.0', 'unresolved']
# only the permissively-licensed sources (Shabalina 2006, Monopoli 2023, Davis 2025):
records = load_records(licenses=["CC BY 4.0", "CC BY 2.0"])
len(records), len({r.gene for r in records}) # 1255, 45
for source in list_sources():
source.license_id # 'CC BY-NC-ND 4.0'
source.commercial_use # False (None == unresolved, NOT "probably fine")
source.derivatives_redistributable # False (the "ND" term)
source.notes # the caveat worth reading
license_for_source(records[0].source).license_id # per-record provenance -> license
License ids are matched case- and punctuation-insensitively ("cc-by-4.0"
works) but are version-specific, since two sources here state two different
things ("CC BY-NC" vs "CC BY-NC 4.0"). An id no source carries raises
ValueError listing the valid ones, rather than quietly loading nothing.
licenses= intersects with the include_* flags, and the two
unresolved-license sources are never selected by a CC license -- only by
asking for "unresolved" explicitly.
This registry is a machine-readable copy of NOTICE.md's
table, not legal advice; read the real terms before relying on it.
Splitting into train/test
from sirna_data import load_records, train_test_split, leave_n_genes_out
records = load_records()
# sklearn-style train_test_split, but grouped by gene by default so no gene
# straddles both splits (see by_gene below for why this matters):
train, test = train_test_split(records, test_size=0.2, random_state=0)
# leave-N-genes-out cross-validation: a generator yielding one (train, test)
# fold per group of N genes, until every gene has been held out exactly once
for train, test in leave_n_genes_out(records, n=5, random_state=0):
... # train + evaluate a model on this fold
train_test_split mirrors sklearn.model_selection.train_test_split's name
and parameters (test_size, random_state) -- the one addition is
by_gene (default True), which sklearn has no equivalent for. With
by_gene=True, every record for a given gene goes entirely into train or
entirely into test, so a model can't partly "solve" a test siRNA just by
having seen another siRNA against the same gene during training. Pass
by_gene=False for a plain per-record random split with no regard for gene.
leave_n_genes_out(records, n, random_state=None) generalizes leave-one-
gene-out cross-validation: it shuffles the distinct genes once, partitions
them into consecutive groups of n, and yields one (train, test) fold per
group -- so every gene appears in exactly one test fold across the full
iteration (n=1 reproduces classic leave-one-gene-out CV). If the gene
count isn't evenly divisible by n, the last fold holds out fewer than n
genes.
Rank confidence: how many top predictions do you need to check?
from sirna_data import min_top_k_for_confidence, probability_true_top_in_predicted_top_k
# Given only a correlation between a model's predicted and true rankings of
# 4561 candidate items, how many of the top-predicted items do you need to
# check to be 95% confident the true best one is among them?
min_top_k_for_confidence(n_items=4561, confidence=0.95, pcc=0.3686)
# Or ask it the other way: given you check the top 50, how confident can
# you be that the true best item is in there?
probability_true_top_in_predicted_top_k(50, 4561, pcc=0.3686)
Both take the correlation as either pcc (Pearson's r, used directly) or
spcc (Spearman's rho, converted internally) -- exactly one of the two.
top_n (default 1) generalizes the question from "is the single true best
item captured" to "is at least one of the true top top_n items captured"
-- pass e.g. top_n=10 to ask about catching any of the top 10, which
needs a smaller K for the same confidence. See sirna_data.rank_confidence's
module docstring for the full model and its caveats -- this is a planning
heuristic (generally conservative), not a certified statistical bound.
Also installed: the sirna-rank-confidence CLI --
sirna-rank-confidence --pcc 0.3686 --n-items 4561 --confidence 0.99 0.95 0.9.
Comparing multiple models at once
from sirna_data import min_top_k_for_confidence_multi, probability_curves_for_pccs
pccs = [0.2, 0.4, 0.6] # one Pearson correlation per model to compare
# {pcc: min top-K needed for 95% confidence}, one entry per model
min_top_k_for_confidence_multi(pccs, n_items=4561, confidence=0.95)
# {pcc: [probability at each K in a default spread of K's]}, one entry per model
probability_curves_for_pccs(pccs, n_items=4561)
Both run the single-model function above once per PCC in the list --
min_top_k_for_confidence_multi for a straight side-by-side "tests needed"
comparison, probability_curves_for_pccs for the full probability-vs-K
curve each model traces out (this is what the plotting function below
draws). Pass k_values to either the fixed set of K's you want the
comparison at instead of the default spread.
Plotting probability vs. number of tests
from sirna_data.rank_confidence_plot import plot_probability_vs_num_tests
plot_probability_vs_num_tests(pccs, n_items=4561, save_path="curves.png")
One curve per PCC, x-axis is K (number of top-predicted items checked),
y-axis is the probability of capturing at least one true top-top_n item
at that K -- lets you see at a glance how the number of tests needed
relates to each model's correlation. Requires the optional plot extra
(pip install sirna-data-grabber[plot]) for matplotlib -- not installed by
the core package, and this function lives in its own
sirna_data.rank_confidence_plot module (not sirna_data's top-level
import) specifically so nothing else in this package needs matplotlib.
Returns the matplotlib.axes.Axes for further customization; pass an
existing ax= to draw on it instead of creating a new figure.
Per-point markers, marker size, and line style are all configurable via
marker / markersize / linestyle (each forwarded straight to
Axes.plot) -- e.g. marker=None for plain lines with no dots, useful
once k_values gets dense enough that individual markers just clutter the
curve:
# Dots (default):
plot_probability_vs_num_tests(pccs, n_items=4561, save_path="curves.png")
# Plain lines, no per-point markers:
plot_probability_vs_num_tests(pccs, n_items=4561, marker=None, save_path="curves.png")
# Dashed lines with square markers:
plot_probability_vs_num_tests(
pccs, n_items=4561, marker="s", linestyle="--", save_path="curves.png"
)
Also installed: the sirna-rank-confidence-plot CLI, a thin wrapper
around the same function that writes straight to a file --
sirna-rank-confidence-plot --pcc 0.2 0.4 0.6 --n-items 4561 \
--marker none --save-path curves.png
--marker/--marker-size/--linestyle mirror the Python function's
marker/markersize/linestyle (pass --marker none or --linestyle none for no markers / no connecting line, respectively); --labels sets
the legend text per --pcc value; --k-max/--num-points/--k-values
control which K's get plotted. Run sirna-rank-confidence-plot --help for
the full option list.
Using this from another project
Install as a sibling checkout in editable mode:
pip install -e ../sirna-data-grabber
That gives you import sirna_data with no other coupling — this repo only
depends on pandas and requests, and knows nothing about any particular
downstream model or feature-engineering pipeline.
Tests
pip install -e ".[test]"
pytest
Tests run entirely against small in-memory/tmp-dir fixtures (see
tests/conftest.py) and mocked HTTP calls, so they don't touch the real
dataset or the network.
Linting and type checking
pip install -e ".[lint]"
ruff check .
mypy
Both run in CI on every pull request (.github/workflows/tests.yml), alongside
the test matrix.
-
These two repos ship no
LICENSEfile, so they are all-rights-reserved by default under GitHub's terms. Their derivative files are kept locally but excluded from git -- seeNOTICE.md. "CC BY-NC-ND" means no derivatives may be redistributed, which is why only CMsiRNAdb's untouched original TSV is committed and its per-gene subsets are derived at load time. ↩ ↩2 -
This gene has more than one distinct transcript accession across its records in the raw data (different isoforms/predicted RefSeq entries used for different rows) -- the length shown is for the accession used by the largest number of records, not necessarily all of them. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15
-
This dataset has two textually-distinct
EGFPgene entries: the Martinelli row uses a clean"EGFP"gene string, while siRNAEfficacyDB's ownGenecolumn has a trailing space ("EGFP ") -- a pre-existing data-entry quirk in that source, not introduced by adding Martinelli. They group separately here and inload_records()because that's how the raw gene strings actually compare, not silently merged. ↩ -
This
EGFProw's 702 rows are mapped in siRNAEfficacyDB to accessionNZ_CP024869, which currently resolves to a ~3.7 Mb bacterial genome assembly, not the actual EGFP transcript -- almost certainly lab-plasmid contamination baked into that assembly (see "Known data-quality caveats" indata/DATA_SOURCES.md). All 702 target sites still verify correctly against a small window of that assembly, so it's usable for target-site context, but its full length is not a meaningful "EGFP transcript length" and is omitted here rather than shown as 3,720,309 nt.Firefly luciferaseandFireflyLucare also two separate string labels in the source data for what is conceptually the same reporter, kept distinct here since that's howload_records()actually groups them. ↩
Metadata
Release files for sirna-data-grabber 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sirna_data_grabber-0.9.0.tar.gz | 98.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sirna_data_grabber-0.9.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 172.8 kB
Release files / sirna_data_grabber-0.9.0.tar.gz
| Download URL | sirna_data_grabber-0.9.0.tar.gz |
|---|---|
| Size | 98.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9b132269ec9e7a17dff4f18d593fb476cc9f161c4b9224a2e9b228b5f5205fc4
|
|
BLAKE2b-256 checksum How to use checksums |
079d8cc957fa3b1d490d17b752c0a85ca13a6d302b99a7b0eabd01196989176b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / sirna_data_grabber-0.9.0-py3-none-any.whl
| Download URL | sirna_data_grabber-0.9.0-py3-none-any.whl |
|---|---|
| Size | 74.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc42c036f18742d07c3f9e51fa7b780de147279afb3278e28e404af00058751c
|
|
BLAKE2b-256 checksum How to use checksums |
8b3e36350c41e925f75533c3b0469472191efde8c8f33863e2958e466da24947
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log