<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Data Science Demos</title><link href="https://stharrold.github.io/" rel="alternate"></link><link href="https://stharrold.github.io/feeds/all.atom.xml" rel="self"></link><id>https://stharrold.github.io/</id><updated>2016-02-08T03:50:00+00:00</updated><entry><title>Extract, transform, and load census data with Python</title><link href="https://stharrold.github.io/20160110-etl-census-with-python.html" rel="alternate"></link><updated>2016-02-08T03:50:00+00:00</updated><author><name>Samuel Harrold</name></author><id>tag:stharrold.github.io,2016-01-10:20160110-etl-census-with-python.html</id><summary type="html">&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#motivations"&gt;Motivations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#example"&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#helpful-links"&gt;Helpful links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#footnotes"&gt;Footnotes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="overview"&gt;Overview&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://www.census.gov/about/what.html"&gt;Census Bureau&lt;/a&gt; collects data from people in the United States through multiple survey programs. Federal, state, and local governments use the data to assess how constituents are represented and to allocate spending. The data are also made freely available to the public and have a wide range of uses.&lt;sup id="fnref:use-cases"&gt;&lt;a class="footnote-ref" href="#fn:use-cases" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; In this post, I parse, load, and verify data from the Census Bureau's &lt;a href="http://www.census.gov/programs-surveys/acs/about.html"&gt;American Community Survey (ACS)&lt;/a&gt; &lt;a href="https://www.census.gov/programs-surveys/acs/technical-documentation/pums/documentation.2013.html"&gt;2013 5-year Public Use Microdata Sample (PUMS)&lt;/a&gt; for Washington&amp;nbsp;DC.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brief process:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start with &lt;a href="/20151208-ipynb-on-gce-from-chrome.html"&gt;"Running an IPython Notebook on Google Compute Engine from Chrome"&lt;/a&gt;.&lt;ul&gt;
&lt;li&gt;For additional storage, &lt;a href="https://cloud.google.com/compute/docs/disks/persistent-disks"&gt;create and mount a disk&lt;/a&gt; to the instance.&lt;sup id="fnref:services"&gt;&lt;a class="footnote-ref" href="#fn:services" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Download (and decompress):&lt;sup id="fnref:ftp"&gt;&lt;a class="footnote-ref" href="#fn:ftp" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:api"&gt;&lt;a class="footnote-ref" href="#fn:api" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;ul&gt;
&lt;li&gt;2013 5-year PUMS data dictionary: &lt;a href="http://www2.census.gov/programs-surveys/acs/tech_docs/pums/data_dict/PUMS_Data_Dictionary_2009-2013.txt"&gt;PUMS_Data_Dictionary_2009-2013.txt&lt;/a&gt; (&amp;lt;1&amp;nbsp;MB)&lt;/li&gt;
&lt;li&gt;2013 5-year PUMS person and housing records for Washington DC:&lt;ul&gt;
&lt;li&gt;Person records: &lt;a href="http://www2.census.gov/programs-surveys/acs/data/pums/2013/5-Year/csv_pdc.zip"&gt;csv_pdc.zip&lt;/a&gt; (5&amp;nbsp;MB compressed, 30&amp;nbsp;MB decompressed)&lt;/li&gt;
&lt;li&gt;Housing records: &lt;a href="http://www2.census.gov/programs-surveys/acs/data/pums/2013/5-Year/csv_hdc.zip"&gt;csv_hdc.zip&lt;/a&gt; (2&amp;nbsp;MB compressed, 13&amp;nbsp;MB decompressed)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2013 5-year PUMS estimates for user verification: &lt;a href="http://www2.census.gov/programs-surveys/acs/tech_docs/pums/estimates/pums_estimates_9_13.csv"&gt;pums_estimates_9_13.csv&lt;/a&gt; (&amp;lt;1&amp;nbsp;MB)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Load the files:&lt;ul&gt;
&lt;li&gt;Data dictionary TXT: &lt;code&gt;dsdemos.census.parse_pumsdatadict&lt;/code&gt; (see &lt;code&gt;dsdemos&lt;/code&gt; package &lt;a href="#source"&gt;below&lt;/a&gt;)&lt;br /&gt;
This is a customized parser I wrote for &lt;code&gt;PUMS_Data_Dictionary_2009-2013.txt&lt;/code&gt;. The data dictionary is inconsistently formatted, which complicates parsing.&lt;sup id="fnref:so-post"&gt;&lt;a class="footnote-ref" href="#fn:so-post" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:json"&gt;&lt;a class="footnote-ref" href="#fn:json" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Person/housing records and user verification CSVs: &lt;code&gt;pandas.read_csv&lt;/code&gt; &lt;sup id="fnref:pd-csv"&gt;&lt;a class="footnote-ref" href="#fn:pd-csv" rel="footnote"&gt;7&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:pd-py35"&gt;&lt;a class="footnote-ref" href="#fn:pd-py35" rel="footnote"&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Confirm the user verification estimates (see example &lt;a href="#example"&gt;below&lt;/a&gt;):&lt;sup id="fnref:pums-acc"&gt;&lt;a class="footnote-ref" href="#fn:pums-acc" rel="footnote"&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;ul&gt;
&lt;li&gt;To calculate an estimate &lt;span class="math"&gt;\(X\)&lt;/span&gt; for a specific "characteristic" (e.g. "Age 25-34"), sum the column &lt;code&gt;'[P]WGTP'&lt;/code&gt; of the filtered data (&lt;code&gt;'PWGTP'&lt;/code&gt; for person records, &lt;code&gt;'WGTP'&lt;/code&gt; for housing records).&lt;sup id="fnref:filter"&gt;&lt;a class="footnote-ref" href="#fn:filter" rel="footnote"&gt;10&lt;/a&gt;&lt;/sup&gt; &lt;code&gt;'[P]WGTP'&lt;/code&gt; are the sample weights.&lt;/li&gt;
&lt;li&gt;To calculate the estimate's "direct standard error", use the ACS's modified &lt;a href="https://en.wikipedia.org/wiki/Root-mean-square_deviation"&gt;root-mean-square deviation&lt;/a&gt;:&lt;br /&gt;
&lt;div class="math"&gt;$$\mathrm{SE}(X) = \sqrt{\frac{4}{80}\sum_{r=1}^{80}(X_r-X)^2}$$&lt;/div&gt;
&lt;br /&gt;
where each &lt;span class="math"&gt;\(X_r\)&lt;/span&gt; is the sum of the column &lt;code&gt;'[P]WGTPr'&lt;/code&gt; of the filtered data. &lt;code&gt;'[P]WGTP[1-80]'&lt;/code&gt; are the "replicate weights".&lt;/li&gt;
&lt;li&gt;To calculate the estimate's margin of error (defined by ACS at the &lt;a href="http://www.wolframalpha.com/input/?i=90%25+confidence+level"&gt;90%&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Confidence_interval"&gt;confidence level&lt;/a&gt;):&lt;br /&gt;
&lt;div class="math"&gt;$$\mathrm{MOE}(X) = 1.645\,\mathrm{SE}(X)$$&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span id="source"&gt;&lt;strong&gt;Source code:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For step-by-step, see the Jupyter Notebook (click the HTML export to render in-browser):&lt;br /&gt;
&lt;a href="https://stharrold.github.io/static/20160110-etl-census-with-python/20160110-etl-census-with-python.ipynb"&gt;20160110-etl-census-with-python.ipynb&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://stharrold.github.io/static/20160110-etl-census-with-python/20160110-etl-census-with-python-full.html"&gt;20160110-etl-census-with-python-full.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;This post uses &lt;code&gt;dsdemos&lt;/code&gt; &lt;a href="https://github.com/stharrold/dsdemos/releases/tag/v0.0.3"&gt;v0.0.3&lt;/a&gt;.&lt;sup id="fnref:checkout"&gt;&lt;a class="footnote-ref" href="#fn:checkout" rel="footnote"&gt;11&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="motivations"&gt;Motivations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Why am I using the American Community Survey (ACS)?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ACS is a relevant data set. A future step is to predict an individual's household income, which is among the &lt;a href="http://www.census.gov/programs-surveys/acs/guidance/subjects.html"&gt;subjects that the ACS survey addresses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The ACS is a reliable data set.&lt;sup id="fnref:acs-method"&gt;&lt;a class="footnote-ref" href="#fn:acs-method" rel="footnote"&gt;12&lt;/a&gt;&lt;/sup&gt; The ACS has quality controls to ensure that it is representative. The survey samples about &lt;a href="https://www.census.gov/acs/www/methodology/sample-size-and-data-quality/sample-size/"&gt;3&amp;nbsp;million addresses per year&lt;/a&gt; with a &lt;a href="https://www.census.gov/acs/www/methodology/sample-size-and-data-quality/response-rates/"&gt;response rate of about 97%&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The ACS is a time-series data set. The survey sends questionnaires throughout the year and &lt;a href="https://www.census.gov/programs-surveys/acs/news/data-releases.html"&gt;releases data once per year&lt;/a&gt;. A future step is to use the time series to forecast an individual's household income.&lt;/li&gt;
&lt;li&gt;I recognize that using ACS data can be &lt;span id="problematic"&gt;problematic&lt;/span&gt;. Data from the Census Bureau has been used for harm,&lt;sup id="fnref:data-harm"&gt;&lt;a class="footnote-ref" href="#fn:data-harm" rel="footnote"&gt;13&lt;/a&gt;&lt;/sup&gt; and current ACS terminology asks respondents to identify by terms such as "race".&lt;sup id="fnref:prob-race"&gt;&lt;a class="footnote-ref" href="#fn:prob-race" rel="footnote"&gt;14&lt;/a&gt;&lt;/sup&gt; For this project, I take data from the Census Bureau at face value, and I infer from it at face value. It's important to respect that these aren't simply data points; these are people.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why am I using the ACS 5-year estimate?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As of Dec 2015, the ACS offers two windowing options for their data releases: 1-year estimates and 5-year estimates.&lt;sup id="fnref:acs-ests"&gt;&lt;a class="footnote-ref" href="#fn:acs-ests" rel="footnote"&gt;15&lt;/a&gt;&lt;/sup&gt; Because the ACS 5-year estimates include data over a 5-year window, they have the largest sample size and thus the highest precision for modeling small populations. However, the sample size comes at the expense of currency. Forecasting the predictions from a 5-year window to be more relevant to a specific year is a future step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why am I using Python?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This project can be done using Python, R, SQL, and/or other languages.&lt;sup id="fnref:rvpy"&gt;&lt;a class="footnote-ref" href="#fn:rvpy" rel="footnote"&gt;16&lt;/a&gt;&lt;/sup&gt; I'm using Python since a future step is to make a machine learning pipeline, which is a popular application of &lt;a href="http://scikit-learn.org/"&gt;scikit-learn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about "big data"?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'm starting with a data set small enough to be processed in memory (i.e. operated on in RAM), since the focus of many Python packages is in-memory operations on single machines.&lt;sup id="fnref:pydata"&gt;&lt;a class="footnote-ref" href="#fn:pydata" rel="footnote"&gt;17&lt;/a&gt;&lt;/sup&gt; These packages often parallelize operations across the machine's processor cores. For operations that exceed the machine's available RAM (i.e. &lt;a href="https://en.wikipedia.org/wiki/Out-of-core_algorithm"&gt;out-of-core&lt;/a&gt; computations), there's &lt;a href="http://dask.pydata.org/en/latest/"&gt;Dask&lt;/a&gt; for Python, and for operations that require a cluster of machines, there's &lt;a href="http://spark.apache.org/"&gt;Spark&lt;/a&gt; for Java, Scala, Python, and R. Scaling a pipeline to a large enough data set that requires a cluster is a future step.&lt;/p&gt;
&lt;!--
Note: The "Example" header will be rendered with `id="example"`.
  Creating an additional `id="example"` will break the reference.
  `href="#example"` will automatically link to this header.
--&gt;

