Methodology
How we compute strain lab statistics
Our state-lab potency statistics come from 17,793 flower tests in public data, matched to strain names by strict rules. This page documents each step and its limits. Breeder specifications and other published potency descriptions are separately attributed in the guides.
Generated 2026-10-02. All numbers below are computed from the source files; nothing was imputed.
Downloads: summary by strain (CSV) and full aggregates (JSON). Guides with the original test rows provide a downloadable per-test CSV. Guides with only the published aggregates provide a labelled JSON summary and omit per-test histograms.
1. Source
- Dataset: Cannlytics, cannabis_results — https://huggingface.co/datasets/cannlytics/cannabis_results
- License: Creative Commons Attribution 4.0 International (CC BY 4.0) — https://creativecommons.org/licenses/by/4.0/
- Repository version used: lastModified 2026-02-02T19:10:03Z, commit
8724df97f3c40b3f844157606dd91e97509a8cb9. - Files (per-file last-commit date from the Hugging Face API):
| State | File | Bytes | Last commit | Rows read | Name fields in file | Flower tests used |
|---|---|---|---|---|---|---|
| CA | data/ca/ca-results-latest.csv |
1,585,774,619 | 2026-02-02 | 85,487 | strain_name, product_name, product | 410 |
| FL | data/fl/fl-results-latest.csv |
305,684,201 | 2026-02-02 | 16,309 | strain_name, product_name | 43 |
| NV | data/nv/nv-results-latest.csv |
98,519,804 | 2024-08-16 | 153,064 | product_name | 4,520 |
| OR | data/or/or-results-latest.csv |
38,932,645 | 2024-08-16 | 196,900 | — (none) | 0 |
| MA | data/ma/ma-results-latest.csv |
35,460,727 | 2024-08-16 | 75,164 | product_name | 350 |
| MD | data/md/md-results-latest.csv |
32,885,944 | 2024-08-16 | 105,013 | strain_name | 4,394 |
| HI | data/hi/hi-results-latest.csv |
27,109,389 | 2024-08-16 | 13,485 | strain_name, product_name | 257 |
| MI | data/mi/mi-results-latest.csv |
13,171,269 | 2024-08-16 | 89,956 | product_name | 3,707 |
| UT | data/ut/ut-results-latest.csv |
9,639,780 | 2024-08-16 | 1,230 | strain_name, product_name | 22 |
| RI | data/ri/ri-results-latest.csv |
7,318,634 | 2024-08-16 | 25,832 | — (none) | 0 |
| NY | data/ny/ny-results-latest.csv |
2,374,548 | 2024-08-16 | 330 | strain_name, product_name | 10 |
| CO | data/co/co-results-latest.xlsx |
13,405,514 | 2024-08-16 | 25,798 | product_name | 138 |
| CT | data/ct/ct-results-latest.xlsx |
74,288,499 | 2024-08-16 | 19,963 | product_name | 18 |
| WA | data/wa/wa-results-latest.xlsx |
56,124,010 | 2024-08-16 | 202,812 | strain_name, product_name, inventory_name, product_description | 3,924 |
Files deliberately not used: data/all/all-results-latest.csv (2.5 GB; the per-state files were used instead);
the .xlsx twins of the CSV files; and the newer Connecticut COA exports data/ct/ct-coa-data-*.xlsx
(last commit 2026-02-02), which were not used in this release. The CT figures here come only from
ct-results-latest.xlsx (sheet Values, 19,963 records = the full file).
The dataset README notes that the data are a non-random subset of all lab results and that data about individuals may not be used commercially. The public CSV produced here contains no producer, licensee or personal fields.
How to cite (use exactly)
Source: Cannlytics, cannabis_results (CC BY 4.0), analysis by Official Cannabis.
CC BY 4.0 also asks for a link to the license and an indication that changes were made; on the web page, link “CC BY 4.0” to the license URL above and note that the data were filtered, de-duplicated and aggregated.
2. Pipeline
- Streaming. Every CSV was streamed over HTTPS straight into a CSV parser (the 1.59 GB CA file was never
written to disk). The three xlsx-only states (CO, CT, WA) were downloaded temporarily, read with openpyxl and
deleted. A deliberately broad regex pre-filter kept every row whose name fields mention any strain stem
(e.g.
blue\W*dream,chem,diesel,g\W?13), so strict matching could be redone offline. - Name field.
strain_nameif present, elseproduct_name(WA:strain_name, checked against the product name / inventory name; UT: strain parsed from the “Strain: … Lab Tracking” text when needed). - Strict matching (section 3), product-type filter (section 4), value extraction (section 5), de-duplication (section 6), plausibility filter (0 < total THC ≤ 40 %), then statistics (section 7).
3. Strain matching rules
Normalisation. Lower-case; accents and curly quotes folded; possessives collapsed (lamb's → lambs);
content in parentheses/brackets set aside; compound packaging words joined (pre-roll → preroll,
pop corn → popcorn, fresh frozen → frozen, sugar shake → shake); tokens split on any punctuation.
Aliases may be written with or without spaces/hyphens (BlueDream, G-13, C-99, Chem-Dawg all match).
STRICT match = after normalisation the name consists of exactly one alias (contiguous tokens) plus only
non-name tokens, before or after it. Non-name tokens are: weights and fractions (3.5g, 1/8, oz, lb, eighth,
dime …), numbers and alphanumeric lot/batch/test codes (#2, T18.8, TLMB1206202201), packaging and form
words for flower (flower, bud(s), smalls, popcorn, bulk, lot, jar, pouch, sample, test, QA …), quality grades
(A/B, AAA, tier, top shelf, premium), cultivation words (indoor, outdoor, greenhouse, light-dep, organic …),
lineage words (sativa, indica, hybrid, S/I/H, fem), and 1–2-letter codes (except name-like abbreviations such
as OG, NL, SD, NY, LA, SF, UK).
Excluded (counted as near-matches): any extra strain-name word before or after the alias (Santa Cruz Blue Dream, Super Sour Diesel, Blue Dream OG, Platinum GSC, Gelato Cake, Royal Wedding Cake); any cross
marker (x, cross, bx, f1/f2, s1); names containing two different target strains; glued variants
(Blue Dreamsicle); CBD variants (CBD Blue Dream, Lambsbread (CBD)); a cross or another strain inside
parentheses. In rows whose source product type is flower, concentrate/edible words are treated as name
words (so Blueberry Crumble — a different cultivar — is excluded rather than mistaken for a concentrate).
Brand / producer prefixes stripped only where obvious:
(a) a first segment before a separator (-, |, :) that recurs in front of ≥3 different product names in
the same state file (e.g. Cloud Cover - GSC - Bulk, Virtue - G13 - Lab Sample);
(b) leading words equal to the leading words of the row’s producer/brand field (≥2 words, or one ≥4-letter
word that is not a common strain word);
(c) a short curated list of brand/descriptor names verified in the data (none is a strain word):
travis x james, true humboldt, true mom pop, true mom & pop, almora farm, oz farms, joy ridge, circle s farms, summit buds, cloud cover, franklin fields, charlie walter, luman chichester, med to au transfer, proficiency test, for packaged flower, farmer and the felon, time machine, trb, tcs, summa, sst, cannasol, curaleaf, virtue, kushman, wcc, wwp, led, hps. Examples: TRB = Tahoe-Reno Botanicals (producer field),
SUMMA = Euphoria Wellness, Kushman = one NV producer’s line used in front of many different strains.
(d) breeder-of-record prefixes, accepted only in front of the cultivar that breeder released:
DJ Short + Blueberry, Ken's + Granddaddy Purple, Josh D + OG Kush.
Alias table: each strain’s common names plus obvious spelling and spacing variants found in the data (sour deisel,
jack herrer, grand daddy purple, train wreck, girl scout cookie, northern light, lamb breath …);
glued/hyphenated forms (BlueDream, G-13) are matched automatically:
| Strain | Group | Aliases matched |
|---|---|---|
| Blue Dream | network | blue dream |
| Sour Diesel | network | sour diesel, sour d, sour deez, sour deisel, sour diesal |
| Green Crack | network | green crack, green crush, green cush |
| Northern Lights | network | northern lights, northern light |
| Purple Urkle | network | purple urkle, purple urkel |
| Blue Cheese | network | blue cheese |
| Cinderella 99 | network | cinderella 99, c99, cindy 99 |
| Hindu Kush | network | hindu kush |
| Chemdawg | network | chemdawg, chemdog, chem dawg, chem dog, chem 91, chem 4, chem d |
| Grape Ape | network | grape ape |
| G13 Haze | network | g13 haze |
| G13 | network | g13 |
| Lemon Kush | network | lemon kush |
| Agent Orange | network | agent orange |
| Lamb’s Bread | network | lambs bread, lambsbread, lambs breath, lamb bread, lamb breath |
| Lime OG | network | lime og |
| Critical Jack | network | critical jack |
| Pineapple Express | comparison | pineapple express |
| OG Kush | comparison | og kush |
| Jack Herer | comparison | jack herer, jack herrer |
| Durban Poison | comparison | durban poison |
| Granddaddy Purple | comparison | granddaddy purple, grandaddy purple, grand daddy purple, granddaddy purp, grandaddy purp, grand daddy purp, gdp, granddaddy purps, grandaddy purps, grand daddy purps |
| Super Lemon Haze | comparison | super lemon haze |
| Girl Scout Cookies | comparison | girl scout cookies, girl scout cookie, gsc |
| Gelato | comparison | gelato |
| Wedding Cake | comparison | wedding cake |
| Blueberry | comparison | blueberry |
| Trainwreck | comparison | trainwreck, train wreck |
| Strawberry Cough | comparison | strawberry cough |
Chemdawg sub-buckets. All strict Chemdawg matches form the main bucket; sub-buckets are plain (no
designator), 91 (Chemdawg 91 / Chem 91 / Chem ’91), 4 (Chemdog #4 / Chem 4), d (Chem D / Chemdog D) and
other_number (pheno-hunt/lot numbers such as Chem Dawg #173). Chem 4 and Chem D are accepted as the
standard short forms of Chemdog #4 / Chemdog D; they are reported
separately in the aggregates JSON (chemdawg.sub_buckets) so they can be dropped.
G13 Haze and G13 are separate strains (G13 Haze never counts as G13).
strain_name vs product name. Where a row has both, the product name is checked: if it names a different target strain, a cross/variant of the strain, or another cultivar, the row is excluded as a conflict.
Washington. In the WA file the joined strain_name frequently contradicts the product / inventory name
(e.g. strain “Jack Herer” on product “Flower Lot (A-bud) - A-bud - Nitro Cookies - (g)”). Among WA flower rows involving a target
strain: 4,329 have both fields agreeing; 1,018 conflict;
422 have a product name for a target strain but a different strain_name; and
7,118 carry only a generic product name (“Flower Lot”). Because the
join is unreliable, a WA test is used only when strain_name and the product/inventory name independently
name the same strain; the generic-name rows are excluded and counted as wa_uncorroborated_flower.
4. Flower-only filter
Each row’s source product type is mapped to: flower, shake/trim, pre-roll, infused pre-roll, concentrate,
edible/topical, wet/whole plant, hemp, other, unknown. Only “flower” enters the statistics. Flower types
by state: CA Flower; Flower, Inhalable; Flower, Medical Inhalable; Flower, Product Inhalable; Plant (Flower -
Cured) · CO Flower, Inhaled Product · CT Raw material (flower), Usable Marijuana, Flower… · FL Flower,
Flower Inhalable · HI Flower Lot · MA flower · MD Buds · MI Flower · NV Marijuana Flowers/Buds,
Small/Popcorn Buds, …-Packaged · NY Flower · UT Flower, Packaged Flower, Bulk Flower · WA Flower Lot,
Flower Unlotted, Usable Cannabis/Marijuana (Leaf: from the [strain - type - size] bracket of the inventory
name). Shake/trim, hemp and “Flower, Non-Inhalable” are excluded. A flower-typed row is re-classified (and
excluded) when its name says pre-roll/joint/blunt/cone, infused, shake/trim/grind, fresh-frozen/whole-plant,
or proficiency test. UT: most rows have no type; rows whose UDAF tracking number starts with “F” are treated
as flower (all explicitly typed UT flower rows carry an F number) and flagged in flags.
5. Values and units
- Total THC (%): the reported total if 0 < x ≤ 40. Otherwise, if absent, Δ9-THC + 0.877 × THCA (recorded
per strain in
thc_value_method). A reported total of 0 alongside positive THCA is treated as missing. - Units: values are % w/w. mg/g is converted (÷10) only with evidence: (i) the reported total is 10× the %-components (CA: Excelbis, SQRD, Decano), or (ii) all values sit on one mg/g scale with THCA between 100 and 400 (impossible as %; NV CANN Labs, a few HI/MD/WA rows). Other values above 40 are not “fixed” — they fail plausibility.
- Plausibility: 0 < total THC ≤ 40 %; other tests are dropped and counted (
flower_thc_le_0,flower_thc_gt_40). - Total CBD (%): reported total; if absent, or if it contradicts the lab’s own CBD/CBDA results (FL
TerpLife Labs), CBD + 0.877 × CBDA.
ND/<LOQcount as 0; empty/NT/NRas missing. MI has no CBD field. - Terpenes (% w/w): flat columns (NV, CT, NY, UT), COA results JSON (CA, CO, FL, MA;
mg_g/10or value with its unit), total-only (MDterpenes). Limonene = d-limonene/limonene; humulene = α-humulene; ocimene = reported ocimene, else the sum of α/β/cis/trans isomers. ND → 0. A test “has terpene data” only if at least one terpene (or total) is > 0 (all-zero NV rows are untested panels). Values above Cannlytics’ schema limits (5 % per terpene, 15 % total) are dropped. WA, MI and HI report no terpenes. - Dates:
date_tested(NV fallbacktest_performed_date; WA CCRStest_date; WA Leafcreated_at). Dates outside 2013-01-01 … 2026-02-02 are set to null.
6. De-duplication
The CA file contains the same certificate parsed several times (different sample_hash, same lot and values);
Metrc states repeat one lab result on every child package. Within each strain, tests are dropped when they share
(1) a sample_id, results_hash or WA lab_result_id, or (2) the same state, lab, producer, test date,
total THC, total CBD, THCA and Δ9-THC (rounded to 0.001). Rule (2) is not applied to WA CCRS rows, whose
potency is reported in whole or tenth percent and which have a unique lab_result_id per test.
7. Statistics
n_tests = de-duplicated, strictly matched, flower, plausible tests. Percentiles use linear interpolation.
share_ge_25pct and share_ge_1pct are fractions (0–1). Per-state medians are given for states with n ≥ 10.
Top-3 terpenes rank individual terpenes by median (ties by mean); n is given for each and a note flags fewer
than 10 tests. max_single_lab_share = largest share of a strain’s tests (with a lab recorded) from one lab;
lab IDs are state-specific (WA/MD license IDs, MI/MA anonymised in the source, HI none).
8. Exclusions and quality checks (per strain)
Near-matches and conflicts are counted over candidate rows of all product types before de-duplication.
| Strain | Tests used | Near-matches excl. (all types) | …of which flower | Name conflicts | WA uncorroborated flower | Other product types | concentrate | shake/trim | pre-rolls | Duplicates removed | Flower, no THC value | THC ≤0 or >40 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Blue Dream | 2,118 | 780 | 311 | 319 | 537 | 1,347 | 946 | 179 | 143 | 267 | 87 | 1 |
| Sour Diesel | 1,071 | 2,304 | 1,449 | 228 | 405 | 642 | 320 | 170 | 84 | 65 | 44 | 11 |
| Green Crack | 1,236 | 156 | 56 | 347 | 815 | 352 | 216 | 91 | 20 | 123 | 25 | 0 |
| Northern Lights | 406 | 251 | 92 | 153 | 155 | 437 | 306 | 94 | 13 | 10 | 18 | 1 |
| Purple Urkle | 35 | 12 | 9 | 28 | 44 | 7 | 6 | 0 | 0 | 2 | 0 | 0 |
| Blue Cheese | 288 | 50 | 38 | 59 | 98 | 70 | 37 | 17 | 0 | 2 | 3 | 6 |
| Cinderella 99 | 598 | 150 | 57 | 37 | 21 | 179 | 6 | 172 | 0 | 6 | 14 | 1 |
| Hindu Kush | 17 | 217 | 93 | 105 | 103 | 19 | 16 | 0 | 3 | 1 | 0 | 1 |
| Chemdawg | 668 | 1,244 | 790 | 105 | 222 | 428 | 141 | 192 | 57 | 91 | 23 | 0 |
| Grape Ape | 202 | 74 | 16 | 277 | 231 | 147 | 94 | 40 | 7 | 5 | 0 | 0 |
| G13 Haze | 14 | 2 | 1 | 4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| G13 | 97 | 117 | 57 | 37 | 6 | 51 | 30 | 11 | 0 | 4 | 1 | 0 |
| Lemon Kush | 29 | 251 | 151 | 27 | 48 | 62 | 60 | 1 | 0 | 1 | 1 | 0 |
| Agent Orange | 140 | 9 | 3 | 29 | 167 | 85 | 16 | 66 | 1 | 3 | 7 | 1 |
| Lamb’s Bread | 117 | 174 | 90 | 32 | 38 | 19 | 11 | 0 | 8 | 4 | 9 | 0 |
| Lime OG | 29 | 35 | 10 | 0 | 0 | 39 | 33 | 2 | 0 | 1 | 0 | 0 |
| Critical Jack | 8 | 14 | 12 | 7 | 1 | 5 | 0 | 0 | 0 | 0 | 0 | 0 |
| Pineapple Express | 461 | 379 | 133 | 248 | 300 | 418 | 309 | 23 | 42 | 15 | 41 | 0 |
| OG Kush | 379 | 1,000 | 707 | 172 | 250 | 483 | 235 | 63 | 61 | 24 | 50 | 0 |
| Jack Herer | 910 | 297 | 102 | 257 | 132 | 568 | 344 | 120 | 25 | 18 | 48 | 0 |
| Durban Poison | 528 | 175 | 12 | 124 | 157 | 407 | 269 | 59 | 41 | 22 | 33 | 1 |
| Granddaddy Purple | 512 | 163 | 36 | 196 | 286 | 368 | 292 | 23 | 22 | 19 | 22 | 0 |
| Super Lemon Haze | 1,543 | 275 | 30 | 321 | 375 | 532 | 269 | 203 | 14 | 64 | 40 | 1 |
| Girl Scout Cookies | 567 | 818 | 515 | 141 | 232 | 306 | 186 | 89 | 6 | 32 | 14 | 1 |
| Gelato | 1,845 | 7,792 | 5,666 | 346 | 636 | 670 | 322 | 156 | 102 | 84 | 39 | 0 |
| Wedding Cake | 3,085 | 1,132 | 841 | 603 | 624 | 1,190 | 561 | 420 | 136 | 95 | 129 | 0 |
| Blueberry | 411 | 6,005 | 3,083 | 304 | 738 | 299 | 77 | 44 | 15 | 21 | 26 | 1 |
| Trainwreck | 248 | 772 | 440 | 249 | 121 | 219 | 131 | 33 | 38 | 48 | 14 | 0 |
| Strawberry Cough | 231 | 223 | 14 | 176 | 375 | 271 | 203 | 11 | 17 | 55 | 3 | 0 |
| Total | 17,793 | 24,871 | 14,814 | 4,931 | 7,118 | 9,620 | 1,082 | 691 | 26 |
The most frequent excluded near-match names per strain are listed in the aggregates JSON (exclusions.near_match_top_names).
9. Concentration of the evidence
Producer shares are computed only over tests that record a producer (MD and MI record none).
| Strain | Tests | Labs | Max share one lab | Max share one producer (tests with producer) | Largest state share |
|---|---|---|---|---|---|
| Blue Dream | 2,118 | 49 | 0.167 | 0.316 (1250) | 0.29 (WA) |
| Sour Diesel | 1,071 | 45 | 0.253 | 0.166 (385) | 0.56 (MD) |
| Green Crack | 1,236 | 37 | 0.235 | 0.256 (951) | 0.61 (WA) |
| Northern Lights | 406 | 24 | 0.433 | 0.214 (56) | 0.76 (MD) |
| Purple Urkle | 35 | 10 | 0.265 | 0.519 (27) | 0.66 (WA) |
| Blue Cheese | 288 | 12 | 0.91 | 0.556 (9) | 0.93 (MD) |
| Cinderella 99 | 598 | 15 | 0.263 | 0.684 (57) | 0.87 (MD) |
| Hindu Kush | 17 | 7 | 0.353 | 0.375 (16) | 0.82 (WA) |
| Chemdawg | 668 | 28 | 0.308 | 0.331 (450) | 0.50 (NV) |
| Grape Ape | 202 | 23 | 0.441 | 0.451 (162) | 0.47 (NV) |
| G13 Haze | 14 | 4 | 0.571 | 0.714 (14) | 0.86 (WA) |
| G13 | 97 | 10 | 0.299 | 0.726 (73) | 0.55 (NV) |
| Lemon Kush | 29 | 7 | 0.5 | 0.412 (17) | 0.41 (MI) |
| Agent Orange | 140 | 12 | 0.443 | 0.444 (18) | 0.84 (MD) |
| Lamb’s Bread | 117 | 6 | 0.761 | 0.846 (26) | 0.78 (MD) |
| Lime OG | 29 | 9 | 0.552 | 0.833 (6) | 0.79 (MI) |
| Critical Jack | 8 | 2 | 0.5 | 0.25 (4) | 0.50 (MA) |
| Pineapple Express | 461 | 33 | 0.233 | 0.185 (265) | 0.42 (MI) |
| OG Kush | 379 | 32 | 0.231 | 0.282 (291) | 0.32 (WA) |
| Jack Herer | 910 | 26 | 0.293 | 0.209 (508) | 0.44 (NV) |
| Durban Poison | 528 | 35 | 0.237 | 0.153 (314) | 0.42 (NV) |
| Granddaddy Purple | 512 | 30 | 0.336 | 0.34 (247) | 0.43 (MD) |
| Super Lemon Haze | 1,543 | 35 | 0.189 | 0.288 (1176) | 0.44 (WA) |
| Girl Scout Cookies | 567 | 36 | 0.165 | 0.43 (251) | 0.41 (MD) |
| Gelato | 1,845 | 47 | 0.162 | 0.091 (692) | 0.37 (MI) |
| Wedding Cake | 3,085 | 49 | 0.181 | 0.188 (1802) | 0.43 (NV) |
| Blueberry | 411 | 35 | 0.399 | 0.144 (194) | 0.43 (MD) |
| Trainwreck | 248 | 24 | 0.348 | 0.38 (205) | 0.37 (NV) |
| Strawberry Cough | 231 | 17 | 0.498 | 0.572 (194) | 0.52 (WA) |
10. Caveats
- Lab shopping / THC inflation. Producers can choose labs, and labs differ systematically; reported THC is known to be inflated at some labs. Several strains rest heavily on one lab (table above) — e.g. MD Blue Cheese comes almost entirely from MD lab 2501, whose median total THC across all matched strains (23.2 %, n≈1,200) is above the other Maryland labs (20.3–21.5 %); the same lab reported implausibly high Δ9-THC for some 2018 flower (tests over 40 % were dropped; others remain).
- Sampling bias by state and period. The data are whatever each state released or Cannlytics could parse: MD, NV, MI and WA dominate; CA is mainly 2023–2024 COAs from a few labs; MA is the MCR Labs COA subset (mostly 2014–2019); HI has no THC values for tests dated 2020-12 to 2023-08. Year-to-year changes mix real trends with changing state mix.
- Names are not genetics. Matching is by label text; the same name from different growers can be different genetics, and pheno-hunt series (e.g. CA “Strawberry Cough #110–#139”, “Trainwreck #297–#322” from one producer) are included as the named strain.
- Small samples. Critical Jack (n = 8), G13 Haze (14), Hindu Kush (17), Lemon Kush (29), Lime OG (29) and Purple Urkle (35) are too small for robust distribution statistics; terpene top-3 lists for strains with < 10 terpene tests are anecdotal.
- Agent Orange (median 12.8 %) is 118 of 140 tests from Maryland, where all four labs report low values — this reflects that market’s product, not necessarily the cultivar everywhere.
- Terpene coverage is limited to NV, CA, MA, FL, CT, CO, NY and UT (MD: total only; WA, MI, HI: none), so terpene figures describe a different subset of tests than the THC figures.
- Parsing artefacts in the source were found and handled rather than silently used: WA CCRS flat potency columns (used the COA results instead), FL TerpLife total CBD, UT total THC = 0.0, CA duplicate COAs.
11. Per-state notes
- CA — Name: product_name (strain_name populated in <2% of rows). Flower types: Flower; Flower, Inhalable; Flower, Medical Inhalable; Flower, Product Inhalable; Plant (Flower - Cured). Hemp flower excluded. Reported total THC used; a few labs (Excelbis, SQRD, Decano) report totals in mg/g, converted only when the % components confirm. Terpenes from COA results. Many COAs are contaminant-only (no potency) -> no THC value.
- CO — Name: product_name. Flower type: “Flower, Inhaled Product” (pre-rolls, blunts and fresh-frozen samples in that type are excluded by name). Many SC Labs COAs are contaminant-only (no potency).
- CT — Name: product_name. Flower types: Raw material (flower), Usable Marijuana, Flower variants. Several product registrations share one lab test -> collapsed by value de-duplication.
- FL — Name: strain_name (product_name used only to check for contradictions). Flower types: Flower, Flower Inhalable. TerpLife Labs total_cbd column contradicts its own CBD/CBDA results -> CBD recomputed from components.
- HI — Name: strain_name. Flower type: Flower Lot. No total THC column -> delta-9 THC + 0.877 x THCA. THC/THCA are blank in the source for tests dated 2020-12-31 to 2023-08-18 -> those tests have no THC value and are excluded. No lab field. No terpenes.
- MA — Name: product_name, present only for the MCR Labs COA subset (state public-records rows carry no product name and cannot be matched). Total THC computed from delta-9 THC + 0.877 x THCA. Mostly 2014-2019 tests.
- MD — Name: strain_name only. Flower type: Buds. No total THC column -> computed. Only total terpenes reported. Lab given as a lab ID code; no producer field.
- MI — Name: product_name. Flower type: Flower. Total THC only (no CBD, no terpenes). Labs anonymised in the source (Lab 1, Lab 2, …).
- NV — Name: product_name. Flower types: Marijuana Flowers/Buds, Small/Popcorn Buds, Marijuana Flowers/Buds-Packaged. Terpenes reported (no ocimene column). Some rows have no test date.
- NY — Very small file (330 rows). Type from standard_product_type.
- UT — Product type missing for most rows: rows with a UDAF tracking number starting with “F” are treated as flower (every explicitly typed flower row carries an F number). Flat total_thc is a 0.0 parsing artefact for these rows -> THC computed from the COA results.
- WA — Two systems: Leaf Data Systems (2018-2019 rows; type from the inventory-name bracket, date = record created_at) and CCRS (2021-2023; type = inventory_type, date = test_date, potency from the results JSON because the flat columns disagree with it in ~50% of rows). The joined strain_name contradicts the product/inventory name in a large share of rows, so a WA test is used only when strain_name and the product/inventory name independently name the same strain. No terpenes.
- OR — No product or strain name field in the file -> cannot be matched (0 tests).
- RI — No product or strain name field in the file (only a Metrc tag) -> cannot be matched (0 tests).
12. Reproducibility
The pipeline is scripted end to end (streaming pre-filter, matching and classification, de-duplication and aggregation) and is rerun when Cannlytics publishes new data. Every figure on our strain guides is computed from these outputs at build time; none is typed in by hand.