├── .gitignore ├── README.md ├── bower.json ├── gulpfile.js ├── package.json └── public ├── common ├── css │ └── common.css ├── favicon.ico ├── js │ └── capitons.js ├── partials │ └── nav.html └── templates │ └── card-template.html ├── datasets ├── css │ └── datasets.css ├── datasets.html └── js │ └── datasets.js ├── datatype ├── AssaultsonOfficers.html ├── Citations.html ├── Complaints.html ├── OfficerInvolvedShootings.html ├── Pursuits.html ├── ResponseTime.html ├── TrafficandPedestrianStops.html ├── UseofForce.html └── js │ └── datatype.js ├── grid ├── css │ └── grid.css ├── img │ └── KeyToHashmarks.gif ├── index.html └── js │ └── grid.js └── recommendations ├── img ├── bulk1.png ├── bulk2.png ├── context1.png ├── context2.png ├── context3.png ├── context4.png ├── date1.png ├── date2.png ├── example1.png ├── incident1.png ├── incident2.png ├── incident3.png ├── machineReadable1.png ├── machineReadable2.png ├── machineReadable3.png └── machineReadable4.png └── recommendations.html /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io 2 | 3 | ### OSX ### 4 | .DS_Store 5 | .AppleDouble 6 | .LSOverride 7 | 8 | # Icon must end with two \r 9 | Icon 10 | 11 | 12 | # Thumbnails 13 | ._* 14 | 15 | # Files that might appear in the root of a volume 16 | .DocumentRevisions-V100 17 | .fseventsd 18 | .Spotlight-V100 19 | .TemporaryItems 20 | .Trashes 21 | .VolumeIcon.icns 22 | 23 | # Directories potentially created on remote AFP share 24 | .AppleDB 25 | .AppleDesktop 26 | Network Trash Folder 27 | Temporary Items 28 | .apdisk 29 | 30 | 31 | ### Node ### 32 | # Logs 33 | logs 34 | *.log 35 | 36 | # Runtime data 37 | pids 38 | *.pid 39 | *.seed 40 | 41 | # Directory for instrumented libs generated by jscoverage/JSCover 42 | lib-cov 43 | 44 | # Coverage directory used by tools like istanbul 45 | coverage 46 | 47 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 48 | .grunt 49 | 50 | # node-waf configuration 51 | .lock-wscript 52 | 53 | # Compiled binary addons (http://nodejs.org/api/addons.html) 54 | build/Release 55 | 56 | # Dependency directory 57 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 58 | node_modules 59 | 60 | 61 | ### Bower ### 62 | bower_components 63 | .bower-cache 64 | .bower-registry 65 | .bower-tmp 66 | 67 | ### Build Folder ### 68 | out 69 | PoliceOpenDataCensus -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | To Add a New Department or Dataset: 2 | ------------- 3 | 4 | [Fill out this form!](https://docs.google.com/forms/d/1Qe3UQOPI7w0QxdsVVhy6tTbX5TYMlqc48duP7YP9z6k/viewform) 5 | 6 | For Development: 7 | ------------- 8 | 9 | `git clone git@github.com:codeforamerica/PoliceOpenDataCensus.git` 10 | 11 | `cd PoliceOpenDataCensus` 12 | 13 | `npm install` 14 | 15 | `npm install gulp -G` 16 | 17 | `gulp readme` 18 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "policedatacensus", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "ignore": [ 6 | "**/.*", 7 | "node_modules", 8 | "bower_components", 9 | "test", 10 | "tests" 11 | ], 12 | "dependencies": { 13 | "tabletop": "~1.4.0", 14 | "jquery": "~2.1.4", 15 | "bootstrap": "~3.3.4", 16 | "handlebars": "~3.0.3", 17 | "underscore": "~1.8.3", 18 | "uri.js": "~1.15.1", 19 | "components-font-awesome": "~4.3.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var concat = require('gulp-concat'); 3 | var uglify = require('gulp-uglify'); 4 | var prepBower = require('bower-files'); 5 | var inject = require('gulp-inject'); 6 | var series = require('stream-series'); 7 | var del = require('del'); 8 | var bower = require('gulp-bower'); 9 | var colors = require('colors'); 10 | var taskListing = require('gulp-task-listing'); 11 | var betterConsole = require('better-console'); 12 | var ghPages = require('gulp-gh-pages'); 13 | var connect = require('gulp-connect'); 14 | var print = require('gulp-print'); 15 | var underscore = require('underscore'); 16 | var merge = require('merge-stream'); 17 | var install = require("gulp-install"); 18 | 19 | var modules = ["datasets", "grid", "datatype", "recommendations"]; 20 | 21 | gulp.task('default', ["bower", "clean", "buildDev"]); 22 | 23 | gulp.task('help', taskListing); 24 | 25 | gulp.task('bower', function() { 26 | return bower().pipe(gulp.dest('bower_components/')) 27 | }); 28 | 29 | gulp.task('npm', function() { 30 | return gulp.src(['./package.json']) 31 | .pipe(install()); 32 | }); 33 | 34 | gulp.task('clean', function() { 35 | return del.sync(['out/']); 36 | }); 37 | 38 | gulp.task('buildDev', ['npm', 'bower', "clean"], function() { 39 | var lib = prepBower(); 40 | 41 | var bowerJs = gulp.src(lib.ext('js').files) 42 | .pipe(gulp.dest('out/common/js')); 43 | 44 | var bowerCss = gulp.src(lib.ext('css').files) 45 | .pipe(gulp.dest('out/common/css')); 46 | 47 | var bowerWoff = gulp.src(lib.ext('woff').files) 48 | .pipe(gulp.dest('out/common/fonts')); 49 | 50 | var commonCss = gulp.src('./public/common/css/**.css') 51 | .pipe(gulp.dest('out/common/css')); 52 | 53 | var commonJs = gulp.src('./public/common/js/**.js') 54 | .pipe(gulp.dest('out/common/js')); 55 | 56 | 57 | gulp.src('./public/common/favicon.ico') 58 | .pipe(gulp.dest('out/')); 59 | 60 | 61 | return merge(underscore.map(modules, function(module) { 62 | var target = gulp.src('./public/' + module + '/*.html'); 63 | 64 | var customJs = gulp.src('./public/' + module + '/js/**.js') 65 | .pipe(gulp.dest('out/' + module + '/js')); 66 | 67 | var customCss = gulp.src('./public/' + module + '/css/**.css') 68 | .pipe(gulp.dest('out/' + module + '/css')); 69 | 70 | var images = gulp.src('./public/' + module + '/img/**.*') 71 | .pipe(gulp.dest('out/' + module + '/img')); 72 | 73 | 74 | return merge([target.pipe(inject(series(bowerJs, commonJs, customJs), { 75 | ignorePath: '/out/' 76 | })) 77 | .pipe(inject(series(bowerCss, commonCss, customCss), { 78 | ignorePath: '/out/' 79 | })) 80 | .pipe(inject(bowerWoff, {ignorePath:'/out/'})) 81 | //OKAY so bummer, it doesn't sound like gulp-inject supports dynamic 82 | //injection tags so we'll need to hard code these for now. Hopefully 83 | //there won't be more than just the nav. 84 | .pipe(inject(gulp.src(['./public/common/partials/nav.html']), { 85 | starttag: '', 86 | transform: function (filePath, file) { 87 | return file.contents.toString('utf8') 88 | } 89 | })) 90 | .pipe(inject( 91 | gulp.src(['./public/common/templates/*.html'], { 92 | read: true 93 | }), { 94 | starttag: '', 95 | transform: function(filePath, file) { 96 | return '"; 97 | } 98 | } 99 | )) 100 | .pipe(gulp.dest('out/')) 101 | .pipe(connect.reload()), images]) 102 | })); 103 | }); 104 | 105 | gulp.task('watch', ['buildDev'], function() { 106 | return gulp.watch("public/**/*", ['buildDev']); 107 | }); 108 | 109 | gulp.task('connect', function() { 110 | connect.server({ 111 | root: 'out', 112 | port: 8000, 113 | livereload: true 114 | }); 115 | }); 116 | 117 | gulp.task('devServer', ['connect', 'watch']) 118 | 119 | gulp.task('buildProd', ['bower'], function() { 120 | var lib = prepBower(); 121 | 122 | 123 | var bowerJs = gulp.src(lib.ext('js').files) 124 | .pipe(concat('lib.min.js')) 125 | .pipe(uglify()) 126 | .pipe(gulp.dest('PoliceOpenDataCensus/common/js')); 127 | 128 | var bowerCss = gulp.src(lib.ext('css').files) 129 | .pipe(concat('lib.min.css')) 130 | .pipe(gulp.dest('PoliceOpenDataCensus/common/css')); 131 | 132 | var bowerWoff = gulp.src(lib.ext('woff').files) 133 | .pipe(gulp.dest('PoliceOpenDataCensus/common/fonts')); 134 | 135 | var commonCss = gulp.src('./public/common/css/**.css') 136 | .pipe(gulp.dest('PoliceOpenDataCensus/common/css')); 137 | 138 | var commonJs = gulp.src('./public/common/js/**.js') 139 | .pipe(concat('common.min.js')) 140 | .pipe(uglify()) 141 | .pipe(gulp.dest('PoliceOpenDataCensus/common/js')); 142 | 143 | gulp.src('./public/common/favicon.ico') 144 | .pipe(gulp.dest('PoliceOpenDataCensus/')); 145 | 146 | return merge(underscore.map(modules, function(module) { 147 | var target = gulp.src('./public/' + module + '/*.html'); 148 | 149 | var customJs = gulp.src('./public/' + module + '/js/**.js') 150 | .pipe(concat('app.min.js')) 151 | .pipe(uglify()) 152 | .pipe(gulp.dest('PoliceOpenDataCensus/' + module + '/js')); 153 | 154 | var customCss = gulp.src('./public/' + module + '/css/**.css') 155 | .pipe(concat('app.min.css')) 156 | .pipe(gulp.dest('PoliceOpenDataCensus/' + module + '/css')); 157 | 158 | 159 | var images = gulp.src('./public/' + module + '/img/**.*') 160 | .pipe(gulp.dest('PoliceOpenDataCensus/' + module + '/img')); 161 | 162 | 163 | return merge([target.pipe(inject(series(bowerJs, commonJs, customJs))) 164 | .pipe(inject(series(bowerCss, commonCss, customCss))) 165 | .pipe(inject(bowerWoff)) 166 | .pipe(inject(gulp.src(['./public/common/partials/nav.html']), { 167 | starttag: '', 168 | transform: function (filePath, file) { 169 | return file.contents.toString('utf8') 170 | } 171 | })) 172 | .pipe(inject( 173 | gulp.src(['./public/common/templates/*.html'], { 174 | read: true 175 | }), { 176 | starttag: '', 177 | transform: function(filePath, file) { 178 | return '"; 179 | } 180 | } 181 | )) 182 | .pipe(gulp.dest('PoliceOpenDataCensus/')) 183 | .pipe(connect.reload()), images]) 184 | })); 185 | 186 | }); 187 | 188 | gulp.task('cleanPublish', function() { 189 | return del.sync(['.publish/']); 190 | }); 191 | gulp.task('gh-pages', ["buildProd", "cleanPublish"], function() { 192 | return gulp.src('./PoliceOpenDataCensus/**/*') 193 | .pipe(ghPages()); 194 | }); 195 | 196 | gulp.task('deploy', ["gh-pages"], function() { 197 | return del.sync(['PoliceOpenDataCensus/']); 198 | }); 199 | 200 | var toFileName = function (filePath){ 201 | return filePath.split('\\').pop().split('/').pop().replace(/\.[^/.]+$/, ""); 202 | } 203 | 204 | gulp.task('readme', function() { 205 | betterConsole.clear() 206 | console.log("Part of:"); 207 | console.log("___ ____ ____ _ ____ ____ ___ ____ ____ _ _ ___ ____ ____ ___"); 208 | console.log("|__] |__/ | | | |___ | | | | | |\\/| |__] | | |__/ | "); 209 | console.log("| | \\ |__| _| |___ |___ | |___ |__| | | | |__| | \\ | "); 210 | console.log(); 211 | console.log(); 212 | console.log("From:") 213 | console.log("____ ____ ___ ____ ____ ____ ____ ____ _ _ ____ ____ _ ____ ____") 214 | console.log("| | | | \\ |___ |___ | | |__/ |__| |\\/| |___ |__/ | | |__|") 215 | console.log("|___ |__| |__/ |___ | |__| | \\ | | | | |___ | \\ | |___ | |") 216 | console.log(); 217 | console.log(" / ::::======= / \\ ".blue); 218 | console.log(" / ::::======= / \\ ".blue); 219 | console.log(" \\ =========== / / ".blue); 220 | console.log(" \\ =========== / / ".blue); 221 | console.log();; 222 | console.log("And:"); 223 | console.log("___ ____ ____ _ _ _ _ _ ___ _ _"); 224 | console.log(" | |___ |__| |\\/| | |\\ | | \\ \\_/"); 225 | console.log(" | |___ | | | | | | \\| |__/ |"); 226 | console.log(); 227 | console.log("______________________________________________".red); 228 | console.log(" _____ _____ _____ _______ _______".red); 229 | console.log("|_____] | | | | | |______".red); 230 | console.log("| |_____| |_____ __|__ |_____ |______".red); 231 | console.log(" _____ _____ _______ __ _".white); 232 | console.log("| | |_____] |______ | \\ |".white); 233 | console.log("|_____| | |______ | \\_|".white); 234 | console.log("______ _______ _______ _______".white); 235 | console.log("| \\ |_____| | |_____|".white); 236 | console.log("|_____/ | | | | |".white); 237 | console.log("_______ _______ __ _ _______ _ _ _______".blue); 238 | console.log("| |______ | \\ | |______ | | |______".blue); 239 | console.log("|_____ |______ | \\_| ______| |_____| ______|".blue); 240 | console.log("______________________________________________".blue); 241 | console.log(); 242 | console.log(); 243 | console.log("WHAT:"); 244 | console.log("The Police Open Data Census is an attempt to catalog open police accountibilty,"); 245 | console.log("oversight and transparency datasets available to the public."); 246 | console.log(); 247 | console.log("HOW:"); 248 | console.log("The Census is built on a Google Spreadsheet integration though tabletop.js."); 249 | console.log("Feedback and suggested additions to the current data are more than welcome"); 250 | console.log("at" + " indy@codeforamerica.org".red + " and/or our google form" + " bit.ly/1KMFbxZ".red) 251 | console.log(); 252 | console.log("The site is otherwise a fairly bogstandard bootstrap/jquery build. All that"); 253 | console.log("should be required to get the development environment up is:"); 254 | console.log(); 255 | console.log(" gulp") 256 | console.log(); 257 | console.log("which will build the site in the 'out' directory where it can be served by") 258 | console.log("your static site server of choice. If you're going to be working on the site,") 259 | console.log(); 260 | console.log(" gulp devServer") 261 | console.log(); 262 | console.log("will watch changes to the 'public' directory, serve a live updating version of") 263 | console.log("the site at localhost:8000 and live refresh when changes occur.") 264 | console.log("To minifiy and concat resouces then publish the site to gh-pages:") 265 | console.log(); 266 | console.log(" gulp deploy") 267 | console.log(); 268 | }); 269 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "better-console": "^0.2.4", 4 | "colors": "^1.1.0", 5 | "del": "^1.1.1", 6 | "gulp": "^3.8.11", 7 | "gulp-bower": "0.0.10", 8 | "gulp-connect": "^2.2.0", 9 | "gulp-gh-pages": "^0.5.1", 10 | "gulp-task-listing": "^1.0.0", 11 | "merge-stream": "^0.1.7", 12 | "stream-series": "^0.1.1" 13 | }, 14 | "dependencies": { 15 | "bower-files": "^3.7.0", 16 | "gulp-concat": "^2.5.2", 17 | "gulp-inject": "^1.2.0", 18 | "gulp-install": "^0.4.0", 19 | "gulp-print": "^1.1.0", 20 | "gulp-uglify": "^1.2.0", 21 | "underscore": "^1.8.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/common/css/common.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Base structure 3 | */ 4 | /* Move down content because we have a fixed navbar that is 50px tall */ 5 | 6 | body { 7 | padding-top: 50px; 8 | } 9 | /* 10 | * Global add-ons 11 | */ 12 | 13 | .sub-header { 14 | padding-bottom: 10px; 15 | border-bottom: 1px solid #eee; 16 | } 17 | /* 18 | * Top navigation 19 | * Hide default border to remove 1px line. 20 | */ 21 | 22 | .navbar-fixed-top { 23 | border: 0; 24 | } 25 | /* 26 | * Main content 27 | */ 28 | 29 | .main { 30 | padding: 20px; 31 | } 32 | 33 | a { 34 | word-wrap: break-word; 35 | } 36 | 37 | p { 38 | word-wrap: break-word; 39 | } 40 | 41 | @media (min-width: 768px) { 42 | .main { 43 | padding-right: 40px; 44 | padding-left: 40px; 45 | } 46 | } 47 | 48 | .main .page-header { 49 | margin-top: 0; 50 | } 51 | .datapole.DNE { 52 | background-color: silver; 53 | } 54 | 55 | .datapole.Yes { 56 | background-color: #8BDD3A; 57 | } 58 | 59 | .datapole.No { 60 | background-color: #DD3D3A; 61 | } 62 | 63 | .datapole.Unsure { 64 | background-color: #39BEFA; 65 | } 66 | 67 | ul.availability.icons { 68 | margin:20px; 69 | padding-left: 0px; 70 | list-style:none; 71 | width: 100%; 72 | } 73 | ul.icons li{ 74 | display: inline-block; 75 | width: 22px; 76 | height: 22px; 77 | line-height: 22px; 78 | text-align: center; 79 | margin-left: -2px; 80 | } 81 | 82 | ul.availability.icons li, i.fa { 83 | background-color: #CCC; 84 | color: #f9f9f9; 85 | padding: 3px; 86 | float: left; 87 | -webkit-border-radius: 2px; 88 | -moz-border-radius: 2px; 89 | border-radius: 3px; 90 | } 91 | 92 | .data-icons ul{ 93 | padding-left: 0px; 94 | line-height: 20px; 95 | text-align: left; 96 | vertical-align: top; 97 | line-height: 20px; 98 | } 99 | .tooltip{ 100 | display: block; 101 | } 102 | 103 | .department-title { 104 | margin-top: 0px; 105 | margin-bottom: 0px; 106 | color: white; 107 | } 108 | 109 | .panel-default > .department-title-heading { 110 | background-color: navy; 111 | } 112 | 113 | .clickable { 114 | cursor: pointer; 115 | } 116 | 117 | .firstCharacter { 118 | float: left; 119 | font-size: 70px; 120 | line-height: 60px; 121 | padding-top: 4px; 122 | padding-right: 8px; 123 | padding-left: 3px; 124 | } 125 | -------------------------------------------------------------------------------- /public/common/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/PoliceOpenDataCensus/73c45ad1c9efb29a4c2021e3d7b6d67780dba165/public/common/favicon.ico -------------------------------------------------------------------------------- /public/common/js/capitons.js: -------------------------------------------------------------------------------- 1 | var captions = { 2 | "free": { 3 | "Yes": "The data is available online", 4 | "No": "The data is not available online", 5 | "Unsure": "It is unclear whether the data is available online" 6 | }, 7 | 8 | "machine": { 9 | "Yes": "It's machine readable", 10 | "No": "It is not machine readable", 11 | "Unsure": "It is unclear whether the data is machine readable" 12 | }, 13 | 14 | "context": { 15 | "Yes": "Context is provided", 16 | "No": "Context is not provided ", 17 | "Unsure": "It is unclear whether the contect is provided" 18 | }, 19 | 20 | "bulk": { 21 | "Yes": "Data can be downloaded in bulk ", 22 | "No": "Data cannot be downloaded in bulk ", 23 | "Unsure": "It is unclear whether the data can be downloaded in bulk" 24 | }, 25 | 26 | "fresh": { 27 | "Yes": "Data is up-to-date", 28 | "No": "Data is not up-to-date ", 29 | "Unsure": "It is unclear whether the data is up-to-date" 30 | }, 31 | 32 | "incident": { 33 | "Yes": "Data shows individual incidents ", 34 | "No": "Data does not show individual incidents", 35 | "Unsure": "It is unclear whether the data shows individual incidents" 36 | } 37 | }; -------------------------------------------------------------------------------- /public/common/partials/nav.html: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /public/common/templates/card-template.html: -------------------------------------------------------------------------------- 1 |
Description: {{Description}}
42 |Content Available: {{"Content Available"}}
43 |Machine Readable: {{"Data is machine readable"}}
48 |Update Frequency: {{"Update frequency"}}
53 |Fields: {{"Fields Included"}}
58 |Download Formats: {{"Available downloads"}}
63 |Data timeline: {{"Data timeline"}}
68 |Is something missing? Please let us know about additional or updated policing datasets.
32 |These datasets contain information about incidents where officers were assaulted by individuals.
32 |These datasets contain information about citations given by police.
32 |These datasets contain information about resident complaints about police officers. They usually include whether the complaint was sustained, not sustained or exonerated after an investigation.
32 |These datasets contain information about incidents where police officers discharge their service weapons. That may include shootings where no one was hit (misses), as well as where someone was injured or killed.
32 |Philadelphia provides information about the city's approach to violent crime, procedures when officer-involved shootings occur, some tables and maps they've put together, and definitions of the terms used in addition to data about individual 35 | incidents. 36 |
37 | 38 |These datasets contain information about pursuits by police, the tactics utilized, and their outcomes.
32 |These datasets contain information about the time between calls for service and the arrival of emergency services.
32 |These datasets contain information about vehicle and pedestrian stops by police.
32 |These datasets contain information about incidents where police officers used force. They may share how often different types of incidents occured in different months, or share incident-level data such as the date and location of the incident.
32 |This is a census of currently available open datasets about police interactions with citizens in the US, including Use of Force, Officer-Involved Shootings, and Complaints Against Police. For crime data, see the Open Knowledge Foundation's 29 | US City Open Data Census.
30 |Created by the 2015 Code for America Fellows for Indianapolis 31 | www.codeforamerica.org/governments/indianapolis/
32 |Feedback welcome at 33 | indy@codeforamerica.org.
34 |35 | The state of transparent police accountability reporting varies widely across the country today. This is a good thing. A diverse group of departments across size, geographic region and situation are all attempting a variety of strategies 36 | and tactics for promoting better community relationships by being transparent around what they are doing well and where there is room for improvement. 37 |
38 |39 | We built our Police Open Data Census to surface as many of these early adopters as possible. We’ve begun to assemble a cross section of these departments and have seen first hand where the state of the art stands. Datasets vary from full annual accountability 40 | reports from the the Magnolia, Texas police department (13 officers, population 1,547) to the incredibly detailed incident decision letters issued by The Office of the Denver District Attorney every time a member of the Denver Police Department 41 | (1,470 officers, population 607,051) uses force in the line of duty. Looking at the cross section of this information we’ve prepared the following recommendations with the hope of offering departments interested in starting or augmenting open 42 | accountability programs with the best practices currently in use and seeing where similar departments stand. We also hope that the Census and these recommendations will serve as a valuable tool for interested residents to know what practices 43 | to advocate their local departments adopt and serve as evidence of the feasibility and impact these programs can have. 44 |
45 |46 | These recommendations should be considered “living” and, as such, any comments or alterations are more than welcome at Indy@CodeForAmerica.org. 47 |
48 |49 | We’ll begin the recommendations with the six cross-cutting vectors we evaluated each dataset in the Census on: 50 |
51 |56 | Any information that departments release should be available to the general public on an easily accessible and discoverable website. 57 |
58 |Ideally, departments should prominently feature links to this data on their websites and should routinely evaluate how accessible the data is from the perspective of external users. Consider that not all external users will necessarily know 59 | what policing specific terms (like “Internal Affairs”, “CALEA”, or “Office of Professional Standards”) mean or that the data they are looking for will be listed under those terms. Many cities have adopted open data portals from vendors like 60 | Socrata or 61 | Esri and several departments make their data available through them. If your department is releasing data like this, ensure again that users can easily find your data through both the portal and from your 62 | department’s website.
63 |As much as possible, any data released should be provided in a machine readable format (.csv, .json, .xml, etc.) in addition to any reports or web pages made for the general public. 81 |
82 |Data made available in PDFs and HTML pages are not generally considered machine readable. While technology exists to extract data from both, departments should make machine readable data in one of the other formats listed. Code for America advocates 83 | for machine readability in open data to “drive internal efficiency, spark community engagement, and fuel a civic tech ecosystem” by allowing the data to be used in conjunction with other datasets, applications or wider uses. Departments have 84 | found that by releasing data in machine readable formats, the wider community, in addition to those inside the department, can put the information to productive uses that were not initially considered. It will also greatly aid efforts like 85 | those by the Police Foundation and the Sunlight Foundation to provide for better national police accountability data gathering. 86 |
87 |Given the sensitivity of the police accountability data, departments should avoid only releasing machine readable data. It’s important that a general audience website or report summarizing and contextualizing the released information be made 88 | available first. Additionally, users of civic Open Data platforms should ensure that they completely fill out the metadata pages so consumers fully understand what they’re receiving. Preferably, the machine readable data should be easily accessed 89 | from similar paths as discussed above. 90 |
91 | 107 |132 | Releasing sensitive data should never be done without some attempt to contextualize and explain the information 133 |
134 |135 | The general public should be brought up to the department’s level of understanding around what the numbers in the data mean, any trends the department is aware of and what the required context is for correctly interpreting the provided data. Particularly 136 | useful to provide is some measure of the number of total police interactions with the public during the timeline of the data. Often this takes the form of the number of calls for service and the number of arrests. Providing this information 137 | can contextualize information like Use of Force incidents or Pursuits to the actual level of policing activity a department engages in. If a department provides data at a more granular level than annually, it can also help contextualize seasonal 138 | changes in policing activity that may otherwise appear as significant swings in incident frequency. 139 |
140 |141 | In addition to this contextual data, it is also important to provide explanations on what each field in a dataset represents. A common example is helping the general public to understand the typical dispositions of the police complaint process e.g. Sustained, 142 | Not Sustained, Exonerated, Unfounded. Again it’s valuable to approach this process from the perspective of the general public who may not be familiar with police-specific terminology and acronyms. 143 |
144 |145 | Two other valuable things a department can provide alongside a dataset include a short introduction from a high ranking member of the department introducing the data, explaining why the department is interested in releasing this information, the steps 146 | the department is taking based on the information included, and the full text of any relevant departmental policy or general orders. 147 |
148 |The released data should be available in as few downloads as makes sense.
195 |If a department provides incident level data it’s good to make those available in a single bulk download/page/report in addition to providing them separately. This is most relevant for machine readable data where it should be assumed that consumers 196 | of the data want all of it in as little additional work as possible. Most Open Data platforms will provide this functionality by default. 197 |
198 |Data should be released at sensible and predictable intervals. 223 |
224 |225 | Many departments in the Census release data annually. Others release incident level data as soon as they are legally permitted to do so. We understand that the work involved in collecting, collating and cleaning information means that annual releases 226 | are the the only sensible option for many departments. It is our hope that as departments move toward standardized software solutions for Professional Standards (e.g. CI Technologies’ IAPro), the work involved in data release can be automated 227 | to the point that it can be done far more often. If a department is committed to set interval reports (e.g. annual, monthly), information should be provided around the expected release date of the next report and be kept up to date itself. 228 | If a department releases information on an incident by incident basis, the process that dictates when information can be released should appear alongside the data. If possible, some measure of the amount of data “in the pipe” should be provided 229 | as well. 230 |
231 |If possible, data should be released at the incident level.
252 |253 | Many departments who release data annually condense and summarize their data sets. While this provides a good overall depiction of the state of the department, it removes a significant amount of value that can be gleaned from examining incidents at a 254 | more granular level. For instance, releasing a summary count table of “Reasons a Pursuit was Initiated” and a summary count table of “Reasons a Pursuit was Terminated” gives a good indication of general trends in what pursuits in a city look 255 | like, but prevents deeper analysis of the connection between those characteristics. Given the sensitivity of police accountability data, incident level data has to be handled with deliberate care to avoid publishing information that should 256 | not be public, but doing so strongly demonstrates a dedication to transparency. As with several other of the above concerns, there should not an “either or” decision between incident level data and summarized data. Ideally, both should be 257 | provided for “wide” and “deep” analysis and public understanding. 258 |
259 |