Interactive dashboard of NYCPS public ELA results, grades 3-8, 2018-2026. Built for CPRL. Citywide, borough and district views, NYC Reads rollout phases, student subgroups, and the paper-to-computer t
翻译准备中
数据HTML · JavaScriptGitHub @anuragmishraapplications-lab在线运营者未确认
试用过了吗? 点一下就好,无需登录。
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Interactive dashboard of NYCPS public ELA results, grades 3-8, 2018-2026. Built for CPRL. Citywide, borough and district views, NYC Reads rollout phases, student subgroups, and the paper-to-computer test transition.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Interactive dashboard of NYCPS public ELA results (grades 3–8, 2018–2026) for CPRL /
the Robertson Foundation ask.
Deliverable: NYC_Reads_ELA_Dashboard.html — one file, 1.5 MB, opens by
double-clicking. No server, no install, no network needed (Chart.js and all data are
embedded; only webfonts load from Google and fall back cleanly to system serif/sans).
Every chart has a PNG button; every page has a Download CSV button that exports
exactly the view on screen (so results can be dropped straight into a deck).查看完整 README ↗Interactive dashboard of NYCPS public ELA results (grades 3–8, 2018–2026) for CPRL / the Robertson Foundation ask.
Deliverable: NYC_Reads_ELA_Dashboard.html — one file, 1.5 MB, opens by
double-clicking. No server, no install, no network needed (Chart.js and all data are
embedded; only webfonts load from Google and fall back cleanly to system serif/sans).
| Page | What it answers |
|---|---|
| Citywide overview | Where the city stands in 2026 and how far it has moved from a baseline you pick (2023, 2024 or 2025). Level distribution by year and by grade. |
| District explorer | All 32 districts on any grade band and any student group. Names the districts that improved on both measures and those that got worse on both, each tagged with its NYC Reads wave. Scatter of Δ Level 1 against Δ proficiency with the "improved on both" quadrant shaded, ranked bars, sortable table, CSV. |
| Boroughs | Borough trends and distributions; every district as a bar coloured by borough; borough × grade matrix. |
| NYC Reads phases | Elementary Phase 1 vs Phase 2 on tested grades 3–5, the middle-school wave on grades 6–8, group-contrast table, and a placebo check. |
| Providers & curriculum | Districts grouped by the NYC Reads professional learning provider they work with and by the elementary curriculum they adopted, with ELA results for each group. |
| Subgroups & gaps | Every reported student group at city / borough / district level, plus five paired proficiency gaps over time. |
| Test format | The paper-to-computer transition, grouped by the year each grade moved. Each line is dashed with hollow points while those grades were on paper and solid with filled points once they moved, so the switch is visible without annotations. |
Every chart has a PNG button; every page has a Download CSV button that exports exactly the view on screen (so results can be dropped straight into a deck).
Phase markers. Time-series charts carry dashed rules at the first year each NYC Reads wave could appear in results. A spring test sits at the end of that school year, so a wave launched in SY 2023–24 first shows up in the 2024 results — the marker goes on 2024, not 2023. Years before any wave reached a tested grade are tinted and labelled "before NYC Reads". Each chart shows only the waves that reach the grades it plots: the grades 3–5 charts carry the elementary waves, the grades 6–8 charts carry the middle-school wave. The test-format page marks the paper-to-computer transitions instead. A Phase markers checkbox on each page turns them off for a clean export.
count / tested. Nothing is copied from a published
percentage column, so no figure is a rounded value of a rounded value.python3 scripts/extract.py # .xlsx -> data/payload.json, asserts every invariant
python3 scripts/build.py # template + app.js + payload + Chart.js -> single HTML
extract.py refuses to emit a row that violates its invariants, so a bad build fails
loudly rather than shipping wrong numbers.
Two independent audits, both run against the shipped file with the browser driving
the real UI. Each re-reads the original .xlsx files from scratch rather than reusing
any intermediate artefact.
python3 scripts/audit_engine.py # 40,698 combinations, numeric with tolerance
python3 scripts/audit_digest.py # 40,698 combinations, exact by hash
python3 scripts/audit_render.py # 8,324 rendered values
python3 scripts/audit_pass2.py # 4,030 chart, table and CSV values
| Audit | Coverage | Result |
|---|---|---|
audit_raw.py | Internal consistency of all 30,728 source rows | counts sum to tested; % = count/tested; L3+4 = L3+L4; max deviation 5.7e-6 pp |
audit_engine.py | Every level × geography × grade band × year × student group = 40,698 combinations pulled out of the live page | 0 mismatches. Max deviation 5e-7 pp on percentages, 9.8e-7 on mean scale score. Also cross-checks all 28,523 cells against the files' own published % columns (agreement to 4.3e-6 pp, the source's float precision). |
audit_digest.py | All 40,698 combinations again, by SHA-256 over the aggregated student counts. Exact integer comparison, no dependence on decimal formatting | identical hash |
audit_render.py | 9,560 values actually rendered — KPI cards, chart datapoints, table cells, signs and directions of every change — across 130 filter states | 0 mismatches |
audit_pass2.py | 4,062 more: the diverging grade chart, the 2022 reference chart, the district scatter and ranked bars, the borough matrix and district bars, the phase contrast table, the gap chart, the per-grade format table, and all six CSV exports in full | 0 mismatches |
Claims in the team's working doc were reproduced exactly: citywide Level 1 26.1% → 24.3% (2024→2026); 27 of 32 districts down on Level 1; largest falls in Districts 23, 7, 16 and 5; and 23, 16, 5 confirmed as Elementary Phase 1.
Assignments are for school year 2025-26, the year the spring 2026 test measures,
transcribed from the curriculum-and-JESP chart the team supplied on 11 Aug 2026 into
data/vendors_sy2025_26.json. JESP is the job-embedded support provider, i.e. the
professional learning vendor. K-5 and grades 6-8 are held separately because they differ.
The 2026-27 draft workbook is no longer used for provider or curriculum: those
assignments begin after the 2026 test, and they differ from SY2025-26 for 21 of the 32
districts. That workbook also carried superintendent names and 94 email addresses, so it
was never committed; extract.py still asserts that no @ can reach the payload.
Unresolved: the supplied chart's own Phase column disagrees with the NYC Reads launch timeline for seven districts (10, 13, 14, 24, 28, 29, 30). The tool keeps the launch timeline, because it is independently corroborated by the "year joined" columns of the 2026-27 workbook for all 32 districts. The disagreement is displayed on the providers page rather than hidden.
The number of students tested is not stable. Between 2024 and 2026 the district totals fell 2.6%, but individual districts range from -15.4% (D05) to +10.0% (D14). Because a district's result is a percentage of whoever sat the test, that is a competing explanation for a measured gain, and it is not a small one: the change in cohort size correlates with the change in proficiency at r = -0.48 and with the change in the Level 1 share at r = +0.60. The 14 districts whose cohort shrank by more than 5% averaged +4.2pp on proficiency against +0.4pp for those that held steady or grew.
The district explorer carries a "Δ tested %" column and a dedicated panel plotting cohort change against proficiency change, so the two are read together.
Mathematics, Science and charter schools are out of scope. NYC Solves provider and curriculum are carried in the district table for reference but no ELA result is ever grouped by them, since they concern mathematics.
School level. The meeting scoped this to citywide, borough and district for a first cut, so the school file is not loaded. It is present and usable: 1,129 schools over 33,793 rows in its All Students tab, with the same columns plus DBN and school name. Adding a school page is straightforward — the same engine handles it — and would let you see which schools drive a district's movement, which is the natural next question for targeting support.
NYC_Reads_ELA_Dashboard.html the deliverable
src/template.html markup + CSS (CPRL palette, Crimson Text / Hind)
src/app.js aggregation engine + all seven pages
scripts/extract.py .xlsx -> payload.json, with invariant assertions
scripts/build.py assembles the single file
scripts/audit_*.py the audits above
data/ source .xlsx, payload.json, CPRL logo
audit/ captured dumps from the live page