Skip to main content

sirna-data-grabber

Tests PyPI version Python versions License

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,467 siRNA records across 243 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,488 40 CC BY-NC
CMsiRNAdb (He et al.) 2026 12,357 13 CC BY-NC-ND 4.01
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
Sciabola et al. in-house panel (NAR Supp. Tables S3/S4) 2013 356 10 CC BY-NC 3.0
Harborth et al. lamin A/C panel (via Ichihara et al. 2007) 2003 44 1 CC BY-NC 2.0 UK
Martin et al. 2007 (NAR Supp. Tables 1/4) 2007 256 128 CC BY-NC
Wang et al. 2009 (NAR Supp. Table 3) 2009 134 14 CC BY-NC
Total 18,467 243

"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 116 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 243 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, and the cell line(s) it was tested in. Computed directly from the fetched data/raw/ files, not hand-maintained -- except the Martin 2007 and Wang 2009 rows, which were computed from those sources' parsed supplementary tables plus their transcripts fetched from NCBI, because data/raw/ for them has not been built yet. Regenerate the whole table from data/raw/ after the next sirna-data-fetch; those two sources' per-gene counts are pre-dedup and may come in marginally lower -- 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 243 genes
Gene Source dataset siRNAs Transcript length (nt) Cell line / test system 3
AARS Wang 2009 10 3,437 HeLa
ABCA2 Martin 2007 2 8,172 HCT-116
ABCA5 Martin 2007 2 7,044 MDA-MB-231
ABCB1 Martin 2007 2 4,872 NCI_ADR-RES
ABCB2 Martin 2007 2 2,974 MDA-MB-231
ABCB7 Martin 2007 2 2,404 HCT-116
ABCC1 Martin 2007 2 5,927 HCT-116
ABCC3 Martin 2007 2 5,176 MDA-MB-231
ABCD4 Martin 2007 2 2,927 MDA-MB-231
ABCE1 Martin 2007 2 3,568 MDA-MB-231
ABL Martin 2007 2 5,384 MDA-MB-231
ACAA2 Wang 2009 10 2,926 HeLa
ACP5 Martinelli 2023 / sirna-reproduction 32 1,683 not recorded
ADAM8 Martin 2007 2 3,275 MDA-MB-231
ADAR Martin 2007 2 6,640 HCT-116
ADM Martin 2007 2 1,449 MDA-MB-231
AGT CMsiRNAdb (full) 872 2,148 2 Hep3B (638), HepG2 (98), transgenic mice (in vivo) (60), +6 more
AKT1 Shabalina 2006 + Martin 2007 7 3,008 2 not recorded, MDA-MB-231
AKT2 Shabalina 2006 + Martin 2007 6 5,250 2 not recorded, MDA-MB-231
AKT3 Martin 2007 2 3,588 MDA-MB-231
ALDH1B1 Wang 2009 10 3,028 HeLa
ALPG Shabalina 2006 11 2,492 not recorded
ANGPTL3 CMsiRNAdb (full) 551 2,926 2 Hep3B (222), primary cyno hepatocytes (184), transgenic mice (in vivo) (96), +6 more
ANP32A Martin 2007 2 1,136 MDA-MB-231
APC Martin 2007 2 10,719 MDA-MB-231
APOB Martinelli 2023 / sirna-reproduction 34 14,121 not recorded
APP CMsiRNAdb (full) + Davis 2025 + Monopoli 2023 1,244 3,358 2 BE(2)-C (353), SH-SY5Y (284), primary cyno hepatocytes (269), +5 more
ARD1 Martin 2007 2 916 MDA-MB-231
ARHGDIB Martin 2007 2 1,216 MDA-MB-231
ARHGEF12 Martin 2007 2 9,501 HCT-116
ARNT Martin 2007 2 4,846 HCT-116
ASNS Martin 2007 2 1,994 HCT-116
ATM Martin 2007 2 13,147 MDA-MB-231
ATP5B Wang 2009 9 1,759 HeLa
ATR Martin 2007 2 8,265 MDA-MB-231
BACE1 Davis 2025 + Monopoli 2023 183 5,835 SH-SY5Y (180), not recorded (3)
BAG3 Martin 2007 2 2,608 HCT-116
BAG4 Martin 2007 2 2,182 MDA-MB-231
BAK1 Martin 2007 2 2,165 HCT-116
BAX Martin 2007 2 891 HCT-116
BBC3 Martin 2007 2 1,840 MDA-MB-231
BCL2L1 Martin 2007 2 2,386 HCT-116
BCL9 Martin 2007 2 6,278 MDA-MB-231
BIRC5 Sciabola 2013 in-house panel (NAR Supp. S3/S4) 9 2,574 Hep3B
BRAF Sciabola 2013 in-house panel (NAR Supp. S3/S4) + Martin 2007 7 6,459 2 Hep3B, MDA-MB-231
BRCA1 Martin 2007 2 7,191 MDA-MB-231
BRCA2 Martin 2007 2 10,987 MDA-MB-231
BRMS1 Martin 2007 2 1,455 HCT-116
C6orf110 siRNAEfficacyDB 145 3,465 HeLa
Cacnb1 siRNAEfficacyDB 46 3,393 HeLa
CASR_rhesus Martinelli 2023 / sirna-reproduction 68 3,144 not recorded
CAV1 Martin 2007 2 2,704 MDA-MB-231
CAV2 Martin 2007 2 3,332 MDA-MB-231
CBL Shabalina 2006 5 11,168 not recorded
CBLB Shabalina 2006 5 3,354 not recorded
CCND1 Martin 2007 + Wang 2009 12 4,306 HeLa (10), MDA-MB-231 (2)
CD44 Martin 2007 2 5,748 HCT-116
CDC34 siRNAEfficacyDB 57 1,418 HeLa
CDH1 Martin 2007 2 4,828 HCT-116
CDK4 Martin 2007 + Wang 2009 12 1,474 HeLa (10), MDA-MB-231 (2)
CDKN1A Shabalina 2006 5 2,117 not recorded
CDKN1B Martinelli 2023 / sirna-reproduction 60 2,410 not recorded
CHEK1 Martin 2007 2 2,042 HCT-116
CREB1 Martin 2007 2 2,964 HCT-116
CREBBP Martin 2007 2 8,694 HCT-116
CRSP3 Martin 2007 2 5,227 HCT-116
CSK Shabalina 2006 5 2,743 not recorded
CTNNB1 CMsiRNAdb (full) + Sciabola 2013 in-house panel (NAR Supp. S3/S4) + Martin 2007 359 3,488 2 Hep3B (350), HeLa (7), HCT-116
CTNND1 Martin 2007 2 6,232 MDA-MB-231
CUL2 Martin 2007 2 2,910 HCT-116
Cyclophilin B siRNAEfficacyDB 90 851 HEK293
CYP51A1 Wang 2009 8 2,988 HeLa
DAD1 Shabalina 2006 5 684 not recorded
DBI siRNAEfficacyDB 9 675 HEK293
DICER1 Martin 2007 2 10,220 HCT-116
DLC1 Martin 2007 2 7,445 MDA-MB-231
DNMT1 Martin 2007 2 5,434 HCT-116
DNMT2 Martin 2007 2 3,539 MDA-MB-231
DNMT3A Martin 2007 2 4,314 HCT-116
DNMT3B Martin 2007 2 4,353 HCT-116
E2F1 Martin 2007 2 2,486 HCT-116
EGFP Martinelli 2023 / sirna-reproduction 74 1,470 not recorded
EGFP4 siRNAEfficacyDB 702 N/A 5 HeLa
EGFR Martin 2007 2 5,616 MDA-MB-231
EGLN1 Martin 2007 2 5,163 MDA-MB-231
EGLN3 Martin 2007 2 2,765 MDA-MB-231
EIF2C2 Martin 2007 2 3,567 HCT-116
EIF4EBP1 Shabalina 2006 4 827 not recorded
ERBB2 Martin 2007 2 4,624 HCT-116
ERBB3 Martin 2007 2 5,511 HCT-116
EZH2 Sciabola 2013 in-house panel (NAR Supp. S3/S4) 9 2,654 Hep3B
F3_human Shabalina 2006 14 2,104 not recorded
F3_mouse Shabalina 2006 10 1,821 not recorded
FGFR1 Martin 2007 2 4,049 MDA-MB-231
FH Martin 2007 2 1,791 MDA-MB-231
Firefly luciferase siRNAEfficacyDB 87 2,387 HEK293
FireflyLuc siRNAEfficacyDB 46 2,387 2 avg. of CHO-K1/HeLa/E14TG2a (37), HEK293 (9)
FLJ11011 siRNAEfficacyDB 78 8,412 HeLa
FLJ16071 Shabalina 2006 14 2,773 not recorded
FMR1 Martin 2007 2 4,362 MDA-MB-231
FOXO1 Shabalina 2006 5 5,779 not recorded
FOXO4 Shabalina 2006 5 3,644 not recorded
FRAP1 Martin 2007 2 8,680 HCT-116
FURIN Martin 2007 2 4,180 HCT-116
Fxyd6 siRNAEfficacyDB 72 1,766 HeLa
FYN Shabalina 2006 5 3,628 not recorded
GAPDH siRNAEfficacyDB 20 1,285 HEK293
GEMIN5 Martin 2007 2 4,527 HCT-116
GIPC1 Martin 2007 2 1,947 MDA-MB-231
GPRC5A Wang 2009 9 6,582 HeLa
GRB2 Martin 2007 2 3,317 HCT-116
GRB7 Martin 2007 2 2,260 HCT-116
GSK3A Shabalina 2006 5 2,193 not recorded
GSK3B Shabalina 2006 + Martin 2007 7 7,782 2 not recorded, MDA-MB-231
HDAC1 Martin 2007 2 2,091 HCT-116
HDAC3 Martin 2007 2 1,955 HCT-116
HDAC4 Martin 2007 2 8,459 HCT-116
HDAC5 Martin 2007 2 5,324 MDA-MB-231
HIF1A Sciabola 2013 in-house panel (NAR Supp. S3/S4) + Martin 2007 + Wang 2009 112 3,946 2 Hep3B, HeLa (10), HCT-116 (2)
HIP2 siRNAEfficacyDB 79 5,153 HeLa
HK2 Sciabola 2013 in-house panel (NAR Supp. S3/S4) 97 5,626 Hep3B
HPRT Martin 2007 2 1,331 MDA-MB-231
HPSE Sciabola 2013 in-house panel (NAR Supp. S3/S4) 107 4,652 2 Hep3B
HRAS Shabalina 2006 10 570 not recorded
HSD17B13 CMsiRNAdb (full) 1,985 2,260 2 COS7 (639), primary human hepatocytes (549), primary cyno hepatocytes (476), +7 more
HSP90AA1 Martin 2007 2 2,912 HCT-116
HSPC150 siRNAEfficacyDB 77 878 HeLa
ICAM-1 siRNAEfficacyDB 40 2,986 T24
IGF1R Shabalina 2006 + Martin 2007 23 12,235 2 not recorded, MDA-MB-231
IGF2R Martin 2007 2 9,090 MDA-MB-231
IGFBP3 Martin 2007 2 2,620 MDA-MB-231
ILK Shabalina 2006 5 1,759 not recorded
INHBE CMsiRNAdb (full) 670 2,460 2 Hep3B (595), primary cyno hepatocytes (75)
INSR Martin 2007 2 4,691 MDA-MB-231
IRS1 Shabalina 2006 + Martin 2007 7 9,771 2 not recorded, MDA-MB-231
IRS2 Martin 2007 2 7,014 MDA-MB-231
ITGB1 Shabalina 2006 + Martin 2007 7 3,735 2 not recorded, MDA-MB-231
KAI1 Martin 2007 2 1,640 MDA-MB-231
KAZRIN Martinelli 2023 / sirna-reproduction 39 2,641 not recorded
KISS1 Martin 2007 2 725 MDA-MB-231
KRAS Martin 2007 2 5,312 MDA-MB-231
Lamin A Harborth 2003 (via Ichihara 2007) 44 3,178 HeLa
LPA CMsiRNAdb (full) 556 6,431 2 Huh7 (376), Hep3B (111), transgenic mice (in vivo) (56), +1 more
Luciferase_firefly Martinelli 2023 / sirna-reproduction 122 6,047 2 not recorded
Luciferase_renilla Martinelli 2023 / sirna-reproduction 43 1,969 not recorded
LYPD1 Shabalina 2006 14 3,458 not recorded
MAP2K1 Martin 2007 2 2,222 HCT-116
MAP2K2 Martin 2007 2 1,759 MDA-MB-231
MAPK1 Martin 2007 2 5,916 HCT-116
MAPK14 Shabalina 2006 + Martin 2007 10 4,222 2 not recorded, HCT-116
MAPT CMsiRNAdb (full) + Davis 2025 + Monopoli 2023 917 6,816 2 T98G (379), SH-SY5Y (292), BE(2)-C (213), +4 more
MARC1 CMsiRNAdb (full) 823 1,020 2 Hep3B (341), Huh7 (259), transgenic mice (in vivo) (174), +3 more
MDH2 Wang 2009 9 2,001 HeLa
MET Martin 2007 2 6,641 MDA-MB-231
MIR155HG Martinelli 2023 / sirna-reproduction 42 1,500 not recorded
MMAC1 siRNAEfficacyDB 36 3,160 T24
MMP1 Martin 2007 2 1,973 MDA-MB-231
Mmp7 siRNAEfficacyDB 150 1,043 HeLa
MSTN CMsiRNAdb (full) 9 2,705 2 CD-1 mouse muscle (in vivo) (2), Hepa1-6 (2), chicken embryo myoblasts (2), +2 more
MTOR Sciabola 2013 in-house panel (NAR Supp. S3/S4) 10 8,721 Hep3B
MYC Sciabola 2013 in-house panel (NAR Supp. S3/S4) + Shabalina 2006 + Martin 2007 16 3,721 2 Hep3B (9), not recorded (5), MDA-MB-231
MYH9 Wang 2009 10 7,451 HeLa
MyoD Shabalina 2006 5 1,833 not recorded
NME2 Martin 2007 2 822 HCT-116
NOG siRNAEfficacyDB 71 1,913 HeLa
NPY Martinelli 2023 / sirna-reproduction 8 567 not recorded
P2rx2 siRNAEfficacyDB 77 1,833 HeLa
P2RX3 siRNAEfficacyDB 90 3,792 HeLa
PAC Shabalina 2006 10 906 not recorded
PCSK9 CMsiRNAdb (PCSK9) 2,756 3,637 HeLa (1,825), HepG2 (379), HEK293A (258), +4 more
PDE2A Wang 2009 9 4,182 HeLa
PDPK1 Shabalina 2006 5 7,184 not recorded
PHLDA1 Martin 2007 2 1,998 HCT-116
PIK3C2A Martin 2007 2 5,061 MDA-MB-231
PIK3CA Shabalina 2006 + Sciabola 2013 in-house panel (NAR Supp. S3/S4) 10 9,259 not recorded (5), Hep3B (5)
PIK3R1 Shabalina 2006 5 3,371 not recorded
PIK3R2 Shabalina 2006 5 3,980 not recorded
PLAUR Martin 2007 2 1,548 HCT-116
PLK siRNAEfficacyDB 10 2,123 HEK293
PLK1 Martin 2007 2 2,204 MDA-MB-231
PLN CMsiRNAdb (full) 135 2,480 Hepa1-6
PNPLA3 CMsiRNAdb (full) 2,066 2,753 2 Hep3B (680), COS7 (624), primary cyno hepatocytes (298), +6 more
PRDX1 Wang 2009 10 1,139 HeLa
PSKH1 Shabalina 2006 4 3,460 not recorded
RAB13 Shabalina 2006 5 1,164 not recorded
RAB6IP1 siRNAEfficacyDB 126 4,991 HeLa
RB1 Shabalina 2006 + Martin 2007 7 4,768 2 not recorded, MDA-MB-231
RBX1 Martin 2007 2 521 MDA-MB-231
RHOA Martin 2007 2 1,926 MDA-MB-231
RHOC Martin 2007 2 1,116 MDA-MB-231
RPS6 Shabalina 2006 5 1,369 not recorded
RPS6KA1 Shabalina 2006 5 3,192 not recorded
RPS6KA3 Shabalina 2006 5 7,987 not recorded
RRM1 Martin 2007 2 3,117 MDA-MB-231
RRM2 Martin 2007 2 2,500 MDA-MB-231
SEAP siRNAEfficacyDB 17 2,754 2 HEK293
SEPTIN2 Shabalina 2006 5 3,251 not recorded
SET Martin 2007 2 2,577 HCT-116
SFN Martin 2007 2 1,336 HCT-116
SHC1 Martin 2007 2 3,076 HCT-116
SKP1 Shabalina 2006 5 2,616 not recorded
SLC16A1 Wang 2009 10 4,512 HeLa
SLC2A1 Martin 2007 2 2,856 HCT-116
SMAD2 Martin 2007 2 5,415 HCT-116
SMAD4 Martin 2007 2 3,220 MDA-MB-231
SMPD1 Martin 2007 2 2,473 MDA-MB-231
SNCA Davis 2025 + Monopoli 2023 224 3,177 SH-SY5Y (220), not recorded (4)
SOD2_chimp Martinelli 2023 / sirna-reproduction 51 600 not recorded
SOS1 Martin 2007 2 4,002 MDA-MB-231
SOST siRNAEfficacyDB 75 2,296 HeLa
SRC Martin 2007 2 4,145 HCT-116
STAT1 Martin 2007 2 4,157 HCT-116
STAT3 Martin 2007 2 4,953 MDA-MB-231
TC10 siRNAEfficacyDB 67 4,780 HeLa
TCAP siRNAEfficacyDB 144 1,532 HeLa
THBS1 Martin 2007 2 5,820 MDA-MB-231
TIAM1 Martin 2007 2 5,521 HCT-116
TOP1 Martin 2007 2 3,734 HCT-116
TOP2A Martin 2007 2 5,698 HCT-116
TSC1 Shabalina 2006 5 8,598 not recorded
TSC2 Shabalina 2006 5 6,415 not recorded
UBE2B siRNAEfficacyDB 79 2,241 HeLa
UBE2C siRNAEfficacyDB 76 777 HeLa
UBE2D3 siRNAEfficacyDB 78 3,976 HeLa
UBE2E3 siRNAEfficacyDB 79 1,555 HeLa
UBE2G1 siRNAEfficacyDB 79 4,167 HeLa
UBE2H siRNAEfficacyDB 70 5,162 HeLa
UBE2I siRNAEfficacyDB 64 2,850 HeLa
UBE2J1 siRNAEfficacyDB 49 4,164 HeLa
UBE2L3 siRNAEfficacyDB 53 2,861 HeLa
UBE2L6 siRNAEfficacyDB 72 1,219 HeLa
UBE2M siRNAEfficacyDB 76 1,159 HeLa
UBE2N siRNAEfficacyDB 79 4,877 HeLa
UBE2S siRNAEfficacyDB 79 2,559 HeLa
UBE2V1 siRNAEfficacyDB 74 2,539 HeLa
Ufc1 siRNAEfficacyDB 70 888 HeLa
UGCG Martin 2007 2 1,637 MDA-MB-231
VDAC2 Martin 2007 2 1,522 MDA-MB-231
VEGFA Martinelli 2023 / sirna-reproduction 4 3,660 not recorded
VHL Martin 2007 2 2,968 MDA-MB-231
VIL2 Martin 2007 2 3,166 MDA-MB-231
YWHAB Martin 2007 2 3,015 HCT-116
YWHAZ Martin 2007 2 2,834 MDA-MB-231

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)
  data_source_ledger.csv     machine-readable companion to DATA_SOURCES.md
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 -> monopoli_*
    shabalina.py                 Shabalina et al. 2006 -> 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_sciabola2013.py        unit tests for the Sciabola 2013 loader
  test_harborth2003.py        unit tests for the Harborth 2003 loader + its supersede rule
  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,510 trainable records across 107 genes, 7 sources — 18,077 records / 116 genes if the optional CMsiRNAdb full-database retrieval and Davis2025 are also included). The largest single 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 nine sources; see sirna-data-fetch --help. Every source load_records() reads has a fetcher, so a bare pip install plus one fetch reconstructs the whole dataset quoted at the top of this file -- nothing here depends on having the git checkout. tests/test_fetch_coverage.py enforces that: adding a loadable source without a fetcher fails the suite.

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_shabalina / include_martinelli / include_harborth2003 / include_sciabola2013 / 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 116, sorted
len(list_genes())     # 116

