forked from ChelseaKR/gtfs-scorecard
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
222 lines (214 loc) · 13.7 KB
/
Copy pathindex.html
File metadata and controls
222 lines (214 loc) · 13.7 KB
1
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Open data — GTFS Scorecard</title>
<meta name="description"
content="Download the worldwide GTFS data-quality dataset and the separate United States NTD readiness portfolio. One row per covered feed record, updated on completed scoring runs.">
<link rel="canonical" href="https://gtfsscorecard.org/data/">
<meta property="og:type" content="website">
<meta property="og:title" content="Open data — GTFS Scorecard">
<meta property="og:description" content="Download the worldwide GTFS data-quality dataset and the separate United States NTD readiness portfolio.">
<meta property="og:url" content="https://gtfsscorecard.org/data/">
<meta property="og:image" content="https://gtfsscorecard.org/og.png">
<meta property="og:image:alt" content="GTFS Scorecard: transit data quality for small agencies.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://gtfsscorecard.org/og.png">
<meta name="twitter:image:alt" content="GTFS Scorecard: transit data quality for small agencies.">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"DataCatalog","name":"GTFS Scorecard open data","description":"Scheduled GTFS data-quality reports for the public transit feed records this site currently covers worldwide, with public last-run status.","url":"https://gtfsscorecard.org/data/","license":"https://creativecommons.org/licenses/by/4.0/","publisher":{"@type":"Organization","name":"GTFS Scorecard","url":"https://gtfsscorecard.org/"},"dataset":[{"@type":"Dataset","name":"GTFS Scorecard agency feed-quality dataset","url":"https://gtfsscorecard.org/dataset.json","license":"https://creativecommons.org/licenses/by/4.0/","distribution":[{"@type":"DataDownload","encodingFormat":"application/json","contentUrl":"https://gtfsscorecard.org/dataset.json"},{"@type":"DataDownload","encodingFormat":"text/csv","contentUrl":"https://gtfsscorecard.org/dataset.csv"}]}]}</script>
<link rel="stylesheet" href="/src/styles.css">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ccircle cx='16' cy='16' r='13' fill='%23204e3a'/%3E%3Ccircle cx='16' cy='16' r='5' fill='%23f2f3ee'/%3E%3C/svg%3E">
<script src="/src/theme.js" defer></script>
<script src="/src/nav.js" defer></script>
<noscript><style>
/* Without JS the menu button cannot expand the collapsed nav, so show the
stacked nav permanently and hide the button (content stays operable
without scripting). nav.js never runs here, so nothing double-toggles. */
@media (max-width: 1400px) {
.nav-menu-btn { display: none !important; }
.nav-cluster { display: flex !important; position: static; }
}
</style></noscript>
</head>
<body>
<a class="skip-link" href="#main">Skip to main content</a>
<header class="site-header"><div class="wrap"><a class="brand" href="/"><span class="brand-mark" aria-hidden="true"></span><span class="brand-name">GTFS Scorecard</span></a><button class="nav-menu-btn" type="button" aria-expanded="false" aria-controls="nav-cluster"><span aria-hidden="true">☰</span> Menu</button><div class="nav-cluster" id="nav-cluster"><nav class="nav-stops" aria-label="Primary"><a class="nav-stop" href="/agencies/"><span class="pip" aria-hidden="true"></span>Find an agency</a><a class="nav-stop" href="/pulse/"><span class="pip" aria-hidden="true"></span>Coverage</a><a class="nav-stop" href="/app/#/?view=features"><span class="pip" aria-hidden="true"></span>Feed features</a><a class="nav-stop" href="/tools/"><span class="pip" aria-hidden="true"></span>Tools</a><a class="nav-stop" href="/how-to-read/"><span class="pip" aria-hidden="true"></span>How it works</a><a class="nav-stop" href="/about/"><span class="pip" aria-hidden="true"></span>About</a></nav><div id="theme-control"></div></div></div></header>
<main id="main" class="wrap" tabindex="-1">
<a class="backlink" href="/">← Home</a>
<h1 class="page-title">The open dataset</h1>
<p class="page-lede">Every feed record's latest grade and measured category scores in one file,
updated on completed scoring runs and free to download and cite. The same scores behind the agency pages, published flat so a
researcher or transit program can analyze every feed this site currently covers at once.</p>
<section aria-labelledby="get-h">
<h2 class="section-title" id="get-h">Get the data</h2>
<p>One row per feed record: id, name, date, letter grade, overall score, available category scores,
and days until the service calendar expires. Built from the same dated artifacts the site
runs on, so it is reproducible and versioned.</p>
<p>
<a class="btn btn-primary" href="/dataset.csv">Download CSV</a>
<a class="btn btn-ghost" href="/dataset.json">Download JSON</a>
<a class="btn btn-ghost" href="/ntd.json">United States NTD portfolio (JSON)</a>
<a class="btn btn-ghost" href="/api/v1/accessibility.json">Accessibility coverage (JSON)</a>
</p>
<p id="dataset-summary" class="page-lede"></p>
<p>Browse the same data as pages: <a href="/ntd/">United States NTD readiness</a>,
<a href="/access/">accessibility data coverage</a>, and a
<a href="/procurement/">procurement clause</a> agencies can put in a vendor contract.
The full endpoint list is at <a href="/api/v1/index.json">api/v1/index.json</a>.</p>
</section>
<section aria-labelledby="ntd-h">
<h2 class="section-title" id="ntd-h">United States NTD readiness, by state</h2>
<p>This separate view covers United States feed records. Since Report Year 2023, every
National Transit Database reporter with fixed-route or
deviated-fixed-route service has to publish a valid, current GTFS feed and certify it each
year. This is how many tracked U.S. feed scorecards look ready, nationally and per state.
Readiness mirrors three pillars (published, valid, current); it is a heads-up, not an
official determination.</p>
<p id="ntd-headline" class="page-lede"></p>
<table id="ntd-table" class="data-table" hidden>
<caption class="visually-hidden">Feed scorecards ready to certify, by state</caption>
<thead>
<tr><th scope="col">State</th><th scope="col">Ready</th><th scope="col">Needs attention</th><th scope="col">Not ready</th><th scope="col">Total</th></tr>
</thead>
<tbody id="ntd-rows"></tbody>
</table>
<p id="ntd-fallback">Download <a href="/ntd.json">ntd.json</a> for the full United States
national and per-state breakdown.</p>
</section>
<section aria-labelledby="use-h">
<h2 class="section-title" id="use-h">How to use and cite it</h2>
<p>Free to use, share, and build on. If you cite it, please link
<a href="https://gtfsscorecard.org/">gtfsscorecard.org</a> and note the date you pulled the
data, since it can change after a completed scoring run. Check <a href="/status/">pipeline
status</a> for the latest run time. The scoring method, with citations, is in
<a href="https://github.com/ChelseaKR/gtfs-scorecard/blob/main/docs/rubric.md">docs/rubric.md</a>,
how it maps to the standards is in
<a href="https://github.com/ChelseaKR/gtfs-scorecard/blob/main/docs/crosswalk.md">docs/crosswalk.md</a>,
and the machine-readable weights are at
<a href="/data/artifacts/scoring.json">scoring.json</a>.</p>
<p>The CC BY 4.0 license covers this scorecard's reports and derived dataset. It does not
relicense or redistribute the underlying GTFS files. Each feed keeps its publisher's own
terms, recorded in its scorecard artifact.</p>
<p>This is a data-quality lens, not an official compliance determination. The grade is
computed on top of the canonical
<a href="https://gtfs-validator.mobilitydata.org/">MobilityData GTFS validator</a>.</p>
</section>
</main>
<footer class="site-footer">
<div class="wrap">
<div class="footer-intro">
<a class="footer-brand" href="/">GTFS Scorecard</a>
<p>An open-source data quality tool for small and rural transit agencies.</p>
</div>
<nav class="footer-grid" aria-label="Footer">
<section aria-labelledby="footer-find-h">
<h2 id="footer-find-h">Find a scorecard</h2>
<ul>
<li><a href="/agencies/">Agency directory</a></li>
<li><a href="/app/">Interactive search</a></li>
<li><a href="/map/">Agency map</a></li>
<li><a href="/routes/">All routes</a></li>
<li><a href="/compare/">Compare two agencies</a></li>
</ul>
</section>
<section aria-labelledby="footer-improve-h">
<h2 id="footer-improve-h">Improve a feed</h2>
<ul>
<li><a href="/fix/">GTFS errors & fixes</a></li>
<li><a href="/check/">Check before publishing</a></li>
<li><a href="/try.html">Request a one-off score</a></li>
<li><a href="/subscribe.html">Feed-health alerts</a></li>
<li><a href="/submit.html">Add an agency</a></li>
<li><a href="/claim/">Correct or claim a listing</a></li>
<li><a href="/procurement/">Procurement language</a></li>
</ul>
</section>
<section aria-labelledby="footer-explore-h">
<h2 id="footer-explore-h">Explore the data</h2>
<ul>
<li><a href="/pulse/">Coverage overview</a></li>
<li><a href="/problems/">Common problems</a></li>
<li><a href="/realtime/">Realtime quality</a></li>
<li><a href="/adoption/">What feeds publish</a></li>
<li><a href="/focus/">Focus areas</a></li>
<li class="footer-subhead">United States tools</li>
<li><a href="/ntd/">U.S. NTD readiness</a></li>
<li><a href="/equity/">U.S. equity</a></li>
<li><a href="/query/">Query the dataset</a></li>
<li><a href="/data/">Open data</a></li>
</ul>
</section>
<section aria-labelledby="footer-project-h">
<h2 id="footer-project-h">Project</h2>
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/status/">Status</a></li>
<li><a href="/support/">Get help or sponsor</a></li>
<li><a href="/how-to-read/">How to read a scorecard</a></li>
<li><a href="/how-to-read/#glossary">Glossary</a></li>
<li><a href="/crosswalk/">Standards crosswalk</a></li>
<li><a href="/press/">For reporters</a></li>
<li><a href="/accessibility/">Accessibility</a></li>
<li><a href="https://github.com/ChelseaKR/gtfs-scorecard/blob/main/CONTRIBUTING.md">Contribute</a></li>
<li><a href="https://github.com/ChelseaKR/gtfs-scorecard/blob/main/docs/listing-policy.md">Listing & removal policy</a></li>
</ul>
</section>
</nav>
</div>
</footer>
<script>
// Enrich with live numbers; the download links and fallbacks stand if JS is
// off or a fetch fails.
const esc = (s) => String(s == null ? "" : s).replace(/[&<>"']/g, (c) =>
({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]));
Promise.all([
fetch("/dataset.json").then((r) => (r.ok ? r.json() : null)),
fetch("/api/v1/stats.json").then((r) => (r.ok ? r.json() : null)),
])
.then(([d, stats]) => {
const rows = (d && d.rows) || [];
if (!rows.length) return;
let current = 0;
for (const row of rows) {
if (typeof row.days_until_expiry === "number" && row.days_until_expiry > 0) current += 1;
}
const pctCurrent = rows.length ? Math.round((current / rows.length) * 100) : 0;
const comparable = Number(stats && stats.comparison && stats.comparison.eligible_count);
const guardedAverage =
Number.isInteger(comparable) && comparable > 0 &&
stats && typeof stats.average_score === "number";
const averageText = guardedAverage
? ` Guarded average score ${stats.average_score} out of 100 across ` +
`${comparable.toLocaleString()} canonical, non-duplicate feed records.`
: " Cross-feed average unavailable until current-contract checks create a " +
"comparable cohort.";
document.getElementById("dataset-summary").textContent =
`${rows.length.toLocaleString()} feed records in the current file. ` +
`${pctCurrent}% have a calendar that has not expired.` + averageText;
})
.catch(() => {});
fetch("/ntd.json")
.then((r) => (r.ok ? r.json() : null))
.then((d) => {
if (!d || typeof d.total !== "number" || !d.total) return;
document.getElementById("ntd-headline").innerHTML =
`<strong>${d.pct_ready}% of ${d.total.toLocaleString()} tracked feed records look ready to certify.</strong> ` +
`${d.ready.toLocaleString()} ready, ${d.at_risk.toLocaleString()} need attention, ` +
`${d.not_ready.toLocaleString()} not ready.`;
const byState = d.by_state || {};
const names = Object.keys(byState).filter((s) => s).sort();
if (!names.length) return;
const body = document.getElementById("ntd-rows");
body.innerHTML = names.map((name) => {
const s = byState[name] || {};
return `<tr><td>${esc(name)}</td><td>${s.ready || 0}</td>` +
`<td>${s.at_risk || 0}</td><td>${s.not_ready || 0}</td><td>${s.total || 0}</td></tr>`;
}).join("");
document.getElementById("ntd-table").hidden = false;
document.getElementById("ntd-fallback").hidden = true;
})
.catch(() => {});
</script>
</body>
</html>