&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;This is an abbreviated example of my ETL procedure in the Jupyter Notebook for this post (see links to source code &lt;a href="#source"&gt;above&lt;/a&gt;).&lt;/p&gt;
&lt;!-- 
Copy-pasted from
    /static/20160110-etl-census-with-python/example-basic.html
TODO: Add exported notebook by embedding HTML rather than copy-paste.
    https://github.com/stharrold/stharrold.github.io/issues/5
--&gt;

&lt;!--
BEGIN IPYNB
--&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;/home/samuel_harrold
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Import standard packages.&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="c"&gt;# Import installed packages.&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="c"&gt;# Import local packages.&lt;/span&gt;
&lt;span class="c"&gt;# Insert current directory into module search path.&lt;/span&gt;
&lt;span class="c"&gt;# &lt;code&gt;dsdemos&lt;/code&gt; version: https://github.com/stharrold/dsdemos/releases/tag/v0.0.3&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;curdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;dsdemos&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;dsdemos&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;dsd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# File paths&lt;/span&gt;
&lt;span class="c"&gt;# Base path to ACS:&lt;/span&gt;
&lt;span class="c"&gt;#     http://www2.census.gov/programs-surveys/acs/&lt;/span&gt;
&lt;span class="c"&gt;# 2013 5-year PUMS data dictionary:&lt;/span&gt;
&lt;span class="c"&gt;#     tech_docs/pums/data_dict/PUMS_Data_Dictionary_2009-2013.txt&lt;/span&gt;
&lt;span class="c"&gt;# 2013 5-year PUMS housing records for Washington DC (extracted from csv_pdc.zip):&lt;/span&gt;
&lt;span class="c"&gt;#     data/pums/2013/5-Year/csv_pdc.zip&lt;/span&gt;
&lt;span class="c"&gt;# 2013 5-year PUMS user verification estimates:&lt;/span&gt;
&lt;span class="c"&gt;#     tech_docs/pums/estimates/pums_estimates_9_13.csv&lt;/span&gt;
&lt;span class="n"&gt;path_acs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;/mnt/disk-20151227t211000z/www2-census-gov/programs-surveys/acs/&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;path_dtxt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_acs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;tech_docs/pums/data_dict/PUMS_Data_Dictionary_2009-2013.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;path_hcsv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_acs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;data/pums/2013/5-Year/ss13hdc.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;path_ecsv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_acs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;tech_docs/pums/estimates/pums_estimates_9_13.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Load and display the data dictionary.&lt;/span&gt;
&lt;span class="n"&gt;ddict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dsd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;census&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_pumsdatadict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;path_dtxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;code&gt;ddict&lt;/code&gt;, &lt;code&gt;dfd&lt;/code&gt;: Convert the nested &lt;code&gt;dict&lt;/code&gt; into a hierarchical data frame.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;# &lt;code&gt;tmp&lt;/code&gt; is a throwaway variable&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;record_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ddict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;record_types&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;record_type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ddict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;record_types&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;record_type&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;orient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;index&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dfd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;record_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;var_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;dfd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;&amp;#96;ddict&amp;#96;, &amp;#96;dfd&amp;#96;: Convert the nested &amp;#96;dict&amp;#96; into a hierarchical data frame.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[4]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;length&lt;/th&gt;
      &lt;th&gt;description&lt;/th&gt;
      &lt;th&gt;var_codes&lt;/th&gt;
      &lt;th&gt;notes&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;record_type&lt;/th&gt;
      &lt;th&gt;var_name&lt;/th&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th rowspan="5" valign="top"&gt;HOUSING RECORD&lt;/th&gt;
      &lt;th&gt;ACR&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Lot size&lt;/td&gt;
      &lt;td&gt;{'b': 'N/A (GQ/not a one-family house or mobil...&lt;/td&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;ADJHSG&lt;/th&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;Adjustment factor for housing dollar amounts (...&lt;/td&gt;
      &lt;td&gt;{'1086032': '2009 factor', '1068395': '2010 fa...&lt;/td&gt;
      &lt;td&gt;[Note: The values of ADJHSG inflation-adjusts ...&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;ADJINC&lt;/th&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;Adjustment factor for income and earnings doll...&lt;/td&gt;
      &lt;td&gt;{'1085467': '2009 factor (0.999480 * 1.0860317...&lt;/td&gt;
      &lt;td&gt;[Note: The values of ADJINC inflation-adjusts ...&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;AGS&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Sales of Agriculture Products (Yearly sales)&lt;/td&gt;
      &lt;td&gt;{'b': 'N/A (GQ/vacant/not a one-family house o...&lt;/td&gt;
      &lt;td&gt;[Note: No adjustment factor is applied to AGS.]&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;BATH&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Bathtub or shower&lt;/td&gt;
      &lt;td&gt;{'b': 'N/A (GQ)', '1': 'Yes', '2': 'No'}&lt;/td&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Load and display the housing records.&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;code&gt;dfh&lt;/code&gt;: First 5 housing records and first 10 columns.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dfh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_hcsv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dfh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;&amp;#96;dfh&amp;#96;: First 5 housing records and first 10 columns.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;insp&lt;/th&gt;
      &lt;th&gt;RT&lt;/th&gt;
      &lt;th&gt;SERIALNO&lt;/th&gt;
      &lt;th&gt;DIVISION&lt;/th&gt;
      &lt;th&gt;PUMA00&lt;/th&gt;
      &lt;th&gt;PUMA10&lt;/th&gt;
      &lt;th&gt;REGION&lt;/th&gt;
      &lt;th&gt;ST&lt;/th&gt;
      &lt;th&gt;ADJHSG&lt;/th&gt;
      &lt;th&gt;ADJINC&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;600&lt;/td&gt;
      &lt;td&gt;H&lt;/td&gt;
      &lt;td&gt;2009000000403&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;102&lt;/td&gt;
      &lt;td&gt;-9&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;1086032&lt;/td&gt;
      &lt;td&gt;1085467&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
      &lt;td&gt;H&lt;/td&gt;
      &lt;td&gt;2009000001113&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;103&lt;/td&gt;
      &lt;td&gt;-9&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;1086032&lt;/td&gt;
      &lt;td&gt;1085467&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;480&lt;/td&gt;
      &lt;td&gt;H&lt;/td&gt;
      &lt;td&gt;2009000001978&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;103&lt;/td&gt;
      &lt;td&gt;-9&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;1086032&lt;/td&gt;
      &lt;td&gt;1085467&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
      &lt;td&gt;H&lt;/td&gt;
      &lt;td&gt;2009000002250&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;105&lt;/td&gt;
      &lt;td&gt;-9&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;1086032&lt;/td&gt;
      &lt;td&gt;1085467&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;4&lt;/th&gt;
      &lt;td&gt;2500&lt;/td&gt;
      &lt;td&gt;H&lt;/td&gt;
      &lt;td&gt;2009000002985&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;101&lt;/td&gt;
      &lt;td&gt;-9&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;1086032&lt;/td&gt;
      &lt;td&gt;1085467&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Load and display the verification estimates.&lt;/span&gt;
&lt;span class="c"&gt;# Select the estimates for Washington DC then for the&lt;/span&gt;
&lt;span class="c"&gt;# characteristic &amp;#39;Owner occupied units (TEN in 1,2)&amp;#39;.&lt;/span&gt;
&lt;span class="n"&gt;dfe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_ecsv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tfmask_dc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;state&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;District of Columbia&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;dfe_dc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tfmask_dc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;code&gt;dfe_dc&lt;/code&gt;: This example verifies these quantities.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dfe_dc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="mi"&gt;310&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;&amp;#96;dfe_dc&amp;#96;: This example verifies these quantities.
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[6]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;st&lt;/th&gt;
      &lt;th&gt;state&lt;/th&gt;
      &lt;th&gt;characteristic&lt;/th&gt;
      &lt;th&gt;pums_est_09_to_13&lt;/th&gt;
      &lt;th&gt;pums_se_09_to_13&lt;/th&gt;
      &lt;th&gt;pums_moe_09_to_13&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;310&lt;/th&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;District of Columbia&lt;/td&gt;
      &lt;td&gt;Owner occupied units (TEN in 1,2)&lt;/td&gt;
      &lt;td&gt;110,362&lt;/td&gt;
      &lt;td&gt;1363&lt;/td&gt;
      &lt;td&gt;2242&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Verify the estimates following&lt;/span&gt;
&lt;span class="c"&gt;# https://www.census.gov/programs-surveys/acs/&lt;/span&gt;
&lt;span class="c"&gt;#     technical-documentation/pums/documentation.2013.html&lt;/span&gt;
&lt;span class="c"&gt;#     tech_docs/pums/accuracy/2009_2013AccuracyPUMS.pdf&lt;/span&gt;
&lt;span class="c"&gt;# Define the column names for the housing weights.&lt;/span&gt;
&lt;span class="c"&gt;# Select the reference verification data for the characteristic,&lt;/span&gt;
&lt;span class="c"&gt;# and select the records for the characteristic.&lt;/span&gt;
&lt;span class="n"&gt;hwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;WGTP&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;hwts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hwt&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;inum&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="c"&gt;# [&amp;#39;WGTP1&amp;#39;, ..., &amp;#39;WGTP80&amp;#39;]&lt;/span&gt;
&lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Owner occupied units (TEN in 1,2)&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;#39;{char}&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;tfmask_ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfe_dc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;characteristic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt;
&lt;span class="n"&gt;tfmask_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logical_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dfh&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;TEN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dfh&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;TEN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c"&gt;# Calculate and verify the estimate (&amp;#39;est&amp;#39;) for the characteristic.&lt;/span&gt;
&lt;span class="c"&gt;# The estimate is the sum of the sample weights &amp;#39;WGTP&amp;#39;.&lt;/span&gt;
&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pums_est_09_to_13&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;    &amp;#39;{col}&amp;#39;:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ref_est&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dfe_dc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tfmask_ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;test_est&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tfmask_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hwt&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref_est&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_est&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rtol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;(ref, test) = {tup}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref_est&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_est&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c"&gt;# Calculate and verify the &amp;quot;direct standard error&amp;quot; (&amp;#39;se&amp;#39;) of the estimate.&lt;/span&gt;
&lt;span class="c"&gt;# The direct standard error is a modified root-mean-square deviation&lt;/span&gt;
&lt;span class="c"&gt;# using the &amp;quot;replicate weights&amp;quot; &amp;#39;WGTP[1-80]&amp;#39;.&lt;/span&gt;
&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pums_se_09_to_13&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;    &amp;#39;{col}&amp;#39; :&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ref_se&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfe_dc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tfmask_ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;test_se&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;dfh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tfmask_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hwts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;test_est&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&lt;strong&gt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref_se&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_se&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rtol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;(ref, test) = {tup}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref_se&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_se&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="c"&gt;# Calculate and verify the margin of error (&amp;#39;moe&amp;#39;) at the&lt;/span&gt;
&lt;span class="c"&gt;# 90% confidence level (+/- 1.645 standard errors).&lt;/span&gt;
&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pums_moe_09_to_13&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;    &amp;#39;{col}&amp;#39;:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ref_moe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dfe_dc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tfmask_ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;test_moe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.645&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;test_se&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref_moe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_moe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rtol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;(ref, test) = {tup}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref_moe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_moe&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;&amp;apos;Owner occupied units (TEN in 1,2)&amp;apos;
    &amp;apos;pums_est_09_to_13&amp;apos;: (ref, test) = (110362, 110362)
    &amp;apos;pums_se_09_to_13&amp;apos; : (ref, test) = (1363, 1363.1910174293257)
    &amp;apos;pums_moe_09_to_13&amp;apos;: (ref, test) = (2242, 2242.449223671241)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[8]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Export ipynb to html&lt;/span&gt;
&lt;span class="n"&gt;path_static&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;~&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;stharrold.github.io/content/static&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;20160110-etl-census-with-python&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;example&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;path_ipynb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_static&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;.ipynb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;basic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;full&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;path_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_ipynb&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;jupyter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;nbconvert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--to&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--template&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path_ipynb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--output&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path_html&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;jupyter nbconvert --to html --template basic /home/samuel_harrold/stharrold.github.io/content/static/20160110-etl-census-with-python/example.ipynb --output /home/samuel_harrold/stharrold.github.io/content/static/20160110-etl-census-with-python/example-basic.html

jupyter nbconvert --to html --template full /home/samuel_harrold/stharrold.github.io/content/static/20160110-etl-census-with-python/example.ipynb --output /home/samuel_harrold/stharrold.github.io/content/static/20160110-etl-census-with-python/example-full.html

&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;!--
END IPYNB
--&gt;

&lt;h3 id="helpful-links"&gt;Helpful links&lt;/h3&gt;
&lt;p&gt;Some links I found helpful for this blog post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;American Community Survey (ACS):&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.census.gov/programs-surveys/acs/about.html"&gt;ACS About&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.census.gov/programs-surveys/acs/guidance.html"&gt;ACS Guidance for Data Users&lt;/a&gt; describes how to get started with ACS data.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.census.gov/programs-surveys/acs/technical-documentation.html"&gt;ACS Technical Documentation&lt;/a&gt; links to resources for learning how to work with ACS data.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.census.gov/programs-surveys/acs/methodology.html"&gt;ACS Methodology&lt;/a&gt; includes design details, sample sizes, coverage estimates, and past questionnaires.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.census.gov/programs-surveys/acs/library.All.html"&gt;ACS Library&lt;/a&gt; has a collection of reports and infographics using ACS data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Python:&lt;ul&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920028154.do"&gt;&lt;em&gt;Learning Python, 5th ed.&lt;/em&gt; (2013, O'Reilly)&lt;/a&gt; was my formal introduction to Python.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920023784.do"&gt;&lt;em&gt;Python for Data Analysis&lt;/em&gt; (2012, O'Reilly)&lt;/a&gt; introduced me to &lt;code&gt;pandas&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920027072.do"&gt;&lt;em&gt;Python Cookbook, 3rd ed.&lt;/em&gt; (2013, O'Reilly)&lt;/a&gt; has a collection of optimized recipes.&lt;/li&gt;
&lt;li&gt;From the well-documented &lt;a href="https://docs.python.org/3/index.html"&gt;Python 3.5&lt;/a&gt; standard library, I used &lt;a href="https://docs.python.org/3/library/collections.html"&gt;collections&lt;/a&gt;, &lt;a href="https://docs.python.org/3/library/functools.html"&gt;functools&lt;/a&gt;, &lt;a href="https://docs.python.org/3/library/os.html"&gt;os&lt;/a&gt;, &lt;a href="https://docs.python.org/3/library/pdb.html"&gt;pdb&lt;/a&gt;, &lt;a href="https://docs.python.org/3/library/subprocess.html"&gt;subprocess&lt;/a&gt;, &lt;a href="https://docs.python.org/3/library/sys.html"&gt;sys&lt;/a&gt;, and &lt;a href="https://docs.python.org/3/library/time.html"&gt;time&lt;/a&gt; for this post.&lt;/li&gt;
&lt;li&gt;Likewise, the documentation for &lt;a href="http://docs.scipy.org/doc/numpy-1.10.0/reference/"&gt;numpy&lt;/a&gt; and &lt;a href="http://pandas.pydata.org/pandas-docs/version/0.17.1/"&gt;pandas&lt;/a&gt; is thorough and invaluable.&lt;/li&gt;
&lt;li&gt;Of IPython's convenient &lt;a href="http://ipython.readthedocs.org/en/stable/interactive/magics.html"&gt;"magic" commands&lt;/a&gt;, within this post's Jupyter Notebooks, I used &lt;a href="http://ipython.readthedocs.org/en/stable/interactive/magics.html#magic-pdb"&gt;%pdb&lt;/a&gt;, &lt;a href="http://ipython.readthedocs.org/en/stable/interactive/magics.html#magic-reload_ext"&gt;%reload_ext&lt;/a&gt;, and the extension &lt;a href="http://ipython.readthedocs.org/en/stable/config/extensions/autoreload.html?highlight=autoreload#module-IPython.extensions.autoreload"&gt;%autoreload&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;StackOverflow &lt;a href="http://stackoverflow.com/questions/845058/how-to-get-line-count-cheaply-in-python"&gt;"How to get line count cheaply in Python"&lt;/a&gt; (not as performant as &lt;code&gt;wc -l&lt;/code&gt; but still neat).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Git:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://guides.github.com/"&gt;GitHub Guides&lt;/a&gt; are where I started with &lt;code&gt;git&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git documentation&lt;/a&gt; answers a lot of questions.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nvie/gitflow"&gt;Git-flow&lt;/a&gt; streamlines my repository management with this &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;branching model&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;StackOverflow &lt;a href="http://stackoverflow.com/questions/791959/download-a-specific-tag-with-git"&gt;"Download a specific tag with git"&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dsdemos&lt;/code&gt; &lt;a href="https://github.com/stharrold/dsdemos/tree/59705867b61b1bbc054c9ff2a5f8c6b2305ca60e"&gt;v0.0.3 (browse code)&lt;/a&gt;:&lt;ul&gt;
&lt;li&gt;To design the package file structure, I used &lt;a href="http://shop.oreilly.com/product/0636920028154.do"&gt;&lt;em&gt;Learning Python, 5th ed.&lt;/em&gt; (2013, O'Reilly)&lt;/a&gt;, Part V, "Modules and Packages"; and &lt;a href="http://shop.oreilly.com/product/0636920027072.do"&gt;&lt;em&gt;Python Cookbook, 3rd ed.&lt;/em&gt; (2013, O'Reilly)&lt;/a&gt;, Ch. 10, "Modules and Packages".&lt;/li&gt;
&lt;li&gt;I use &lt;a href="https://google.github.io/styleguide/pyguide.html"&gt;Google-style docstrings&lt;/a&gt; adapted from the &lt;a href="http://sphinxcontrib-napoleon.readthedocs.org/en/latest/example_google.html"&gt;example&lt;/a&gt; by the &lt;a href="https://sphinxcontrib-napoleon.readthedocs.org/en/latest/"&gt;Napoleon&lt;/a&gt; extension to &lt;a href="http://sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; (a Python documentation generator, not yet used by &lt;code&gt;dsdemos&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pytest.org/latest/"&gt;Pytest&lt;/a&gt; for testing.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://semver.org/"&gt;Semantic Versioning&lt;/a&gt; for version numbers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="footnotes"&gt;Footnotes&lt;/h3&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:use-cases"&gt;
&lt;p&gt;Some use cases for the Census Bureau's American Community Survey with data access recommendations: &lt;a href="https://www.census.gov/acs/www/guidance/which-data-tool/"&gt;ACS Which Data Tool&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:use-cases" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:services"&gt;
&lt;p&gt;For this post, I mounted a single disk for storage to a single instance and loaded the data in RAM. A scaled version of this pipeline on Google Cloud Platform could include integrated services such as &lt;a href="https://cloud.google.com/storage/"&gt;Cloud Storage&lt;/a&gt; and &lt;a href="https://cloud.google.com/bigquery/"&gt;Big Query&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:services" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:ftp"&gt;
&lt;p&gt;To download &lt;a href="https://www.census.gov/programs-surveys/acs/data/data-via-ftp.html"&gt;ACS data via FTP&lt;/a&gt;:&lt;br /&gt;
&lt;code&gt;$ sudo curl --remote-name &amp;lt;url&amp;gt;&lt;/code&gt;&lt;br /&gt;
Decompress the ZIP files with &lt;code&gt;unzip&lt;/code&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ftp" rev="footnote" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:api"&gt;
&lt;p&gt;I'm downloading the data files rather than using the &lt;a href="http://www.census.gov/developers/"&gt;Census Bureau's API&lt;/a&gt; because this project requires one-time access to all data rather than dynamic access to a subset of the data.&amp;#160;&lt;a class="footnote-backref" href="#fnref:api" rev="footnote" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:so-post"&gt;
&lt;p&gt;StackOverflow &lt;a href="http://stackoverflow.com/questions/26564775/regex-to-parse-well-formated-multi-line-data-dictionary/34564141#34564141"&gt;"regex to parse well-formatted multi-line data dictionary"&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:so-post" rev="footnote" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:json"&gt;
&lt;p&gt;With &lt;code&gt;dsdemos&lt;/code&gt; v0.0.3 &lt;a href="#source"&gt;above&lt;/a&gt;, you can export the data dictionary to &lt;a href="http://json.org/"&gt;JSON format&lt;/a&gt; with the &lt;a href="https://docs.python.org/3.5/library/json.html"&gt;&lt;code&gt;json&lt;/code&gt; Python library&lt;/a&gt;. See &lt;a href="https://github.com/stharrold/dsdemos/blob/59705867b61b1bbc054c9ff2a5f8c6b2305ca60e/tests/test_census.py#L34-L43"&gt;example from &lt;code&gt;dsdemos&lt;/code&gt; tests&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:json" rev="footnote" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:pd-csv"&gt;
&lt;p&gt;&lt;a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html"&gt;Docs for &lt;code&gt;pandas.read_csv&lt;/code&gt;&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:pd-csv" rev="footnote" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:pd-py35"&gt;
&lt;p&gt;Pandas 0.17.1 has a compatibility issue with Python 3.5. See &lt;a href="https://github.com/pydata/pandas/issues/11915"&gt;GitHub pandas issue 11915&lt;/a&gt; for a temporary fix. The issue should be resolved in pandas 0.18.&amp;#160;&lt;a class="footnote-backref" href="#fnref:pd-py35" rev="footnote" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:pums-acc"&gt;
&lt;p&gt;For the formulas to calculate the estimates, the direct standard error, and the margin of error, as well as for example calculations, see &lt;a href="http://www2.census.gov/programs-surveys/acs/tech_docs/pums/accuracy/2009_2013AccuracyPUMS.pdf"&gt;2013 5-year PUMS Accuracy&lt;/a&gt;, section 7, "Measuring Sampling Error". The sample weights &lt;code&gt;'[P]WGTP'&lt;/code&gt; mitigate over/under-representation and control agreement with published ACS estimates. The accuracy PDF describes two methods of calculating the error (i.e. uncertainty) associated with an estimate of a characteristic:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Calculate the "generalized standard error" of the estimate using "design factors" from the survey. This method does not use columns &lt;code&gt;'[P]WGTP[1-80]'&lt;/code&gt; and requires looking up a design factor for the specific characteristic (e.g "population by tenure"). See the accuracy PDF for the design factors.&lt;/li&gt;
&lt;li&gt;Calculate the "direct standard error" of the estimate using the "replicate weights", which are the columns &lt;code&gt;'[P]WGTP[1-80]'&lt;/code&gt;. This method is extensible to many kinds of characteristics (e.g. population by tenure by age).
&lt;/ol&gt;&lt;br /&gt;
Note: Controlled estimates of characteristics like "total population" have 0 direct standard error from replicate weights. Use the generalized standard error for these estimates.&amp;#160;&lt;a class="footnote-backref" href="#fnref:pums-acc" rev="footnote" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:filter"&gt;
&lt;p&gt;There are &lt;a href="http://pandas.pydata.org/pandas-docs/stable/indexing.html"&gt;several ways&lt;/a&gt; to select rows by filtering on conditions using &lt;code&gt;pandas&lt;/code&gt;. I prefer creating a &lt;code&gt;pandas.Series&lt;/code&gt; with boolean values as true-false mask then using the true-false mask as an index to filter the rows. See the &lt;a href="http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.loc.html"&gt;docs for &lt;code&gt;pandas.DataFrame.loc&lt;/code&gt;&lt;/a&gt;.&lt;br /&gt;
Example query: Select columns &lt;code&gt;'AGEP'&lt;/code&gt; and &lt;code&gt;'WGTP'&lt;/code&gt; where values for &lt;code&gt;'AGEP'&lt;/code&gt; are between 25 and 34.&lt;br /&gt;
&lt;code&gt;tfmask = np.logical_and(25 &amp;lt;= df['AGEP'], df['AGEP'] &amp;lt;= 34)&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;df_subset = df.loc[tfmask, ['AGEP', 'WGTP']]&lt;/code&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:filter" rev="footnote" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:checkout"&gt;
&lt;p&gt;To download &lt;code&gt;dsdemos&lt;/code&gt; and checkout v0.0.3 for following the example &lt;a href="#example"&gt;above&lt;/a&gt;:&lt;br /&gt;
&lt;code&gt;$ cd ~&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ git clone https://github.com/stharrold/dsdemos.git&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ cd dsdemos&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ git checkout tags/v0.0.3&lt;/code&gt;&lt;br /&gt;
If you already have a clone of &lt;code&gt;dsdemos&lt;/code&gt;, update your local repository then checkout the version's tag:&lt;br /&gt;
&lt;code&gt;$ cd dsdemos&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ git pull&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ git checkout tags/v0.0.3&lt;/code&gt;
&lt;!-- ## Motivations --&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:checkout" rev="footnote" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:acs-method"&gt;
&lt;p&gt;&lt;a href="http://www.census.gov/programs-surveys/acs/methodology.html"&gt;ACS Methodology&lt;/a&gt; includes design details, sample sizes, coverage estimates, and past questionnaires.&amp;#160;&lt;a class="footnote-backref" href="#fnref:acs-method" rev="footnote" title="Jump back to footnote 12 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:data-harm"&gt;
&lt;p&gt;Data from the Census Bureau was used to identify Japanese communities as part of the internment of US citizens and residents with Japanese ancestry during World&amp;nbsp;War&amp;nbsp;II. See the &lt;a href="https://www.aclu.org/frequently-asked-questions-national-census"&gt;ACLU's FAQ section about census data&lt;/a&gt; and the &lt;a href="https://en.wikipedia.org/wiki/Internment_of_Japanese_Americans"&gt;Wikipedia article "Internment of Japanese Americans"&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:data-harm" rev="footnote" title="Jump back to footnote 13 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:prob-race"&gt;
&lt;p&gt;"Race" is a problematic term with historical connotations and conflicts between self-identification and labeling by others. The &lt;a href="http://www2.census.gov/programs-surveys/acs/methodology/questionnaires/2015/quest15.pdf"&gt;2015 ACS questionnaire&lt;/a&gt; refers to "race" and "ethnicity" separately. The American Anthropological Association &lt;a href="http://s3.amazonaws.com/rdcms-aaa/files/production/public/FileDownloads/pdfs/cmtes/minority/upload/AAA_Response_OMB1997.pdf"&gt;recommended in 1997&lt;/a&gt; that questions about "race" and "ethnicity" are ambiguous given the historical context and would be better phrased as about "race/ethnicity". For this project, I refer to "race" and "ethnicity" as "race/ethnicity". The following links are also helpful:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.census.gov/topics/population/race/about.html"&gt;Census Bureau's statement about "race" (2013)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitehouse.gov/omb/fedreg_notice_15/"&gt;Office of Management and Budget, "Standards for the Classification of Federal Data on Race and Ethnicity" (1994), Appendix Directive No.&amp;nbsp;15 (1977)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitehouse.gov/omb/fedreg_directive_15"&gt;Office of Management and Budget, "Review of the Racial and Ethnic Standards to the OMB Concerning Changes" (Jul&amp;nbsp;1997)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.whitehouse.gov/omb/fedreg_1997standards"&gt;Office of Management and Budget, "Revisions to the Standards for the Classification of Federal Data on Race and Ethnicity" (Oct&amp;nbsp;1997)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.americananthro.org/ConnectWithAAA/Content.aspx?ItemNumber=2583"&gt;American Anthropological Association, "Statement on Race" (1998)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Race_and_ethnicity_in_the_United_States_Census"&gt;Wikipedia article "Race and ethnicity in the United States Census"&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:prob-race" rev="footnote" title="Jump back to footnote 14 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:acs-ests"&gt;
&lt;p&gt;The ACS 3-year estimates are discontinued; 2013 is the last year included in the 3-year estimates. For guidance in choosing, accessing, and using a data set, see &lt;a href="https://www.census.gov/programs-surveys/acs/guidance.html"&gt;ACS Guidance for Data Users&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:acs-ests" rev="footnote" title="Jump back to footnote 15 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:rvpy"&gt;
&lt;p&gt;StackExchange Programmers &lt;a href="http://programmers.stackexchange.com/questions/181342/r-vs-python-for-data-analysis"&gt;"R vs Python for data analysis"&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:rvpy" rev="footnote" title="Jump back to footnote 16 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:pydata"&gt;
&lt;p&gt;See the &lt;a href="http://pydata.org/downloads/"&gt;PyData stack&lt;/a&gt; for a collection of performant Python packages.&amp;#160;&lt;a class="footnote-backref" href="#fnref:pydata" rev="footnote" title="Jump back to footnote 17 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;!-- ## Overview --&gt;

&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "left",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    var location_protocol = (false) ? 'https' : document.location.protocol;
    if (location_protocol !== 'http' &amp;&amp; location_protocol !== 'https') location_protocol = 'https:';
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = location_protocol + '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</summary><category term="etl"></category><category term="how-to"></category><category term="python"></category><category term="pandas"></category><category term="census"></category></entry><entry><title>Running an IPython Notebook on Google Compute Engine from Chrome</title><link href="https://stharrold.github.io/20151208-ipynb-on-gce-from-chrome.html" rel="alternate"></link><updated>2016-02-08T02:45:00+00:00</updated><author><name>Samuel Harrold</name></author><id>tag:stharrold.github.io,2015-12-08:20151208-ipynb-on-gce-from-chrome.html</id><summary type="html">&lt;!--
Note: Plugin 'pelican_alias' requires 'Alias:' to have '.html' extension,
otherwise page is named only &lt;slug&gt; without '.html'
--&gt;

&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#motivations"&gt;Motivations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#first-time-setup"&gt;First-time setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#helpful-links"&gt;Helpful links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#acknowledgements"&gt;Acknowledgements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#footnotes"&gt;Footnotes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="overview"&gt;Overview&lt;/h3&gt;
&lt;p&gt;In October 2015, I bought a Chromebook with the intent of learning how to move my data-science development environment to the cloud. In exchange for an extra 5&amp;nbsp;minutes of setup, I now have a flexible infrastructure that can scale with the task. This setup is cross-platform in that it can be used on any laptop with Chrome, not just a Chromebook.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brief setup:&lt;/strong&gt;&lt;/p&gt;
&lt;div id="screenshot"&gt;
&lt;a href="/static/20151208-ipynb-on-gce-from-chrome/20151208-chrome-secure-shell-settings-821x451pix.png" type="image/png"&gt;
    &lt;img src="/static/20151208-ipynb-on-gce-from-chrome/20151208-chrome-secure-shell-settings-821x451pix.png" alt="Chrome Secure Shell settings" align="right" width="320" /&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Start a &lt;a href="https://cloud.google.com/compute/"&gt;Google Compute Engine&lt;/a&gt; virtual machine instance.&lt;/li&gt;
&lt;li&gt;Start a &lt;a href="http://jupyter.org/"&gt;Jupyter Notebook&lt;/a&gt; server on the instance:&lt;br /&gt;
&lt;code&gt;$ jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser &amp;amp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ disown 1234&lt;/code&gt; (where &lt;code&gt;1234&lt;/code&gt; is the process ID)&lt;/li&gt;
&lt;li&gt;Create an &lt;a href="http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html"&gt;SSH tunnel&lt;/a&gt; to forward a local port to the server's port on the instance:&lt;br /&gt;
&lt;code&gt;$ ssh -f -N -L localhost:8888:0.0.0.0:8888 samuel_harrold@123.123.123.123&lt;/code&gt;&lt;br /&gt;
For &lt;a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo"&gt;Chrome Secure Shell&lt;/a&gt;, omit &lt;code&gt;-f&lt;/code&gt; to keep the tunnel open (see &lt;a href="#screenshot"&gt;screenshot&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;View the server at &lt;code&gt;http://localhost:8888&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;I use the &lt;a href="https://c9.io/?redirect=0"&gt;Cloud9 IDE&lt;/a&gt; and connect the instance as an &lt;a href="https://docs.c9.io/docs/running-your-own-ssh-workspace"&gt;SSH workspace&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="motivations"&gt;Motivations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Why did I move to the cloud?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I wanted to save money.&lt;ul&gt;
&lt;li&gt;With a cloud-based platform, I only need a laptop as a web browser. I spent $170 on my &lt;a href="http://www.amazon.com/gp/product/B00VUV0MG0"&gt;ASUS C201 Chromebook with 4GB RAM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I spend about $20 per month on &lt;a href="https://cloud.google.com/"&gt;Google Cloud&lt;/a&gt; services.&lt;sup id="fnref:gce-prices"&gt;&lt;a class="footnote-ref" href="#fn:gce-prices" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;I spend $10 per month on a &lt;a href="https://c9.io/pricing/public"&gt;Cloud9 micro plan&lt;/a&gt; for SSH workspaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I wanted a reproducible environment. Snapshots can serve as simple backups of instances. For more complex platform managment, there's the &lt;a href="https://cloud.google.com/cloud-shell/docs/"&gt;Google Cloud Shell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I wanted to test the scalability of a pipeline. On a cloud platform, I can mount disks with large data sets and change the instance size to test how efficiently algorithms use CPUs and memory. Connecting other cloud services expands the possibilities.&lt;sup id="fnref:alts"&gt;&lt;a class="footnote-ref" href="#fn:alts" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why do I use Google Cloud?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Between Google Cloud and Amazon Web Services, I chose Google Cloud for its intuitive UI. &lt;a href="https://cloud.google.com/compute/docs/ssh-in-browser"&gt;SSH within the browser&lt;/a&gt; is very convenient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why do I use IPython Notebooks?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ipython.org/notebook.html"&gt;IPython (Jupyter) Notebooks&lt;/a&gt; are an important part of my development process since they enable me to prototype quickly and to share my work in-progress. The notebook serves as a top-level script, the parts of which I eventually modularize as components of installable packages. I prefer the &lt;a href="https://www.continuum.io/"&gt;Continuum Analytics Anaconda Python distribution&lt;/a&gt; for its &lt;a href="http://conda.pydata.org/docs/"&gt;Conda package manager&lt;/a&gt;. I'm using &lt;a href="https://docs.python.org/3.5/"&gt;Python 3.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why do I use Cloud9?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I saw that &lt;a href="http://stackshare.io/stackups/cloud9-ide-vs-nitrous-io-vs-koding"&gt;Cloud9 is popular&lt;/a&gt; and has good &lt;a href="https://docs.c9.io/docs/"&gt;documentation&lt;/a&gt;.&lt;sup id="fnref:c9-debug"&gt;&lt;a class="footnote-ref" href="#fn:c9-debug" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt; I wanted a cloud-based IDE since I didn't want to spend resources on my Chromebook or on my instances to run the IDE.&lt;/p&gt;
&lt;h3 id="first-time-setup"&gt;First-time setup&lt;/h3&gt;
&lt;p&gt;There are many ways to run a Jupyter Notebook server on a virtual machine instance. This is one example setup working from my Chromebook with details for newcomers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a Google Compute Engine virtual machine instance and SSH keys:&lt;ul&gt;
&lt;li&gt;Make a project in the &lt;a href="https://console.developers.google.com"&gt;Google Developers Console&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Configure an instance:&lt;ul&gt;
&lt;li&gt;Machine type: Start with the smallest machine type.&lt;sup id="fnref:mem-cpu"&gt;&lt;a class="footnote-ref" href="#fn:mem-cpu" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Boot disk: Start with the default boot disk (Debian, 10GB).&lt;sup id="fnref:disk"&gt;&lt;a class="footnote-ref" href="#fn:disk" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Firewall: Allow HTTP and HTTPS connections to use &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;wget&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Project access: Reserve an external IP address ("Networking" &amp;gt; "External IP"). Other settings can be left at default.&lt;sup id="fnref:ext-ip"&gt;&lt;a class="footnote-ref" href="#fn:ext-ip" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt; For this example, I give &lt;code&gt;123.123.123.123&lt;/code&gt; as my instance's static external IP address.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connect to the instance, e.g. with Google's &lt;a href="https://cloud.google.com/compute/docs/ssh-in-browser"&gt;in-browser SSH&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://askubuntu.com/questions/222348/what-does-sudo-apt-get-update-do"&gt;Update the Debian system&lt;/a&gt;:&lt;br /&gt;
&lt;code&gt;$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get dist-upgrade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.github.com/articles/generating-ssh-keys/"&gt;Generate an SSH key pair for the instance&lt;/a&gt; &lt;span id="ssh-keygen"&gt;&lt;/span&gt; and might as well connect to GitHub.&lt;sup id="fnref:use-less"&gt;&lt;a class="footnote-ref" href="#fn:use-less" rel="footnote"&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span id="ipynb-server"&gt;Start a Jupyter Notebook server&lt;/span&gt; on the instance from the in-browser SSH:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.continuum.io/downloads"&gt;Install Python&lt;/a&gt; on the instance.&lt;/li&gt;
&lt;li&gt;Start a &lt;a href="http://jupyter.org/"&gt;Jupyter Notebook&lt;/a&gt; server:&lt;br /&gt;
&lt;code&gt;$ jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser &amp;amp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;$ disown 1234&lt;/code&gt; (where &lt;code&gt;1234&lt;/code&gt; is the process ID)&lt;sup id="fnref:disown"&gt;&lt;a class="footnote-ref" href="#fn:disown" rel="footnote"&gt;8&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create an SSH tunnel to forward a local port to the server's port on the instance:&lt;ul&gt;
&lt;li&gt;Generate an SSH key pair for the Chromebook as &lt;a href="#ssh-keygen"&gt;above&lt;/a&gt;&lt;sup id="fnref:keys"&gt;&lt;a class="footnote-ref" href="#fn:keys" rel="footnote"&gt;9&lt;/a&gt;&lt;/sup&gt; and &lt;span id="ssh-keyadd"&gt;add the Chromebook's public key to the instance's &lt;code&gt;authorized_keys&lt;/code&gt;&lt;/span&gt;.&lt;sup id="fnref:cat"&gt;&lt;a class="footnote-ref" href="#fn:cat" rel="footnote"&gt;10&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Within Chrome, install &lt;a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo"&gt;Chrome Secure Shell&lt;/a&gt; and forward a port (see screenshot &lt;a href="#screenshot"&gt;above&lt;/a&gt;):&lt;br /&gt;
&lt;code&gt;Username: samuel_harrold&lt;/code&gt; (in the instance's shell, run &lt;code&gt;whoami&lt;/code&gt;)&lt;br /&gt;
&lt;code&gt;Hostname: 123.123.123.123&lt;/code&gt; (the instance's external IP address)&lt;br /&gt;
&lt;code&gt;Port: 22&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;Identity: id_rsa&lt;/code&gt; &lt;sup id="fnref:import"&gt;&lt;a class="footnote-ref" href="#fn:import" rel="footnote"&gt;11&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;
&lt;code&gt;SSH Arguments: -N -L localhost:8888:0.0.0.0:8888&lt;/code&gt; &lt;sup id="fnref:no-f"&gt;&lt;a class="footnote-ref" href="#fn:no-f" rel="footnote"&gt;12&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:paste"&gt;&lt;a class="footnote-ref" href="#fn:paste" rel="footnote"&gt;13&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;View the server at &lt;code&gt;http://localhost:8888&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For an IDE, connect a Cloud9 remote SSH workspace to the instance:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions"&gt;Install Node.js&lt;/a&gt; on the instance.&lt;/li&gt;
&lt;li&gt;Create a &lt;a href="https://docs.c9.io/docs/running-your-own-ssh-workspace"&gt;Cloud9 SSH workspace&lt;/a&gt;, copy the public SSH key from Cloud9 to the instance's &lt;code&gt;authorized_keys&lt;/code&gt; as &lt;a href="#ssh-keyadd"&gt;above&lt;/a&gt;, then open the workspace:&lt;sup id="fnref:install-deps"&gt;&lt;a class="footnote-ref" href="#fn:install-deps" rel="footnote"&gt;14&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;
&lt;code&gt;Username: samuel_harrold&lt;/code&gt; (in the instance's shell, run &lt;code&gt;whoami&lt;/code&gt;)&lt;br /&gt;
&lt;code&gt;Hostname: 123.123.123.123&lt;/code&gt; (the instance's external IP address)&lt;br /&gt;
&lt;code&gt;Initial path: /home/samuel_harrold&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;Port: 22&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;Node.js binary path: /usr/bin/nodejs&lt;/code&gt; (in the instance's shell, run &lt;code&gt;which nodejs&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span id="shutdown"&gt;To shutdown the instance&lt;/span&gt;:&lt;ul&gt;
&lt;li&gt;Close the Jupyter Notebook and the Chrome Secure Shell tabs. Kill the Jupyter Notebook server.&lt;sup id="fnref:lsof-kill"&gt;&lt;a class="footnote-ref" href="#fn:lsof-kill" rel="footnote"&gt;15&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Close the Cloud9 workspace tab.&lt;/li&gt;
&lt;li&gt;"Stop" the instance in the Developers Console.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For a simple backup of the instance, create a snapshot from the Developers Console. This can be done while the instance is running.&lt;/li&gt;
&lt;li&gt;To change the instance's machine type or disk size:&lt;ul&gt;
&lt;li&gt;Shutdown the instance as &lt;a href="#shutdown"&gt;above&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a snapshot of the instance.&lt;/li&gt;
&lt;li&gt;Clone the instance but set the new boot disk to the new snapshot and...&lt;ul&gt;
&lt;li&gt;...if changing the machine type, set the new machine type.&lt;/li&gt;
&lt;li&gt;...if changing the disk size, set the new disk size.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reassign the external IP address to the new instance.&lt;sup id="fnref:networking"&gt;&lt;a class="footnote-ref" href="#fn:networking" rel="footnote"&gt;16&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Start the Jupyter Notebook server on the instance and create an SSH tunnel as &lt;a href="#ipynb-server"&gt;above&lt;/a&gt;.&lt;sup id="fnref:host-id"&gt;&lt;a class="footnote-ref" href="#fn:host-id" rel="footnote"&gt;17&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Open the Cloud9 workspace.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="helpful-links"&gt;Helpful links&lt;/h3&gt;
&lt;p&gt;Some links I found helpful for this blog post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo"&gt;Chrome app Secure Shell.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/cookiestxt/njabckikapfpffapmjgojcnbfjonfjfg"&gt;Chrome app cookies.txt&lt;/a&gt; to export cookies from Chrome for &lt;code&gt;wget&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To inspect system resources, &lt;code&gt;chrome://system&lt;/code&gt; in Chrome's address bar.&lt;/li&gt;
&lt;li&gt;To inspect RAM usage by Chrome, &lt;code&gt;chrome://memory-redirect&lt;/code&gt; in Chrome's address bar (from the Chrome Task Manager).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chromebook:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=y1dAnXkednM"&gt;Chromebook 2GB vs 4GB Demo.&lt;/a&gt; I had to upgrade from a 2GB RAM Chromebook to a model with 4GB RAM since I typically use about 2.5GB RAM while working.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jjg.svbtle.com/chromebook-for-developers-part-3"&gt;Using a Chromebook as a developer.&lt;/a&gt; I've had my Chromebook for 2&amp;nbsp;months and haven't yet needed developer mode.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/B00LLER2CS"&gt;Low-profile flash drive&lt;/a&gt; to expand the Chromebook's storage.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/sftp-file-system/gbheifiifcfekkamhepkeogobihicgmn"&gt;Chromebook app SFTP.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/caret/fljalecfjciodhpcledpamjachpmelml"&gt;Chomebook app Caret text editor.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linux:&lt;ul&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/9780596005955.do"&gt;&lt;em&gt;Classic Shell Scripting&lt;/em&gt; (2005, O'Reilly)&lt;/a&gt; was my formal introduction to Bash and Linux/Unix.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.datamation.com/open-source/debian-vs-ubuntu-which-is-best-for-you-1.html"&gt;Choosing between Debian and Ubuntu.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://askubuntu.com/questions/222348/what-does-sudo-apt-get-update-do"&gt;Updating a Debian system.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.linuxproblem.org/art_9.html"&gt;SSH login without password.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html"&gt;SSH port forwarding (tunnels) explained.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/solutions/connecting-securely"&gt;Google's recommended best practices for securing communications with Compute Engine instances.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thegeekstuff.com/2012/07/wget-curl/"&gt;&lt;code&gt;wget&lt;/code&gt; vs &lt;code&gt;curl&lt;/code&gt; with examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;StackExchange Unix and Linux &lt;a href="http://unix.stackexchange.com/questions/136371/how-to-download-a-folder-from-google-drive-using-terminal"&gt;download from Google Drive with &lt;code&gt;wget&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/forums/f/15/kaggle-forum/t/6604/downloading-data-via-command-line"&gt;Download from Kaggle with &lt;code&gt;wget&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cyberciti.biz/faq/unix-linux-disown-command-examples-usage-syntax/"&gt;&lt;code&gt;disown&lt;/code&gt; examples.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IPython (Jupyter) Notebooks:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/iamatypeofwalrus/5183133"&gt;Running an IPython Notebook from Amazon Web Services.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/samklr/07bee2868a6ed72a8ec4"&gt;Hosting a password-protected IPython Notebook on Google Compute Engine.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="acknowledgements"&gt;Acknowledgements&lt;/h3&gt;
&lt;p&gt;Thanks to John and Julie for their early reviews.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;John Jardel: &lt;a href="http://thewannabedatascientist.blogspot.com"&gt;http://thewannabedatascientist.blogspot.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Julie Hollek: &lt;a href="https://github.com/jkru"&gt;https://github.com/jkru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="footnotes"&gt;Footnotes&lt;/h3&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:gce-prices"&gt;
&lt;p&gt;As of Dec 2015 on Google Compute Engine, running a 1-core shared virtual CPU instance with 0.6GB RAM costs about &amp;#36;4.50 per month. Running a 32-core virtual CPU instance with 120GB RAM costs about &amp;#36;1.12 per hour.&amp;#160;&lt;a class="footnote-backref" href="#fnref:gce-prices" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:alts"&gt;
&lt;p&gt;There are also hosted services like &lt;a href="https://wakari.io/"&gt;Continuum Analytics Wakari&lt;/a&gt;, &lt;a href="https://cloud.google.com/datalab/"&gt;Google Cloud Datalab&lt;/a&gt;, &lt;a href="https://c9.io/?redirect=0"&gt;Cloud9 hosted workspaces&lt;/a&gt;, and &lt;a href="https://www.digitalocean.com/"&gt;Digital Ocean&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:alts" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:c9-debug"&gt;
&lt;p&gt;As of Dec 2015, Cloud9 doesn't support debugging in Python. However, this hasn't been a problem for me since I use &lt;a href="https://docs.python.org/3.5/library/pdb.html"&gt;pdb&lt;/a&gt; for debugging and &lt;a href="http://pytest.org/latest/"&gt;pytest&lt;/a&gt; for testing. I use the IDE mostly for code navigation, autocomplete, and managing packages with many files.&amp;#160;&lt;a class="footnote-backref" href="#fnref:c9-debug" rev="footnote" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:mem-cpu"&gt;
&lt;p&gt;Determine if more RAM is necessary by using &lt;code&gt;free -m&lt;/code&gt; to display the free memory (RAM) in MB. Use the Developers Console to determine the CPU utilization.&amp;#160;&lt;a class="footnote-backref" href="#fnref:mem-cpu" rev="footnote" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:disk"&gt;
&lt;p&gt;Determine if more disk space is necessary by using &lt;code&gt;df -B MB&lt;/code&gt; to display the free disk space in MB.&amp;#160;&lt;a class="footnote-backref" href="#fnref:disk" rev="footnote" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:ext-ip"&gt;
&lt;p&gt;Reassigning a static external IP address to a new instance when changing instances is often more convenient than changing an ephemeral IP address in all connections to the instance, e.g. in Chrome Secure Shell and Cloud9.&amp;#160;&lt;a class="footnote-backref" href="#fnref:ext-ip" rev="footnote" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:use-less"&gt;
&lt;p&gt;For Google's in-browser SSH, &lt;code&gt;xclip&lt;/code&gt; does not function. Copy the public key from &lt;code&gt;less&lt;/code&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:use-less" rev="footnote" title="Jump back to footnote 7 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:disown"&gt;
&lt;p&gt;Disowning a background process (the control operator &lt;code&gt;&amp;amp;&lt;/code&gt;) from the shell allows a process to continue running in the background when the shell is closed.&amp;#160;&lt;a class="footnote-backref" href="#fnref:disown" rev="footnote" title="Jump back to footnote 8 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:keys"&gt;
&lt;p&gt;To create an SSH key pair for the Chromebook without going into the laptop's developer mode, generate an extra pair of keys on the instance as &lt;a href="#ssh-keygen"&gt;above&lt;/a&gt; then move them to the Chromebook. I save mine under &lt;code&gt;Downloads/ssh&lt;/code&gt; (no dot-file access without developer mode). Transfer the keys by copy-paste using &lt;code&gt;less&lt;/code&gt; from instance's in-browser SSH and &lt;a href="https://chrome.google.com/webstore/detail/caret/fljalecfjciodhpcledpamjachpmelml"&gt;a text editor app for Chromebook&lt;/a&gt; or download them from a connected &lt;a href="https://docs.c9.io/docs/running-your-own-ssh-workspace"&gt;Cloud9 SSH workspace&lt;/a&gt;: right-click the file &amp;gt; "Download".&amp;#160;&lt;a class="footnote-backref" href="#fnref:keys" rev="footnote" title="Jump back to footnote 9 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:cat"&gt;
&lt;p&gt;To append a local public SSH key, e.g. &lt;code&gt;id_rsa.pub&lt;/code&gt;, to a remote machine's &lt;code&gt;authorized_keys&lt;/code&gt; file, in the instance's in-browser shell:&lt;br /&gt;
&lt;code&gt;$ cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;[Ctrl+V to paste the local public key, then Enter]&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;[Ctrl+D to signal end of file]&lt;/code&gt;  &amp;#160;&lt;a class="footnote-backref" href="#fnref:cat" rev="footnote" title="Jump back to footnote 10 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:import"&gt;
&lt;p&gt;Select both of the Chromebook's private and public keys, &lt;code&gt;id_rsa&lt;/code&gt; and &lt;code&gt;id_rsa.pub&lt;/code&gt;, to import as a pair.&amp;#160;&lt;a class="footnote-backref" href="#fnref:import" rev="footnote" title="Jump back to footnote 11 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:no-f"&gt;
&lt;p&gt;Omit the &lt;code&gt;-f&lt;/code&gt; option to keep Chrome Secure Shell's tunnel open. Pin the tab in Chrome (right-click the tab &amp;gt; "Pin tab") to keep Chrome Secure Shell open and minimized in the browser.&amp;#160;&lt;a class="footnote-backref" href="#fnref:no-f" rev="footnote" title="Jump back to footnote 12 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:paste"&gt;
&lt;p&gt;To paste the password for the Chromebook's SSH key, use Chrome's paste function ("Customize and control" &amp;gt; "Edit" &amp;gt; "Paste"; using Ctrl+V will input &lt;code&gt;^v&lt;/code&gt; as the password). In place of &lt;code&gt;ssh-add&lt;/code&gt; on my Chromebook, I use &lt;a href="https://lastpass.com/"&gt;LastPass&lt;/a&gt; to manage passwords.&amp;#160;&lt;a class="footnote-backref" href="#fnref:paste" rev="footnote" title="Jump back to footnote 13 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:install-deps"&gt;
&lt;p&gt;If the Cloud9 workspace fails to connect to the instance, e.g. the terminal within the workspace doesn't receive input, run the &lt;a href="https://github.com/c9/install/"&gt;Cloud9 dependency installation script&lt;/a&gt; then reopen the workspace:&lt;br /&gt;
&lt;code&gt;curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash&lt;/code&gt;&lt;br /&gt;
(requires HTTPS traffic allowed in the instance's firewall settings)&amp;#160;&lt;a class="footnote-backref" href="#fnref:install-deps" rev="footnote" title="Jump back to footnote 14 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:lsof-kill"&gt;
&lt;p&gt;In the instance's in-browser SSH:&lt;br /&gt;
&lt;code&gt;$ lsof -i:8888&lt;/code&gt; (list process IDs filtered by port)&lt;br /&gt;
&lt;code&gt;$ kill 1234&lt;/code&gt; (send a termination signal to the process ID)&lt;br /&gt;
(install &lt;code&gt;lsof&lt;/code&gt; with &lt;code&gt;sudo apt-get install lsof&lt;/code&gt;)&amp;#160;&lt;a class="footnote-backref" href="#fnref:lsof-kill" rev="footnote" title="Jump back to footnote 15 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:networking"&gt;
&lt;p&gt;In the Developers Console, &lt;a href="https://cloud.google.com/compute/docs/instances-and-network"&gt;manage IP addresses&lt;/a&gt; under "Products &amp;amp; services" &amp;gt; "Networking".&amp;#160;&lt;a class="footnote-backref" href="#fnref:networking" rev="footnote" title="Jump back to footnote 16 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:host-id"&gt;
&lt;p&gt;Because the external IP address was reassigned to a new instance, a warning will appear that the remote host identification has changed. To remove the offending ECDSA key from &lt;code&gt;known_hosts&lt;/code&gt;, in Chrome, open the JavaScript console (Ctrl+Shift+J) and run &lt;code&gt;term_.command.removeKnownHostByIndex(idx)&lt;/code&gt; where idx is the given line number in &lt;code&gt;known_hosts&lt;/code&gt;, e.g. from the warning line &lt;code&gt;Offending ECDSA key in /.ssh/known_hosts:1&lt;/code&gt;, idx=1.&amp;#160;&lt;a class="footnote-backref" href="#fnref:host-id" rev="footnote" title="Jump back to footnote 17 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="devops"></category><category term="how-to"></category><category term="python"></category><category term="cloud-computing"></category><category term="chrome"></category><category term="cloud9"></category><category term="ssh"></category></entry><entry><title>Test page and template</title><link href="https://stharrold.github.io/20151030-test.html" rel="alternate"></link><updated>2016-02-08T02:45:00+00:00</updated><author><name>Samuel Harrold</name></author><id>tag:stharrold.github.io,2015-10-30:20151030-test.html</id><summary type="html">&lt;!--
Note: Plugin 'pelican_alias' requires 'Alias:' to have '.html' extension,
otherwise page is named only &lt;slug&gt; without '.html'
--&gt;

&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contents&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#heading2"&gt;Heading2&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#heading3"&gt;Heading3&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#heading4"&gt;Heading4&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#heading5"&gt;Heading5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#heading6"&gt;Heading6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#motivations"&gt;Motivations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#body"&gt;Body&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#helpful-links"&gt;Helpful links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#footnotes"&gt;Footnotes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id="overview"&gt;Overview&lt;/h3&gt;
&lt;p&gt;I use this page for testing how structures are rendered on the blog and for templating new posts. I leave this page openly visible as a resource for others who are interested in building their own blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://stharrold.github.io/static/20151030-test/20151030-test.ipynb"&gt;20151030-test.ipynb&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://stharrold.github.io/static/20151030-test/20151030-test-full.html"&gt;20151030-test-full.html&lt;/a&gt;  &lt;/p&gt;
&lt;h3 id="heading2"&gt;Heading2&lt;/h3&gt;
&lt;h4 id="heading3"&gt;Heading3&lt;/h4&gt;
&lt;h5 id="heading4"&gt;Heading4&lt;/h5&gt;
&lt;h6 id="heading5"&gt;Heading5&lt;/h6&gt;
&lt;h6 id="heading6"&gt;Heading6&lt;/h6&gt;
&lt;h3 id="motivations"&gt;Motivations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Why am I doing this?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why I'm doing this.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="body"&gt;Body&lt;/h3&gt;
&lt;p&gt;Text with a footnote.&lt;sup id="fnref:fn"&gt;&lt;a class="footnote-ref" href="#fn:fn" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A link:&lt;br /&gt;
&lt;a href="https://github.com/stharrold/demo/blob/5ececb3b400ea8d51bcb396933e6b9c2a7b29963/demo/utils.py#L27-L62"&gt;GitHub link&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A link with code as text: &lt;a href="https://docs.python.org/3/index.html"&gt;&lt;code&gt;python&lt;/code&gt; docs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Text with always-rendered dollar signs &amp;#36;1.12.&lt;/p&gt;
&lt;p&gt;Text with a non-breaking&amp;nbsp;space.&lt;/p&gt;
&lt;!--
Note:
* Use &lt;span&gt; tag for referencing inline elements (e.g. text)
  and &lt;div&gt; tag for referencing block-level elements (e.g. images).
* Use href="/&lt;slug&gt;.html#ref" for references between pages
  and href="#ref" for references within a single page.
--&gt;

&lt;p&gt;Text with a &lt;span id="ref"&gt;referenced portion&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Text referencing &lt;a href="/20151030-test.html#ref"&gt;above&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Text with an equation &lt;span class="math"&gt;\(\mathrm{SE}(X) = \sqrt{(\sum_{i=1}^{n}(X_i-X)^2)/n}\)&lt;/span&gt; inline.&lt;/p&gt;
&lt;p&gt;Text with an equation&lt;br /&gt;
&lt;/p&gt;
&lt;div class="math"&gt;$$\mathrm{SE}(X) = \sqrt{\frac{\sum_{i=1}^{n}(X_i-X)^2}{n}}$$&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
as a paragraph.&lt;/p&gt;
&lt;!--
TODO: Fix JavaScript event handling. Icon doesn't change.
https://github.com/stharrold/stharrold.github.io/issues/34
--&gt;

&lt;p&gt;Text that is collapsible:&lt;br /&gt;
&lt;div&gt;
    Short answer.
    &lt;div class="btn-group"&gt;
        &lt;button type="button" class="btn btn-link" data-toggle="collapse" data-target="#details"&gt;
            &lt;span class="glyphicon glyphicon-plus"&gt;&lt;/span&gt;
        &lt;/button&gt;
    &lt;/div&gt;
    &lt;div id="details" class="collapse"&gt;Long answer.&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A plot included via Markdown:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="plot.jpg" src="https://stharrold.github.io/static/20151030-test/plot.jpg" /&gt;&lt;br /&gt;
&lt;a href="https://stharrold.github.io/static/20151030-test/plot.jpg"&gt;plot.jpg&lt;/a&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A screenshot included via HTML:&lt;/li&gt;
&lt;/ul&gt;
&lt;!--
Note:
Use align="left" attribute to wrap image rather than have in-line.
--&gt;

&lt;p&gt;&lt;a href="/static/20151030-test/screenshot-432x323pix.png" type="image/png"&gt;
    &lt;img src="/static/20151030-test/screenshot-432x323pix.png" alt="Chrome Secure Shell settings" width="320" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A table:&lt;/li&gt;
&lt;/ul&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;c0&lt;/th&gt;
      &lt;th&gt;c1&lt;/th&gt;
      &lt;th&gt;c2&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;a&lt;/td&gt;
      &lt;td&gt;A&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;b&lt;/td&gt;
      &lt;td&gt;B&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;c&lt;/td&gt;
      &lt;td&gt;C&lt;/td&gt;
      &lt;td&gt;12&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;a href="https://stharrold.github.io/static/20151030-test/table.html"&gt;table.html&lt;/a&gt;&lt;/p&gt;
&lt;!--
TODO: Add table by embedding HTML rather than copy-paste.
https://github.com/stharrold/stharrold.github.io/issues/5
--&gt;

&lt;!--
TODO: Fix event handling for JavaScript. Included content isn't included. 
https://github.com/stharrold/stharrold.github.io/issues/14
--&gt;

&lt;div id="includedContent"&gt;&lt;/div&gt;

&lt;script type="text/javascript"&gt; 
  $(document).onload(function() {
    $("#includedContent").load("/static/20151030-test/table.html");
  });
&lt;/script&gt;

&lt;ul&gt;
&lt;li&gt;A code snippet:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="sd"&gt;r&amp;quot;&amp;quot;&amp;quot;My docstring.&lt;/span&gt;

&lt;span class="sd"&gt;  Args:&lt;/span&gt;
&lt;span class="sd"&gt;    string (str): String to print.&lt;/span&gt;

&lt;span class="sd"&gt;  Returns:&lt;/span&gt;
&lt;span class="sd"&gt;    None&lt;/span&gt;

&lt;span class="sd"&gt;  &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;my &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;!--
TODO: Include a D3 document in an ipynb and as embedded html.
https://github.com/stharrold/stharrold.github.io/issues/14
--&gt;

&lt;ul&gt;
&lt;li&gt;A Jupyter Notebook:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: Add exported notebook by embedding HTML rather than copy-paste (&lt;a href="https://github.com/stharrold/stharrold.github.io/issues/5"&gt;issue 5&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Copy-pasted from &lt;a href="https://stharrold.github.io/static/20151030-test/20151030-test-basic.html"&gt;20151030-test-basic.html&lt;/a&gt; (all cells included):&lt;/p&gt;
&lt;!--
Note:
* Do not prettify (e.g. with JS Beautify) the "basic" HTML export,
  otherwise it will not render correctly.
* Block-level &lt;div&gt; are supported with blank lines before and after
  http://daringfireball.net/projects/markdown/syntax#html
* Disable liquid_tags.notebook plugin  before inserting HTML file below.
* liquid_tags.notebook has been disabled since it does not render
  cleanly with pelican-bootstrap3.
--&gt;

&lt;!--
BEGIN IPYNB
--&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h1 id="20151030-test"&gt;20151030-test&lt;a class="anchor-link" href="#20151030-test"&gt;&amp;#182;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Heading2"&gt;Heading2&lt;a class="anchor-link" href="#Heading2"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id="Heading3"&gt;Heading3&lt;a class="anchor-link" href="#Heading3"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;&lt;h4 id="Heading4"&gt;Heading4&lt;a class="anchor-link" href="#Heading4"&gt;&amp;#182;&lt;/a&gt;&lt;/h4&gt;&lt;h5 id="Heading5"&gt;Heading5&lt;a class="anchor-link" href="#Heading5"&gt;&amp;#182;&lt;/a&gt;&lt;/h5&gt;&lt;h6 id="Heading6"&gt;Heading6&lt;a class="anchor-link" href="#Heading6"&gt;&amp;#182;&lt;/a&gt;&lt;/h6&gt;&lt;p&gt;Description.&lt;/p&gt;
&lt;h2 id="Initialization"&gt;Initialization&lt;a class="anchor-link" href="#Initialization"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id="Imports"&gt;Imports&lt;a class="anchor-link" href="#Imports"&gt;&amp;#182;&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[1]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;/home/samuel_harrold
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[2]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Import standard packages.&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pdb&lt;/span&gt; &lt;span class="c"&gt;# Debug with pdb.&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="c"&gt;# Import installed packages.&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="c"&gt;# Import local packages.&lt;/span&gt;
&lt;span class="c"&gt;# Append current directory to module search path.&lt;/span&gt;
&lt;span class="c"&gt;# Autoreload local packages after editing.&lt;/span&gt;
&lt;span class="c"&gt;# &lt;code&gt;dsdemos&lt;/code&gt; version: https://github.com/stharrold/dsdemos (master branch)&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;curdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;dsdemos&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;reload_ext&lt;/span&gt; autoreload
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;autoreload&lt;/span&gt; 2
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;dsdemos&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;dsd&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; inline
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[3]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Datestamp:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;%Y-%m-%dT%H:%M:%S%Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmtime&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Python version:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Datestamp:
2016-01-04T16:44:26GMT

Python version:
sys.version_info(major=3, minor=5, micro=1, releaselevel=&amp;apos;final&amp;apos;, serial=0)
&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Globals"&gt;Globals&lt;a class="anchor-link" href="#Globals"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[4]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# File paths&lt;/span&gt;
&lt;span class="n"&gt;path_static&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;~&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;stharrold.github.io/content/static&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;20151030-test&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Section-1"&gt;Section 1&lt;a class="anchor-link" href="#Section-1"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Description of section 1.&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[5]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;c0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;c1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;c2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;path_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_static&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;table.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;path_html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;/home/samuel_harrold/stharrold.github.io/content/static/20151030-test/table.html
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt output_prompt"&gt;Out[5]:&lt;/div&gt;

&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;
&lt;div&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;c0&lt;/th&gt;
      &lt;th&gt;c1&lt;/th&gt;
      &lt;th&gt;c2&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;a&lt;/td&gt;
      &lt;td&gt;A&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;b&lt;/td&gt;
      &lt;td&gt;B&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;c&lt;/td&gt;
      &lt;td&gt;C&lt;/td&gt;
      &lt;td&gt;12&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[6]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;path_jpg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_static&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;r&amp;#39;plot.jpg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;/home/samuel_harrold/stharrold.github.io/content/static/20151030-test/plot.jpg
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
AAALEgAACxIB0t1+/AAAENxJREFUeJzt3W+oXGedwPHvL9Zu2LUWuoWCqS27jaWuGEW09kXZHVvZ
3uybiFL6ByopiIFuJe+MvpBeQdC+K92i3Swh4gZJg11o1lWsSAfp1tSIbaM2aVOV2KSSUv+BC4UY
fvtipsnJ9N47586cmTl/vh8YuOfeZ848Pdz73G+embmNzESS1E4bFj0BSdLsuMhLUou5yEtSi7nI
S1KLuchLUou5yEtSi41d5CNiT0Scjogja4x5MCKOR8SzEfH+aqcoSZpUmZLfC9yy2hcjYitwTWa+
C9gBPFzR3CRJUxq7yGfmk8Af1hiyDfjGcOzTwKURcUU105MkTaOKPflNwMuF41PDz0mSFswnXiWp
xS6q4ByngHcWjq8cfu5NIsI/lCNJE8jMmOR+ZUs+hreVHAQ+CRARNwB/zMzTq50oM71lct999y18
DnW5eS28Fl6L87fTp5NPfCJ597uTQ4cGn5tGmZdQfhN4Crg2In4TEXdHxI6I+PRw0f4O8OuIeAn4
d+CeqWYkSR2UCY88Alu2wObN8NOfwoc/PP15x27XZOadJcbcO/1UJKmbXn0V7rkHnn8eHnusmsX9
DT7xuiC9Xm/RU6gNr8V5XovzunAtZlXvRTHtfs+6Hiwi5/l4klRXxXrfu3ftxT0iyBk/8SpJqsA8
6r2oipdQSpJKmOXe+2oseUmasXnXe5ElL0kztIh6L7LkJWkGFlnvRZa8JFVs0fVeZMlLUkXqUu9F
lrwkVaBO9V5kyUvSFOpY70WWvCRNqK71XmTJS9I61b3eiyx5SVqHJtR7kSUvSSU0qd6LLHlJGqNp
9V5kyUvSKppa70WWvCStoMn1XmTJS1JBG+q9yJKXpKG21HuRJS+p89pW70WWvKROa2O9F1nykjqp
zfVeZMlL6py213uRJS+pM7pS70WWvKRO6FK9F1nyklqti/VeZMlLaq2u1nuRJS+pdbpe70WWvKRW
sd4vZMlLagXrfWWWvKTGs95XZ8lLaizrfTxLXlIjWe/lWPKSGsV6Xx9LXlJjWO/rV6rkI2IpIo5F
xIsRsWuFr789Ig5GxLMR8bOI2F75TCV1lvU+ucjMtQdEbABeBG4GXgEOA7dn5rHCmM8Db8/Mz0fE
5cALwBWZ+ZeRc+W4x5OkomK9793bzcU9IsjMmOS+ZUr+euB4Zp7IzDPAfmDbyJgELhl+fAnwu9EF
XpLWw3qvRpk9+U3Ay4XjkwwW/qKHgIMR8QrwNuC2aqYnqYvce69OVU+83gI8k5k3RcQ1wPcjYktm
/nl04PLy8rmPe70evV6voilIarpMOHAAdu6E7dth3z7YuHHRs5q/fr9Pv9+v5Fxl9uRvAJYzc2l4
/DkgM/P+wphvA1/OzP8dHv8A2JWZPxk5l3vyklbk3vvqZr0nfxjYHBFXR8TFwO3AwZExJ4CPDidz
BXAt8KtJJiSpW9x7n62x2zWZeTYi7gUeZ/BLYU9mHo2IHYMv527gS8DXI+LI8G6fzczfz2zWklrB
vffZG7tdU+mDuV0jiTfvvS8vd3Pvvaxptmt8x6ukubLe58u/XSNpLtx7XwxLXtLMWe+LY8lLmhnr
ffEseUkzYb3XgyUvqVLWe71Y8pIqY73XjyUvaWrWe31Z8pKmYr3XmyUvaSLWezNY8pLWzXpvDkte
UmnWe/NY8pJKsd6byZKXtCbrvdkseUmrst6bz5KX9CbWe3tY8pIuYL23iyUvCbDe28qSl2S9t5gl
L3WY9d5+lrzUUdZ7N1jyUsdY791iyUsdYr13jyUvdYD13l2WvNRy1nu3WfJSS1nvAkteaiXrXW+w
5KUWsd41ypKXWsJ610oseanhrHetxZKXGsx61ziWvNRA1rvKsuSlhrHetR6WvNQQ1rsmYclLDWC9
a1KlSj4iliLiWES8GBG7VhnTi4hnIuLnEfFEtdOUusl617QiM9ceELEBeBG4GXgFOAzcnpnHCmMu
BZ4C/jkzT0XE5Zn52grnynGPJ2mgWO9797q4d1lEkJkxyX3LlPz1wPHMPJGZZ4D9wLaRMXcCj2bm
KYCVFnhJ5VjvqlKZPflNwMuF45MMFv6ia4G3Drdp3gY8mJn/Wc0Upe5w711Vq+rVNRcBHwC2AkvA
FyJic0XnllrPeteslCn5U8BVheMrh58rOgm8lpmvA69HxA+B9wEvjZ5seXn53Me9Xo9er7e+GUst
Y71rVL/fp9/vV3KuMk+8vgV4gcETr78FfgzckZlHC2OuA/6NQcX/FfA0cFtmPj9yLp94lYYy4cAB
2LkTtm+H5WXYuHHRs1IdTfPE69iSz8yzEXEv8DiD7Z09mXk0InYMvpy7M/NYRHwPOAKcBXaPLvCS
zrPeNS9jS77SB7Pk1XHWuyYx05KXVA3rXYvg366RZsxXzmiRLHlphqx3LZolL82A9a66sOSlilnv
qhNLXqqI9a46suSlCljvqitLXpqC9a66s+SlCVnvagJLXlon611NYslL62C9q2kseakE611NZclL
Y1jvajJLXlqF9a42sOSlFVjvagtLXiqw3tU2lrw0ZL2rjSx5dZ71rjaz5NVp1rvazpJXJ1nv6gpL
Xp1jvatLLHl1hvWuLrLk1QnWu7rKklerWe/qOkterWW9S5a8Wsh6l86z5NUq1rt0IUterWC9Syuz
5NV41ru0OktejWW9S+NZ8mok610qx5JXo1jv0vpY8moM611aP0tetWe9S5Oz5FVr1rs0HUtetWS9
S9UoVfIRsQQ8wOCXwp7MvH+VcR8CngJuy8z/qmyW6hTrXarO2JKPiA3AQ8AtwHuAOyLiulXGfQX4
XtWTVDdY71L1ypT89cDxzDwBEBH7gW3AsZFxnwG+BXyo0hmqE6x3aTbK7MlvAl4uHJ8cfu6ciHgH
8LHM/BoQ1U1PbWe9S7NV1atrHgB2FY5d6DWW9S7NXplF/hRwVeH4yuHnij4I7I+IAC4HtkbEmcw8
OHqy5eXlcx/3ej16vd46p6ymy4QDB2DnTti+Hfbtg40bFz0rqT76/T79fr+Sc0Vmrj0g4i3AC8DN
wG+BHwN3ZObRVcbvBf57pVfXRESOezy1W7He9+613qUyIoLMnGiHZOyefGaeBe4FHgd+AezPzKMR
sSMiPr3SXSaZiNrNvXdpMcaWfKUPZsl3kvUuTWemJS9NynqXFs+/XaOZ8JUzUj1Y8qqU9S7ViyWv
yljvUv1Y8pqa9S7VlyWvqVjvUr1Z8pqI9S41gyWvdbPepeaw5FWa9S41jyWvUqx3qZksea3Jepea
zZLXqqx3qfkseb2J9S61hyWvC1jvUrtY8gKsd6mtLHlZ71KLWfIdZr1L7WfJd5T1LnWDJd8x1rvU
LZZ8h1jvUvdY8h1gvUvdZcm3nPUudZsl31LWuySw5FvJepf0Bku+Rax3SaMs+Zaw3iWtxJJvOOtd
0los+Qaz3iWNY8k3kPUuqSxLvmGsd0nrYck3hPUuaRKWfANY75ImZcnXmPUuaVqWfE1Z75KqYMnX
jPUuqUqWfI1Y75KqVqrkI2IpIo5FxIsRsWuFr98ZEc8Nb09GxHurn2p7We+SZmVsyUfEBuAh4Gbg
FeBwRDyWmccKw34F/GNm/ikiloD/AG6YxYTbxnqXNEtlSv564HhmnsjMM8B+YFtxQGYeysw/DQ8P
AZuqnWb7WO+S5qHMnvwm4OXC8UkGC/9qPgV8d5pJtZ31LmleKn3iNSI+AtwN3LjamOXl5XMf93o9
er1elVOotUw4cAB27oTt22HfPti4cdGzklQ3/X6ffr9fybkiM9ceEHEDsJyZS8PjzwGZmfePjNsC
PAosZeYvVzlXjnu8tirW+9691ruk8iKCzIxJ7ltmT/4wsDkiro6Ii4HbgYMjE7iKwQJ/12oLfFe5
9y5pkcZu12Tm2Yi4F3icwS+FPZl5NCJ2DL6cu4EvAJcBX42IAM5k5lr79p3g3rukRRu7XVPpg3Vk
u2Z073152b13SZObZrvGd7xWzHqXVCf+7ZqKuPcuqY4s+QpY75LqypKfgvUuqe4s+QlZ75KawJJf
J+tdUpNY8utgvUtqGku+BOtdUlNZ8mNY75KazJJfhfUuqQ0s+RVY75LawpIvsN4ltY0lP2S9S2qj
zpe89S6pzTpd8ta7pLbrZMlb75K6onMlb71L6pLOlLz1LqmLOlHy1rukrmp1yVvvkrqutSVvvUtS
C0veepek81pV8ta7JF2oFSVvvUvSyhpf8ta7JK2usSVvvUvSeI0seetdksppVMlb75K0Po0peetd
ktav9iVvvUvS5Gpd8ta7JE2nliVvvUtSNWpX8ta7JFWnNiVvvUtS9WpR8ta7JM1GqZKPiKWIOBYR
L0bErlXGPBgRxyPi2Yh4f5nzWu+SNFtjF/mI2AA8BNwCvAe4IyKuGxmzFbgmM98F7AAeHnfeV1+F
W2+FL35xUO9f+Qps3DjRf0Mj9fv9RU+hNrwW53ktzvNaVKNMyV8PHM/ME5l5BtgPbBsZsw34BkBm
Pg1cGhFXrHQy633Ab+DzvBbneS3O81pUo8ye/Cbg5cLxSQYL/1pjTg0/d3r0ZLfe6t67JM3L3J94
3bwZ9u3r1taMJC1KZObaAyJuAJYzc2l4/DkgM/P+wpiHgScy85Hh8THgnzLz9Mi51n4wSdKKMjMm
uV+Zkj8MbI6Iq4HfArcDd4yMOQj8K/DI8JfCH0cX+GkmKUmazNhFPjPPRsS9wOMMnqjdk5lHI2LH
4Mu5OzO/ExH/EhEvAf8H3D3baUuSyhi7XSNJaq6Z/FmDWb15qonGXYuIuDMinhvenoyI9y5invNQ
5vtiOO5DEXEmIj4+z/nNU8mfkV5EPBMRP4+IJ+Y9x3kp8TPy9og4OFwrfhYR2xcwzZmLiD0RcToi
jqwxZv3rZmZWemPwi+Ml4GrgrcCzwHUjY7YC/zP8+MPAoarnUYdbyWtxA3Dp8OOlLl+LwrgfAN8G
Pr7oeS/w++JS4BfApuHx5Yue9wKvxeeBL79xHYDfARcteu4zuBY3Au8Hjqzy9YnWzVmUfKVvnmq4
sdciMw9l5p+Gh4cYvL+gjcp8XwB8BvgW8Oo8JzdnZa7FncCjmXkKIDNfm/Mc56XMtUjgkuHHlwC/
y8y/zHGOc5GZTwJ/WGPIROvmLBb5ld48NbpwrfbmqbYpcy2KPgV8d6YzWpyx1yIi3gF8LDO/BrT5
lVhlvi+uBS6LiCci4nBE3DW32c1XmWvxEPAPEfEK8Bywc05zq5uJ1s1a/BVKQUR8hMGrkm5c9FwW
6AGguCfb5oV+nIuADwA3AX8D/CgifpSZLy12WgtxC/BMZt4UEdcA34+ILZn550VPrAlmscifAq4q
HF85/NzomHeOGdMGZa4FEbEF2A0sZeZa/1xrsjLX4oPA/ogIBnuvWyPiTGYenNMc56XMtTgJvJaZ
rwOvR8QPgfcx2L9ukzLX4m7gywCZ+cuI+DVwHfCTucywPiZaN2exXXPuzVMRcTGDN0+N/pAeBD4J
595Ru+Kbp1pg7LWIiKuAR4G7MvOXC5jjvIy9Fpn598Pb3zHYl7+nhQs8lPsZeQy4MSLeEhF/zeCJ
tqNznuc8lLkWJ4CPAgz3oK8FfjXXWc5PsPq/YCdaNysv+fTNU+eUuRbAF4DLgK8OC/ZMZo7+AbjG
K3ktLrjL3Cc5JyV/Ro5FxPeAI8BZYHdmPr/Aac9Eye+LLwFfL7y08LOZ+fsFTXlmIuKbQA/424j4
DXAfcDFTrpu+GUqSWqw2/49XSVL1XOQlqcVc5CWpxVzkJanFXOQlqcVc5CWpxVzkJanFXOQlqcX+
H5gI1cNra0F7AAAAAElFTkSuQmCC
"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="Export-ipynb-to-html"&gt;Export ipynb to html&lt;a class="anchor-link" href="#Export-ipynb-to-html"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;In&amp;nbsp;[7]:&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Export ipynb to html&lt;/span&gt;
&lt;span class="n"&gt;path_ipynb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_static&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;.ipynb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;basic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;full&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;path_html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_ipynb&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;jupyter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;nbconvert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--to&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--template&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path_ipynb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;--output&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path_html&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;jupyter nbconvert --to html --template basic /home/samuel_harrold/stharrold.github.io/content/static/20151030-test/20151030-test.ipynb --output /home/samuel_harrold/stharrold.github.io/content/static/20151030-test/20151030-test-basic.html

jupyter nbconvert --to html --template full /home/samuel_harrold/stharrold.github.io/content/static/20151030-test/20151030-test.ipynb --output /home/samuel_harrold/stharrold.github.io/content/static/20151030-test/20151030-test-full.html

&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;!--
END IPYNB
--&gt;

&lt;h3 id="helpful-links"&gt;Helpful links&lt;/h3&gt;
&lt;p&gt;Some links I found helpful for this blog post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some links here.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="footnotes"&gt;Footnotes&lt;/h3&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:fn"&gt;
&lt;p&gt;Text as a footnote.&amp;#160;&lt;a class="footnote-backref" href="#fnref:fn" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;!-- JavaScript --&gt;

&lt;!--
Collapsible text
http://www.w3schools.com/bootstrap/bootstrap_ref_js_collapse.asp
http://stackoverflow.com/questions/13778703/adding-open-closed-icon-to-twitter-bootstrap-collapsibles-accordions
--&gt;

&lt;script type="text/javascript"&gt;
$('.collapse').on('shown.bs.collapse', function() {
  $(this).parent().find(".glyphicon-plus").removeClass("glyphicon-plus").addClass("glyphicon-minus");
}).on('hidden.bs.collapse', function() {
  $(this).parent().find(".glyphicon-minus").removeClass("glyphicon-minus").addClass("glyphicon-plus");
});
&lt;/script&gt;

&lt;script type="text/javascript"&gt;if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
    var align = "left",
        indent = "0em",
        linebreak = "false";

    if (false) {
        align = (screen.width &lt; 768) ? "left" : align;
        indent = (screen.width &lt; 768) ? "0em" : indent;
        linebreak = (screen.width &lt; 768) ? 'true' : linebreak;
    }

    var mathjaxscript = document.createElement('script');
    var location_protocol = (false) ? 'https' : document.location.protocol;
    if (location_protocol !== 'http' &amp;&amp; location_protocol !== 'https') location_protocol = 'https:';
    mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
    mathjaxscript.type = 'text/javascript';
    mathjaxscript.src = location_protocol + '//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
    mathjaxscript[(window.opera ? "innerHTML" : "text")] =
        "MathJax.Hub.Config({" +
        "    config: ['MMLorHTML.js']," +
        "    TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'AMS' } }," +
        "    jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
        "    extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
        "    displayAlign: '"+ align +"'," +
        "    displayIndent: '"+ indent +"'," +
        "    showMathMenu: true," +
        "    messageStyle: 'normal'," +
        "    tex2jax: { " +
        "        inlineMath: [ ['\\\\(','\\\\)'] ], " +
        "        displayMath: [ ['$$','$$'] ]," +
        "        processEscapes: true," +
        "        preview: 'TeX'," +
        "    }, " +
        "    'HTML-CSS': { " +
        "        styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
        "        linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
        "    }, " +
        "}); " +
        "if ('default' !== 'default') {" +
            "MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
            "MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
                "var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
                "VARIANT['normal'].fonts.unshift('MathJax_default');" +
                "VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
                "VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
                "VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
            "});" +
        "}";
    (document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
&lt;/script&gt;</summary><category term="test"></category><category term="how-to"></category><category term="template"></category></entry></feed>