# 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 2.0 UK', 'CC BY-NC 3.0', '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.

  1. "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 -- see NOTICE.md. ↩

  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 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27

  3. The cell line (or in vivo model) each gene's knockdown was measured in, taken from the raw data wherever the source records it: siRNAEfficacyDB's Cell column and CMsiRNAdb's Cell_Type column (names lightly normalized, e.g. Hela -> HeLa, Be(2)C cell line -> BE(2)-C; "in vivo" marks animal-model rows). Davis 2025 rows are listed as SH-SY5Y, the cell line that paper's native assay was run in (see data/DATA_SOURCES.md). Sciabola 2013's rows are Hep3B (QuantiGene 2.0 mRNA, 48 h) and the Harborth 2003 lamin-A/C panel is HeLa (lamin A/C protein by immunoblot) -- both from those papers' own Methods rather than a column in the data. Shabalina 2006, Martinelli 2023 and Monopoli 2023 don't include a cell-line field in the data shipped here and their papers weren't checked for this column, so their rows show "not recorded" rather than a value guessed at. Where a gene was tested in more than one system, the top three are shown with their siRNA counts. ↩

  4. This dataset has two textually-distinct EGFP gene entries: the Martinelli row uses a clean "EGFP" gene string, while siRNAEfficacyDB's own Gene column has a trailing space ("EGFP ") -- a pre-existing data-entry quirk in that source, not introduced by adding Martinelli. They group separately here and in load_records() because that's how the raw gene strings actually compare, not silently merged. ↩

  5. This EGFP row's 702 rows are mapped in siRNAEfficacyDB to accession NZ_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" in data/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 luciferase and FireflyLuc are also two separate string labels in the source data for what is conceptually the same reporter, kept distinct here since that's how load_records() actually groups them. ↩

