# MoCo Parents - Montgomery County Public Schools data > Free, machine-readable data about Montgomery County (MD) Public Schools: per-school profiles, > plus a warehouse of MCPS + MSDE facts (achievement, accountability, graduation, climate, > finance, educators, enrollment, capacity, income/demographics), bus routes, and boundaries. > Static JSON/Parquet, no API key, no server. ## Where to look (topic -> file) Most questions: /data/school_year.parquet (or .csv) - one row per school x year with the headline measures already joined. Measure definitions and validity caveats: /data/MEASURES.md. - math acceleration (algebra in middle school, accelerated math, compacted math, math pathways) -> /data/school_year.parquet accel_pct = share of grade 8 testing beyond Math 8 (placement, not performance - MEASURES.md 1); MS-vs-HS Algebra 1 split: QUERYING.md recipe 5 - compare schools / rankings (best schools, top schools, school performance) -> /data/school_year.parquet show farms_pct beside any ranking - raw ranks mostly recover demographics (MEASURES.md 12); a context model explains ~90% of between-school variance - test scores by school, grade or subgroup (MCAP, proficiency, ELA scores, math scores, reading) -> /data/assessments.parquet SQL: assessments.parquet; fetch-only: /data/mcap/{code}.json per school; match grade exactly - grade != 'All' is NOT per-grade (QUERYING.md recipe 3) - suspensions / discipline (suspension rate, discipline, expulsions) -> /data/school_year.parquet suspended_pct = unique students suspended as pct of enrollment (near-fully suppressed from 2024); incident COUNTS are a different measure - warehouse domain='discipline_incidents' - class size (student-teacher ratio, class sizes, crowded classes) -> /data/mcps_consolidated.parquet flat domain: WHERE domain='class_size' AND metric='avg_class_size' (see warehouse_domains.json); 2024 redefinition breaks secondary trends - absenteeism / attendance (chronic absence, attendance rate) -> /data/school_year.parquet chronic_absent_pct + attendance_pct columns; full detail /data/climate.parquet - star ratings / accountability (report card stars, percentile rank, school rating) -> /data/school_year.parquet star_rating + acct_points_pct (2022-2025 only, no 2020-21); detail /data/accountability.parquet - per-pupil spending (school budget, expenditure, funding per student) -> /data/school_year.parquet ppe_total vs ppe_state_local vs ppe_federal - never mix variants (MEASURES.md 10); detail /data/finance.parquet - graduation / dropout (graduation rate, dropouts, completers) -> /data/school_year.parquet grad_rate_4yr (HS only); 5-yr cohorts + dropout detail /data/graduation.parquet - enrollment, demographics, poverty (FARMS, free and reduced meals, EML, ESOL, special education share, school size) -> /data/school_year.parquet enrollment, farms_pct, eml_pct, swd_pct; MSDE top-codes FARMS ~80 pct from 2024 (MEASURES.md 6); by-grade history /data/enrollment.parquet - teacher experience / qualifications (inexperienced teachers, emergency certification, staffing quality) -> /data/school_year.parquet inexperienced_pct + emergency_cred_pct; poverty/students-of-color breakdowns /data/educators.parquet - school lookup / roster (school codes, clusters, addresses, coordinates, which schools exist) -> /data/roster.json code, name, type, cluster, lat, lon - the join spine; the 3-digit code keys every other file - boundaries / bus routes (attendance area, which school serves this address, school bus) -> /boundaries/HS.geojson ES/MS/HS(.geojson) + MS_adopted/HS_adopted (post-2027); bus routes /bus/{code}.geojson per school ## Pick your lane - Can run SQL (DuckDB etc.)? Query the parquet URLs in place; read /data/QUERYING.md first. - Fetch-only (no SQL)? /data/school_year.csv (~230 KB, fits a context window) + /data/roster.json (the school list) + per-school JSON: /data/schools/{code}.json (profiles) and /data/mcap/{code}.json (test scores). - District-wide trends without SQL: /data/district.json. ## Start here - [Dataset index (JSON)](https://mocoparents.org/data/index.json): every published dataset with URLs, docs, sizes - [Measure definitions](https://mocoparents.org/data/MEASURES.md): what each number means - and what NOT to conclude - [Query recipes](https://mocoparents.org/data/QUERYING.md): verified DuckDB recipes, one per known trap - [Human overview](https://mocoparents.org/data/): the same catalog, for people - [Bundle manifest](https://mocoparents.org/data/manifest.json): contract version + per-source as-of vintages ## Datasets - **School-by-year wide table - one row per school x year with the headline measure from every source (start here)**: https://mocoparents.org/data/school_year.parquet - fields: https://mocoparents.org/data/schemas/school_year_columns.json - **MCAP results - school + district, every student group, every grade, 2019-2026**: https://mocoparents.org/data/assessments.parquet - **MCAP results as JSON, one file per school (all years) - parquet-free mirror**: https://mocoparents.org/data/mcap/{code}.json - fields: https://mocoparents.org/data/schemas/mcap.schema.json - **Per-school profiles, district rollup, sped detail, income/gaps analyses**: https://mocoparents.org/data/schools/{code}.json - fields: https://mocoparents.org/data/schemas/school.schema.json - **District-wide rollup - MCPS totals and trends (MCAP, climate, per-pupil, by-group latest)**: https://mocoparents.org/data/district.json - fields: https://mocoparents.org/data/schemas/district.schema.json - **Special education by school - inclusion (LRE) trend, students served, staffing, caseload**: https://mocoparents.org/data/sped.json - fields: https://mocoparents.org/data/schemas/sped.schema.json - **School roster (slim JSON) - code, name, type, cluster, coordinates for every school**: https://mocoparents.org/data/roster.json - fields: https://mocoparents.org/data/schemas/roster.schema.json - **What each measure means - definitions, formulas, and what NOT to conclude**: https://mocoparents.org/data/MEASURES.md - **How to query this data without fooling yourself - verified DuckDB recipes**: https://mocoparents.org/data/QUERYING.md - **District-wide MCAP proficiency, race x special-services-group intersections, 2022-2026 (authoritative)**: https://mocoparents.org/data/assessments_race_service_district.parquet - **Bus routes (per-school GeoJSON + index)**: https://mocoparents.org/data/busindex.json - fields: https://mocoparents.org/data/schemas/busindex.schema.json - **School directory (crosswalk) - codes, names, type, cluster, coordinates, coverage**: https://mocoparents.org/data/schools.parquet - **Attendance-area income / demographics / property profiles (ACS + SDAT)**: https://mocoparents.org/data/neighborhoods.parquet - **Historical enrollment by school x school-year x grade**: https://mocoparents.org/data/enrollment.parquet - **School program capacity + facility attributes (by vintage)**: https://mocoparents.org/data/capacity.parquet - fields: https://mocoparents.org/data/schemas/mcdev_columns.json - **MCPS official enrollment projections (by vintage x projected year)**: https://mocoparents.org/data/official_projections.parquet - fields: https://mocoparents.org/data/schemas/mcdev_columns.json - **Housing-development pipeline student yield (by school x year)**: https://mocoparents.org/data/development.parquet - fields: https://mocoparents.org/data/schemas/mcdev_columns.json - **HS college-test outcomes - SAT / ACT / AP graduate results, 2019 + 2021-2025**: https://mocoparents.org/data/hs_outcomes.parquet - **MSDE accountability - star rating, index points, percentile rank (by school x year)**: https://mocoparents.org/data/accountability.parquet - **Graduation - 4/5-yr cohort grad + dropout, HS completion, annual dropout**: https://mocoparents.org/data/graduation.parquet - fields: https://mocoparents.org/data/schemas/msde_tables_columns.json - **School climate - attendance, chronic absenteeism, mobility, promotion**: https://mocoparents.org/data/climate.parquet - fields: https://mocoparents.org/data/schemas/msde_tables_columns.json - **Per-pupil expenditures (state/local, federal, total) by school x year**: https://mocoparents.org/data/finance.parquet - fields: https://mocoparents.org/data/schemas/msde_tables_columns.json - **Educator qualifications - inexperienced/out-of-field/emergency-cred, by poverty & students-of-color level**: https://mocoparents.org/data/educators.parquet - fields: https://mocoparents.org/data/schemas/msde_tables_columns.json - **Full-fidelity archive - every MCPS + MSDE figure, one row per source cell (audit layer; hardest to query - start with school_year or the typed tables)**: https://mocoparents.org/data/mcps_consolidated.parquet - fields: https://mocoparents.org/data/schemas/warehouse_domains.json - **Warehouse pivot map - per-domain shape + ready-made pivot SQL for mcps_consolidated.parquet**: https://mocoparents.org/data/schemas/warehouse_domains.json - fields: https://mocoparents.org/data/schemas/warehouse_domains.schema.json - **MSDE Maryland Report Card - every published figure, exactly as MSDE reports it**: https://mocoparents.org/data/msde.parquet - **MCPS School Profiles - every published figure, exactly as MCPS reports it**: https://mocoparents.org/data/mcps.parquet ## Geo - [Attendance boundaries (GeoJSON)](https://mocoparents.org/boundaries/HS.geojson): ES / MS / HS, plus MS_adopted / HS_adopted (post-2027) - Bus routes: https://mocoparents.org/bus/{code}.geojson, one file per school ## Smoke tests Verify your query pattern against these pinned values before trusting any answer from it (assessments.parquet; district level, year 2026, All Students, NOT is_alt, source='bulk'): 1. assessment='Algebra 1' -> tested_count = 13122. 2. Tested counts: ELA 8 = 11425, ELA 3-8 = 67979, ELA All = 80494. Spans are separate assessments, not grades - never use grade != 'All' for per-grade. 3. Proficiency: Math 6-8 = 21.9 but Math All = 36.9. Math 6-8 excludes every accelerated student - do not quote it as "middle school math". If a number differs, the method is wrong - read /data/QUERYING.md before proceeding. ## Notes - Join key everywhere: the 3-digit MCPS school code, zero-padded string (427 = Walt Whitman HS). - null values (with a suppressed flag / marker) are privacy-suppressed small counts - do not infer them. - The Parquet tables are DuckDB-queryable in place, e.g. top middle schools by math acceleration: SELECT school_name, accel_pct, math_all_pct, farms_pct FROM 'https://mocoparents.org/data/school_year.parquet' WHERE school_type = 'MS' AND year = 2025 ORDER BY accel_pct DESC LIMIT 5 - Audit layer: mcps_consolidated.parquet holds every figure both agencies publish, exactly as reported (EAV - pivot by record_id; shapes + ready-made pivots: https://mocoparents.org/data/schemas/warehouse_domains.json). Use it to verify a number, not to start from. - Where MCPS and MSDE report the same fact, it carries concept / canonical / discrepant flags (enrollment prefers MCPS; test scores prefer MSDE); cross-check report at https://mocoparents.org/data/source_discrepancies.json - Sources: MCPS School Profiles, MSDE Report Card, U.S. Census ACS, MD SDAT.