Jekyll2022-06-08T20:03:48-05:00https://skinnamarieke.com/feed.xmlskinnamariekeMiscellany by Marieke JacksonGenerational Anxiety2020-08-01T00:00:00-05:002020-08-01T00:00:00-05:00https://skinnamarieke.com/data/essays/2020/08/01/fear<!--
#################################################
### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
#################################################
# file to edit: _notebooks/2020-08-01-fear.ipynb
-->
<div class="container" id="notebook-container">
<div class="cell border-box-sizing code_cell rendered">
</div>
</div>Marieke JacksonNon-Profits & Tech2020-06-15T00:00:00-05:002020-06-15T00:00:00-05:00https://skinnamarieke.com/data/non-profits/civic%20tech/2020/06/15/non-profits<!--
#################################################
### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
#################################################
# file to edit: _notebooks/2020-06-15-non-profits.ipynb
-->
<div class="container" id="notebook-container">
<div class="cell border-box-sizing code_cell rendered">
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>There is a growing disparity in access to tech, and in turn, access to data. You have to have a certain income to afford a smart phone and a level of understanding to sign up for tech services, yes. But I'm particularly interested in the disparity in access to tech <em>across organizations</em>. Large, for-profit hospitals can afford more expensive electronic health records and billing tools than a small non-profit organization that serves the homeless. This disparity means that organizations serving individuals with low socioeconomic status have limited access to tools that can automate repeating processes, build basic reports, send data extracts to partners and funders, and generally spend less time entering and processing data.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>In the tech world, the folks programming and building the actual product generally don't think about costs (outside of developer time). For companies who make money from the product the technologists are building, success is determined by revenue.</p>
<p><img src="https://i.gifer.com/VZav.gif" alt="" /></p>
<p>A thriving charity's first success is being able to afford basic operations. A non-proft has "made it" when they can say "what else can we pay for".</p>
<p>We're going to review the cost of different technical solutions non-profits might use, how things like grant structures prohibit them from engaging technology, how that keeps them from doing what they want, and finally what technologists can do to fill the gap and support them.</p>
<h1 id="How-to-Read-this-Guide">How to Read this Guide<a class="anchor-link" href="#How-to-Read-this-Guide"> </a></h1><p><strong>This post is going to review the cost of different technical solutions non-profits might use, how things like grant structures prohibit them from engaging technology, how that keeps them from increasing efficiency, and finally what technologists can do to fill the gap and support them.</strong></p>
<p>For non-profits and government agencies, there's not a lot of passive (legal) revenue to the organization, so we're gonna cover that choose-your-own-adventure style.</p>
<p>If you are in tech, start here. If you are a non-profit, I'm going assume you're familiar with funding. Start <a href="#SaaS-Me-If-You-Can">further down</a>.</p>
<h1 id="Making-money-the-hard-way">Making money the hard way<a class="anchor-link" href="#Making-money-the-hard-way"> </a></h1><h2 id="A-primer-for-folks-who-haven't-hustled-to-avoid-revenue">A primer for folks who haven't hustled to avoid revenue<a class="anchor-link" href="#A-primer-for-folks-who-haven't-hustled-to-avoid-revenue"> </a></h2><p>Let's start with the assumption that all non-profits need some amount of funding. The most common methods for getting these funds are:</p>
<ol>
<li>Donations </li>
<li>Grants</li>
<li>Services</li>
</ol>
<h3 id="Donations">Donations<a class="anchor-link" href="#Donations"> </a></h3><p>For the sake of not letting myself ramble, we're going to focus on financial donations. Many non-profits exist on the model of donations of goods (like Goodwill), selling those goods, and then generating operating costs from those goods. It's a financial model. It exists. The end.</p>
<p>Non-profit organizations normally accept financial donations, but simply relying on someone to wake up and think "you know what, I'm going to send a check to United Way today" is probably not going to result in a reliable stream of income, if any income at all. If a non-profit wants a reliable amount of funds from donations, they need a fundraising campaign. Fundraising campaigns are not free - if Susan G. Komen spends $200,000 buying fancy pink shoes for football players and raises $800,000 (in an imaginary land in which you can directly attribute all financial donations to a single campaign), they're actually raising $600,000. They spent 25 cents for every dollar raised. In order to include this money in an annual budget, the non-profit needs to hold regular fundraising campaigns. This is why most non-profits will employ a Fundraising Coordinator or Marketing Specialist. If they plan on relying on donations as a revenue stream, they need to efficiently and consistently fundraise.</p>
<h3 id="Services">Services<a class="anchor-link" href="#Services"> </a></h3><p>Some non-profits receive funding for their programs through direct services given to members. For example, a non-profit that offers Medication Assisted Treatment may submit insurance claims for participants who have received services through the non-profit. Most insurance companies will have set money amounts for each procedure reported on each claim.</p>
<p>Services may also come in the form of goods, like yellow silicone bracelets that are $3 beacons of virtue...
<center>
<div class="jekyll-twitter-plugin"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">I finally got one. <a href="https://t.co/VjgsJRIyfT">pic.twitter.com/VjgsJRIyfT</a></p>— Marieke Jackson (@skinnamarieke) <a href="https://twitter.com/skinnamarieke/status/1171062154499411968?ref_src=twsrc%5Etfw">September 9, 2019</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div>
</center>
</p>
<h3 id="Grants">Grants<a class="anchor-link" href="#Grants"> </a></h3><p>Grants are a sum of money given to an organization for a specific purpose. Grants come in two basic flavors: a sweet but tangy public grant or an earthy, umami private grant. In my experience, private grants are a little less stringent with their requirements but here's a basic breakdown of how to receive and use grant funding.</p>
<p><strong>Step 1: Funding Opportunity Announcement (FOA)</strong>
Grant agency puts out an FOA (it's the government, did you think there wasn't an acronym?) that specifies what the grant is for, how much you could receive, who is eligible, timeline, and how to apply. Federal FOA's are almost humorously specific, like this "<a href="https://www.grants.gov/web/grants/search-grants.html">Small Grants Program for Leading English Discussion Groups in Sapporo, Japan</a>"</p>
<p><strong>Step 2: Application and Award</strong>
Agency seeking funding writes up their grant application (which usually is about the size of a graduate thesis) including a need statement, program narrative, proposed budget (or a budget narrative), discussion of impact, blood type, head shots, and $20 worth of pennies from 1960. Some of those are a joke but grant applicants have to be really careful what they include in their applications, using specific language, as the submissions are filtered through an <a href="https://www.nsf.gov/pubs/policydocs/pappg18_1/pappg_2.jsp#IIC2">automated</a> check initally.</p>
<p><strong>Step 3: Administration</strong>
Remember that grant budget you put in your application? Now you have to stick to it. The grant will specify how much money is allotted for each component: personnel, services, materials, etc. Grant awardees are required to not only stick to these budgets, but also report weekly to the funding agency.</p>
<p>For multi-year grants, awardees are oftentimes required to re-apply (with the understanding that they will still receive the grant). Funding agencies may adjust the amount of funds given to awardees at this time.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="Identifying-and-Adopting-Tech,-An-Example">Identifying and Adopting Tech, An Example<a class="anchor-link" href="#Identifying-and-Adopting-Tech,-An-Example"> </a></h1><h2 id="SaaS-Me-If-You-Can">SaaS Me If You Can<a class="anchor-link" href="#SaaS-Me-If-You-Can"> </a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Back in the day, I was the data manager for two federal grants that were implemented by a state government. Our grant provided direct services for citizens, so a portion of the grant was earmarked for those costs. We were required to spend a certain percentage of grant funds on direct services.</p>
<p>The program I worked for required a 60/40 split when it came to direct services. This means we had to spend at least 60% of our allotted money on paying for medical services for our participants. The grant also required that we report very specific data elements from those services.</p>
<p>Because the grant was federally funded but implemented at the state level, the program was responsible for both salary and benefits for all employees. The Program was also responsible for paying an administrative fee to the state - for using state resources (internet, office space, legal services, etc).</p>
<p>For the sake of easy math, let's say the program was granted $1,000,000.</p>
<p><strong><em>Charts are interactive, so you can click or hover for more info.</em></strong></p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_html rendered_html output_subarea output_execute_result">
<div id="altair-viz-237ae611bfbb42d48d6103a8471f14b4"></div>
<script type="text/javascript">
(function(spec, embedOpt){
let outputDiv = document.currentScript.previousElementSibling;
if (outputDiv.id !== "altair-viz-237ae611bfbb42d48d6103a8471f14b4") {
outputDiv = document.getElementById("altair-viz-237ae611bfbb42d48d6103a8471f14b4");
}
const paths = {
"vega": "https://cdn.jsdelivr.net/npm//vega@5?noext",
"vega-lib": "https://cdn.jsdelivr.net/npm//vega-lib?noext",
"vega-lite": "https://cdn.jsdelivr.net/npm//vega-lite@4.8.1?noext",
"vega-embed": "https://cdn.jsdelivr.net/npm//vega-embed@6?noext",
};
function loadScript(lib) {
return new Promise(function(resolve, reject) {
var s = document.createElement('script');
s.src = paths[lib];
s.async = true;
s.onload = () => resolve(paths[lib]);
s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
document.getElementsByTagName("head")[0].appendChild(s);
});
}
function showError(err) {
outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
throw err;
}
function displayChart(vegaEmbed) {
vegaEmbed(outputDiv, spec, embedOpt)
.catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
}
if(typeof define === "function" && define.amd) {
requirejs.config({paths});
require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
} else if (typeof vegaEmbed === "function") {
displayChart(vegaEmbed);
} else {
loadScript("vega")
.then(() => loadScript("vega-lite"))
.then(() => loadScript("vega-embed"))
.catch(showError)
.then(() => displayChart(vegaEmbed));
}
})({"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "data": {"name": "data-9639842df9b0f59516eabceac07ec489"}, "mark": "bar", "encoding": {"color": {"type": "nominal", "field": "Resource", "legend": null}, "tooltip": [{"type": "nominal", "field": "Resource"}, {"type": "quantitative", "field": "Budget"}], "x": {"type": "quantitative", "field": "Budget", "title": "Program Budget Breakdown"}, "y": {"type": "nominal", "axis": {"labels": false, "title": ""}, "field": "Program"}}, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", "datasets": {"data-9639842df9b0f59516eabceac07ec489": [{"Resource": "Program Administrator", "Budget": 95000, "Program": "Program"}, {"Resource": "Data Manager", "Budget": 85000, "Program": "Program"}, {"Resource": "Case Manager", "Budget": 45000, "Program": "Program"}, {"Resource": "Program Specialist", "Budget": 75000, "Program": "Program"}, {"Resource": "Program Coordinator", "Budget": 75000, "Program": "Program"}, {"Resource": "Administrative", "Budget": 20000, "Program": "Program"}, {"Resource": "Direct Services", "Budget": 600000, "Program": "Program"}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The grant requires that we find individuals in need of services, so we'll need a Program Coordinator. It also requires a Program Specialist to engage with the organizations that provide the service and receive data reports from those organizations. This person should understand what data is required, how it comes in, will probably need to enter that data, and coordinate with service providers and participants regularly. The grant requires a Data Manager for bi-annual reporting of Minimum Data Elements (MDEs) identified and verified by the funding agency and ad-hoc program evaluation. The funding agency also requires regular reporting of progress and a specific adminstration of the grant, thus requiring a Program Administrator. Because the staff for the program will need materials and space, there is an annual administrative budget. This fits exactly into the $1,000,000 allotted.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="How-important-is-tech?">How important is tech?<a class="anchor-link" href="#How-important-is-tech?"> </a></h1><p>Based on this budget breakdown, there is no room for paying for developers or third party tooling.</p>
<p>But is it necessary? How much is tech used nowadays anyways? Are there any industries that don't need technology?</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>I pulled <a href="https://www.bls.gov/data/">2019 data from the Bureau of Labor Statistics</a> to see what percentage of each major industry is technologists.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_html rendered_html output_subarea output_execute_result">
<div id="altair-viz-1cdca9950ec04ad79d32ceab5bbb10a3"></div>
<script type="text/javascript">
(function(spec, embedOpt){
let outputDiv = document.currentScript.previousElementSibling;
if (outputDiv.id !== "altair-viz-1cdca9950ec04ad79d32ceab5bbb10a3") {
outputDiv = document.getElementById("altair-viz-1cdca9950ec04ad79d32ceab5bbb10a3");
}
const paths = {
"vega": "https://cdn.jsdelivr.net/npm//vega@5?noext",
"vega-lib": "https://cdn.jsdelivr.net/npm//vega-lib?noext",
"vega-lite": "https://cdn.jsdelivr.net/npm//vega-lite@4.8.1?noext",
"vega-embed": "https://cdn.jsdelivr.net/npm//vega-embed@6?noext",
};
function loadScript(lib) {
return new Promise(function(resolve, reject) {
var s = document.createElement('script');
s.src = paths[lib];
s.async = true;
s.onload = () => resolve(paths[lib]);
s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
document.getElementsByTagName("head")[0].appendChild(s);
});
}
function showError(err) {
outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
throw err;
}
function displayChart(vegaEmbed) {
vegaEmbed(outputDiv, spec, embedOpt)
.catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
}
if(typeof define === "function" && define.amd) {
requirejs.config({paths});
require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
} else if (typeof vegaEmbed === "function") {
displayChart(vegaEmbed);
} else {
loadScript("vega")
.then(() => loadScript("vega-lite"))
.then(() => loadScript("vega-embed"))
.catch(showError)
.then(() => displayChart(vegaEmbed));
}
})({"config": {"view": {"continuousWidth": 400, "continuousHeight": 300, "stroke": null}, "axis": {"labelFontSize": 16, "titleFontSize": 16}, "axisY": {"maxExtent": 55}, "facet": {"spacing": 0}}, "data": {"name": "data-2ae1159158d27eadd7506611ab1e5090"}, "mark": {"type": "circle", "size": 100}, "encoding": {"color": {"type": "nominal", "field": "Industry", "legend": null}, "tooltip": [{"type": "nominal", "field": "Industry"}, {"type": "quantitative", "field": "Percent Tech", "format": ".2%"}], "x": {"type": "quantitative", "axis": {"format": ".0%"}, "field": "Percent Tech", "title": "% Tech Employees"}}, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", "datasets": {"data-2ae1159158d27eadd7506611ab1e5090": [{"Industry": "Agriculture, Forestry, Fishing and Hunting", "Technologists": 290, "total_emp": 430720, "Hourly mean wage": 35.38, "annual_salary_tech": 73590, "annual_salary_all": 33510, "Percent Tech": 0.0007}, {"Industry": "Mining", "Technologists": 12630, "total_emp": 684390, "Hourly mean wage": 53.89, "annual_salary_tech": 112100, "annual_salary_all": 65860, "Percent Tech": 0.0185}, {"Industry": "Utilities", "Technologists": 19480, "total_emp": 547100, "Hourly mean wage": 45.35, "annual_salary_tech": 94320, "annual_salary_all": 81550, "Percent Tech": 0.0356}, {"Industry": "Construction", "Technologists": 18100, "total_emp": 7439360, "Hourly mean wage": 36.91, "annual_salary_tech": 76770, "annual_salary_all": 57110, "Percent Tech": 0.0024}, {"Industry": "Manufacturing", "Technologists": 307140, "total_emp": 12707850, "Hourly mean wage": 49.38, "annual_salary_tech": 102710, "annual_salary_all": 54260, "Percent Tech": 0.0242}, {"Industry": "Wholesale Trade", "Technologists": 173160, "total_emp": 5848510, "Hourly mean wage": 42.04, "annual_salary_tech": 87440, "annual_salary_all": 59110, "Percent Tech": 0.0296}, {"Industry": "Retail Trade", "Technologists": 49940, "total_emp": 15822440, "Hourly mean wage": 38.74, "annual_salary_tech": 80590, "annual_salary_all": 34870, "Percent Tech": 0.0032}, {"Industry": "Transportation and Warehousing", "Technologists": 39560, "total_emp": 6281590, "Hourly mean wage": 38.72, "annual_salary_tech": 80540, "annual_salary_all": 49850, "Percent Tech": 0.0063}, {"Industry": "Information", "Technologists": 588500, "total_emp": 2831080, "Hourly mean wage": 48.99, "annual_salary_tech": 101900, "annual_salary_all": 80050, "Percent Tech": 0.2079}, {"Industry": "Finance and Insurance", "Technologists": 438650, "total_emp": 5972610, "Hourly mean wage": 47.63, "annual_salary_tech": 99070, "annual_salary_all": 75280, "Percent Tech": 0.0734}, {"Industry": "Real Estate and Rental and Leasing", "Technologists": 18110, "total_emp": 2259880, "Hourly mean wage": 40.52, "annual_salary_tech": 84290, "annual_salary_all": 51190, "Percent Tech": 0.008}, {"Industry": "Professional, Scientific, and Technical Services", "Technologists": 1664310, "total_emp": 9379990, "Hourly mean wage": 46.74, "annual_salary_tech": 97230, "annual_salary_all": 85720, "Percent Tech": 0.1774}, {"Industry": "Management of Companies and Enterprises", "Technologists": 289550, "total_emp": 2463870, "Hourly mean wage": 45.01, "annual_salary_tech": 93630, "annual_salary_all": 87280, "Percent Tech": 0.1175}, {"Industry": "Administrative and Support and Waste Management and Remediation Services", "Technologists": 235830, "total_emp": 9372940, "Hourly mean wage": 41.34, "annual_salary_tech": 85990, "annual_salary_all": 42010, "Percent Tech": 0.0252}, {"Industry": "Educational Services", "Technologists": 231480, "total_emp": 13275220, "Hourly mean wage": 33.16, "annual_salary_tech": 68960, "annual_salary_all": 58080, "Percent Tech": 0.0174}, {"Industry": "Health Care and Social Assistance", "Technologists": 146000, "total_emp": 21025440, "Hourly mean wage": 37.14, "annual_salary_tech": 77260, "annual_salary_all": 55300, "Percent Tech": 0.0069}, {"Industry": "Arts, Entertainment, and Recreation", "Technologists": 11310, "total_emp": 2484140, "Hourly mean wage": 34.87, "annual_salary_tech": 72530, "annual_salary_all": 39300, "Percent Tech": 0.0046}, {"Industry": "Accommodation and Food Services", "Technologists": 5160, "total_emp": 14073290, "Hourly mean wage": 30.11, "annual_salary_tech": 62620, "annual_salary_all": 27980, "Percent Tech": 0.0004}, {"Industry": "Other Services (except Federal, State, and Local Government)", "Technologists": 39750, "total_emp": 4249730, "Hourly mean wage": 36.94, "annual_salary_tech": 76830, "annual_salary_all": 44220, "Percent Tech": 0.0094}, {"Industry": "Federal, State, and Local Government", "Technologists": 263930, "total_emp": 9725350, "Hourly mean wage": 41.38, "annual_salary_tech": 86070, "annual_salary_all": 62720, "Percent Tech": 0.0271}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Many of the outliers make sense here - the Information industry is just "Data Processing, Hosting, and Related Services". Professional, Scientific, and Technical Services includes "Computer Systems Design and Related Services" companies which need developers to create their revenue stream.</p>
<p>Within these categories, there's Health Care and Social Assistance, with technologists composing 0.69% of its workforce, and Other Services, with 0.94%. <em>Health Care</em> includes hospitals, medical providers, and emergency services. <em>Social Assistance</em> is mostly the companies we're looking for here: Individual and Family Services, Community Food and Housing, and Emergency and Other Relief Services. <em>Other services</em> includes Grantmaking and Giving Services, Social Advocacy Organizations, and Business, Professional, Labor, Political, and Similar Organizations.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Non-Profit-Industries">Non-Profit Industries<a class="anchor-link" href="#Non-Profit-Industries"> </a></h3><p>If you break out the Health Care and Other Services industries to pinpoint non-profit organizations, you find Grantmaking & Giving Services (3.2% Tech), Social Assistance (0.2% Tech), and Social Advocacy Organizations (2% Tech). Even with the highest percentage of tech employees, Grantmaking & Giving Services pales in comparison to their close relative Finance & Insurance (7.3%).</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="The-Cost-of-Tech">The Cost of Tech<a class="anchor-link" href="#The-Cost-of-Tech"> </a></h1><h2 id="Tech-Debt">Tech Debt<a class="anchor-link" href="#Tech-Debt"> </a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Clearly, tech contributes to every industry in the US. This is reasonable. Let's say you want to buy a shirt from a store but you can't get to the store. Remember the days of catalog ordering? How much more work is it to mail or call an order in? Imagine managing all of those orders without an inventory or order management system. The benefit of tech is automating mundane and repetitive activities. Every organization needs that!</p>
<p><strong>So why isn't it happening with non-profits?</strong></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="The-Johari-Window">The Johari Window<a class="anchor-link" href="#The-Johari-Window"> </a></h3><p>The first project I worked on with Code for Philly was actually born from a desire to do some ad-hoc data analysis for a local non-profit I love. This non-profit has two dozen separate programs, providing medical and non-medical services to a criminally underserved population. These services are paid for by a combination of donations, grants, and direct service models. When I met with them, I was hoping that they'd be able to just zip together a de-identified extract of their data to do some work on.</p>
<p>Once I started talking with them, I realized that they stored their data in excel spreadsheets, partner systems, and paper forms. Because they didn't have access to dynamic tech solutions, they couldn't track a participant's activities across multiple programs (or even within a program).</p>
<p>This leads me to the <strong>Johari Window</strong>.</p>
<p><img src="http://lifewiseadvisors.com/wp-content/uploads/2017/04/unknown-unknown-quadrant-768x616.png" alt="" /></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Generally, this is an intrapersonal principle but it applies here. When I was a data manager for a grant program, I knew what tech could do for us even if I couldn't build it myself (known-unknowns). Companies that have tech teams know what they can build and have the capacity to build it (known-knowns). Even organizations that know they need to collect data, and there are tools that do it, but may be a bit lost when it comes to implementing them are empowered to reach out for help (unknown-knowns). When tech solutions are unknown-unknowns, not only is there an inability to know what you can ask for but even knowing that it can be asked!</p>
<p><strong>If you don't have someone at the table who knows what you can do with tech, your organization won't know how to leverage tech to improve their process.</strong></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Let's circle back to <a href="#SaaS-Me-If-You-Can">the example I laid out earlier</a>.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>I was the only "tech" person on the team working on those programs. My plate was full managing the data requirements of both the program and the grant, so I had no extra bandwidth (and definitely did not have the prowess) to develop a tool to manage all of our data for free.</p>
<p>The state employed an IT department, passionate and kind folks who worked to develop and manage external and in-house solutions but who were overwhelmed with the needs of each siloed program.</p>
<p><em>What is the cheapest way to improve access to technology?</em></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="In-House-Team">In-House Team<a class="anchor-link" href="#In-House-Team"> </a></h2><p>Using the same BLS data, I looked at how much it costs to employ a technologist.</p>
<p>On average, technologists in any industry make significantly more than an average employee in that industry.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_html rendered_html output_subarea output_execute_result">
<div id="altair-viz-6418b42a4fca4ed59ab87c1496a85744"></div>
<script type="text/javascript">
(function(spec, embedOpt){
let outputDiv = document.currentScript.previousElementSibling;
if (outputDiv.id !== "altair-viz-6418b42a4fca4ed59ab87c1496a85744") {
outputDiv = document.getElementById("altair-viz-6418b42a4fca4ed59ab87c1496a85744");
}
const paths = {
"vega": "https://cdn.jsdelivr.net/npm//vega@5?noext",
"vega-lib": "https://cdn.jsdelivr.net/npm//vega-lib?noext",
"vega-lite": "https://cdn.jsdelivr.net/npm//vega-lite@4.8.1?noext",
"vega-embed": "https://cdn.jsdelivr.net/npm//vega-embed@6?noext",
};
function loadScript(lib) {
return new Promise(function(resolve, reject) {
var s = document.createElement('script');
s.src = paths[lib];
s.async = true;
s.onload = () => resolve(paths[lib]);
s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
document.getElementsByTagName("head")[0].appendChild(s);
});
}
function showError(err) {
outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
throw err;
}
function displayChart(vegaEmbed) {
vegaEmbed(outputDiv, spec, embedOpt)
.catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
}
if(typeof define === "function" && define.amd) {
requirejs.config({paths});
require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
} else if (typeof vegaEmbed === "function") {
displayChart(vegaEmbed);
} else {
loadScript("vega")
.then(() => loadScript("vega-lite"))
.then(() => loadScript("vega-embed"))
.catch(showError)
.then(() => displayChart(vegaEmbed));
}
})({"config": {"view": {"continuousWidth": 400, "continuousHeight": 600}, "axis": {"labelFontSize": 16, "titleFontSize": 16}}, "data": {"name": "data-206b94c41653384551085f75cd3c3eb4"}, "mark": {"type": "circle", "size": 100}, "encoding": {"color": {"type": "nominal", "field": "Industry", "legend": null}, "tooltip": [{"type": "nominal", "field": "Industry"}, {"type": "quantitative", "field": "Average Salary"}], "x": {"type": "quantitative", "axis": {"title": "Average Annual Salary"}, "field": "Average Salary", "scale": {"zero": false}}, "y": {"type": "nominal", "axis": {"title": null}, "field": "Occupation"}}, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", "datasets": {"data-206b94c41653384551085f75cd3c3eb4": [{"Industry": "Agriculture, Forestry, Fishing and Hunting", "Occupation": "Tech", "Average Salary": 73590}, {"Industry": "Mining", "Occupation": "Tech", "Average Salary": 112100}, {"Industry": "Utilities", "Occupation": "Tech", "Average Salary": 94320}, {"Industry": "Construction", "Occupation": "Tech", "Average Salary": 76770}, {"Industry": "Manufacturing", "Occupation": "Tech", "Average Salary": 102710}, {"Industry": "Wholesale Trade", "Occupation": "Tech", "Average Salary": 87440}, {"Industry": "Retail Trade", "Occupation": "Tech", "Average Salary": 80590}, {"Industry": "Transportation and Warehousing", "Occupation": "Tech", "Average Salary": 80540}, {"Industry": "Information", "Occupation": "Tech", "Average Salary": 101900}, {"Industry": "Finance and Insurance", "Occupation": "Tech", "Average Salary": 99070}, {"Industry": "Real Estate and Rental and Leasing", "Occupation": "Tech", "Average Salary": 84290}, {"Industry": "Professional, Scientific, and Technical Services", "Occupation": "Tech", "Average Salary": 97230}, {"Industry": "Management of Companies and Enterprises", "Occupation": "Tech", "Average Salary": 93630}, {"Industry": "Administrative and Support and Waste Management and Remediation Services", "Occupation": "Tech", "Average Salary": 85990}, {"Industry": "Educational Services", "Occupation": "Tech", "Average Salary": 68960}, {"Industry": "Health Care and Social Assistance", "Occupation": "Tech", "Average Salary": 77260}, {"Industry": "Arts, Entertainment, and Recreation", "Occupation": "Tech", "Average Salary": 72530}, {"Industry": "Accommodation and Food Services", "Occupation": "Tech", "Average Salary": 62620}, {"Industry": "Other Services (except Federal, State, and Local Government)", "Occupation": "Tech", "Average Salary": 76830}, {"Industry": "Federal, State, and Local Government", "Occupation": "Tech", "Average Salary": 86070}, {"Industry": "Agriculture, Forestry, Fishing and Hunting", "Occupation": "All", "Average Salary": 33510}, {"Industry": "Mining", "Occupation": "All", "Average Salary": 65860}, {"Industry": "Utilities", "Occupation": "All", "Average Salary": 81550}, {"Industry": "Construction", "Occupation": "All", "Average Salary": 57110}, {"Industry": "Manufacturing", "Occupation": "All", "Average Salary": 54260}, {"Industry": "Wholesale Trade", "Occupation": "All", "Average Salary": 59110}, {"Industry": "Retail Trade", "Occupation": "All", "Average Salary": 34870}, {"Industry": "Transportation and Warehousing", "Occupation": "All", "Average Salary": 49850}, {"Industry": "Information", "Occupation": "All", "Average Salary": 80050}, {"Industry": "Finance and Insurance", "Occupation": "All", "Average Salary": 75280}, {"Industry": "Real Estate and Rental and Leasing", "Occupation": "All", "Average Salary": 51190}, {"Industry": "Professional, Scientific, and Technical Services", "Occupation": "All", "Average Salary": 85720}, {"Industry": "Management of Companies and Enterprises", "Occupation": "All", "Average Salary": 87280}, {"Industry": "Administrative and Support and Waste Management and Remediation Services", "Occupation": "All", "Average Salary": 42010}, {"Industry": "Educational Services", "Occupation": "All", "Average Salary": 58080}, {"Industry": "Health Care and Social Assistance", "Occupation": "All", "Average Salary": 55300}, {"Industry": "Arts, Entertainment, and Recreation", "Occupation": "All", "Average Salary": 39300}, {"Industry": "Accommodation and Food Services", "Occupation": "All", "Average Salary": 27980}, {"Industry": "Other Services (except Federal, State, and Local Government)", "Occupation": "All", "Average Salary": 44220}, {"Industry": "Federal, State, and Local Government", "Occupation": "All", "Average Salary": 62720}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>This is not limited to private industry - tech salaries are consistently higher across all industries!</p>
<p>Developing a tech solution usually requires more than one technologist! If you want to build even a simple app, you need someone to develop it and someone to check the work!</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="OOTB-Solutions">OOTB Solutions<a class="anchor-link" href="#OOTB-Solutions"> </a></h2><p>In the example, every state had a program funded by one of our grants and 22 states had a program funded by the other grant. Because the data we were required to report to the CDC (visit level medical information for each participant) was discrete and consistent, a third party company had actually created an Out-of-the-Box SaaS app for data collection.</p>
<p>This solution was not free, unfortunately.</p>
<p>In the first year, we had to pay $150,000 to have the solution set up. This included data migration from our historical systems to the new system and licensing fees for each program.</p>
<p>After the initial setup, we had to pay $25,000 for licensing and hosting. We also had to create a slush fund ($20,000) for ad-hoc development fees.</p>
<p>That means that the app would cost us $330,000 over 5 years! If all of the grant money is accounted for, how will the program drum up an extra $330,000?</p>
<h3 id="Customization">Customization<a class="anchor-link" href="#Customization"> </a></h3><p>Even though this solution was was built <em>specifically</em> for our grants, the third party provider <strong>still</strong> recommended that we earmark $20,000 per year for customization. If you are a program that offers both direct services and general services, who collects data both at the time of service and may need to enter data at a later time, if you need to be able to control access to data at system, form, and program levels; you will have a lot of customization work.</p>
<p>In this scenario, an OOTB solution may incur more costs than hiring internally. For example, a non-profit looking to use Salesforce but needing specific data fields may incur a lot of customization-related costs just to ensure they are meeting grant requirements!</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="How-Tech-Helps">How Tech Helps<a class="anchor-link" href="#How-Tech-Helps"> </a></h1><p>Why should you care about this? Working in tech isn't perfect, but it's a stable form of employment that pays very well, is in high demand, and allows a lot of us introverts to just solve problems all day! It's a great gig.</p>
<p>In the interest of keeping this brief, here are three arguments for increasing non-profit and government access to up-to-date technologies.</p>
<h2 id="Better-Data">Better Data<a class="anchor-link" href="#Better-Data"> </a></h2><p>We are recognizing the economic divide in the data created by modern tech. Tech solutions are built to make <em>money</em>. There's no money to be made from populations with lower socioeconomic status. This means the user data for those solutions does not represent an entire swath of the population! If you want to build predictive tooling for an entire population, you need equal amounts of data to <strong>represent the entire population</strong>.</p>
<h2 id="Better-Services">Better Services<a class="anchor-link" href="#Better-Services"> </a></h2><p>If a non-profit is spending 4 hours every week cleaning and preparing data for direct service claims when they can spend 5 minutes making that extract in a BI tool, imagine what they would then do with the extra 203 hours each year. Non-profits that offer individual services but use tools like Excel cannot easily see a participant's journey within a program, nonetheless within the organization. Better tech means better service.</p>
<p>Non-profits can operate with a similar budget! By automating simple processes, they have more capacity to do the work that makes their jobs rewarding!</p>
<h2 id="Better-Knowledge">Better Knowledge<a class="anchor-link" href="#Better-Knowledge"> </a></h2><p>Giving programs access to better data collection tools means we will have access to more complete data on issues we are working to resolve (with limited data!). By encouraging more standardized data collection, we are building capacity for a more complete picture!</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="Contribute-to-Civic-Tech">Contribute to Civic Tech<a class="anchor-link" href="#Contribute-to-Civic-Tech"> </a></h1><p>So what can you do?</p>
<p><strong>As a citizen</strong>
You may have a local <a href="https://brigade.codeforamerica.org/">Code for America brigade</a>! Reach out to them. If you don't, start one!</p>
<p>If you're not a technologist, managing a project is absolutely a huge need for these brigades!</p>
<p><strong>As a non-profit</strong>
See above :)</p>
<p><strong>As a tech company</strong>
Encourage developers to work on these projects! Local companies can donate actual developer time to work on projects - these projects don't happen overnight. Increasing volunteer capacity is just as valuable (and, honestly, more valuable) than a financial donation.</p>
<p>Also, you can do pro bono work yourself! Are there any non-profits that can benefit from your product? Can you help them set it up and then offer them access to it for very cheap or free?</p>
<p><strong>As a decision maker</strong>
MAKE TECH-SPECIFIC GRANT FUNDING. STOP SILOING WORK FOR STATE AND CITY LEVEL PROJECTS.</p>
</div>
</div>
</div>
</div>Watching the Watchmen2020-05-31T00:00:00-05:002020-05-31T00:00:00-05:00https://skinnamarieke.com/data/government/how-it-works/law-enforcement/2020/05/31/watchmen<p>Like the rest of the world, I’m still trying to wrap my head around the disaster that is law enforcement in the United States. As a middle class, educated, relatively insulated, white female, I’m kinda in this situation:</p>
<p><a href="https://twitter.com/badsynthesis/status/1267070910894399489"><img src="/images/posts/watchmen/helpless.png" alt="" /></a></p>
<p>In terms of my power here, I’m pretty low on the totem pole. Honestly, I’m struggling writing this because it feels like yelling into the wind.</p>
<p>It led me to wonder, who does actually have power to course correct a law enforcement agency? What regulations are in place to review cases internally and what power do higher level governmental bodies have to oversee an agency? Who has the power to identify and remove corruption, how is it triggered, and what triggers it? And how can I, as a private citizen with horrible crowd anxiety, do something to help?</p>
<h2 id="enforcement-agencies">Enforcement Agencies</h2>
<p>While most countries will have one law enforcement agency, a given American may be under the jurisdiction of several. Let’s walk through an example.</p>
<p>Welcome to sunny Las Cruces, New Mexico.</p>
<p><img src="/images/posts/watchmen/organs.jpg" alt="" title="Look at our big ol rocks" /></p>
<p>Las Cruces is the second largest city in New Mexico, about 60 miles away from Ciudad Juárez, and my hometown! In a given day, I could chat with an officer from the Las Cruces Police Department walking around downtown. My friend’s dad was a deputy with Doña Ana County Sheriff’s office along with <a href="https://www.krwg.org/post/actor-steven-seagal-becomes-do-ana-county-sheriffs-deputy">Steven Segal</a>. I could be pulled over by a New Mexico State Trooper for speeding on I-10. I had to stop at Border Patrol checkpoints within 50 miles on any highway out of my town and regularly saw Border Patrol agents driving into their office in Las Cruces. As someone who constantly thinks they’re doing something wrong, it was a real game of “identify the ticket-giving squad cars”.</p>
<h2 id="law-enforcement-oversight">Law Enforcement Oversight</h2>
<p>Given this complex web of civil servants, how is oversight currently conducted?</p>
<h3 id="by-citizens">By citizens</h3>
<p>As a private citizen, you are able to complain about misconduct by filing a complaint either through the (legally) required internal complaints process, filing a criminal complaint, or bring a civil suit against an officer or an agency.</p>
<p>I’m going to assume that most folks who are targeted by prejudiced policing efforts probably don’t have the time or funds to pursue criminal complaints or a civil suit, so let’s focus on:</p>
<p><strong>Internal Complaints</strong></p>
<p>The agency will usually have an internal affairs department that manages complaints. Most complaints about unneccessary force administered by a department are then handled by departments within the agency that … administered the unneccessary force. Even if they decide that unneccessary force was administered, agencies will explore every possible avenue of internal discipline before firing an officer. Case in point: the officer who murdered George Floyd had <a href="https://www.nydailynews.com/news/crime/ny-minneapolis-officer-derek-chauvin-george-floyd-death-19-complains-20200528-2npi7qxbkrgl3oxlzcielnvq3u-story.html">19 complaints</a> filed against him.</p>
<h4 id="firing-is-pricey">Firing is Pricey</h4>
<p>If the officer is fired, it could look like an admission of guilt. This opens up the agency to a lawsuit in which they’d be required to pay financial damages. Even if your complaint is not recognized, you can sue the department for damages in civil courts. Determinations from lawsuits are not considered by internal investigations when deciding whether to discipline an officer. If a police officer is sued, the settlement is normally paid by the law enforcement agency (not the union). This means that settlements for police brutality are actually paid by taxpayers who fund the law enforcement agency. In 2019 alone, the <a href="https://www.citylab.com/equity/2020/06/police-brutality-lawsuits-cities-settlements-credit-ratings/612301/">city of Minneapolis paid $20 million in settlements associated with police brutality</a>. In case you thought “maybe this is why police budgets are so high”, settlements are usually paid from non-general funds (which are what most of those budget breakdowns represent - this is why it always looks like they’re spending nothing on education).</p>
<h4 id="police-union-protection">Police Union Protection</h4>
<p>I live in Philadelphia, so let’s look at the PPD union contract with the City. Philly’s contract is with the Fraternal Order of the Police, which is a national union with local chapters. FYI, the president of the Philly chapter makes $180,000 a year. The <a href="https://www.phila.gov/media/20170815123224/AAA-City-FOP5-Act-111-Award-2017.pdf">15 page, three year agreement starting in 2017</a> expires on June 30, 2020. At the time of writing, the city actually has settled on a new contract. If you want a TL;DR, the agreement details a few paragraphs on vacation time, a couple of clauses about insurance, two paragraphs about discipline, and 10 pages explicitly detailing the City’s required investment in Police pensions (contributions to the fund increased 630% between 2001-2016). Why is there so little in the agreement on standards for police behavior? <a href="https://www.legis.state.pa.us/CFDOCS/LEGIS/LI/uconsCheck.cfm?txtType=HTM&yr=1968&sessInd=0&smthLwInd=0&act=0111.&CFID=341789689&CFTOKEN=68930824">Act 111 of 1968</a> mitigated the power firefighters and police officers had to strike and required all collective bargaining efforts to go through arbitration.</p>
<p><strong>Arbitration</strong></p>
<p>If an officer appeals disciplinary action, Act 111 requires the process of determining this discipline go through a (private) arbitration hearing. Act 111 stipulates that the selected arbitrators are composed of a representative of the government, a representative of the law enforcement agency, and a representative chosen by the defendant. It would behoove the police department to send someone who would defend the officer seeking reinstatement (see: two paragraphs above). As such, it’s highly likely that 2/3 of the arbitrators will be in favor of reinstatement even before arbitration begins. In Philadelphia, the findings and outcomes of these arbitration hearings are not published anywhere. <a href="https://www.inquirer.com/news/a/philadelphia-police-problem-union-misconduct-secret-20190912.html">In many cases</a>, even when a city has had to pay settlements from an officer’s actions (remember, the settlement is only decided if the citizen files a lawsuit and it looks like they would win a case), the arbitration process reinstates them.</p>
<h3 id="within-governing-bodies">Within governing bodies</h3>
<p>Most governmental bodies have review or advisory boards, populated either by citizens or appointees of the head of that governmental body. Philadelphia has a <a href="https://www.phila.gov/departments/police-advisory-commission/">Police Advisory Commission</a>. The state of Vermont has a <a href="https://dps.vermont.gov/committees-boards/spac">State Police Advisory Commission</a>. These groups are generally managed and run at the same level of government as the law enforcement agency. The mayor of Philadelphia decides who will be on the Police Advisory Commission. The City of Minneapolis has a <a href="http://www.ci.minneapolis.mn.us/boards/civil-rights-comsn">Civil Rights Commission</a>, <a href="http://www.ci.minneapolis.mn.us/boards/police-conduct-oversight-cmsn">Police Conduct Oversight Commission</a>, and a <a href="http://www.ci.minneapolis.mn.us/boards/police-conduct-review-panel">Police Conduct Review Panel</a>. Members of these groups are selected by elected government leadership (either the Mayor or City Council).</p>
<p>Can you name the people who oversee your local law enforcement agency? Does it affect who you vote for in local elections?</p>
<h3 id="above-governing-body">Above governing body</h3>
<p>Generally, when you hear about the federal government engaging with local authorities, it’s to work in concert with them.</p>
<p>If it seems like this to you too, that’s actually kinda great cause it means they’re working together and also that I’m not woefully underinformed.</p>
<p>The Department of Justice (DOJ) also handles complaints against law enforcement agents (from all levels) in which the agent has violated constitutional rights or other forms of misconduct including:</p>
<blockquote>
<p>excessive force, sexual assault, intentional false arrests, theft, or the intentional fabrication of evidence resulting in a loss of liberty to another (<a href="https://www.justice.gov/crt/addressing-police-misconduct-laws-enforced-department-justice">DOJ</a>).</p>
</blockquote>
<p>Separate from an internal complaint, which can refer to an isolated incident, complaints to the DOJ must establish a pattern in the agent’s behavior.</p>
<p><strong>Consent Decrees</strong></p>
<p>When a law enforcement agency has a high profile issue (think Ferguson, MO a few years ago), the federal government can enter into a consent decree with the agency. Specifically, consent decrees are used to determine if authorities have misused their powers, especially when it comes to constitutional rights.</p>
<p>I’m not a legal expert, so if you’re interested in understanding consent decrees, check out an <a href="http://chicagopoliceconsentdecree.org/wp-content/uploads/2018/07/IPCE-Community-Engagement-Report_Final.pdf">example of one done in Chicago in 2017</a>. Based on the (sadly minimal) <a href="https://crim.sas.upenn.edu/fact-check/does-legal-regulation-police-impact-crime">criminology research</a> done on consent decrees, it seems like they result in actionable roadmaps for improvement but are oftentimes disruptive an unnecessarily costly. The biggest issue with understanding the impact of consent decrees is <em>[shocked face]</em> lack of data. How can you do a case-control study with two separate cities?</p>
<p>In their <a href="https://www.usccr.gov/pubs/2018/11-15-Police-Force.pdf">2018 report</a> on Police Use of Force tactics, officials in the Trump administration actually made</p>
<blockquote>
<p>… key recommendations, including that the United States Department of Justice should return to vigorous enforcement of constitutional policing, …, and the use of consent decrees where necessary to ensure that constitutional policing standards are upheld. (page 6)</p>
</blockquote>
<p>I think we all know what happens next. Taking the advice from their own report encouraging consent decrees, the Trump Administration has initiated exactly…zero. To add insult to injury, former Attorney General Jeff Sessions <a href="https://www.governing.com/topics/public-justice-safety/gov-trump-sessions-consent-decrees-police-reform.html">severely limited</a> the Department of Justice’s capacity to entering into new consent decrees shortly before leaving office. Even though the recent murder of George Floyd resulted in mass protests and rioting across the United States, Session’s regulations on consent decrees means the DOJ is unlikely to pursue one with the Minneapolis Police Department.</p>
<h2 id="measuring-justice">Measuring Justice</h2>
<p>Hopefully you’re not weeping into your keyboard. I started looking into the process by which folks who are clearly abusing their power are held accountable hoping to find some relief that maybe someone can step in and replace pain with community.</p>
<p>So let’s figure out what we can do to turn the tides. How can we make an ironclad case that something’s wrong?</p>
<h3 id="open-data-portals">Open Data Portals</h3>
<p>Many city, county, and state governments are moving towards publishing extracts of their activities to <a href="https://www.data.gov/open-gov/">open data portals</a>. The <a href="https://www.opendataphilly.org/organization/30e750ce-14ad-4403-9bf4-85a776a2bda8?tags=Philadelphia+Police+Department">City of Philadelphia</a> actually publishes <a href="https://www.opendataphilly.org/dataset/police-complaints">event-level police complaint data</a> (although I didn’t see any use of force data). Many of these organizations encourage feedback from the community to identify new datasets they can publish in an effort to better inform citizens.</p>
<h3 id="death-in-custody-reporting-program">Death in Custody Reporting Program</h3>
<p>Way back in 2000 when the world was fresh faced and innocent and our biggest fear was date formatting, Congress passed the Death in Custody Reporting Act <a href="https://www.congress.gov/106/plaws/publ297/PLAW-106publ297.pdf">(DCRA)</a>. The DCRA required the collection of individual data on deaths in the process of arrest, local jails, and state prisons by the Bureau of Justice Statistics (BJS). The act was lauded as a bipartisan success, with support from both sides of the aisle.</p>
<p>What the DCRA <em>didn’t</em> require, however, was the requirement that law enforcement agencies report their data to the federal government. This resulted in an ad-hoc data collection system, a frankenstein’s monster of surveys, google searches, and data munging. In 2015, the BJS <a href="https://www.bjs.gov/content/pub/ascii/acardp.txt">evaluated ARD program data</a> and (using other reported death in custody data and a capture-recapture analysis) found that over half of all deaths in custody between 2003 and 2009 were not included in the dataset. Don’t worry: in 2011, they captured 69%.</p>
<p>What happened in 2010?
<code class="highlighter-rouge">¯\_(ツ)_/¯</code></p>
<p><strong>It gets worse and I’m sorry</strong>
Between 2003 and 2009, reporting from the Arrest-Related Deaths (ARD) dataset shows that around 60% of all <em>reported</em> deaths were law enforcement homicides - deaths attributed to weapons or restraint tactics used by state or local law enforcement officers. That means that three out of every five of the deaths that were <em>reported</em> to the ARD (remember, they estimate that over half of all deaths weren’t even reported) were caused by officers.</p>
<p>(Honestly, that report is fascinating - I fully recommend reading it.)</p>
<p>In 2013 , congress re-authorized the DCRA and added provisions requiring quarterly reporting of information regarding the death of any person who is
detained, under arrest, or in the process of being arrested; is
en route to be incarcerated; or is incarcerated. This resulted in the administration of penalties for states that fail to report data (though it doesn’t specify if the same penalties are given to local and county level agencies).</p>
<h3 id="unified-crime-reporting">Unified Crime Reporting</h3>
<p>When it comes to Use of Force data, the BJS has been working to develop better programs within its Unified Crime Reporting (<a href="https://www.fbi.gov/services/cjis/ucr">UCR</a>) program, which has this totally real logo.</p>
<p><img src="/images/posts/watchmen/ucr.jpg" alt="" title="I EAT JUSTICE FOR BREAKFAST" /></p>
<p>Under the UCR, the BJS kicked off a National Use of Force Data Collection program in 2018. The Use of Force Data Collection program uses a pre-existing <a href="https://www.fbi.gov/services/cjis/leep">data portal</a>, which lowers the barrier for agencies that need to contribute. The program also clearly defines the required data elements, which should increase general data quality and decrease the amount of data collection effort from the federal government.</p>
<p>Once again, it should be noted that:</p>
<blockquote>
<p>The FBI has no legal authority to mandate reporting of any data to the UCR Program. <a href="https://www.fbi.gov/services/cjis/ucr">Unified Crime Reporting, FBI</a></p>
</blockquote>
<h2 id="tech-allies">Tech Allies</h2>
<p>Back to the initial situation.</p>
<p><a href="https://twitter.com/badsynthesis/status/1267070910894399489"><img src="/images/posts/watchmen/helpless.png" alt="" /></a></p>
<p>We are not powerless here. Clearly, there is room for progress in law enforcement transparency.</p>
<h3 id="the-data-needs-to-be-complete">The data needs to be complete.</h3>
<ul>
<li>The federal government should legally require law enforcement agencies <em>at all levels</em> to report use of force, complaint, and deaths in custody data regularly.</li>
<li>If you experience harassment at the hands of a law enforcement agent, <strong>file a complaint</strong>. Give the agency no way to say they didn’t know the agent had aggressive tendencies. Give us more complete data.</li>
</ul>
<h3 id="the-data-needs-to-be-available">The data needs to be available.</h3>
<ul>
<li>Identify what is missing. Hold your agencies accountable to make that data available.
<ul>
<li>“Funny story, Mr. Mayor. I didn’t see any Use of Force data for our area reported to the FBI. Do you know why that is?”</li>
</ul>
</li>
<li>Arbitration data - where is it? I want it. I want it all.</li>
<li>Settlement data - see above</li>
</ul>
<h3 id="the-data-needs-to-be-used-to-make-decisions">The data needs to be used to make decisions.</h3>
<ul>
<li>Analyze complaints. Are there officers (you’ll probably only get a common ID) that have repeated complaints of unnecessary force that aren’t held accountable? Show up at the review board meetings!</li>
<li>Internally, law enforcement agencies need to use proven cases of officers that show a pattern of harassment and aggression to develop methods of prevention when other officers show similar patterns <strong>before those officers harm a citizen</strong>
<ul>
<li>Honestly, I want to see this analysis. De-identify it but dang I wanna know what you’re using to predict this.</li>
</ul>
</li>
</ul>
<p>If one officer has 25 complaints, show that. Show the ratio of complaints to officers and ask for data on how many officers were dismissed in the past five years. (Honestly, it’s lose-lose for the department. Either their data is bad or their officer is bad.)</p>
<p>Make sure the folks that should be held accountable are given no excuse to explain away or diminish prejudice.</p>
<p>Catch the officers that are likely to use unnecessary use of force (and fatal use of force) before they get to <em>a dozen complaints</em>.</p>
<p>Before you vote for elected officials, ask them how they are going to provide oversight in their policing policies.</p>
<h2 id="use-the-skills-you-have-to-level-the-playing-field">Use the skills you have to level the playing field.</h2>Like the rest of the world, I’m still trying to wrap my head around the disaster that is law enforcement in the United States. As a middle class, educated, relatively insulated, white female, I’m kinda in this situation:The Middle Road Feminist2020-04-25T00:00:00-05:002020-04-25T00:00:00-05:00https://skinnamarieke.com/2020/04/25/clothes<p>So you believe in equality, but you also want to work within the system to make it happen. Welcome to the middle road, friend. Happy to have some company here.</p>
<p>When you emerge from the one bedroom, centrally located apartment in which you live alone, you strive to look good enough to be employed at your current job (or one step above) but not TOO good so as to avoid unwanted attention from other humans. You are not alone, my labial friend. Many women have worked tirelessly to maintain this upper-middling level of fashionability. It is the woman’s dream to have a wardrobe that makes you feel comfortable, is simultaneously professional and casual, and screams “I have all the prerequisite parts to be a capable human for the role I serve”.</p>
<p><img src="/images/clothes/figure1.png" alt="" /></p>
<p>Herein, we will describe how to create a wardrobe of a variety of pieces that are all distinct but in retrospect seem to blur together.</p>
<h2 id="head">Head</h2>
<p>This is where you want to direct the majority of attention, towards your idea hole and your soul windows. However, you cannot encourage that attention using copious amounts of your mother’s blue eyeshadow or thick, dark black eyeliner a la 1999 Avril Lavigne. That carries little thoughts into the wrong heads and you are therefore both creator and caretaker of such thoughts.<br />
<img src="/images/clothes/figure2.png" alt="" /></p>
<p>From personal experience, I have also learned that regularly sporting a giant foam cowboy hat that you won at a local rodeo does more harm than good. Your best bet is a hairstyle that doesn’t look like it took too much work to both get and maintain, some mascara, and the chapstick you keep forgetting is in your wallet.</p>
<h2 id="torso">Torso</h2>
<p>Here lies the true battleground. You want something that does not turn you into a game piece from “Perfection!” but you also have an upper chestal area that you’d rather not display for the world to consider. Ideally, the body of the blouse goes out, then in, then out again. But not in an overt or suggestive manner. It is important, nay - PIVOTAL, that you appear to have a waist. This implies that you are breezy, but not overweight.<br />
<img src="/images/clothes/figure3.png" alt="" /></p>
<h3 id="baby-its-cold-outside">Baby it’s cold outside</h3>
<p>The middle road feminist’s best friend is the button up shirt/sweater combo. As the male gaze slides down from your eyes, it is immediately stopped at the top button. The shirt happens to be buttoned one button higher than is fashionable. The button is Gandalf, telling the eyes “YOU SHALL NOT PASS”, and redirecting attention to your ideas as opposed to your yabbos. The sweater serves the important purpose of keeping you warm while allowing you to wear that one button up shirt that fits your waist but insists on being too small for your bust.</p>
<h3 id="getting-hot-in-here">Getting hot in here</h3>
<p>If the temperature outside is such that your ‘sweater’ becomes more of an adjective than a noun, your second best bet is the V-neck tshirt. However, there are several rules one must follow to adequately satisfy the middling feminist’s needs.</p>
<ol>
<li>The t-shirt must be a color that is neither too bright nor too dark. If the t-shirt is bright pink, it implies overt femininity and may make the observer think of vaginas. It is imperative that the observer not think of vaginas. A ranked list of color choices: white, gray, navy blue, forest green, marigold, black, everything except pink, pink</li>
<li>The shirt must be a weight that is light enough to flow, but thick enough to wear on its own. You need a shirt that is light and airy, but thick enough that <em>no one thinks about your bra</em>. A light but thick, white, v-neck shirt is the perfect circle - impossible to draw, easy to conceive.</li>
<li>The shirt must not be fitted but it must be larger at the top, smaller in the middle, and then larger at the bottom. This implies that the shirt is loose, but once again, ensures that the woman does not appear to be overweight. I cannot stress enough how important it is to the people around you that you have a visible waist.</li>
</ol>
<p>Given these constraints, please enjoy attempting to find a comfortable and long-lasting cotton/linen shirt for under $50.</p>
<h2 id="bottom">Bottom</h2>
<p>This is a little more relaxed. A good pair of jeans or chinos works for essentially every need. The jeans are dark wash, the pants should be grey or black. You want your body to appear in shadows always, like the third member of Wilson Phillips.</p>
<p>You could branch out and wear a pencil skirt. May I remind you, friend, that you don’t want hip-related attention. Pencil skirts will attract that, and your choice to wear them means that you are asking for that attention (obviously). Your mission is to not make the people around you think of you outside of a floating, bodiless orb of calm and ideas.<br />
<img src="/images/clothes/figure4.png" alt="" /></p>
<h3 id="yoga-pant-exception">Yoga Pant Exception</h3>
<p>If you are of the mindset that you need exercise to remain a healthy human being, you will probably own at least one pair of exercise pants. The yoga pant is the swiss army knife of fitness fashion. You can wear it for any exercise. The yoga pant also has the unfortunate fortune of highlighting your rear-facing assets. You must either accept the attention, or accept your future of wearing tunic tops. You cannot have both.</p>
<h2 id="feet">Feet</h2>
<p>To a middle road feminist, the feet are the canvas. Luckily, the shoes that attract attention also happen to be the least comfortable ones. Every middling feminist should have the following shoes: child-like sneakers, ankle boots, mid calf boots, tall boots (especially if you live in a colder climate), birkenstock-like sandals, flip flops, and ballet flats. Should the particular feminist be active, she may have more shoes specific to her activities (running shoes, climbing shoes, pointe shoes, clown shoes, etc). In professional and casual settings, the provided list of necessary shoes should cover every need. When in doubt, follow the Ellen Principle: could you pair these shoes with a business suit to look more approachable? The answer should always be <strong>DANCING</strong>.</p>
<h2 id="being-a-professional-and-a-woman-is-tiring">Being a professional and a woman is tiring</h2>
<p>The way women dress is scrutinized in a way that men aren’t. Women’s clothes have historically been designed to elicit feelings in <em>others</em>, while men’s clothes have been designed for the person wearing them.</p>
<p>In the workplace, and especially in tech, you are always a woman first and a developer second. You are never purely considered or regarded for your skills or talent. Your physical attributes should be independent from your professional aptitude. Everyone wants to not think about how they look some days, and care about it others. Think about the last woman you worked with who didn’t shower for days, wore the same jeans for a week, was overweight, and just bought multiples of the same shirt - was she respected? Was she seen as talented and qualified?</p>
<h3 id="it-takes-just-as-much-effort-for-a-successful-professional-woman-to-be-stylish-as-it-does-to-pass-unnoticed">It takes just as much effort for a successful professional woman to be stylish as it does to pass unnoticed.</h3>So you believe in equality, but you also want to work within the system to make it happen. Welcome to the middle road, friend. Happy to have some company here.Introducing fastpages2020-02-21T00:00:00-06:002020-02-21T00:00:00-06:00https://skinnamarieke.com/fastpages/jupyter/2020/02/21/introducing-fastpages<!--
#################################################
### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
#################################################
# file to edit: _notebooks/2020-02-21-introducing-fastpages.ipynb
-->
<div class="container" id="notebook-container">
<div class="cell border-box-sizing code_cell rendered">
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p><img src="https://github.com/fastai/fastpages/raw/master/images/diagram.png" alt="" title="https://github.com/fastai/fastpages" /></p>
<p>We are very pleased to announce the immediate availability of <a href="https://github.com/fastai/fastpages">fastpages</a>. <code>fastpages</code> is a platform which allows you to create and host a blog for free, with no ads and many useful features, such as:</p>
<ul>
<li>Create posts containing code, outputs of code (which can be interactive), formatted text, etc directly from <a href="https://jupyter.org/">Jupyter Notebooks</a>; for instance see this great <a href="https://drscotthawley.github.io/devblog3/2019/02/08/My-1st-NN-Part-3-Multi-Layer-and-Backprop.html">example post</a> from Scott Hawley. Notebook posts support features such as:<ul>
<li>Interactive visualizations made with <a href="https://altair-viz.github.io/">Altair</a> remain interactive.</li>
<li>Hide or show cell input and output.</li>
<li>Collapsable code cells that are either open or closed by default.</li>
<li>Define the Title, Summary and other metadata via a special markdown cells</li>
<li>Ability to add links to <a href="https://colab.research.google.com/">Colab</a> and GitHub automatically.</li>
</ul>
</li>
<li>Create posts, including formatting and images, directly from Microsoft Word documents.</li>
<li>Create and edit <a href="https://guides.github.com/features/mastering-markdown/">Markdown</a> posts entirely online using GitHub's built-in markdown editor.</li>
<li>Embed Twitter cards and YouTube videos.</li>
<li>Categorization of blog posts by user-supplied tags for discoverability.</li>
<li>... and <a href="https://github.com/fastai/fastpages">much more</a></li>
</ul>
<p><a href="https://github.com/fastai/fastpages">fastpages</a> relies on Github pages for hosting, and <a href="https://github.com/features/actions">Github Actions</a> to automate the creation of your blog. The setup takes around three minutes, and does not require any technical knowledge or expertise. Due to built-in automation of fastpages, you don't have to fuss with conversion scripts. All you have to do is save your Jupyter notebook, Word document or markdown file into a specified directory and the rest happens automatically. Infact, this blog post is written in a Jupyter notebook, which you can see with the "View on GitHub" link above.</p>
<p><a href="https://www.fast.ai/">fast.ai</a> have previously released a similar project called <a href="https://www.fast.ai/2020/01/16/fast_template/">fast_template</a>, which is even easier to set up, but does not support automatic creation of posts from Microsoft Word or Jupyter notebooks, including many of the features outlined above.</p>
<p><strong>Because <code>fastpages</code> is more flexible and extensible, we recommend using it where possible.</strong> <code>fast_template</code> may be a better option for getting folks blogging who have no technical expertise at all, and will only be creating posts using Github's integrated online editor.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Setting-Up-Fastpages">Setting Up Fastpages<a class="anchor-link" href="#Setting-Up-Fastpages"> </a></h2><p><a href="https://github.com/fastai/fastpages#setup-instructions">The setup process</a> of fastpages is automated with GitHub Actions, too! Upon creating a repo from the fastpages template, a pull request will automatically be opened (after ~ 30 seconds) configuring your blog so it can start working. The automated pull request will greet you with instructions like this:</p>
<p><img src="https://i.imgur.com/JhkIip8.png" alt="Imgur" /></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>All you have to do is follow these instructions (in the PR you receive) and your new blogging site will be up and running!</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Jupyter-Notebooks-&-Fastpages">Jupyter Notebooks & Fastpages<a class="anchor-link" href="#Jupyter-Notebooks-&-Fastpages"> </a></h2><p>In this post, we will cover special features that fastpages provides has for Jupyter notebooks. You can also write your blog posts with Word documents or markdown in fastpages, which contain many, but not all the same features.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Options-via-FrontMatter">Options via FrontMatter<a class="anchor-link" href="#Options-via-FrontMatter"> </a></h3><p>The first cell in your Jupyter Notebook or markdown blog post contains front matter. Front matter is metadata that can turn on/off options in your Notebook. It is formatted like this:</p>
<pre><code># Title
> Awesome summary
- toc:true- branch: master
- badges: true
- comments: true
- author: Hamel Husain & Jeremy Howard
- categories: [fastpages, jupyter]</code></pre>
<p><strong>All of the above settings are enabled in this post, so you can see what they look like!</strong></p>
<ul>
<li>the summary field (preceeded by <code>></code>) will be displayed under your title, and will also be used by social media to display as the description of your page.</li>
<li><code>toc</code>: setting this to <code>true</code> will automatically generate a table of contents</li>
<li><code>badges</code>: setting this to <code>true</code> will display Google Colab and GitHub links on your blog post.</li>
<li><code>comments</code>: setting this to <code>true</code> will enable comments. See <a href="https://github.com/fastai/fastpages#enabling-comments">these instructions</a> for more details.</li>
<li><code>author</code> this will display the authors names. </li>
<li><code>categories</code> will allow your post to be categorized on a "Tags" page, where readers can browse your post by categories.</li>
</ul>
<p><em>Markdown front matter is formatted similarly to notebooks. The differences between the two can be <a href="https://github.com/fastai/fastpages#front-matter-related-options">viewed on the fastpages README</a>.</em></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Code-Folding">Code Folding<a class="anchor-link" href="#Code-Folding"> </a></h3>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>put a <code>#collapse-hide</code> flag at the top of any cell if you want to <strong>hide</strong> that cell by default, but give the reader the option to show it:</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<details class="description">
<summary class="btn btn-sm" data-open="Hide Code" data-close="Show Code"></summary>
<p><div class="input">
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="c1">#collapse-hide</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
<span class="kn">import</span> <span class="nn">altair</span> <span class="k">as</span> <span class="nn">alt</span>
</pre></div>
</div>
</div>
</div>
</p>
</details>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>put a <code>#collapse-show</code> flag at the top of any cell if you want to <strong>show</strong> that cell by default, but give the reader the option to hide it:</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<details class="description" open="">
<summary class="btn btn-sm" data-open="Hide Code" data-close="Show Code"></summary>
<p><div class="input">
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="c1">#collapse-show</span>
<span class="n">cars</span> <span class="o">=</span> <span class="s1">'https://vega.github.io/vega-datasets/data/cars.json'</span>
<span class="n">movies</span> <span class="o">=</span> <span class="s1">'https://vega.github.io/vega-datasets/data/movies.json'</span>
<span class="n">sp500</span> <span class="o">=</span> <span class="s1">'https://vega.github.io/vega-datasets/data/sp500.csv'</span>
<span class="n">stocks</span> <span class="o">=</span> <span class="s1">'https://vega.github.io/vega-datasets/data/stocks.csv'</span>
<span class="n">flights</span> <span class="o">=</span> <span class="s1">'https://vega.github.io/vega-datasets/data/flights-5k.json'</span>
</pre></div>
</div>
</div>
</div>
</p>
</details>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>If you want to completely hide cells (not just collapse them), <a href="https://github.com/fastai/fastpages#hide-inputoutput-cells">read these instructions</a>.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Interactive-Charts-With-Altair">Interactive Charts With Altair<a class="anchor-link" href="#Interactive-Charts-With-Altair"> </a></h3><p>Interactive visualizations made with <a href="https://altair-viz.github.io/">Altair</a> remain interactive!</p>
<p>We leave this below cell unhidden so you can enjoy a preview of syntax highlighting in fastpages, which uses the <a href="https://draculatheme.com/">Dracula theme</a>.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># select a point for which to provide details-on-demand</span>
<span class="n">label</span> <span class="o">=</span> <span class="n">alt</span><span class="o">.</span><span class="n">selection_single</span><span class="p">(</span>
<span class="n">encodings</span><span class="o">=</span><span class="p">[</span><span class="s1">'x'</span><span class="p">],</span> <span class="c1"># limit selection to x-axis value</span>
<span class="n">on</span><span class="o">=</span><span class="s1">'mouseover'</span><span class="p">,</span> <span class="c1"># select on mouseover events</span>
<span class="n">nearest</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># select data point nearest the cursor</span>
<span class="n">empty</span><span class="o">=</span><span class="s1">'none'</span> <span class="c1"># empty selection includes no data points</span>
<span class="p">)</span>
<span class="c1"># define our base line chart of stock prices</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">alt</span><span class="o">.</span><span class="n">Chart</span><span class="p">()</span><span class="o">.</span><span class="n">mark_line</span><span class="p">()</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span>
<span class="n">alt</span><span class="o">.</span><span class="n">X</span><span class="p">(</span><span class="s1">'date:T'</span><span class="p">),</span>
<span class="n">alt</span><span class="o">.</span><span class="n">Y</span><span class="p">(</span><span class="s1">'price:Q'</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="n">alt</span><span class="o">.</span><span class="n">Scale</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="s1">'log'</span><span class="p">)),</span>
<span class="n">alt</span><span class="o">.</span><span class="n">Color</span><span class="p">(</span><span class="s1">'symbol:N'</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">alt</span><span class="o">.</span><span class="n">layer</span><span class="p">(</span>
<span class="n">base</span><span class="p">,</span> <span class="c1"># base line chart</span>
<span class="c1"># add a rule mark to serve as a guide line</span>
<span class="n">alt</span><span class="o">.</span><span class="n">Chart</span><span class="p">()</span><span class="o">.</span><span class="n">mark_rule</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="s1">'#aaa'</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span>
<span class="n">x</span><span class="o">=</span><span class="s1">'date:T'</span>
<span class="p">)</span><span class="o">.</span><span class="n">transform_filter</span><span class="p">(</span><span class="n">label</span><span class="p">),</span>
<span class="c1"># add circle marks for selected time points, hide unselected points</span>
<span class="n">base</span><span class="o">.</span><span class="n">mark_circle</span><span class="p">()</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span>
<span class="n">opacity</span><span class="o">=</span><span class="n">alt</span><span class="o">.</span><span class="n">condition</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">alt</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">alt</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
<span class="p">)</span><span class="o">.</span><span class="n">add_selection</span><span class="p">(</span><span class="n">label</span><span class="p">),</span>
<span class="c1"># add white stroked text to provide a legible background for labels</span>
<span class="n">base</span><span class="o">.</span><span class="n">mark_text</span><span class="p">(</span><span class="n">align</span><span class="o">=</span><span class="s1">'left'</span><span class="p">,</span> <span class="n">dx</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">dy</span><span class="o">=-</span><span class="mi">5</span><span class="p">,</span> <span class="n">stroke</span><span class="o">=</span><span class="s1">'white'</span><span class="p">,</span> <span class="n">strokeWidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span>
<span class="n">text</span><span class="o">=</span><span class="s1">'price:Q'</span>
<span class="p">)</span><span class="o">.</span><span class="n">transform_filter</span><span class="p">(</span><span class="n">label</span><span class="p">),</span>
<span class="c1"># add text labels for stock prices</span>
<span class="n">base</span><span class="o">.</span><span class="n">mark_text</span><span class="p">(</span><span class="n">align</span><span class="o">=</span><span class="s1">'left'</span><span class="p">,</span> <span class="n">dx</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">dy</span><span class="o">=-</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span>
<span class="n">text</span><span class="o">=</span><span class="s1">'price:Q'</span>
<span class="p">)</span><span class="o">.</span><span class="n">transform_filter</span><span class="p">(</span><span class="n">label</span><span class="p">),</span>
<span class="n">data</span><span class="o">=</span><span class="n">stocks</span>
<span class="p">)</span><span class="o">.</span><span class="n">properties</span><span class="p">(</span>
<span class="n">width</span><span class="o">=</span><span class="mi">700</span><span class="p">,</span>
<span class="n">height</span><span class="o">=</span><span class="mi">400</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_html rendered_html output_subarea output_execute_result">
<div id="altair-viz-af30e8a5882348c7b0bad1557e87af48"></div>
<script type="text/javascript">
(function(spec, embedOpt){
let outputDiv = document.currentScript.previousElementSibling;
if (outputDiv.id !== "altair-viz-af30e8a5882348c7b0bad1557e87af48") {
outputDiv = document.getElementById("altair-viz-af30e8a5882348c7b0bad1557e87af48");
}
const paths = {
"vega": "https://cdn.jsdelivr.net/npm//vega@5?noext",
"vega-lib": "https://cdn.jsdelivr.net/npm//vega-lib?noext",
"vega-lite": "https://cdn.jsdelivr.net/npm//vega-lite@4.8.1?noext",
"vega-embed": "https://cdn.jsdelivr.net/npm//vega-embed@6?noext",
};
function loadScript(lib) {
return new Promise(function(resolve, reject) {
var s = document.createElement('script');
s.src = paths[lib];
s.async = true;
s.onload = () => resolve(paths[lib]);
s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
document.getElementsByTagName("head")[0].appendChild(s);
});
}
function showError(err) {
outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
throw err;
}
function displayChart(vegaEmbed) {
vegaEmbed(outputDiv, spec, embedOpt)
.catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
}
if(typeof define === "function" && define.amd) {
requirejs.config({paths});
require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
} else if (typeof vegaEmbed === "function") {
displayChart(vegaEmbed);
} else {
loadScript("vega")
.then(() => loadScript("vega-lite"))
.then(() => loadScript("vega-embed"))
.catch(showError)
.then(() => displayChart(vegaEmbed));
}
})({"config": {"view": {"continuousWidth": 400, "continuousHeight": 300}}, "layer": [{"mark": "line", "encoding": {"color": {"type": "nominal", "field": "symbol"}, "x": {"type": "temporal", "field": "date"}, "y": {"type": "quantitative", "field": "price", "scale": {"type": "log"}}}}, {"mark": {"type": "rule", "color": "#aaa"}, "encoding": {"x": {"type": "temporal", "field": "date"}}, "transform": [{"filter": {"selection": "selector001"}}]}, {"mark": "circle", "encoding": {"color": {"type": "nominal", "field": "symbol"}, "opacity": {"condition": {"value": 1, "selection": "selector001"}, "value": 0}, "x": {"type": "temporal", "field": "date"}, "y": {"type": "quantitative", "field": "price", "scale": {"type": "log"}}}, "selection": {"selector001": {"type": "single", "encodings": ["x"], "on": "mouseover", "nearest": true, "empty": "none"}}}, {"mark": {"type": "text", "align": "left", "dx": 5, "dy": -5, "stroke": "white", "strokeWidth": 2}, "encoding": {"color": {"type": "nominal", "field": "symbol"}, "text": {"type": "quantitative", "field": "price"}, "x": {"type": "temporal", "field": "date"}, "y": {"type": "quantitative", "field": "price", "scale": {"type": "log"}}}, "transform": [{"filter": {"selection": "selector001"}}]}, {"mark": {"type": "text", "align": "left", "dx": 5, "dy": -5}, "encoding": {"color": {"type": "nominal", "field": "symbol"}, "text": {"type": "quantitative", "field": "price"}, "x": {"type": "temporal", "field": "date"}, "y": {"type": "quantitative", "field": "price", "scale": {"type": "log"}}}, "transform": [{"filter": {"selection": "selector001"}}]}], "data": {"url": "https://vega.github.io/vega-datasets/data/stocks.csv"}, "height": 400, "width": 700, "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json"}, {"mode": "vega-lite"});
</script>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Data-Tables">Data Tables<a class="anchor-link" href="#Data-Tables"> </a></h3><p>You can display tables per the usual way in your blog:</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">movies</span> <span class="o">=</span> <span class="s1">'https://vega.github.io/vega-datasets/data/movies.json'</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_json</span><span class="p">(</span><span class="n">movies</span><span class="p">)</span>
<span class="c1"># display table with pandas</span>
<span class="n">df</span><span class="p">[[</span><span class="s1">'Title'</span><span class="p">,</span> <span class="s1">'Worldwide_Gross'</span><span class="p">,</span>
<span class="s1">'Production_Budget'</span><span class="p">,</span> <span class="s1">'IMDB_Rating'</span><span class="p">]]</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_html rendered_html output_subarea output_execute_result">
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Title</th>
<th>Worldwide_Gross</th>
<th>Production_Budget</th>
<th>IMDB_Rating</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>The Land Girls</td>
<td>146083.0</td>
<td>8000000.0</td>
<td>6.1</td>
</tr>
<tr>
<th>1</th>
<td>First Love, Last Rites</td>
<td>10876.0</td>
<td>300000.0</td>
<td>6.9</td>
</tr>
<tr>
<th>2</th>
<td>I Married a Strange Person</td>
<td>203134.0</td>
<td>250000.0</td>
<td>6.8</td>
</tr>
<tr>
<th>3</th>
<td>Let's Talk About Sex</td>
<td>373615.0</td>
<td>300000.0</td>
<td>NaN</td>
</tr>
<tr>
<th>4</th>
<td>Slam</td>
<td>1087521.0</td>
<td>1000000.0</td>
<td>3.4</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Other-Feautures">Other Feautures<a class="anchor-link" href="#Other-Feautures"> </a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="GitHub-Flavored-Emojis">GitHub Flavored Emojis<a class="anchor-link" href="#GitHub-Flavored-Emojis"> </a></h3><p>Typing <code>I give this post two :+1:!</code> will render this:</p>
<p>I give this post two :+1:!</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Images-w/Captions">Images w/Captions<a class="anchor-link" href="#Images-w/Captions"> </a></h3><p>You can include markdown images with captions like this:</p>
<pre><code>![](https://www.fast.ai/images/fastai_paper/show_batch.png "Credit: https://www.fast.ai/2020/02/13/fastai-A-Layered-API-for-Deep-Learning/")</code></pre>
<p><img src="https://www.fast.ai/images/fastai_paper/show_batch.png" alt="" title="Credit: https://www.fast.ai/2020/02/13/fastai-A-Layered-API-for-Deep-Learning/" /></p>
<p>Of course, the caption is optional.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Tweetcards">Tweetcards<a class="anchor-link" href="#Tweetcards"> </a></h3><p>Typing <code>> twitter: https://twitter.com/jakevdp/status/1204765621767901185?s=20</code> will render this:</p>
<h1 id=">-twitter:-https://twitter.com/jakevdp/status/1204765621767901185?s=20">> twitter: <a href="https://twitter.com/jakevdp/status/1204765621767901185?s=20">https://twitter.com/jakevdp/status/1204765621767901185?s=20</a><a class="anchor-link" href="#>-twitter:-https://twitter.com/jakevdp/status/1204765621767901185?s=20"> </a></h1>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Youtube-Videos">Youtube Videos<a class="anchor-link" href="#Youtube-Videos"> </a></h3><p>Typing <code>> youtube: https://youtu.be/XfoYk_Z5AkI</code> will render this:
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/XfoYk_Z5AkI" frameborder="0" allowfullscreen=""></iframe>
</center>
</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="Boxes-/-Callouts">Boxes / Callouts<a class="anchor-link" href="#Boxes-/-Callouts"> </a></h3><p>Typing <code>> Warning: There will be no second warning!</code> will render this:
<div class="flash flash-error">
<svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg>
<strong>Warning: </strong>There will be no second warning!
</div></p>
<p>Typing <code>> Important: Pay attention! It's important.</code> will render this:
<div class="flash flash-warn">
<svg class="octicon octicon-zap" viewBox="0 0 10 16" version="1.1" width="10" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M10 7H6l3-7-9 9h4l-3 7 9-9z"></path></svg>
<strong>Important: </strong>Pay attention! It’s important.
</div></p>
<p>Typing <code>> Tip: This is my tip.</code> will render this:
<div class="flash flash-success">
<svg class="octicon octicon-checklist" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M16 8.5l-6 6-3-3L8.5 10l1.5 1.5L14.5 7 16 8.5zM5.7 12.2l.8.8H2c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h7c.55 0 1 .45 1 1v6.5l-.8-.8c-.39-.39-1.03-.39-1.42 0L5.7 10.8a.996.996 0 000 1.41v-.01zM4 4h5V3H4v1zm0 2h5V5H4v1zm0 2h3V7H4v1zM3 9H2v1h1V9zm0-2H2v1h1V7zm0-2H2v1h1V5zm0-2H2v1h1V3z"></path></svg>
<strong>Tip: </strong>This is my tip.
</div></p>
<p>Typing <code>> Note: Take note of this.</code> will render this:
<div class="flash">
<svg class="octicon octicon-info" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 01-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 01-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
<strong>Note: </strong>Take note of this.
</div></p>
<p>Typing <code>> Note: A doc link to [an example website: fast.ai](https://www.fast.ai/) should also work fine.</code> will render in the docs:
<div class="flash">
<svg class="octicon octicon-info octicon octicon-info" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 01-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 01-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg>
<strong>Note: </strong>A doc link to <a href="https://www.fast.ai/">an example website: fast.ai</a> should also work fine.
</div></p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="More-Examples">More Examples<a class="anchor-link" href="#More-Examples"> </a></h2><p>This <a href="https://fastpages.fast.ai/jupyter/2020/02/20/test.html">tutorial</a> contains more examples of what you can do with notebooks.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="How-fastpages-Converts-Notebooks-to-Blog-Posts">How fastpages Converts Notebooks to Blog Posts<a class="anchor-link" href="#How-fastpages-Converts-Notebooks-to-Blog-Posts"> </a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>fastpages uses <a href="https://nbdev.fast.ai/index.html">nbdev</a> to power the conversion process of Jupyter Notebooks to blog posts. When you save a notebook into the <code>/_notebooks</code> folder of your repository, GitHub Actions applies <code>nbdev</code> against those notebooks automatically. The same process occurs when you save Word documents or markdown files into the <code>_word</code> or <code>_posts</code> directory, respectively.</p>
<p>We will discuss how GitHub Actions work in a follow up blog post.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Resources-&-Next-Steps">Resources & Next Steps<a class="anchor-link" href="#Resources-&-Next-Steps"> </a></h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>We highly encourage you to start blogging with <code>fastpages</code>! Some resources that may be helpful:</p>
<ul>
<li><a href="https://github.com/fastai/fastpages">fastpages repo</a> - this is where you can go to create your own fastpages blog!</li>
<li>Fastai forums - <a href="https://forums.fast.ai/c/fastai-users/nbdev/">nbdev & blogging category</a>. You can ask questions about fastpages here, as well as suggest new features.</li>
<li><a href="https://github.com/fastai/nbdev">nbdev</a>: this project powers the conversion of Jupyter notebooks to blog posts.</li>
</ul>
<p>If you end up writing a blog post using fastpages, please let us know on Twitter: <a href="https://twitter.com/jeremyphoward">@jeremyphoward</a>, <a href="https://twitter.com/hamelhusain">@HamelHusain</a>.</p>
</div>
</div>
</div>
</div>Jeremy Howard & Hamel Husain