Metadata

Release files for sirna-data-grabber 0.14.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sirna-data-grabber 0.14.0
File Size Uploaded
sirna_data_grabber-0.14.0.tar.gz 167.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sirna-data-grabber 0.14.0
File Interpreter ABI Platform
sirna_data_grabber-0.14.0-py3-none-any.whl Python 3 none any Details

Total release size: 282.8 kB

Release files / sirna_data_grabber-0.14.0.tar.gz

Download URL sirna_data_grabber-0.14.0.tar.gz
Size 167.1 kB
Tags Source
SHA-256 checksum
How to use checksums
ed04a1ee61aeee48ee8f7959bc5ac94baa025f4cfcaba27a67b93a6681eb7f4f
BLAKE2b-256 checksum
How to use checksums
93edf2104929f8b6643c7394f22ea9b830c0bffb0a1171e6224268b741e6941f
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 29, 2026.

Transparency log

Release files / sirna_data_grabber-0.14.0-py3-none-any.whl

Download URL sirna_data_grabber-0.14.0-py3-none-any.whl
Size 115.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f5c8484b055eb717da8ea9d0e18de88de731c8baae2e26e2cc25904c138151e5
BLAKE2b-256 checksum
How to use checksums
e9b65502df7934f50dd00b7710ccf3c21d3fa3bfbb3371d8ea6916f0e7eaab6a
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 29, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.14.0 This release

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page