<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Data Science With Python</title><link>https://necromuralist.github.io/data_science/</link><description>Sketches of data explorations.</description><atom:link href="https://necromuralist.github.io/data_science/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2017 &lt;a href="mailto:necromuralist@gmail.com"&gt;necromuralist&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Sun, 01 Oct 2017 00:59:48 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Measures of Centrality</title><link>https://necromuralist.github.io/data_science/posts/Measures-of-Centrality/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;p&gt;In this assignment you will explore measures of centrality on two networks, a friendship network in Part 1, and a blog network in Part 2.&lt;/p&gt;
&lt;div class="section" id="part-1-friendships"&gt;
&lt;h2&gt;Part 1 - Friendships&lt;/h2&gt;
&lt;div class="section" id="imports"&gt;
&lt;h3&gt;1.1 Imports&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_0a8b59a83c6a4a2abcf5d13e8fb31274-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="friendships-data"&gt;
&lt;h3&gt;1.2 Friendships data&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4d7fdabdf4e34d0fb5c308b05d88c412-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;friendships&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_gml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'friendships.gml'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-1"&gt;
&lt;h3&gt;1.3 Question 1&lt;/h3&gt;
&lt;p&gt;Find the degree centrality, closeness centrality, and normalized betweeness centrality (excluding endpoints) of node 100.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a tuple of floats ``(degree_centrality, closeness_centrality, betweenness_centrality)``.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a3dd270f1aad442dad12596ec728daf5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;DEGREE_CENTRALITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degree_centrality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;friendships&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a3dd270f1aad442dad12596ec728daf5-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;CLOSENESS_CENTRALITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closeness_centrality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;friendships&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a3dd270f1aad442dad12596ec728daf5-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;BETWEENNESS_CENTRALITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;betweenness_centrality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;friendships&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets measures of centrality for node 100&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     tuple:&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;      - float: degree centrality&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;      - float: closeness centrality&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;      - float: normalized betweeness centrality&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;NODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DEGREE_CENTRALITY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NODE&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a name="rest_code_23312d0250ab4736a4cf2ce29b0c1e48-12"&gt;&lt;/a&gt;            &lt;span class="n"&gt;CLOSENESS_CENTRALITY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NODE&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;BETWEENNESS_CENTRALITY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NODE&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_57dc96aa118143ab89a7ebf890d1aa77-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
(0.0026501766784452294, 0.2654784240150094, 7.142902633244772e-05)
&lt;/pre&gt;
&lt;p&gt;For Questions 2, 3, and 4, use one of the covered centrality measures to rank the nodes and find the most appropriate candidate.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;largest_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;centrality&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets the node with the best (largest score)&lt;/span&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     int: name of the node with the best score&lt;/span&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c76901c4cb5247e397f7fa053e284750-8"&gt;&lt;/a&gt;                                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;centrality&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&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;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-2"&gt;
&lt;h3&gt;1.4 Question 2&lt;/h3&gt;
&lt;p&gt;Suppose you are employed by an online shopping website and are tasked with selecting one user in network G1 to send an online shopping voucher to. We expect that the user who receives the voucher will send it to their friends in the network.  You want the voucher to reach as many nodes as possible. The voucher can be forwarded to multiple users at the same time, but the travel distance of the voucher is limited to one step, which means if the voucher travels more than one step in this network, it is no longer valid. Apply your knowledge in network centrality to select the best candidate for the voucher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return an integer, the name of the node.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_0d5d8b8147494a568ffd090ccaf5cbb8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_two&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_0d5d8b8147494a568ffd090ccaf5cbb8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""returns the node with the best degree centrality"""&lt;/span&gt;
&lt;a name="rest_code_0d5d8b8147494a568ffd090ccaf5cbb8-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;largest_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DEGREE_CENTRALITY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_40dbe175266f4404886d6fa2e96e6f38-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_two&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
105
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-3"&gt;
&lt;h3&gt;1.5 Question 3&lt;/h3&gt;
&lt;p&gt;Now the limit of the voucher’s travel distance has been removed. Because the network is connected, regardless of who you pick, every node in the network will eventually receive the voucher. However, we now want to ensure that the voucher reaches the nodes in the lowest average number of hops.&lt;/p&gt;
&lt;p&gt;How would you change your selection strategy? Write a function to tell us who is the best candidate in the network under this condition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return an integer, the name of the node.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e2212e1ef1dc4e2ea1fda25e6800de50-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_e2212e1ef1dc4e2ea1fda25e6800de50-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Returns the node with the best closeness centrality"""&lt;/span&gt;
&lt;a name="rest_code_e2212e1ef1dc4e2ea1fda25e6800de50-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;largest_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLOSENESS_CENTRALITY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_465265b0c2cb46839277301706bb2b1b-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
23
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-4"&gt;
&lt;h3&gt;1.6 Question 4&lt;/h3&gt;
&lt;p&gt;Assume the restriction on the voucher’s travel distance is still removed, but now a competitor has developed a strategy to remove a person from the network in order to disrupt the distribution of your company’s voucher. Identify the single riskiest person to be removed under your competitor’s strategy?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return an integer, the name of the node.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b82d6cb94e2d4a2399b1a9830d8cabf8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_b82d6cb94e2d4a2399b1a9830d8cabf8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""the node with the highest betweenness centrality"""&lt;/span&gt;
&lt;a name="rest_code_b82d6cb94e2d4a2399b1a9830d8cabf8-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;largest_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BETWEENNESS_CENTRALITY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6bd632c08e4b4d73a79453c435b20947-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
333
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="part-2-political-blogs"&gt;
&lt;h2&gt;Part 2 - Political Blogs&lt;/h2&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;blogs&lt;/tt&gt; is a directed network of political blogs, where nodes correspond to a blog and edges correspond to links between blogs. Use your knowledge of PageRank and HITS to answer Questions 5-9.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6700b8715aed49348b93ef892a104a8d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;blogs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_gml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'blogs.gml'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;div class="section" id="question-5"&gt;
&lt;h3&gt;2.1 Question 5&lt;/h3&gt;
&lt;p&gt;Apply the Scaled Page Rank Algorithm to this network. Find the Page Rank of node 'realclearpolitics.com' with damping value 0.85.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a float.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e9b4db422af14e03a7666f7b57011898-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;PAGE_RANK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pagerank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blogs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e0aab162beb04c0a8426e018ebca447a-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_e0aab162beb04c0a8426e018ebca447a-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Page Rank of realclearpolitics.com"""&lt;/span&gt;
&lt;a name="rest_code_e0aab162beb04c0a8426e018ebca447a-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;PAGE_RANK&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'realclearpolitics.com'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2fdaac03ee2b4fe482eabba30261489c-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.004636694781649093
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-6"&gt;
&lt;h3&gt;2.2 Question 6&lt;/h3&gt;
&lt;p&gt;Apply the Scaled Page Rank Algorithm to this network with damping value 0.85. Find the 5 nodes with highest Page Rank.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of the top 5 blogs in desending order of Page Rank.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6be669b4af644402a7bd8fe45f321cd8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;top_five&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ranks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_6be669b4af644402a7bd8fe45f321cd8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets the top-five blogs by rank"""&lt;/span&gt;
&lt;a name="rest_code_6be669b4af644402a7bd8fe45f321cd8-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6be669b4af644402a7bd8fe45f321cd8-4"&gt;&lt;/a&gt;                               &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ranks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;())))[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_6be669b4af644402a7bd8fe45f321cd8-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2c29f860ea9548c0a15ced14ed4735ab-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_six&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_2c29f860ea9548c0a15ced14ed4735ab-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Top 5 nodes by page rank"""&lt;/span&gt;
&lt;a name="rest_code_2c29f860ea9548c0a15ced14ed4735ab-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;top_five&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PAGE_RANK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b9dd9fd2fa6140468c572fcb49f96534-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_six&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['dailykos.com', 'atrios.blogspot.com', 'instapundit.com', 'blogsforbush.com', 'talkingpointsmemo.com']
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-7"&gt;
&lt;h3&gt;2.3 Question 7&lt;/h3&gt;
&lt;p&gt;Apply the HITS Algorithm to the network to find the hub and authority scores of node 'realclearpolitics.com'.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your result should return a tuple of floats `(hub_score, authority_score)`.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_10fe363ca3c549b8a5d5813c11928292-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;HUBS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AUTHORITIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blogs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ec7c03e549b14fbca1cd779565bf7fbe-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_seven&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_ec7c03e549b14fbca1cd779565bf7fbe-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""HITS score for realclearpolitics.com"""&lt;/span&gt;
&lt;a name="rest_code_ec7c03e549b14fbca1cd779565bf7fbe-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;HUBS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'realclearpolitics.com'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;AUTHORITIES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'realclearpolitics.com'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e8309f7e26364503b256a092466aab16-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_seven&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
(0.0003243556140916669, 0.003918957645699851)
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-8"&gt;
&lt;h3&gt;2.4 Question 8&lt;/h3&gt;
&lt;p&gt;Apply the HITS Algorithm to this network to find the 5 nodes with highest hub scores.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of the top 5 blogs in desending order of hub scores.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_11067149dae842f29b17437fb702281c-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_eight&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_11067149dae842f29b17437fb702281c-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Top five blogs by hub scores"""&lt;/span&gt;
&lt;a name="rest_code_11067149dae842f29b17437fb702281c-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;top_five&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HUBS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_02f3538824a64a07b7bcb922700ec447-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_eight&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['politicalstrategy.org', 'madkane.com/notable.html', 'liberaloasis.com', 'stagefour.typepad.com/commonprejudice', 'bodyandsoul.typepad.com']
&lt;/pre&gt;
&lt;p&gt;Apply the HITS Algorithm to this network to find the 5 nodes with highest authority scores.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of the top 5 blogs in desending order of authority scores.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f41184eb4baf42deb9450b0c2602b76c-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_nine&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_f41184eb4baf42deb9450b0c2602b76c-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""the top 5 blogs by authorities score"""&lt;/span&gt;
&lt;a name="rest_code_f41184eb4baf42deb9450b0c2602b76c-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;top_five&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AUTHORITIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_888d88e6d054412da2b5c59a1010cda3-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_nine&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['dailykos.com', 'talkingpointsmemo.com', 'atrios.blogspot.com', 'washingtonmonthly.com', 'talkleft.com']
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>centrality</category><category>networks</category><guid>https://necromuralist.github.io/data_science/posts/Measures-of-Centrality/</guid><pubDate>Sun, 01 Oct 2017 00:56:00 GMT</pubDate></item><item><title>Node Importance</title><link>https://necromuralist.github.io/data_science/posts/node-importance/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;1 Introduction&lt;/h2&gt;
&lt;p&gt;When looking at a network one of the things that might be useful is to identify the "important" nodes. Some cases where this would be useful are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;indentifying people who have many connections in a social network&lt;/li&gt;
&lt;li&gt;people who are closest to other members of the network&lt;/li&gt;
&lt;li&gt;weakest links in the network&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b5f8aef86c0740b78e49adeabf10acee-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# from pypi&lt;/span&gt;
&lt;a name="rest_code_b5f8aef86c0740b78e49adeabf10acee-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_29798d8a337f42168094daa3ccb1def4-1"&gt;&lt;/a&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="degree-centrality-undirected"&gt;
&lt;h2&gt;2 Degree Centrality (undirected)&lt;/h2&gt;
&lt;p&gt;Degree centrality starts with the assumption that the person with the most connections (edges) is the most important. Rather than returning a count it is the degree of the node divided by the total possible number of edges that the node could have. For the case of the directed graph the degree of the incoming vertices and outgoing vertices would likely be treated separately.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
Centrality_{degree}(v) = \frac{degree_v}{|N| - 1}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Where &lt;em&gt;N&lt;/em&gt; is the the graph and &lt;em&gt;v&lt;/em&gt; is the vertex (node) that we are measuring.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A &lt;strong&gt;Degree Centrality&lt;/strong&gt; of 1 means the node is directly connected to every other node&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Degree Centrality&lt;/strong&gt; of 0 means the node isn't connected to any other node in the network&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6527b8458713431886d144b847cce64d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_6527b8458713431886d144b847cce64d-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"AAABDE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6527b8458713431886d144b847cce64d-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"BCEEEF"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6527b8458713431886d144b847cce64d-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;edges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_6527b8458713431886d144b847cce64d-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6527b8458713431886d144b847cce64d-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="node_importance_graph.png" src="https://necromuralist.github.io/data_science/posts/node-importance/node_importance_graph.png"&gt;
&lt;p&gt;In this graph there are six nodes so each node can have at most 5 links. &lt;tt class="docutils literal"&gt;E&lt;/tt&gt; has 4 so the degree centrality should be 4/5.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_282f3bdf131e4920b0f67b0016282e3b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;degree_centrality&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degree_centrality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_282f3bdf131e4920b0f67b0016282e3b-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;degree_centrality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_282f3bdf131e4920b0f67b0016282e3b-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;degree_centrality&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;5&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'B': 0.4, 'E': 0.8, 'A': 0.6000000000000001, 'C': 0.2, 'D': 0.2, 'F': 0.2}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="closeness-centrality"&gt;
&lt;h2&gt;3 Closeness Centrality&lt;/h2&gt;
&lt;p&gt;This measure assumes that the node that is closest to all the other nodes is the most important. It is the ratio of the highest possible degree for the node to the sum of the shortest paths to the other nodes.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
Centrality_{closeness}(v) = \frac{|N| - 1}{\textit{sum of shortest paths of v}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Looking at &lt;tt class="docutils literal"&gt;E&lt;/tt&gt; again, you can see that the sum of its shortest paths is 6 so the &lt;strong&gt;closeness centrality&lt;/strong&gt; should be 5/6.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ca91b795007b402eae2ec376a7a5717d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;closeness_centrality&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closeness_centrality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ca91b795007b402eae2ec376a7a5717d-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closeness_centrality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ca91b795007b402eae2ec376a7a5717d-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;closeness_centrality&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'B': 0.625, 'E': 0.8333333333333334, 'A': 0.7142857142857143, 'C': 0.45454545454545453, 'D': 0.5, 'F': 0.5}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>networks centrality</category><guid>https://necromuralist.github.io/data_science/posts/node-importance/</guid><pubDate>Sun, 01 Oct 2017 00:23:00 GMT</pubDate></item><item><title>Connected Components</title><link>https://necromuralist.github.io/data_science/posts/connected-components/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# pypi&lt;/span&gt;
&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt;
&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-3"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;DiGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b7fd5ce0390c4a859ba875481259e04b-7"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2ea9a441d13c4bb8aefc75548a151a82-1"&gt;&lt;/a&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/pre&gt;&lt;div class="section" id="undirected-graphs"&gt;
&lt;h2&gt;1 Undirected Graphs&lt;/h2&gt;
&lt;div class="section" id="connected-graphs"&gt;
&lt;h3&gt;1.1 Connected Graphs&lt;/h3&gt;
&lt;p&gt;An unconnected graph is &lt;cite&gt;connected&lt;/cite&gt; if every pair of nodes has a path between them.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2fa9bc7c016441c9941156de9db92565-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"AAAAABBCDFFFGGGHIJKKKLLLN"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_2fa9bc7c016441c9941156de9db92565-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"BECGNCDDEGIJHIJIJOLMOMNOO"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_2fa9bc7c016441c9941156de9db92565-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;undirected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_2fa9bc7c016441c9941156de9db92565-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_2fa9bc7c016441c9941156de9db92565-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="connected_example.png" src="https://necromuralist.github.io/data_science/posts/connected-components/connected_example.png"&gt;
&lt;p&gt;Is this graph connected? It looks like it, since every node has an edge to it.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_cd90a0c80af94e87b769341b7f4a7fd7-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_connected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
True
&lt;/pre&gt;
&lt;p&gt;To make this graph unconnected you need to remove some edges that connect sub-graphs.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_71861381de644bc89ab308303e2fd694-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_71861381de644bc89ab308303e2fd694-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="unconnected.png" src="https://necromuralist.github.io/data_science/posts/connected-components/unconnected.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_bcc75cd992e24e5081a7346a61d49172-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_connected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
False
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="connected-components"&gt;
&lt;h3&gt;1.2 Connected Components&lt;/h3&gt;
&lt;p&gt;A connected component is a subset of nodes where:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Every node in the subset has a path to every other node&lt;/li&gt;
&lt;li&gt;No node outside the subset has a path to a node in the subset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's break the graph a little more.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3d09e64ff51442469f258db5b5350974-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"J"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"O"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3d09e64ff51442469f258db5b5350974-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="unconnected_2.png" src="https://necromuralist.github.io/data_science/posts/connected-components/unconnected_2.png"&gt;
&lt;p&gt;We now have three connected components.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_24cbaa44396c4395819eedce1473d5e4-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;number_connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
3
&lt;/pre&gt;
&lt;p&gt;Which we can inspect.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8d680aff23f348ef99321ec56169958a-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_8d680aff23f348ef99321ec56169958a-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'J', 'I', 'G', 'H', 'F'}
{'N', 'M', 'O', 'K', 'L'}
{'D', 'B', 'C', 'E', 'A'}
&lt;/pre&gt;
&lt;p&gt;We can also pick out a node from one of the components and get the sub-set.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e1f014d74829467b86b359a84dc8bfb9-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;node_connected_component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'B', 'D', 'C', 'A', 'E'}
&lt;/pre&gt;
&lt;p&gt;Which you can see is the third connected component in the example above.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="directed-graphs"&gt;
&lt;h2&gt;2 Directed Graphs&lt;/h2&gt;
&lt;p&gt;Directed graphs have similar ideas with regard to connectivity when compared to undirected graphs, but with a &lt;strong&gt;strong&lt;/strong&gt; and &lt;strong&gt;weak&lt;/strong&gt; version for each.&lt;/p&gt;
&lt;div class="section" id="strongly-connected"&gt;
&lt;h3&gt;2.1 Strongly Connected&lt;/h3&gt;
&lt;p&gt;A &lt;em&gt;strongly connected&lt;/em&gt; graph is a directed graph where for every pair of nodes there is a directed path in both directions.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e2127f74e9774a35b0a2b1a7f28c719d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"AABCDD"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_e2127f74e9774a35b0a2b1a7f28c719d-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"BDDBCA"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_e2127f74e9774a35b0a2b1a7f28c719d-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_e2127f74e9774a35b0a2b1a7f28c719d-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiGraph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_e2127f74e9774a35b0a2b1a7f28c719d-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_e2127f74e9774a35b0a2b1a7f28c719d-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="directed_graph.png" src="https://necromuralist.github.io/data_science/posts/connected-components/directed_graph.png"&gt;
&lt;p&gt;For some reason &lt;tt class="docutils literal"&gt;networkx&lt;/tt&gt; uses boxes instead of arrow-heads, but hopefully you get the idea.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_d44b07bd912c44ed814ff4c46b6c9cf4-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_strongly_connected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
True
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="weakly-connected"&gt;
&lt;h3&gt;2.2 Weakly Connected&lt;/h3&gt;
&lt;p&gt;A directed graph is &lt;em&gt;weakly connected&lt;/em&gt; if, when all the edges are replaced by undirected edges
(converting it to an undirected graph) then the graph is &lt;em&gt;connected&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5c74aecdc1144766b9c2cde4105f076f-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5c74aecdc1144766b9c2cde4105f076f-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_strongly_connected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_5c74aecdc1144766b9c2cde4105f076f-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_weakly_connected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
False
True
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c0414a5707a24f44a31c0f5d146aadbe-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="directed_weak.png" src="https://necromuralist.github.io/data_science/posts/connected-components/directed_weak.png"&gt;
&lt;p&gt;Our new graph isn't &lt;em&gt;strongly connected&lt;/em&gt; because there's no path from B to A (or B to C, etc.). But it is &lt;em&gt;weakly connected&lt;/em&gt; since removing the directions just makes it a loop.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="strongly-connected-component"&gt;
&lt;h3&gt;2.3 Strongly Connected Component&lt;/h3&gt;
&lt;p&gt;This is a subset of nodes in a directed graph where:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Every node in the subset has a directed path to every other node&lt;/li&gt;
&lt;li&gt;No node outside the subset has a directed path to and from every node in the subset&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c4d3db650d4b43b98f500534847e2aae-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ADDDEFFFFGGH"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c4d3db650d4b43b98f500534847e2aae-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"HBFGGABGHHCE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c4d3db650d4b43b98f500534847e2aae-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiGraph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_c4d3db650d4b43b98f500534847e2aae-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_c4d3db650d4b43b98f500534847e2aae-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="directed_2.png" src="https://necromuralist.github.io/data_science/posts/connected-components/directed_2.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3fab93553a9648a988bb9c9943a94d96-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_strongly_connected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
False
&lt;/pre&gt;
&lt;p&gt;You can see that the graph is not strongly connected (there's no path to E, for instance) but is there a strongly connected component within it?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_27b12732295244ad9ce1e6c7e7a6f0f1-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strongly_connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_27b12732295244ad9ce1e6c7e7a6f0f1-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'C'}
{'H', 'G', 'E'}
{'A'}
{'B'}
{'F'}
{'D'}
&lt;/pre&gt;
&lt;p&gt;In this case H, G, and E are a strongly connected component (as are each of the other individual nodes). What if we add a path from B to D?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6e158d6fd4fd443bbb835571ae872fc5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6e158d6fd4fd443bbb835571ae872fc5-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="directed_3.png" src="https://necromuralist.github.io/data_science/posts/connected-components/directed_3.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2d1c520264b94b348129908ad808b242-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strongly_connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_2d1c520264b94b348129908ad808b242-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'C'}
{'H', 'G', 'E'}
{'A'}
{'B', 'F', 'D'}
&lt;/pre&gt;
&lt;p&gt;Now there are two interesting strongly connected components and two not so interesting ones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="weakly-connected-components"&gt;
&lt;h3&gt;2.4 Weakly Connected Components&lt;/h3&gt;
&lt;p&gt;A &lt;em&gt;weakly connected component&lt;/em&gt; is one where a directed graph is converted into an undirected graph and the sub-set of nodes is a connected component.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_9ec1a7ab4e154f0391736db515435937-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"F"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"F"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"H"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"F"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_9ec1a7ab4e154f0391736db515435937-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_9ec1a7ab4e154f0391736db515435937-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="weakly_connected_component.png" src="https://necromuralist.github.io/data_science/posts/connected-components/weakly_connected_component.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_7de4414f1511463ea61700bd4e8ecbae-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strongly_connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_7de4414f1511463ea61700bd4e8ecbae-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'C'}
{'E'}
{'H'}
{'A'}
{'B'}
{'F'}
{'D'}
{'G'}
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_7a80be05186642f2b5603f1ff4a0f511-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;undirected_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_undirected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_7a80be05186642f2b5603f1ff4a0f511-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="undirected_weak.png" src="https://necromuralist.github.io/data_science/posts/connected-components/undirected_weak.png"&gt;
&lt;p&gt;Looking at the converted graph you can see that there are two connected components.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_716d01836301450f831b80dfc1417770-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undirected_2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_716d01836301450f831b80dfc1417770-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'A', 'H', 'G', 'C', 'E'}
{'D', 'B', 'F'}
&lt;/pre&gt;
&lt;p&gt;An important thing to note is that A and C are part of their connected component, even though visually they look like they're dangling out there.&lt;/p&gt;
&lt;p&gt;You can also skip the conversion and let network x do it for you.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_17dddd5dc54b411491bbc42dbabfd3ce-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weakly_connected_components&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directed_2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_17dddd5dc54b411491bbc42dbabfd3ce-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'G', 'C', 'H', 'E', 'A'}
{'B', 'F', 'D'}
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>networks</category><guid>https://necromuralist.github.io/data_science/posts/connected-components/</guid><pubDate>Sun, 24 Sep 2017 22:44:00 GMT</pubDate></item><item><title>Distance in Social Networks</title><link>https://necromuralist.github.io/data_science/posts/distance-in-social-networks/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;1 Introduction&lt;/h2&gt;
&lt;p&gt;When characterizing a graph one of the things to look at is how far apart the nodes are.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_d21ee2832b9b4c0a9ac6a707fe81829e-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# from pypi&lt;/span&gt;
&lt;a name="rest_code_d21ee2832b9b4c0a9ac6a707fe81829e-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This will be the example network.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a9c9b21ca6f64d028bc6b99c5497c014-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"AAKBCCFEDEIE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a9c9b21ca6f64d028bc6b99c5497c014-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"KBBCFEGFEIJH"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a9c9b21ca6f64d028bc6b99c5497c014-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_a9c9b21ca6f64d028bc6b99c5497c014-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_a9c9b21ca6f64d028bc6b99c5497c014-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="distance_example.png" src="https://necromuralist.github.io/data_science/posts/distance-in-social-networks/distance_example.png"&gt;
&lt;/div&gt;
&lt;div class="section" id="defining-distance"&gt;
&lt;h2&gt;2 Defining Distance&lt;/h2&gt;
&lt;p&gt;This section will look at how we can measure the distance between nodes.&lt;/p&gt;
&lt;div class="section" id="paths"&gt;
&lt;h3&gt;2.1 Paths&lt;/h3&gt;
&lt;p&gt;A path is a sequence of nodes connected by edges. One path from D to K might be D-E-C-B-K.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_352ae469e02b4ed1b811e60fabcaa160-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DECB'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_352ae469e02b4ed1b811e60fabcaa160-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ECBK"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_352ae469e02b4ed1b811e60fabcaa160-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_352ae469e02b4ed1b811e60fabcaa160-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_352ae469e02b4ed1b811e60fabcaa160-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="example_path.png" src="https://necromuralist.github.io/data_science/posts/distance-in-social-networks/example_path.png"&gt;
&lt;/div&gt;
&lt;div class="section" id="distance"&gt;
&lt;h3&gt;2.2 Distance&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The &lt;em&gt;length&lt;/em&gt; of a &lt;em&gt;path&lt;/em&gt; is the number of edges in it.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;distance&lt;/em&gt; between two nodes is the length of the &lt;em&gt;shortest&lt;/em&gt; path between them.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_acbd8c5cc4b043319d08e31c751cc241-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;dk_shortest_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shortest_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"K"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_acbd8c5cc4b043319d08e31c751cc241-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dk_shortest_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['D', 'E', 'C', 'B', 'K']
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_620396f3cf9f429182450fe0a68234f9-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shortest_path_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"K"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_620396f3cf9f429182450fe0a68234f9-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_620396f3cf9f429182450fe0a68234f9-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dk_shortest_path&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="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shortest_path_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"K"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
4
&lt;/pre&gt;
&lt;p&gt;As you can see the path we saw earlier is the shortest path and the distance from D to K is 4.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="breadth-first-search"&gt;
&lt;h3&gt;2.3 Breadth-First Search&lt;/h3&gt;
&lt;p&gt;One way to compute the distances from one node to all the other nodes is to create a tree using Breadth-First-search. Breadth-First search will eliminate any cycles and leave us with the shortest paths to each node.&lt;/p&gt;
&lt;p&gt;This is the tree created for the node A.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_1776321c81854d9f8e2166cd58b30dac-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bfs_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_1776321c81854d9f8e2166cd58b30dac-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nx_agraph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graphviz_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dot"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_1776321c81854d9f8e2166cd58b30dac-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="example_bfs.png" src="https://necromuralist.github.io/data_science/posts/distance-in-social-networks/example_bfs.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b1735355cd6b42d399da6dfefb4c2c2b-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shortest_path_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'J': 5, 'D': 4, 'H': 4, 'F': 3, 'K': 1, 'A': 0, 'B': 1, 'C': 2, 'E': 3, 'G': 4, 'I': 4}
&lt;/pre&gt;
&lt;p&gt;Looking at the shortest path-lengths to &lt;em&gt;A&lt;/em&gt;, you can see that &lt;em&gt;J&lt;/em&gt; is is the furthest away, with 5 edges separating them, while &lt;em&gt;B&lt;/em&gt; and &lt;em&gt;K&lt;/em&gt; are the closest with only 1 hop.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="graph-distance"&gt;
&lt;h2&gt;3 Graph Distance&lt;/h2&gt;
&lt;p&gt;This looks at how you can answer questions about the graph as a whole.&lt;/p&gt;
&lt;div class="section" id="average-distance"&gt;
&lt;h3&gt;3.1 Average Distance&lt;/h3&gt;
&lt;p&gt;One measure is the average of the distances between ever pair of nodes.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a4edfabca0bc40eb950c6f83ab29d491-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;average_shortest_path_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
2.5272727272727273
&lt;/pre&gt;
&lt;p&gt;The average distance for our example is around two and a half edges.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="diameter"&gt;
&lt;h3&gt;3.2 Diameter&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;diameter&lt;/em&gt; of a graph is the maximum distance between any of the pairs of nodes. Note that &lt;em&gt;distance&lt;/em&gt; is always the shortest path between nodes, so this isn't the longest path in the graph.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_7972d484608a4c1495eff1f3425bcefa-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
5
&lt;/pre&gt;
&lt;p&gt;The greatest distance is 5 hops in our example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="eccentricity"&gt;
&lt;h3&gt;3.3 Eccentricity&lt;/h3&gt;
&lt;p&gt;This is the largest distance between a node and all the other nodes.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_7b0063d35849427b98beeaa00ef865d2-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eccentricity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{'J': 5, 'D': 4, 'H': 4, 'F': 3, 'K': 5, 'A': 5, 'B': 4, 'C': 3, 'E': 3, 'G': 4, 'I': 4}
&lt;/pre&gt;
&lt;p&gt;Looking at the output we can see that A, J, and K all have eccentricities matching the diameter. According to &lt;a class="reference external" href="http://www.etymonline.com/index.php?term=eccentric&amp;amp;allowed_in_frame=0"&gt;the Online Etymology Dictionary&lt;/a&gt;, &lt;em&gt;eccentric&lt;/em&gt; means an orbiting object that doesn't have the earth at the center of its orbit. More literally, it means out of center (or off center).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="radius"&gt;
&lt;h3&gt;3.4 Radius&lt;/h3&gt;
&lt;p&gt;The radius is the minimum eccentricity in a graph.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f3ccce521ef94525b8bb4c411357dadc-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
3
&lt;/pre&gt;
&lt;p&gt;So the &lt;em&gt;radius&lt;/em&gt; is the smallest of the largest distances for all the nodes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="periphery"&gt;
&lt;h3&gt;3.5 Periphery&lt;/h3&gt;
&lt;p&gt;This is the set of nodes whose &lt;em&gt;eccentricity&lt;/em&gt; is equal to the &lt;em&gt;diameter&lt;/em&gt; (5 in our case).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3bd2b407a2e9447f8a2c7aef480d3139-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;periphery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['J', 'K', 'A']
&lt;/pre&gt;
&lt;p&gt;Looking at the output and the graph, the diameter of the graph is the distance from A to J or K to J.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="center"&gt;
&lt;h3&gt;3.6 Center&lt;/h3&gt;
&lt;p&gt;This is the set of nodes whose &lt;em&gt;eccentricity&lt;/em&gt; is equal to the &lt;em&gt;radius&lt;/em&gt; of the graph (3 in this example).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_7dbd1561eceb4e64845a0fc85f609be0-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['F', 'C', 'E']
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f980e4590227482da42382c86e9d7cb3-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nx_agraph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graphviz_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dot"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f980e4590227482da42382c86e9d7cb3-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="center.png" src="https://necromuralist.github.io/data_science/posts/distance-in-social-networks/center.png"&gt;
&lt;p&gt;Looking at the graph, you can see that F, C, and, E do in fact form the center triangle.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="karate-club"&gt;
&lt;h2&gt;4 Karate Club&lt;/h2&gt;
&lt;p&gt;This looks at the network created by the relationships between members of a karate club that is on the verge of splitting up. Each node is a member of the club and the edges represent that the incident edges interacted with each other outside of the club (and were thus assumed to be friends). Members who didn't interact with each other outside of the club aren't represented in the data set.&lt;/p&gt;
&lt;p&gt;The instructor wanted to raise fees while the officers didn't. Eventually the instructor was fired and his supporters left with him.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_37492b5da63045ffa92c6a0a035300b1-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;karate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;karate_club_graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_37492b5da63045ffa92c6a0a035300b1-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="karate.png" src="https://necromuralist.github.io/data_science/posts/distance-in-social-networks/karate.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b2579a8461114a03859bd23be4cecbbc-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="karate_circle.png" src="https://necromuralist.github.io/data_science/posts/distance-in-social-networks/karate_circle.png"&gt;
&lt;p&gt;You can see that there are some central characters in the club, notably 0, 32, and 33.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_abfdab2f98fb4fe7a0e43eb5476c6290-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;degrees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&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;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_abfdab2f98fb4fe7a0e43eb5476c6290-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;degrees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;degree&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;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;degree&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;degrees&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;degree&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_abfdab2f98fb4fe7a0e43eb5476c6290-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Node&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;Degree"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_abfdab2f98fb4fe7a0e43eb5476c6290-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;degree&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;degrees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_abfdab2f98fb4fe7a0e43eb5476c6290-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;{}"&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;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="40%"&gt;
&lt;col width="60%"&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Node&lt;/th&gt;
&lt;th class="head"&gt;Degree&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The cut-off of 10 degrees was somewhat arbitrary, there are two nodes with degrees 9 and 10 respectively, but you can see that these three nodes were the most connected members of the club.&lt;/p&gt;
&lt;div class="section" id="what-is-the-average-distance"&gt;
&lt;h3&gt;4.1 What is the average distance?&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_eb5ad43c4eb14cfdbd8a4d163ec2f9a4-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;average_shortest_path_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
2.4
&lt;/pre&gt;
&lt;p&gt;The path lengths are relatively short, on average.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h3&gt;4.2 Diameter&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f6614dc57fce48fe939b5172bbb4c2e9-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
5
&lt;/pre&gt;
&lt;p&gt;The maximum distance is 5.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h3&gt;4.3 Eccentricity&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_303d97d22056494cb3c52c831380f887-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eccentricity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
{0: 3, 1: 3, 2: 3, 3: 3, 4: 4, 5: 4, 6: 4, 7: 4, 8: 3, 9: 4, 10: 4, 11: 4, 12: 4, 13: 3, 14: 5, 15: 5, 16: 5, 17: 4, 18: 5, 19: 3, 20: 5, 21: 4, 22: 5, 23: 5, 24: 4, 25: 4, 26: 5, 27: 4, 28: 4, 29: 5, 30: 4, 31: 3, 32: 4, 33: 4}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h3&gt;4.4 Radius&lt;/h3&gt;
&lt;p&gt;What is the smallest eccentricity?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b8fcb077a87c4eef9e9e0d9434836f9c-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
3
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h3&gt;4.5 Periphery&lt;/h3&gt;
&lt;p&gt;Which nodes are furthest apart?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f7b2a6ee38224dc9a454930fdc33d844-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;periphery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
[14, 15, 16, 18, 20, 22, 23, 26, 29]
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h3&gt;4.6 Center&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4e719a7eb8a34e0e9125c3eb09585064-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
[0, 1, 2, 3, 8, 13, 19, 31]
&lt;/pre&gt;
&lt;p&gt;The center nodes are most likely the ones that kept information flowing between the two factions (although node 0 is in here as well).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>networks</category><guid>https://necromuralist.github.io/data_science/posts/distance-in-social-networks/</guid><pubDate>Sun, 24 Sep 2017 19:49:00 GMT</pubDate></item><item><title>Triadic Closure (Clustering)</title><link>https://necromuralist.github.io/data_science/posts/triadic-closure/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Triadic Closure&lt;/strong&gt; is a measure of the tendency of edges in a graph to form triangles. It's a measure of the degree to which nodes in a graph tend to cluster together (&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Clustering_coefficient"&gt;wikipedia on clustering coefficents&lt;/a&gt;).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8f44b6e80ac34463a93e449c8818dbda-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# python standard library&lt;/span&gt;
&lt;a name="rest_code_8f44b6e80ac34463a93e449c8818dbda-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;fractions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Fraction&lt;/span&gt;
&lt;a name="rest_code_8f44b6e80ac34463a93e449c8818dbda-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_8f44b6e80ac34463a93e449c8818dbda-4"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# pypi&lt;/span&gt;
&lt;a name="rest_code_8f44b6e80ac34463a93e449c8818dbda-5"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt;
&lt;a name="rest_code_8f44b6e80ac34463a93e449c8818dbda-6"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_12e3495cfce04725b8873559698c290b-1"&gt;&lt;/a&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;a name="rest_code_12e3495cfce04725b8873559698c290b-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;seaborn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"whitegrid"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ecb5cf9996ea4fd5a0b3aa2b7b075521-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;sample_graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_ecb5cf9996ea4fd5a0b3aa2b7b075521-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;sample_graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&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;2&lt;/span&gt;&lt;span class="p"&gt;),&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;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_ecb5cf9996ea4fd5a0b3aa2b7b075521-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_spring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="triadic_closure.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/triadic_closure.png"&gt;
&lt;p&gt;In this case we might say that the likelihood that the next edge will be between 1 and 4 or 1 and 5 is greater than the likelihood that it will form between 4 and 5 or 2 and 5.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="local-clustering-coefficient"&gt;
&lt;h2&gt;2 Local Clustering Coefficient&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Local Clustering Coefficient&lt;/strong&gt; is a measure of clustering for a single node. It is the number of pairs of a node's friends that are themselves friends divided by the total number of pairs of a node's friends. This can be interpreted as measuring how close the node's neighbors are to being a complete graph (&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Clustering_coefficient#Local_clustering_coefficient"&gt;wikipedia&lt;/a&gt;).&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
LCC = \frac{\textit{number of pairs of a node's friends that are friends (PTAF)}}{\textit{number of pairs of the node's friends (POF)}}
\end{equation*}
&lt;/div&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"K"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-3"&gt;&lt;/a&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"K"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-4"&gt;&lt;/a&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"F"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-5"&gt;&lt;/a&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-6"&gt;&lt;/a&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"F"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"E"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"H"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-7"&gt;&lt;/a&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"F"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-8"&gt;&lt;/a&gt;                      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"I"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"J"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-10"&gt;&lt;/a&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-11"&gt;&lt;/a&gt;                      &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;ggcode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;ipython&lt;/span&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-12"&gt;&lt;/a&gt;
&lt;a name="rest_code_d1651c7ea12d472f902b6498bb3d4a06-13"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_spring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="triadic_example.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/triadic_example.png"&gt;
&lt;p&gt;The number of pairs of friends can be calculated from the degree of the node.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
POF = \frac{d(d-1)}{2}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Looking at node C, it has degree four so the number of pairs of friends it has is &lt;span class="math"&gt;\(\frac{4(3)}{2} = 6\)&lt;/span&gt;. Looking at the graph you can see that there are two edges between the nodes connected to it - (A,B) and (E, F), so the clustering coefficient for node C is &lt;span class="math"&gt;\(\frac{PTAF}{POF}=\frac{2}{6}\)&lt;/span&gt; which reduces to 1/3. We can double check this with networkx.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f97a8214089d44a09b3f5bde030c1497-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustering&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.3333333333333333
&lt;/pre&gt;
&lt;p&gt;If you don't pass in the node label to &lt;tt class="docutils literal"&gt;networkx.clustering&lt;/tt&gt; the function will return a dictionary with all the clustering coefficients, which might be useful if you need to make multiple queries and have a large graph.&lt;/p&gt;
&lt;div class="section" id="one-friend"&gt;
&lt;h3&gt;2.1 One Friend&lt;/h3&gt;
&lt;p&gt;If you look at nodes I and J, they don't have any pairs of friends, just one friend each. This puts a zero in the denominator of the clustering coefficient, making it undefined, but to make it mathematically useful it is given a 0 instead.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_aa1535770c0c4647bf2ff15930a7bfef-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustering&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"I"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.0
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="the-whole-network"&gt;
&lt;h2&gt;3 The Whole Network&lt;/h2&gt;
&lt;p&gt;There's two ways to calculate a clustering coefficient for the entire network. One is to take the average of all the local clustering coefficients, the other is to calculate the percentage of open triads (three nodes connected by two edges) that are triangles.&lt;/p&gt;
&lt;div class="section" id="averaging"&gt;
&lt;h3&gt;3.1 Averaging&lt;/h3&gt;
&lt;p&gt;This is what wikipedia calls the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Clustering_coefficient#Network_average_clustering_coefficient"&gt;network average clustering coefficient&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f17eb6489ebe4c13907636c12df0b7c3-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;coefficients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustering&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f17eb6489ebe4c13907636c12df0b7c3-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;average&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coefficients&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="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coefficients&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f17eb6489ebe4c13907636c12df0b7c3-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;average&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f17eb6489ebe4c13907636c12df0b7c3-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;average_clustering&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.28787878787878785
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="transitivity"&gt;
&lt;h3&gt;3.2 Transitivity&lt;/h3&gt;
&lt;p&gt;This is also called the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Clustering_coefficient#Global_clustering_coefficient"&gt;global clustering coefficient&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;triangle&lt;/em&gt; is a set of three nodes with three edges connecting them.  An &lt;em&gt;open triad&lt;/em&gt; is a set of three nodes with only two edges connecting them. Each triangle has three open triads embedded in it. &lt;em&gt;Transivity&lt;/em&gt; is a measure of the percentage of open triads that are triangles.&lt;/p&gt;
&lt;p&gt;This triangle:&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_dbccde1a43154bbd8b3b7efe5671df5f-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;triangle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_dbccde1a43154bbd8b3b7efe5671df5f-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;triangle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_dbccde1a43154bbd8b3b7efe5671df5f-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_dbccde1a43154bbd8b3b7efe5671df5f-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_spring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triangle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="tc_one.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/tc_one.png"&gt;
&lt;p&gt;Contains these open triads.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_1e7b13817bfe429f8b266836359df434-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_1e7b13817bfe429f8b266836359df434-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_1e7b13817bfe429f8b266836359df434-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="tc_a.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/tc_a.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c557edaeb7374b639d816181d9930deb-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;two&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_c557edaeb7374b639d816181d9930deb-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;two&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_c557edaeb7374b639d816181d9930deb-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;two&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="tc_b.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/tc_b.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_313edec5827949bc8fd4b9d4e415bc4e-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;three&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_313edec5827949bc8fd4b9d4e415bc4e-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;three&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_313edec5827949bc8fd4b9d4e415bc4e-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;three&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;a name="rest_code_313edec5827949bc8fd4b9d4e415bc4e-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;three&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="tc_c.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/tc_c.png"&gt;
&lt;p&gt;So the transitivity is three times the count of triangles in the graph divided by all the open triads in the graph.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
transitivity = \frac{3 \times \|\textit{triangles}\|}{\|\textit{open triads}\|}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Looking at our earlier example you can see that there are three triangles and thirteen open triads (to be honest I only found 10).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c8c5c859be384511acd732d2c42f316c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_spring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="triadic_example.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/triadic_example.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2e0eb9b26a2a4f9ca334c701ef2a7681-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;transitivity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&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="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_2e0eb9b26a2a4f9ca334c701ef2a7681-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transitivity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_2e0eb9b26a2a4f9ca334c701ef2a7681-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;transitivity&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transitivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.4090909090909091
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="comparing-averaging-and-transitivity"&gt;
&lt;h2&gt;4 Comparing Averaging and Transitivity&lt;/h2&gt;
&lt;div class="section" id="one-high-degree-node"&gt;
&lt;h3&gt;4.1 One High Degree Node&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b47b47d136054d86932517e0cdfa86b4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;high_lcc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_b47b47d136054d86932517e0cdfa86b4-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"AABCCDEEFGGH"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_b47b47d136054d86932517e0cdfa86b4-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"BIIDIIFIIHII"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_b47b47d136054d86932517e0cdfa86b4-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;high_lcc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_b47b47d136054d86932517e0cdfa86b4-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_spring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high_lcc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="high_average.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/high_average.png"&gt;
&lt;p&gt;If we look at this graph, the outer nodes all have a clustering coefficient of 1 (each has 1 pair of friends that are friends) while the center node has a coefficient of 1/7, since half the pairs don't have edges between them.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_94f459e94af941e380157a732b81e2c8-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;degree_i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;a name="rest_code_94f459e94af941e380157a732b81e2c8-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;pairs_of_friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_94f459e94af941e380157a732b81e2c8-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;pairs_that_are_friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&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;a name="rest_code_94f459e94af941e380157a732b81e2c8-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;lcc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pairs_that_are_friends&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pairs_of_friends&lt;/span&gt;
&lt;a name="rest_code_94f459e94af941e380157a732b81e2c8-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lcc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
1/7
&lt;/pre&gt;
&lt;p&gt;Since there are so many nodes with a coefficient of 1, the average is high.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_0d4758a181d14f4780e0eeefd7807757-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;average_clustering&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high_lcc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.9047619047619047
&lt;/pre&gt;
&lt;p&gt;But there are many open triads so the transitivity will be low (transitivity weights nodes with large degree higher, but there's only one node with degree greater than 2).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2177fdf7e4934d66a791b10a16917588-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transitivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high_lcc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.3333333333333333
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="many-open-pairs"&gt;
&lt;h3&gt;4.2 Many Open Pairs&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;outer_left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ABDEGHJKMN"&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;inner_left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"PPPPQQQRRS"&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;outer_right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"BCEFHIKLNO"&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;inner_right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"QRSTRSTSTT"&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outer_left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;inner_left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outer_right&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;inner_right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;low_average&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;low_average&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_a36734f99bf4435b9a9b26b0155355e8-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;low_average&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="low_average.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/low_average.png"&gt;
&lt;p&gt;Here the nodes P, Q, R, S, and T are completely connected (it's hard to see) but all the other nodes are open triads so the average will be low, but the transitivity will be high, because each of the P, Q, R, S, and T form triangles. This should be easier to see if they are plotted separately.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_9ca754d18391420eb28134b4c87ee342-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inner_left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_9ca754d18391420eb28134b4c87ee342-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inner_right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_9ca754d18391420eb28134b4c87ee342-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_9ca754d18391420eb28134b4c87ee342-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_9ca754d18391420eb28134b4c87ee342-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="pqrst.png" src="https://necromuralist.github.io/data_science/posts/triadic-closure/pqrst.png"&gt;
&lt;p&gt;Here's the average clustering coefficient (for the complete graph, not the sub-graph I just made).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b1b3ec09d6ba435b81f46b24e5bbaefc-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;average_clustering&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;low_average&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.25
&lt;/pre&gt;
&lt;p&gt;And here's the transitivity.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e417093197b54d0996c161216171cf8a-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;networkx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transitivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;low_average&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0.8571428571428571
&lt;/pre&gt;
&lt;p&gt;So which one is the right metric? I guess it just depends.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>networks</category><guid>https://necromuralist.github.io/data_science/posts/triadic-closure/</guid><pubDate>Sat, 23 Sep 2017 23:48:00 GMT</pubDate></item><item><title>Assignment 2 - Introduction to NLTK</title><link>https://necromuralist.github.io/data_science/posts/assignment-2-introduction-to-nltk/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;p&gt;In part 1 of this assignment you will use nltk to explore the Herman Melville novel Moby Dick. Then in part 2 you will create a spelling recommender function that uses nltk to find words similar to the misspelling.&lt;/p&gt;
&lt;div class="section" id="part-1-analyzing-moby-dick"&gt;
&lt;h2&gt;1 Part 1 - Analyzing Moby Dick&lt;/h2&gt;
&lt;div class="section" id="imports-and-data-set-up"&gt;
&lt;h3&gt;1.1 Imports and Data Set Up&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nltk.probability&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FreqDist&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nltk.stem&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WordNetLemmatizer&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-3"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nltk.tokenize&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sent_tokenize&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-4"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-5"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pyplot&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-6"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;nltk&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-7"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;nltk.data&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-8"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numba&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-9"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-10"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt;
&lt;a name="rest_code_89894ef1e8e44db99e6a71abc511fb2e-11"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b7f4c0b43f974b02bdfb80251635251c-1"&gt;&lt;/a&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;matplotlib&lt;/span&gt; inline
&lt;a name="rest_code_b7f4c0b43f974b02bdfb80251635251c-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;seaborn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"whitegrid"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;If you would like to work with the raw text you can use 'moby_raw'.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_fc1bf0d0ba65473ab7bc1ddd4f303c5f-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'moby.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_fc1bf0d0ba65473ab7bc1ddd4f303c5f-2"&gt;&lt;/a&gt;    &lt;span class="n"&gt;moby_raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;If you would like to work with the novel in &lt;tt class="docutils literal"&gt;nltk.Text&lt;/tt&gt; format you can use 'text1'.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8a7c6d96525247de8a5789ac4c21beb1-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;moby_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_8a7c6d96525247de8a5789ac4c21beb1-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_8a7c6d96525247de8a5789ac4c21beb1-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;moby_series&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="examples"&gt;
&lt;h3&gt;1.2 Examples&lt;/h3&gt;
&lt;div class="section" id="example-1"&gt;
&lt;h4&gt;1.2.1 Example 1&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;How many tokens (words and punctuation symbols) are in text1?&lt;/em&gt; A &lt;strong&gt;token&lt;/strong&gt; is a linguistic unit such as a word, punctuation mark, or alpha-numeric strings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return an integer.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;example_one&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-2"&gt;&lt;/a&gt;     &lt;span class="sd"&gt;"""counts the tokens in moby dick&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     Returns:&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;      int: number of tokens in moby dick&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     """&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-7"&gt;&lt;/a&gt;     &lt;span class="c1"&gt;# or alternatively len(text1)&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-8"&gt;&lt;/a&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;MOBY_TOKEN_COUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;example_one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_6aaee2f640b244a68694abafc51f151b-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Moby Dick has {:,} tokens."&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;a name="rest_code_6aaee2f640b244a68694abafc51f151b-12"&gt;&lt;/a&gt;     &lt;span class="n"&gt;MOBY_TOKEN_COUNT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Moby Dick has 254,989 tokens.
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="example-2"&gt;
&lt;h4&gt;1.2.2 Example 2&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;How many unique tokens (unique words and punctuation) does text1 have?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return an integer.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;example_two&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""counts the unique tokens&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     int: count of unique tokens in Moby Dick&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-7"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# or alternatively len(set(text1))&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-8"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_raw&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;MOBY_UNIQUE_COUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;example_two&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Moby Dick has {:,} unique tokens."&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;a name="rest_code_24b4a0bd376b42e5abad36771a569ae8-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;MOBY_UNIQUE_COUNT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Moby Dick has 20,755 unique tokens.
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="example-3"&gt;
&lt;h4&gt;1.2.3 Example 3&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;After lemmatizing the verbs, how many unique tokens does text1 have?&lt;/em&gt; A &lt;strong&gt;lemma&lt;/strong&gt; is the canonical form. e.g. &lt;em&gt;run&lt;/em&gt; is the lemma for &lt;em&gt;runs&lt;/em&gt;, &lt;em&gt;ran&lt;/em&gt;, &lt;em&gt;running&lt;/em&gt;, and &lt;em&gt;run&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return an integer.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;example_three&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Counts the number of lemma in Moby Dick&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     int: count of unique lemma&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;lemmatizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WordNetLemmatizer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-8"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;lemmatizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lemmatize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'v'&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;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;MOBY_LEMMA_COUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;example_three&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Moby Dick has {:,} lemma (found in WordNet)."&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;a name="rest_code_2e99db9b8c9e40a0b04eccbe8730bae7-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;MOBY_LEMMA_COUNT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Moby Dick has 16,900 lemma (found in WordNet).
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="questions"&gt;
&lt;h3&gt;1.3 Questions&lt;/h3&gt;
&lt;div class="section" id="question-1"&gt;
&lt;h4&gt;1.3.1 Question 1&lt;/h4&gt;
&lt;p&gt;What is the lexical diversity of the given text input? (i.e. ratio of unique tokens to the total number of tokens)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a float.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-1"&gt;&lt;/a&gt;&lt;span class="nd"&gt;@jit&lt;/span&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lexical_diversity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-3"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Calculates the lexical diversity of a list of tokens&lt;/span&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-4"&gt;&lt;/a&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     float: fraction of tokens that are unique&lt;/span&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_953cde7382604334989394a6f6e16c30-8"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Calculates the lexical diversity of Moby Dick&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     float: fraction of tokens that are unique&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lexical_diversity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_ab92a780f9d84c159f79f1e2f1f88280-10"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Lexical Diversity of Moby Dick: {:.2f}"&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;output&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Lexical Diversity of Moby Dick: 0.08
&lt;/pre&gt;
&lt;p&gt;About 8 percent of the tokens in Moby Dick are unique.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="question-2"&gt;
&lt;h4&gt;1.3.2 Question 2&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;What percentage of tokens is 'whale'or 'Whale'?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a float.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e61e89938fd14f8198d33a2144ecd3b0-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;moby_frequencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FreqDist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_two&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""calculates percentage of tokens that are 'whale'&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     float: percentage of entries that are whales&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;whales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;moby_frequencies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"whale"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;moby_frequencies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Whale"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-8"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;whales&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MOBY_TOKEN_COUNT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;whale_fraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_two&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_91e336210b6b4631be5378580c2dd24e-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Percentage of tokens that are whales: {:.2f} %"&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;whale_fraction&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Percentage of tokens that are whales: 0.41 %
&lt;/pre&gt;
&lt;p&gt;Around 1 percent of the tokens are 'whale'.&lt;/p&gt;
&lt;p&gt;I originally made two mistakes with this question, I was returning a fraction, not a percentage, and I was using a regular expression &lt;em&gt;'([Ww]hale)'&lt;/em&gt; which I later realized would match &lt;em&gt;whales&lt;/em&gt;, &lt;em&gt;whaler&lt;/em&gt;, and other variants.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
782
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-3"&gt;
&lt;h4&gt;1.3.3 Question 3&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;What are the 20 most frequently occurring (unique) tokens in the text? What is their frequency?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of 20 tuples where each tuple is of the form `(token, frequency)`. The list should be sorted in descending order of frequency.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""finds 20 most requently occuring tokens&lt;/span&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list: (token, frequency) for top 20 tokens&lt;/span&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;moby_frequencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_8df9215976e04d879757587fccbb2313-9"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
[(',', 19204), ('the', 13715), ('.', 7308), ('of', 6513), ('and', 6010), ('a', 4545), ('to', 4515), (';', 4173), ('in', 3908), ('that', 2978), ('his', 2459), ('it', 2196), ('I', 2097), ('!', 1767), ('is', 1722), ('--', 1713), ('with', 1659), ('he', 1658), ('was', 1639), ('as', 1620)]
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-4"&gt;
&lt;h4&gt;1.3.4 Question 4&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;What tokens have a length of greater than 5 and frequency of more than 150?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a sorted list of the tokens that match the above constraints. To sort your list, use `sorted()`&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_98a78f817e9c414fa18cc8d2a116db65-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;moby_frequencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_98a78f817e9c414fa18cc8d2a116db65-2"&gt;&lt;/a&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="s2"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"frequency"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets tokens with length &amp;gt; 5, frequency &amp;gt; 150"""&lt;/span&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-4"&gt;&lt;/a&gt;                                  &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_338a2db467c341a2bc74d8e2ae540352-8"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['Captain', 'Pequod', 'Queequeg', 'Starbuck', 'almost', 'before', 'himself', 'little', 'seemed', 'should', 'though', 'through', 'whales', 'without']
&lt;/pre&gt;
&lt;p&gt;I was originally returning the data frame, not just the sorted tokens, which was of course marked wrong.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="question-5"&gt;
&lt;h4&gt;1.3.5 Question 5&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Find the longest word in text1 and that word's length.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a tuple `(longest_word, length)`.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""finds the longest word and its length&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Return:&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     tuple: (longest-word, length)&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;longest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extractall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"(?P&amp;lt;long&amp;gt;.{{{}}})"&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;length&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;longest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;long&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-10"&gt;&lt;/a&gt;
&lt;a name="rest_code_d017350420344667a85421aa61dbbafd-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
("twelve-o'clock-at-night", 23)
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-6"&gt;
&lt;h4&gt;1.3.6 Question 6&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;What unique words have a frequency of more than 2000? What is their frequency?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hint:  you may want to use `isalpha()` to check if the token is a word and not punctuation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of tuples of the form `(frequency, word)` sorted in descending order of frequency.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_38a29af671314fada3d66cc440160e84-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;moby_words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;moby_frequency_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_six&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Finds words wih frequency &amp;gt; 2000&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list: frequency, word tuples&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;moby_words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;moby_words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-8"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_8444bc1b9d87461ea7fdf9ec0104a996-10"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_six&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
[(13715, 'the'), (6513, 'of'), (6010, 'and'), (4545, 'a'), (4515, 'to'), (3908, 'in'), (2978, 'that'), (2459, 'his'), (2196, 'it'), (2097, 'I')]
&lt;/pre&gt;
&lt;p&gt;When I first submitted this I got it wrong because I was returning a list of &lt;tt class="docutils literal"&gt;(word, frequency)&lt;/tt&gt;, not &lt;tt class="docutils literal"&gt;(frequency, word)&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="question-7"&gt;
&lt;h4&gt;1.3.7 Question 7&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;What is the average number of tokens per sentence?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a float.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_seven&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""average number of tokens per sentence"""&lt;/span&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;sentences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sent_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentence&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;sentence&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sentences&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentences&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_seven&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_bea4ac4d7e2f4938a821b71c842c58f4-8"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Average number of tokens per sentence: {:.2f}"&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;output&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Average number of tokens per sentence: 25.88
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-8"&gt;
&lt;h4&gt;1.3.8 Question 8&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;What are the 5 most frequent parts of speech in this text? What is their frequency?&lt;/em&gt; Parts of Speech (POS) are the lexical categories that words belong to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of tuples of the form `(part_of_speech, frequency)` sorted in descending order of frequency.&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_eight&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets the 5 most frequent parts of speech&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list (Tuple): (part of speech, frequency) for top 5&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moby_words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;frequencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FreqDist&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;frequencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-10"&gt;&lt;/a&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-11"&gt;&lt;/a&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_eight&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_19f22d7ad474405481d7131903d135b8-12"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Top 5 parts of speech: {}"&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;output&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Top 5 parts of speech: [('NN', 4016), ('NNP', 2916), ('JJ', 2875), ('NNS', 2452), ('VBD', 1421)]
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="part-2-spelling-recommender"&gt;
&lt;h2&gt;2 Part 2 - Spelling Recommender&lt;/h2&gt;
&lt;p&gt;For this part of the assignment you will create three different spelling recommenders, that each take a list of misspelled words and recommends a correctly spelled word for every word in the list.&lt;/p&gt;
&lt;p&gt;For every misspelled word, the recommender should find find the word in `correct_spellings` that has the shortest distance*, and starts with the same letter as the misspelled word, and return that word as a recommendation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Each of the three different recommenders will use a different distance measure (outlined below)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Each of the recommenders should provide recommendations for the three default words provided: `['cormulent', 'incendenece', 'validrate']`.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c372ab263f1d45578d94796201db0be8-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nltk.corpus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;
&lt;a name="rest_code_c372ab263f1d45578d94796201db0be8-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nltk.metrics.distance&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_c372ab263f1d45578d94796201db0be8-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;edit_distance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_c372ab263f1d45578d94796201db0be8-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;jaccard_distance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_c372ab263f1d45578d94796201db0be8-5"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c372ab263f1d45578d94796201db0be8-6"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;nltk.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ngrams&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_fa927e815f8b40d89b5f7e83114acda8-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;correct_spellings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_fa927e815f8b40d89b5f7e83114acda8-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;spellings_series&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correct_spellings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;div class="section" id="question-9"&gt;
&lt;h3&gt;2.1 Question 9&lt;/h3&gt;
&lt;p&gt;For this recommender, your function should provide recommendations for the three default words provided above using the following distance metric:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Jaccard_index"&gt;Jaccard distance&lt;/a&gt; on the trigrams of the two words.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of length three:&lt;/strong&gt; &lt;tt class="docutils literal"&gt;['cormulent_reccomendation', 'incendenece_reccomendation', 'validrate_reccomendation']&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;jaccard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gram_number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""find the closet words to each entry&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     entries: collection of words to match&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     gram_number: number of n-grams to use&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list: words with the closest jaccard distance to entries&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;outcomes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-12"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-13"&gt;&lt;/a&gt;        &lt;span class="n"&gt;spellings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spellings_series&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;spellings_series&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&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;a name="rest_code_5803e6005d404a1387f7c85c7a047379-14"&gt;&lt;/a&gt;        &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;jaccard_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ngrams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gram_number&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-15"&gt;&lt;/a&gt;                                       &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ngrams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gram_number&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-16"&gt;&lt;/a&gt;                     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;spellings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-17"&gt;&lt;/a&gt;        &lt;span class="n"&gt;closest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5803e6005d404a1387f7c85c7a047379-18"&gt;&lt;/a&gt;        &lt;span class="n"&gt;outcomes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closest&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;a name="rest_code_5803e6005d404a1387f7c85c7a047379-19"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;outcomes&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_51620bbdded141b59e1f6155d4f972af-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_nine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cormulent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'incendenece'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'validrate'&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;a name="rest_code_51620bbdded141b59e1f6155d4f972af-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""finds the closest word based on jaccard distance"""&lt;/span&gt;
&lt;a name="rest_code_51620bbdded141b59e1f6155d4f972af-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jaccard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_51620bbdded141b59e1f6155d4f972af-4"&gt;&lt;/a&gt;
&lt;a name="rest_code_51620bbdded141b59e1f6155d4f972af-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_nine&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['corpulent', 'indecence', 'validate']
&lt;/pre&gt;
&lt;p&gt;I originally got both the Jaccard Distance problems wrong because I was just using the distance, not filtering the candidates by the first letter, which turns out to return fairly dissimilar words.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="question-10"&gt;
&lt;h3&gt;2.2 Question 10&lt;/h3&gt;
&lt;p&gt;For this recommender, your function should provide recommendations for the three default words provided above using the following distance metric:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Jaccard_index"&gt;Jaccard distance&lt;/a&gt; on the 4-grams of the two words.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of length three:&lt;/strong&gt; &lt;tt class="docutils literal"&gt;['cormulent_reccomendation', 'incendenece_reccomendation', 'validrate_reccomendation']&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_ten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cormulent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'incendenece'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'validrate'&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets the neares words using jaccard-distance with 4-grams&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     entries (list): words to find nearest other word for&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list: nearest words found&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jaccard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-11"&gt;&lt;/a&gt;
&lt;a name="rest_code_4073effe606d4bc4a1804ba777d0fea3-12"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_ten&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['cormus', 'incendiary', 'valid']
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-11"&gt;
&lt;h3&gt;2.3 Question 11&lt;/h3&gt;
&lt;p&gt;For this recommender, your function should provide recommendations for the three default words provided above using the following distance metric:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance"&gt;Edit (Levenshtein) distance&lt;/a&gt; on the two words with transpositions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a list of length three:&lt;/strong&gt; &lt;tt class="docutils literal"&gt;['cormulent_reccomendation', 'incendenece_reccomendation', 'validrate_reccomendation']&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_eleven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cormulent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'incendenece'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'validrate'&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets the nearest words based on Levenshtein distance&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     entries (list[str]): words to find closest words to&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list[str]: nearest words to the entries&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;outcomes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-12"&gt;&lt;/a&gt;        &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;edit_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-13"&gt;&lt;/a&gt;                                    &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-14"&gt;&lt;/a&gt;                     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;correct_spellings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-15"&gt;&lt;/a&gt;        &lt;span class="n"&gt;closest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-16"&gt;&lt;/a&gt;        &lt;span class="n"&gt;outcomes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closest&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;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-17"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;outcomes&lt;/span&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-18"&gt;&lt;/a&gt;
&lt;a name="rest_code_838c87d989434e3eb38cdb6bab7f7392-19"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer_eleven&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
['corpulent', 'intendence', 'validate']
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>text nltk nlp</category><guid>https://necromuralist.github.io/data_science/posts/assignment-2-introduction-to-nltk/</guid><pubDate>Sat, 12 Aug 2017 22:02:00 GMT</pubDate></item><item><title>Extracting Dates From Medical Data</title><link>https://necromuralist.github.io/data_science/posts/extracting-dates-from-medical-data/</link><dc:creator>necromuralist</dc:creator><description>&lt;div&gt;&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;1 Introduction&lt;/h2&gt;
&lt;p&gt;In this assignment, you'll be working with messy medical data and using regular expressions to extract relevant information from the data.&lt;/p&gt;
&lt;p&gt;Each line of the &lt;tt class="docutils literal"&gt;dates.txt&lt;/tt&gt; file corresponds to a medical note. Each note has a date that needs to be extracted, but each date is encoded in one of many formats.&lt;/p&gt;
&lt;p&gt;The goal of this assignment is to correctly identify all of the different date variants encoded in this dataset and to properly normalize and sort the dates.&lt;/p&gt;
&lt;p&gt;Here is a list of some of the variants you might encounter in this dataset:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;04/20/2009; 04/20/09; 4/20/09; 4/3/09&lt;/li&gt;
&lt;li&gt;Mar-20-2009; Mar 20, 2009; March 20, 2009;  Mar. 20, 2009; Mar 20 2009;&lt;/li&gt;
&lt;li&gt;20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009&lt;/li&gt;
&lt;li&gt;Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009&lt;/li&gt;
&lt;li&gt;Feb 2009; Sep 2009; Oct 2010&lt;/li&gt;
&lt;li&gt;6/2008; 12/2009&lt;/li&gt;
&lt;li&gt;2009; 2010&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have extracted these date patterns from the text, the next step is to sort them in ascending chronological order accoring to the following rules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Assume all dates in xx/xx/xx format are mm/dd/yy&lt;/li&gt;
&lt;li&gt;Assume all dates where year is encoded in only two digits are years from the 1900's (e.g. 1/5/89 is January 5th, 1989)&lt;/li&gt;
&lt;li&gt;If the day is missing (e.g. 9/2009), assume it is the first day of the month (e.g. September 1, 2009).&lt;/li&gt;
&lt;li&gt;If the month is missing (e.g. 2010), assume it is the first of January of that year (e.g. January 1, 2010).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With these rules in mind, find the correct date in each note and return a pandas Series in chronological order of the original Series' indices.&lt;/p&gt;
&lt;p&gt;For example if the original series was this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
0    1999
1    2010
2    1978
3    2015
4    1985
&lt;/pre&gt;
&lt;pre class="literal-block"&gt;
0    2
1    4
2    0
3    1
4    3
&lt;/pre&gt;
&lt;p&gt;Your score will be calculated using &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient"&gt;Kendall's tau&lt;/a&gt;, a correlation measure for ordinal data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This function should return a Series of length 500 and dtype int.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="imports"&gt;
&lt;h2&gt;2 Imports&lt;/h2&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_9b631790537144579c83f03f88990bad-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# from pypi&lt;/span&gt;
&lt;a name="rest_code_9b631790537144579c83f03f88990bad-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="loading-the-data"&gt;
&lt;h2&gt;3 Loading The Data&lt;/h2&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2c38b1d8ee0947dfa6623e4f2a5beddc-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dates.txt'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_2c38b1d8ee0947dfa6623e4f2a5beddc-2"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_2c38b1d8ee0947dfa6623e4f2a5beddc-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_2c38b1d8ee0947dfa6623e4f2a5beddc-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;data&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;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0         03/25/93 Total time of visit (in minutes):\n
1                       6/18/85 Primary Care Doctor:\n
2    sshe plans to move as of 7/8/71 In-Home Servic...
3                7 on 9/27/75 Audit C Score Current:\n
4    2/6/96 sleep studyPain Treatment Pain Level (N...
5                    .Per 7/06/79 Movement D/O note:\n
6    4, 5/18/78 Patient's thoughts about current su...
7    10/24/89 CPT Code: 90801 - Psychiatric Diagnos...
8                         3/7/86 SOS-10 Total Score:\n
9             (4/10/71)Score-1Audit C Score Current:\n
dtype: object
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_57ded1fdca904a5988df20f362cd4ec4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
count                                                   500
unique                                                  500
top       sApproximately 7 psychiatric hospitalizations ...
freq                                                      1
dtype: object
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="the-grammar"&gt;
&lt;h2&gt;4 The Grammar&lt;/h2&gt;
&lt;div class="section" id="cardinality"&gt;
&lt;h3&gt;4.1 Cardinality&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2e312da055d64864a51ab8189d4ca7e5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;ZERO_OR_MORE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;
&lt;a name="rest_code_2e312da055d64864a51ab8189d4ca7e5-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;ONE_OR_MORE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"+"&lt;/span&gt;
&lt;a name="rest_code_2e312da055d64864a51ab8189d4ca7e5-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;ZERO_OR_ONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'?'&lt;/span&gt;
&lt;a name="rest_code_2e312da055d64864a51ab8189d4ca7e5-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;EXACTLY_TWO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"{2}"&lt;/span&gt;
&lt;a name="rest_code_2e312da055d64864a51ab8189d4ca7e5-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;ONE_OR_TWO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"{1,2}"&lt;/span&gt;
&lt;a name="rest_code_2e312da055d64864a51ab8189d4ca7e5-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;EXACTLY_ONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'{1}'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="groups-and-classes"&gt;
&lt;h3&gt;4.2 Groups and Classes&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;GROUP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"({})"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;NAMED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"(?P&amp;lt;{}&amp;gt;{})"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"[{}]"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;NEGATIVE_LOOKAHEAD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"(?!{})"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;NEGATIVE_LOOKBEHIND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"(?&amp;lt;!{})"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;POSITIVE_LOOKAHEAD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"(?={})"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;POSITIVE_LOOKBEHIND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"(?&amp;lt;={})"&lt;/span&gt;
&lt;a name="rest_code_0b626c76eb924f13803ea3b49573cc1d-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;ESCAPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\{}"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="numbers"&gt;
&lt;h3&gt;4.3 Numbers&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\d"&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;ONE_DIGIT&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;EXACTLY_ONE&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_TWO&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;NON_DIGIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NEGATIVE_LOOKAHEAD&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;DIGIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;EXACTLY_TWO&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;THREE_DIGITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"{3}"&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;EXACTLY_TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;EXACTLY_TWO&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;NON_DIGIT&lt;/span&gt;
&lt;a name="rest_code_066bf65d5ab14ea0ac7a331e1eb77945-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;FOUR_DIGITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"{4}"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;NON_DIGIT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="string-literals"&gt;
&lt;h3&gt;4.4 String Literals&lt;/h3&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;SLASH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;'|'&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;LOWER_CASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"a-z"&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;SPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"\s"&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;DOT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"."&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;DASH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"-"&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;","&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;PUNCTUATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CLASS&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;DOT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_8d32b18c02d04df28379534a1c7949b0-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;EMPTY_STRING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="dates"&gt;
&lt;h3&gt;4.5 Dates&lt;/h3&gt;
&lt;p&gt;These are parts to build up the date-expressions.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;MONTH_SUFFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CLASS&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;LOWER_CASE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ZERO_OR_MORE&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-2"&gt;&lt;/a&gt;                &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CLASS&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;SPACE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DOT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_TWO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;MONTH_PREFIXES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;MONTHS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;MONTH_SUFFIX&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;MONTH_PREFIXES&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;MONTHS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GROUP&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;OR&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;MONTHS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;DAY_SUFFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CLASS&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;DASH&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_TWO&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;DAYS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DAY_SUFFIX&lt;/span&gt;
&lt;a name="rest_code_47ad7ae9f20e4726b34f7b2805fa6487-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;YEAR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FOUR_DIGITS&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is for dates like &lt;em&gt;Mar 21st, 2009&lt;/em&gt;, those with suffixes on the days.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;CONTRACTED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-2"&gt;&lt;/a&gt;              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;LOWER_CASE&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-3"&gt;&lt;/a&gt;              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;EXACTLY_TWO&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-4"&gt;&lt;/a&gt;              &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;CONTRACTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"contraction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-6"&gt;&lt;/a&gt;                           &lt;span class="n"&gt;MONTHS&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-7"&gt;&lt;/a&gt;                           &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CONTRACTED&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-8"&gt;&lt;/a&gt;                           &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DAY_SUFFIX&lt;/span&gt;
&lt;a name="rest_code_64197d882bd04964b03a78b818a7439e-9"&gt;&lt;/a&gt;                           &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;YEAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is for dates that have no days in them, like &lt;em&gt;May 2009&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_88d6900b06dd48868e9b47e314a3552e-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_DAY_BEHIND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NEGATIVE_LOOKBEHIND&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;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_88d6900b06dd48868e9b47e314a3552e-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_DAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"no_day"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NO_DAY_BEHIND&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;MONTHS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;YEAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is for the most common form (that I use) - &lt;em&gt;May 21, 2017&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_87c43c521ca64721be5846e6e2899c17-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;WORDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"words"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MONTHS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DAYS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;YEAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is for the case where the day is placed before them month - &lt;em&gt;20 March, 2009&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_64130b76c99e449d968c5cffe7f9c8e1-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;BACKWARDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"backwards"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;MONTHS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;YEAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is the case where slashes are used but only two digits were used for the year (so we're assuming it's in the twentieth century) - &lt;em&gt;8/4/98&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;slashed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SLASH&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;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-2"&gt;&lt;/a&gt;                      &lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-3"&gt;&lt;/a&gt;                      &lt;span class="n"&gt;EXACTLY_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;dashed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DASH&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;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-5"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-6"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;EXACTLY_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;TWENTIETH_CENTURY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"twentieth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_716a12861d7d4aac8487fd9a9e3e22d0-8"&gt;&lt;/a&gt;                                 &lt;span class="n"&gt;OR&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;slashed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dashed&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is the case where digits with slashes are used and all four digits are used for the year - &lt;em&gt;8/4/1998&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b89dd1204ae94e6f86ef999cfb4c62b6-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;NUMERIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"numeric"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b89dd1204ae94e6f86ef999cfb4c62b6-2"&gt;&lt;/a&gt;                       &lt;span class="n"&gt;SLASH&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;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b89dd1204ae94e6f86ef999cfb4c62b6-3"&gt;&lt;/a&gt;                                   &lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b89dd1204ae94e6f86ef999cfb4c62b6-4"&gt;&lt;/a&gt;                                   &lt;span class="n"&gt;FOUR_DIGITS&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is the case where only month and year are given as digits - &lt;em&gt;9/2009&lt;/em&gt;. There are two expressions, because the day can be one or two digits.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_PRECEDING_SLASH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NEGATIVE_LOOKBEHIND&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;SLASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_PRECEDING_SLASH_DIGIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NEGATIVE_LOOKBEHIND&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;CLASS&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;SLASH&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_ONE_DAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NO_PRECEDING_SLASH_DIGIT&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-4"&gt;&lt;/a&gt;              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ONE_DIGIT&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-5"&gt;&lt;/a&gt;              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SLASH&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-6"&gt;&lt;/a&gt;              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;FOUR_DIGITS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_TWO_DAYS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NO_PRECEDING_SLASH&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-8"&gt;&lt;/a&gt;               &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TWO_DIGITS&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-9"&gt;&lt;/a&gt;               &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SLASH&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-10"&gt;&lt;/a&gt;               &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;FOUR_DIGITS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-11"&gt;&lt;/a&gt;&lt;span class="n"&gt;NO_DAY_NUMERIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"no_day_numeric"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-12"&gt;&lt;/a&gt;                              &lt;span class="n"&gt;NO_ONE_DAY&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-13"&gt;&lt;/a&gt;                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-14"&gt;&lt;/a&gt;                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;NO_TWO_DAYS&lt;/span&gt;
&lt;a name="rest_code_4d140cc2e5974d789b0ce17b7ba5aff2-15"&gt;&lt;/a&gt;                              &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is the case where only a year was given. This is the hardest case, since you don't want to accidentally match the other cases, but the text preceding and following it could be anything. For the look-behind, all the cases have to have the same number of characters so we can't re-use the other expressions&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;CENTURY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GROUP&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="s1"&gt;'19'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"20"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TWO_DIGITS&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;DIGIT_SLASH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SLASH&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;DIGIT_DASH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;DASH&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;DIGIT_SPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIGIT&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;LETTER_SPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CLASS&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;LOWER_CASE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;COMMA_SPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;YEAR_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NEGATIVE_LOOKBEHIND&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;OR&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;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;DIGIT_SLASH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;DIGIT_DASH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;DIGIT_SPACE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;LETTER_SPACE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;COMMA_SPACE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-13"&gt;&lt;/a&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-14"&gt;&lt;/a&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-15"&gt;&lt;/a&gt;&lt;span class="n"&gt;YEAR_ONLY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"year_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-16"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;YEAR_PREFIX&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CENTURY&lt;/span&gt;
&lt;a name="rest_code_923226dbfcce4528ac87cca7a412fa5e-17"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;These are leftovers that don't really match anything.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;IN_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POSITIVE_LOOKBEHIND&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;CLASS&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="s1"&gt;'iI'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'n'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CENTURY&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;SINCE_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POSITIVE_LOOKBEHIND&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;CLASS&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="s2"&gt;"Ss"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'ince'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CENTURY&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;AGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POSITIVE_LOOKBEHIND&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="s2"&gt;"Age"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CENTURY&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;AGE_COMMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POSITIVE_LOOKBEHIND&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="s2"&gt;"Age"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TWO_DIGITS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMA&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CENTURY&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;OTHERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'delivery'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"quit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"attempt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"nephrectomy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;THREE_DIGITS&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;OTHERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;POSITIVE_LOOKBEHIND&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;label&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CENTURY&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;OTHERS&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;OTHERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OR&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;OTHERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;LEFTOVERS_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OR&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;IN_PREFIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SINCE_PREFIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AGE_COMMA&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;OTHERS&lt;/span&gt;
&lt;a name="rest_code_2255d8380ad6401cbe389a36a364eaff-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;LEFTOVERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"leftovers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LEFTOVERS_PREFIX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is the combined expression for all the dates - the one that should be used to extract them from the data.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;DATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NAMED&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="s2"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OR&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;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-2"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;TWENTIETH_CENTURY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-3"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;WORDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-4"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;BACKWARDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-5"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;CONTRACTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-6"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;NO_DAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-7"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;NO_DAY_NUMERIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-8"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;YEAR_ONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fc2bde03f0ea41e9aa371ae7acff5eb8-9"&gt;&lt;/a&gt;                                     &lt;span class="n"&gt;LEFTOVERS&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;twentieth_century&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""adds a 19 to the year&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     date (re.Regex): Extracted date&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SLASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"19{}"&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;year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ece947ef32c3471a8ba5f9a078507b5e-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;SLASH&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;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6de3e020d2fb476caba774a582541806-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;take_two&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_6de3e020d2fb476caba774a582541806-2"&gt;&lt;/a&gt;    &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TWENTIETH_CENTURY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6de3e020d2fb476caba774a582541806-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_6de3e020d2fb476caba774a582541806-4"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;twentieth_century&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6de3e020d2fb476caba774a582541806-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="applying-the-grammer"&gt;
&lt;h2&gt;5 Applying The Grammer&lt;/h2&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""extract all matches and report the count&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     expression (str): regular expression to match&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     data (pandas.Series): data with dates to extratc&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     name (str): name of the group for the expression&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     tuple (pandas.Series, int): extracted dates, count&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-11"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;extracted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extractall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-14"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"'{}' matched {} rows"&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_532a04c46a31499aa7d83e2574dab1b8-15"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_63aead1280094848a5ebbfe01e78cccf-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numeric_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'numeric'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'numeric' matched 25 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_97322d2aec224ba7bbb9f48697b64d0b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;twentieth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twentieth_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TWENTIETH_CENTURY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'twentieth'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'twentieth' matched 100 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ca85b3c6e1c44f678fd7d3101ed02935-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WORDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'words'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'words' matched 34 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3c14eab4f1ab4f7d9914e4dc1d3aaac6-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;backwards&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backwards_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BACKWARDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'backwards'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'backwards' matched 69 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a146a4d183cf48039637b7d71611679a-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;contraction_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONTRACTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'contraction'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'contraction' matched 0 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a72ab48d948d46be864df3b547f2b1d3-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;no_day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_day_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NO_DAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'no_day'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'no_day' matched 115 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_38ddb6bb04124a33baa4f3ee13bda526-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;no_day_numeric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_day_numeric_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NO_DAY_NUMERIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_38ddb6bb04124a33baa4f3ee13bda526-2"&gt;&lt;/a&gt;                                                         &lt;span class="s2"&gt;"no_day_numeric"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'no_day_numeric' matched 112 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_328d16933ace4fb6b298976941bd57a9-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;year_only&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;year_only_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;YEAR_ONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"year_only"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'year_only' matched 15 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_eb1ef7f0d59e496d942d099e9ca6aeda-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;leftovers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leftovers_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_and_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEFTOVERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"leftovers"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
'leftovers' matched 30 rows
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extractall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;total_found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Total Found: {}"&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;total_found&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Remaining: {}"&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="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;total_found&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-6"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Discrepancy: {}"&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;total_found&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numeric_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-7"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;twentieth_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-8"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;words_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-9"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;backwards_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-10"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;contraction&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-11"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;no_day_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-12"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;no_day_numeric_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-13"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;year_only_count&lt;/span&gt;
&lt;a name="rest_code_3c2079d77eec447ea7842e050ebb187c-14"&gt;&lt;/a&gt;                                              &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;leftovers_count&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Total Found: 500
Remaining: 0
Discrepancy: 0
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_230c2cc41b3046dd89e31fd65fd5d156-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;levels&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;a name="rest_code_230c2cc41b3046dd89e31fd65fd5d156-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_230c2cc41b3046dd89e31fd65fd5d156-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;missing&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;data&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;missing&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;a name="rest_code_230c2cc41b3046dd89e31fd65fd5d156-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_230c2cc41b3046dd89e31fd65fd5d156-5"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"all rows matched"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
all rows matched
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="unifying-the-formats"&gt;
&lt;h2&gt;6 Unifying the Formats&lt;/h2&gt;
&lt;p&gt;To make it simpler, I'm going to use the &lt;tt class="docutils literal"&gt;mm/dd/yyyy&lt;/tt&gt; format for the dates. I'm going to use the extracted series to avoid having different clean-up cases contaminating each other - e.g. dealing with 'January' when the day comes first as opposed to when the month comes first.&lt;/p&gt;
&lt;div class="section" id="helper-functions"&gt;
&lt;h3&gt;6.1 Helper Functions&lt;/h3&gt;
&lt;div class="section" id="clean"&gt;
&lt;h4&gt;6.1.1 Clean&lt;/h4&gt;
&lt;p&gt;This is a generic function to clean up some data. I was initially using it directly, but for cases where the expression and replacement function are used more than once, there are helper functions to make it easier.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replacement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""applies the replacement to the source&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    as a side-effect shows sample rows before and after&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): source of the strings&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     expression (str): regular expression to match what to replace&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     replacement: function or expression to replace the matching expression&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): number of randomly chosen examples to show&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-11"&gt;&lt;/a&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-12"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-13"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: the source with the replacement applied to it&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-14"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-15"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Random Sample Before:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-16"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-17"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&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="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replacement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-18"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Random Sample After:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-19"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-20"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Count of cleaned: {}"&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="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-21"&gt;&lt;/a&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_26a70e05d01c41cc987bece031f5383d-22"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="clean-punctuation"&gt;
&lt;h4&gt;6.1.2 Clean Punctuation&lt;/h4&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_punctuation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""removes punctuation&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): data to clean&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): size of sample to show&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: source with punctuation removed&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Cleaning Punctuation"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-12"&gt;&lt;/a&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PUNCTUATION&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-13"&gt;&lt;/a&gt;        &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PUNCTUATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EMPTY_STRING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_a48cfea51ef94f539affe06202de9df7-14"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="convert-long-month-names-to-three-letter-names"&gt;
&lt;h4&gt;6.1.3 Convert Long Month Names to Three-Letter Names&lt;/h4&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;LONG_TO_SHORT&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="n"&gt;January&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Jan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-2"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;February&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Feb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-3"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;March&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Mar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-4"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;April&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Apr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-5"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"May"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-6"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;June&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Jun"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-7"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;July&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Jul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-8"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;August&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Aug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-9"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;September&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Sep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-10"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;October&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Oct"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-11"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;November&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Nov"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-12"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;December&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Dec"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-13"&gt;&lt;/a&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-14"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# it turns out there are spelling errors in the data so this has to be fuzzy&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-15"&gt;&lt;/a&gt;&lt;span class="n"&gt;LONG_TO_SHORT_EXPRESSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OR&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;GROUP&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;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-16"&gt;&lt;/a&gt;                                    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;CLASS&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;LOWER_CASE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-17"&gt;&lt;/a&gt;                                    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ZERO_OR_MORE&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-18"&gt;&lt;/a&gt;                                    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;LONG_TO_SHORT&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;a name="rest_code_4682e078636b4cfc87b46112d727633b-19"&gt;&lt;/a&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-20"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;long_month_to_short&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-21"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""convert long month to short&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-22"&gt;&lt;/a&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-23"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-24"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     match (re.Match): object matching a long month&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-25"&gt;&lt;/a&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-26"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-27"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     str: shortened version of the month&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-28"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_4682e078636b4cfc87b46112d727633b-29"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastindex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This next function is the one you would actually use to make the conversion.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_long_months_to_short&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""convert long month names to short&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): data with months&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): size of sample to show&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: data with short months&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-12"&gt;&lt;/a&gt;                 &lt;span class="n"&gt;LONG_TO_SHORT_EXPRESSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_33736a1f662e47018e28cba7502b4452-13"&gt;&lt;/a&gt;                 &lt;span class="n"&gt;long_month_to_short&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="add-january-1-to-year-only-dates"&gt;
&lt;h4&gt;6.1.4 Add January 1 to year-only dates&lt;/h4&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_month_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""adds 01/01 to years&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     match (re.Match): object that only matched a 4-digit year&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     str: 01/01/YYYY&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_1d4bf34ce7224d8f83445179ce28f7d2-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"01/01/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;And now the function to actually call.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_january_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""adds /01/01/ to year-only dates&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): data with the dates&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: years in source with /01/01/ added&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_5f2ef25af7ea46c4bb713ef8f00ae7fc-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;YEAR_ONLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;add_month_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="two-digit-numbers"&gt;
&lt;h4&gt;6.1.5 Two-Digit Numbers&lt;/h4&gt;
&lt;p&gt;This makes sure that there are exactly two digits in a number, adding a leading zero if needed.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;two_digit_expression&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GROUP&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;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;POSITIVE_LOOKAHEAD&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;SLASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;two_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-4"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""add a leading zero if needed&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     match (re.Match): match with one or two digits&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     str: the matched string with leading zero if needed&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-11"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-12"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# for some reason the string-formatting raises an error if it's a string&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-13"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# so cast it to an int&lt;/span&gt;
&lt;a name="rest_code_e6e899f4ef50407ab134a96cac8b3678-14"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"{:02}"&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="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is the function to call for the case where the number is followed by a slash (e.g. &lt;tt class="docutils literal"&gt;2/&lt;/tt&gt;).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_two_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""makes sure source has two-digits&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): data with digit followed by slash&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): number of samples to show&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: source with digits coerced to two digits&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_9dbbee1a5c284b14a8dd95a0d061f406-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;two_digit_expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;two_digits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is like &lt;tt class="docutils literal"&gt;clean_two_digits&lt;/tt&gt; but it doesn't check for the trailing slash. Use this if you have an isolated column of numbers that need to be two-digits.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_two_digits_isolated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""cleans two digits that are standalone&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): source of the data&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): number of samples to show&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: converted data&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_ccc8f275e4ab4f4583ff735769cac377-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;two_digits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="cleaning-up-months"&gt;
&lt;h4&gt;6.1.6 Cleaning Up Months&lt;/h4&gt;
&lt;p&gt;These clean up and convert written months (e.g. change &lt;tt class="docutils literal"&gt;Aug&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;08&lt;/tt&gt;).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{:02}"&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;month&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;month&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;13&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;MONTH_TO_DIGITS&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="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MONTH_PREFIXES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;SHORT_MONTHS_EXPRESSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OR&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;GROUP&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;month&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;month&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;MONTH_TO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;month_to_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-5"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""converts short month to digits&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-6"&gt;&lt;/a&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     match (re.Match): object with short-month&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-11"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     str: month as two-digit number (e.g. Jan -&amp;gt; 01)&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-12"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_67be1efdfee64e69b7a2632858aa3b6c-13"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MONTH_TO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_short_month_to_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""converts three-letter months to two-digits&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): data with three-letter months&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): number of samples to show&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: source with short-months coverted to digits&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-12"&gt;&lt;/a&gt;                 &lt;span class="n"&gt;SHORT_MONTHS_EXPRESSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-13"&gt;&lt;/a&gt;                 &lt;span class="n"&gt;month_to_digits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6073b8397d994280aad16a5dc7c7943e-14"&gt;&lt;/a&gt;                 &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This function runs the previous three and is the main one that should be used. The others can be run individually for troubleshooting, though.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_months&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""clean up months (which start as words)&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     source (pandas.Series): source of the months&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sample (int): number of random samples to show&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_punctuation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-9"&gt;&lt;/a&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Converting long months to short"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-12"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;LONG_TO_SHORT_EXPRESSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-13"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;long_month_to_short&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-14"&gt;&lt;/a&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-15"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Converting short months to digits"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-17"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;SHORT_MONTHS_EXPRESSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-18"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;month_to_digits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c7fb3254c651489e904705f74c039fe8-19"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="frame-to-series"&gt;
&lt;h4&gt;6.1.7 Frame To Series&lt;/h4&gt;
&lt;p&gt;This is for the case where the date-fields were broken up into columns in a data-frame.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;frame_to_series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index_source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""re-combines data-frame into a series&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     frame (pandas.DataFrame): frame with month, day, year columns&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     index_source (pandas.series): source to copy index from&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     samples (index): number of random entries to print when done&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: series with dates as month/day/year&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-11"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;combined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SLASH&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;SLASH&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index_source&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-14"&gt;&lt;/a&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_37f92571504c45af80c86f9c60aff53e-15"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;combined&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="year-only"&gt;
&lt;h3&gt;6.2 Year Only&lt;/h3&gt;
&lt;p&gt;For the case where there is only a year, I'll add January 1 to the dates.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_278f53251fdb4fc68b34e046c70b6a34-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;year_only_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add_january_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year_only&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
     match
472  0        2010
495  0        1979
497  0        2008
481  0        1974
486  0        1973
Name: year_only, dtype: object

Random Sample After:
     match
495  0        01/01/1979
470  0        01/01/1983
462  0        01/01/1988
481  0        01/01/1974
480  0        01/01/2013
Name: year_only, dtype: object

Count of cleaned: 15
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="leftovers"&gt;
&lt;h3&gt;6.3 Leftovers&lt;/h3&gt;
&lt;p&gt;These were the odd cases that didn't seem to have a real pattern. Since I used a positive lookbehind to match everything but the year they only have the years in them, like the previous year-only cases.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a7b366fae7df44e6b69648ba1bfffdf2-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;leftovers_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add_january_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leftovers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
     match
487  0        1992
477  0        1994
498  0        2005
488  0        1977
484  0        2004
Name: leftovers, dtype: object

Random Sample After:
     match
464  0        01/01/2016
455  0        01/01/1984
465  0        01/01/1976
475  0        01/01/2015
498  0        01/01/2005
Name: leftovers, dtype: object

Count of cleaned: 30
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a8ed56d0d0a94b23a883c68d0de11a23-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;year_only_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leftovers_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_a8ed56d0d0a94b23a883c68d0de11a23-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
45
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="no-day-numeric"&gt;
&lt;h3&gt;6.4 No Day Numeric&lt;/h3&gt;
&lt;p&gt;This is for the case where the date is formatted with slashes and there are no day-values. To make the months uniform I'm going to make them all two-digits first.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4b9fb0f5efe2443fa421f624443f9079-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;no_day_numeric_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_two_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no_day_numeric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
     match
450  0         1/1994
374  0        11/2000
403  0        10/1981
454  0         7/1982
358  0         1/1983
Name: no_day_numeric, dtype: object

Random Sample After:
     match
426  0        11/1984
415  0        02/1973
360  0        12/2008
367  0        09/2001
362  0        08/2003
Name: no_day_numeric, dtype: object

Count of cleaned: 112
&lt;/pre&gt;
&lt;p&gt;Now I'll add the day.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3c74d7a0e4cd47d2b745a2fd00045c03-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;no_day_numeric_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no_day_numeric_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_3c74d7a0e4cd47d2b745a2fd00045c03-2"&gt;&lt;/a&gt;                               &lt;span class="n"&gt;SLASH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_3c74d7a0e4cd47d2b745a2fd00045c03-3"&gt;&lt;/a&gt;                               &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/01/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
     match
368  0        08/1986
409  0        10/1994
443  0        09/2000
404  0        10/1986
395  0        02/1977
Name: no_day_numeric, dtype: object

Random Sample After:
     match
349  0        05/01/1987
392  0        05/01/2000
448  0        05/01/2010
394  0        10/01/2001
424  0        04/01/1979
Name: no_day_numeric, dtype: object

Count of cleaned: 112
&lt;/pre&gt;
&lt;p&gt;And add it to the total.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c186131450e34793996aefde3d7e33e5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c186131450e34793996aefde3d7e33e5-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_day_numeric_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_c186131450e34793996aefde3d7e33e5-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;no_day_numeric_count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3df8414b6ae0412494fc2d475c208687-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
157
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="no-day"&gt;
&lt;h3&gt;6.5 No Day&lt;/h3&gt;
&lt;p&gt;This is for cases like &lt;em&gt;Mar 2011&lt;/em&gt; where no day was given. We're going to assume that it's the first day of the month for each case.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5ec35e8477ed4b75b14b1acea8d730f5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;no_day_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_months&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Cleaning Punctuation
Random Sample Before:
     match
261  0           Oct 1986
269  0          July 1992
280  0          July 1985
295  0         March 1983
339  0        March, 2005
Name: no_day, dtype: object

Random Sample After:
     match
228  0        September 1985
304  0              Mar 2002
253  0              Feb 2016
276  0            April 1986
272  0              Feb 1993
Name: no_day, dtype: object

Count of cleaned: 115
Converting long months to short
Random Sample Before:
     match
315  0             Jun 1976
242  0             Nov 2010
237  0        February 1976
330  0           April 1988
311  0        February 1995
Name: no_day, dtype: object

Random Sample After:
     match
306  0        May 2004
254  0        Aug 1979
269  0        Jul 1992
337  0        Dec 2007
241  0        May 2004
Name: no_day, dtype: object

Count of cleaned: 115
Converting short months to digits
Random Sample Before:
     match
268  0        Dec 2009
298  0        Jan 1993
296  0        Aug 1979
270  0        May 2006
320  0        Nov 2012
Name: no_day, dtype: object

Random Sample After:
     match
246  0        07 1981
286  0        01 2013
263  0        09 1981
276  0        04 1986
247  0        05 1983
Name: no_day, dtype: object

Count of cleaned: 115
&lt;/pre&gt;
&lt;p&gt;Now we need to replace the spaces with the days.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e4c4257b864944be9a3724ac6b376a64-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;no_day_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no_day_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e4c4257b864944be9a3724ac6b376a64-2"&gt;&lt;/a&gt;                       &lt;span class="n"&gt;SPACE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ONE_OR_MORE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e4c4257b864944be9a3724ac6b376a64-3"&gt;&lt;/a&gt;                       &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"/01/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
     match
251  0        12 1998
290  0        12 2011
281  0        08 2004
308  0        02 1994
294  0        02 1983
Name: no_day, dtype: object

Random Sample After:
     match
304  0        03/01/2002
332  0        06/01/1974
310  0        10/01/1992
293  0        09/01/2008
322  0        10/01/1991
Name: no_day, dtype: object

Count of cleaned: 115
&lt;/pre&gt;
&lt;p&gt;Now we can add it to the cleaned.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3700c60a7fbc42ff864963c15b8cb50d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3700c60a7fbc42ff864963c15b8cb50d-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no_day_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_3700c60a7fbc42ff864963c15b8cb50d-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
272
&lt;/pre&gt;
&lt;p&gt;Now to make sure we're where we expect we are.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4af27b29ecac455da3c4e0d31c8d711b-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;no_day_count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="contraction"&gt;
&lt;h3&gt;6.6 Contraction&lt;/h3&gt;
&lt;p&gt;There were no matches for the contraction so I'll ignore it for now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="backwards"&gt;
&lt;h3&gt;6.7 Backwards&lt;/h3&gt;
&lt;p&gt;This is the case where the day comes first. The first thing I'll do is split them up.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_9f1806b4291e4ebfa802e9259ffc9389-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;backwards&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_9f1806b4291e4ebfa802e9259ffc9389-2"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"day month year"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_9f1806b4291e4ebfa802e9259ffc9389-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&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;pre class="literal-block"&gt;
  day month  year
0  24   Jan  2001
1  10   Sep  2004
2  26   May  1982
3  28  June  2002
4  06   May  1972
&lt;/pre&gt;
&lt;p&gt;The next thing to do is to make sure the days all have two digits.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f6072f0515ec436a8714027b631047f4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_two_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
31    26
39    21
4     06
57    13
36    19
Name: day, dtype: object

Random Sample After:
29    06
68    18
60    17
11    11
26    22
Name: day, dtype: object

Count of cleaned: 69
&lt;/pre&gt;
&lt;p&gt;Next comes the months. This is basically the same problem as with the &lt;em&gt;no day&lt;/em&gt; case so I'll re-use some of the code for that.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ab05fe73da44414cb294eb9f3502501c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_months&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Cleaning Punctuation
Converting long months to short
Random Sample Before:
55    Dec
41    Nov
38    Jan
54    Dec
5     Oct
Name: month, dtype: object

Random Sample After:
30    Oct
55    Dec
15    Feb
38    Jan
14    Oct
Name: month, dtype: object

Count of cleaned: 69
Converting short months to digits
Random Sample Before:
29    Mar
22    May
45    Jan
47    Aug
61    Oct
Name: month, dtype: object

Random Sample After:
16    05
32    02
4     05
68    01
38    01
Name: month, dtype: object

Count of cleaned: 69
&lt;/pre&gt;
&lt;p&gt;Now we need to combine them back together. In hindsight it might have been easier to convert everything into data frames instead of the other way around. Or maybe not. Since we want the indexes from the original data as our final answer I also have to copy the index from the original series&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_62fe0d46ed274e2db3053d05f493ef5e-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;backwards_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame_to_series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
     match
177  0        01/18/1990
128  0        06/28/2002
181  0        08/18/1995
158  0        08/23/2000
185  0        08/17/1985
dtype: object
&lt;/pre&gt;
&lt;p&gt;No it gets added to the combined series.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_555c71acd16b47558ef5c9c343044db5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_555c71acd16b47558ef5c9c343044db5-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backwards_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_555c71acd16b47558ef5c9c343044db5-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;backwards_count&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_69e8faeacd0a4beaabb211af9573f40d-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
341
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="words"&gt;
&lt;h3&gt;6.8 Words&lt;/h3&gt;
&lt;p&gt;Since working with the data frame was easier than I though it would be I'll do that again.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_7ba9ad608ca44fea9db0387aea288678-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;words&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&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="s2"&gt;"month day year"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_7ba9ad608ca44fea9db0387aea288678-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&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;pre class="literal-block"&gt;
      month  day  year
0     April  11,  1990
1       May  30,  2001
2       Feb  18,  1994
3  February  18,  1981
4  October.  11,  2013
&lt;/pre&gt;
&lt;p&gt;First we'll clean out the months.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_d0f876a0c5d545248054176fe3b11a12-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_months&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Cleaning Punctuation
Random Sample Before:
25          Dec
10         Mar.
17        April
14    September
0         April
Name: month, dtype: object

Random Sample After:
5         Jan
12    October
24        May
2         Feb
28        May
Name: month, dtype: object

Count of cleaned: 34
Converting long months to short
Random Sample Before:
11       Jan
13    August
20       Sep
6       July
17     April
Name: month, dtype: object

Random Sample After:
27    Oct
30    Jul
6     Jul
14    Sep
33    Sep
Name: month, dtype: object

Count of cleaned: 34
Converting short months to digits
Random Sample Before:
24    May
31    Jun
5     Jan
7     Dec
32    Jan
Name: month, dtype: object

Random Sample After:
15    07
12    10
1     05
30    07
21    08
Name: month, dtype: object

Count of cleaned: 34
&lt;/pre&gt;
&lt;p&gt;Now we'll clean up the punctuation for the days.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_403a8eaa61c148c3b75b879c020e4983-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_punctuation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Cleaning Punctuation
Random Sample Before:
22    11,
13     12
29     14
16    11,
24    14,
Name: day, dtype: object

Random Sample After:
2     18
1     30
24    14
15    25
17    17
Name: day, dtype: object

Count of cleaned: 34
&lt;/pre&gt;
&lt;p&gt;So, what do we have so far?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_fb060e1e44ad4b8aaa75fed980e99703-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&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;pre class="literal-block"&gt;
  month day  year
0    04  11  1990
1    05  30  2001
2    02  18  1994
3    02  18  1981
4    10  11  2013
&lt;/pre&gt;
&lt;p&gt;At this point we need to combine everything with a slash and restore the index.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_fa253b729078464694a8162277a81f8f-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;words_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame_to_series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
     match
194  0        04/11/1990
217  0        06/13/2011
209  0        07/25/1983
216  0        11/11/1988
223  0        10/14/1974
dtype: object
&lt;/pre&gt;
&lt;p&gt;Now we'll add it to the total.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b319c93adfcf4699a4bbd51ebfd40376-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_b319c93adfcf4699a4bbd51ebfd40376-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_b319c93adfcf4699a4bbd51ebfd40376-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;words_count&lt;/span&gt;
&lt;a name="rest_code_b319c93adfcf4699a4bbd51ebfd40376-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
375
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="twentieth-century"&gt;
&lt;h3&gt;6.9 Twentieth Century&lt;/h3&gt;
&lt;p&gt;We'll do the same trick with creating a dataframe. The first thing, though, is to replace the dashes with slashes.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_baf1d171c3ec4f6eb96dec932a8b99da-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;twentieth&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="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_baf1d171c3ec4f6eb96dec932a8b99da-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;twentieth_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twentieth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&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="n"&gt;DASH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SLASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_baf1d171c3ec4f6eb96dec932a8b99da-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&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="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
4-13-82
01/01/1991
&lt;/pre&gt;
&lt;p&gt;Now, we'll create the frame.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4be7ee2936874cd4b245d919e12856ce-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;twentieth_cleaned&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SLASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_4be7ee2936874cd4b245d919e12856ce-2"&gt;&lt;/a&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="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"day"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_4be7ee2936874cd4b245d919e12856ce-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&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;pre class="literal-block"&gt;
  month day year
0    03  25   93
1     6  18   85
2     7   8   71
3     9  27   75
4     2   6   96
&lt;/pre&gt;
&lt;div class="section" id="months"&gt;
&lt;h4&gt;6.9.1 Months&lt;/h4&gt;
&lt;p&gt;The months need to be converted to two-digits.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4dc97efa0ae94a2d8a2474ed70e57c53-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_two_digits_isolated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
73     4
53    10
84     8
93     6
80    10
Name: month, dtype: object

Random Sample After:
76    03
33    07
32    01
94    07
67    05
Name: month, dtype: object

Count of cleaned: 100
&lt;/pre&gt;
&lt;p&gt;As do the days.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5389733c16244c0b97ca473d67c73a35-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_two_digits_isolated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
78    14
29    15
37    15
75    18
80    05
Name: day, dtype: object

Random Sample After:
35    14
30    14
17    21
88    16
0     25
Name: day, dtype: object

Count of cleaned: 100
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a3e1f85c163e4d8da80c2fb1af92bb61-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&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;pre class="literal-block"&gt;
  month day year
0    03  25   93
1    06  18   85
2    07  08   71
3    09  27   75
4    02  06   96
&lt;/pre&gt;
&lt;p&gt;Now we have to add &lt;tt class="docutils literal"&gt;19&lt;/tt&gt; to each of the years.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4ac655e89dc64840aa093c1acfbc915c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TWO_DIGITS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"19"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
41    75
90    97
97    90
69    97
65    81
Name: year, dtype: object

Random Sample After:
4     1996
44    1971
11    1975
17    1998
61    1979
Name: year, dtype: object

Count of cleaned: 100
&lt;/pre&gt;
&lt;p&gt;Now we have to join them back up.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8baf04995baa452ba852a7b93dc2fb0a-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;twentieth_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame_to_series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twentieth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
    match
67  0        07/06/1991
88  0        12/08/1982
4   0        02/06/1996
40  0        07/29/1975
72  0        07/11/1977
dtype: object
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_1d503b332f6e4822a51f526d131a35c7-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_1d503b332f6e4822a51f526d131a35c7-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twentieth_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_59162f44789846f0a3a07c733a932da6-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;twentieth_count&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="numeric"&gt;
&lt;h3&gt;6.10 Numeric&lt;/h3&gt;
&lt;p&gt;The final category is dates with the format &lt;tt class="docutils literal"&gt;mm/dd/yyyy&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_2f9ce5575b0f482bb132ce984d804e2b-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numeric&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;pre class="literal-block"&gt;
    match
14  0         5/24/1990
15  0         1/25/2011
17  0        10/13/1976
24  0        07/25/1984
30  0        03/31/1985
Name: numeric, dtype: object
&lt;/pre&gt;
&lt;p&gt;We should check and make sure there are no dashes here.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_cc4af49c73084dd0a3aca73e6fb07ed7-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;has_dashes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_cc4af49c73084dd0a3aca73e6fb07ed7-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;has_dashes&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Series([], Name: numeric, dtype: object)
&lt;/pre&gt;
&lt;p&gt;It looks like it doesn't so we'll skip this check.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c49525c65d3c47f086c390e1a05429ea-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;numeric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SLASH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_c49525c65d3c47f086c390e1a05429ea-2"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"month day year"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_c49525c65d3c47f086c390e1a05429ea-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&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;pre class="literal-block"&gt;
  month day  year
0     5  24  1990
1     1  25  2011
2    10  13  1976
3    07  25  1984
4    03  31  1985
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_a007c13ce32a4311ae0b9a94b7f6e539-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_two_digits_isolated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
5      5
18    04
4     03
0      5
10    12
Name: month, dtype: object

Random Sample After:
0     05
24    04
3     07
11    08
13    11
Name: month, dtype: object

Count of cleaned: 25
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_71afd6cc3e404c2fba4a7edccec5e061-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clean_two_digits_isolated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Random Sample Before:
9     11
19    08
8     15
13     3
24    27
Name: day, dtype: object

Random Sample After:
23    20
22    11
7     13
18    08
0     24
Name: day, dtype: object

Count of cleaned: 25
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c6874e85b6eb4167992d86cda4fd4879-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;numeric_cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame_to_series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numeric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
    match
94  0        12/08/1990
92  0        04/08/2004
43  0        04/13/2002
38  0        07/27/1986
14  0        05/24/1990
dtype: object
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3389eacbbc4045a8b83c74e93f999331-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3389eacbbc4045a8b83c74e93f999331-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numeric_cleaned&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_3389eacbbc4045a8b83c74e93f999331-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numeric_count&lt;/span&gt;
&lt;a name="rest_code_3389eacbbc4045a8b83c74e93f999331-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
500
&lt;/pre&gt;
&lt;p&gt;At this point it looks like we've cleaned all the cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="re-combining-the-cleaned"&gt;
&lt;h3&gt;6.11 Re-combining The Cleaned&lt;/h3&gt;
&lt;p&gt;Because these notebooks can execute things out of order I'm going to create one monolithic concatenation and ignore the one that I was using to keep the running total.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;numeric_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-2"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;twentieth_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-3"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;words_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-4"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;backwards_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-5"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;no_day_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-6"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;no_day_numeric_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-7"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;year_only_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-8"&gt;&lt;/a&gt;                         &lt;span class="n"&gt;leftovers_cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-9"&gt;&lt;/a&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-10"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-11"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&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;a name="rest_code_ca60a73c85e1438c903b982cd4d34ae2-12"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
500
    match
14  0        05/24/1990
15  0        01/25/2011
17  0        10/13/1976
24  0        07/25/1984
30  0        03/31/1985
dtype: object
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="convert-to-datetimes"&gt;
&lt;h2&gt;7 Convert to Datetimes&lt;/h2&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_957b32bad7d440c5b5dd381de14cd546-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&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;a name="rest_code_957b32bad7d440c5b5dd381de14cd546-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;datetimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"%m/&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;/%Y"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_957b32bad7d440c5b5dd381de14cd546-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetimes&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;pre class="literal-block"&gt;
    match
14  0        05/24/1990
15  0        01/25/2011
17  0        10/13/1976
24  0        07/25/1984
30  0        03/31/1985
dtype: object
    match
14  0       1990-05-24
15  0       2011-01-25
17  0       1976-10-13
24  0       1984-07-25
30  0       1985-03-31
dtype: datetime64[ns]
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_647ff9a60a1a4f69bb41e1bf0924139b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;sorted_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetimes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_647ff9a60a1a4f69bb41e1bf0924139b-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_dates&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;pre class="literal-block"&gt;
    match
9   0       1971-04-10
84  0       1971-05-18
2   0       1971-07-08
53  0       1971-07-11
28  0       1971-09-12
dtype: datetime64[ns]
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3176215c31b3415397607142ecb2f364-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_dates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
     match
231  0       2016-05-01
141  0       2016-05-30
186  0       2016-10-13
161  0       2016-10-19
413  0       2016-11-01
dtype: datetime64[ns]
&lt;/pre&gt;
&lt;p&gt;The grader wants a Series with the indices of the original data put in the order of the sorted dates.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_8b1ec468304743d9af86de787065a82d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_dates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;labels&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;a name="rest_code_8b1ec468304743d9af86de787065a82d-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&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;pre class="literal-block"&gt;
0     9
1    84
2     2
3    53
4    28
dtype: int16
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="the-date-sorter-function"&gt;
&lt;h2&gt;8 The date_sorter Function&lt;/h2&gt;
&lt;p&gt;This is the function called by the grader. Since the work was done outside of it we just need to make sure that it returns our answer.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_9d14237f12654a98b9d9dd249ad4bb2f-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;date_sorter&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_9d14237f12654a98b9d9dd249ad4bb2f-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;note:&lt;/strong&gt; This produced a 94% score, so there are still some cases not correctly handled.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>regularexpressions</category><guid>https://necromuralist.github.io/data_science/posts/extracting-dates-from-medical-data/</guid><pubDate>Tue, 08 Aug 2017 00:16:00 GMT</pubDate></item><item><title>Evaluating a Model</title><link>https://necromuralist.github.io/data_science/posts/evaluating-a-model/</link><dc:creator>hades</dc:creator><description>&lt;div&gt;&lt;p&gt;In this assignment you will train several models and evaluate how effectively they predict instances of credit-card fraud using data based on &lt;a class="reference external" href="https://www.kaggle.com/dalpozz/creditcardfraud"&gt;this dataset from Kaggle&lt;/a&gt;. This is their description:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
The datasets contains transactions made by credit cards in September 2013 by european cardholders. This dataset presents transactions that occurred in two days, where we have 492 frauds out of 284,807 transactions. The dataset is highly unbalanced, the positive class (frauds) account for 0.172% of all transactions.

It contains only numerical input variables which are the result of a PCA transformation. Unfortunately, due to confidentiality issues, we cannot provide the original features and more background information about the data. Features V1, V2, ... V28 are the principal components obtained with PCA, the only features which have not been transformed with PCA are 'Time' and 'Amount'. Feature 'Time' contains the seconds elapsed between each transaction and the first transaction in the dataset. The feature 'Amount' is the transaction Amount, this feature can be used for example-dependant cost-senstive learning. Feature 'Class' is the response variable and it takes value 1 in case of fraud and 0 otherwise.

Given the class imbalance ratio, we recommend measuring the accuracy using the Area Under the Precision-Recall Curve (AUPRC). Confusion matrix accuracy is not meaningful for unbalanced classification.

The dataset has been collected and analysed during a research collaboration of Worldline and the Machine Learning Group (`http://mlg.ulb.ac.be &amp;lt;http://mlg.ulb.ac.be&amp;gt;`_) of ULB (Université Libre de Bruxelles) on big data mining and fraud detection. More details on current and past projects on related topics are available on `http://mlg.ulb.ac.be/BruFence &amp;lt;http://mlg.ulb.ac.be/BruFence&amp;gt;`_ and `http://mlg.ulb.ac.be/ARTML &amp;lt;http://mlg.ulb.ac.be/ARTML&amp;gt;`_

Please cite: Andrea Dal Pozzolo, Olivier Caelen, Reid A. Johnson and Gianluca Bontempi. Calibrating Probability with Undersampling for Unbalanced Classification. In Symposium on Computational Intelligence and Data Mining (CIDM), IEEE, 2015
&lt;/pre&gt;
&lt;p&gt;Each row in `fraud_data.csv` corresponds to a credit card transaction. Features include confidential variables `V1` through `V28` as well as `Amount` which is the amount of the transaction.&lt;/p&gt;
&lt;p&gt;The target is stored in the `class` column, where a value of 1 corresponds to an instance of fraud and 0 corresponds to an instance of not fraud.&lt;/p&gt;
&lt;div class="section" id="imports"&gt;
&lt;h2&gt;1 Imports&lt;/h2&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-3"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plot&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-4"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-6"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.model_selection&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;GridSearchCV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-9"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-10"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.svm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SVC&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-11"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.dummy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DummyClassifier&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-12"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.linear_model&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LogisticRegression&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-13"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-14"&gt;&lt;/a&gt;    &lt;span class="n"&gt;auc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-15"&gt;&lt;/a&gt;    &lt;span class="n"&gt;confusion_matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;precision_recall_curve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-17"&gt;&lt;/a&gt;    &lt;span class="n"&gt;precision_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-18"&gt;&lt;/a&gt;    &lt;span class="n"&gt;recall_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-19"&gt;&lt;/a&gt;    &lt;span class="n"&gt;roc_curve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-20"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_ae453741ead748348fe8c7ae489664bd-21"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;tabulate&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tabulate&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4cbdbd5243fd4ac48840c699e50aec4b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;DATA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"data/fraud_data.csv"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="setup-the-plotting"&gt;
&lt;h2&gt;2 Setup the plotting&lt;/h2&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_923d535399ca4bf3a143c481505eb86b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;get_ipython&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;magic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'matplotlib inline'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_923d535399ca4bf3a143c481505eb86b-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seaborn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axes_style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"whitegrid"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_923d535399ca4bf3a143c481505eb86b-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"axes.grid"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;a name="rest_code_923d535399ca4bf3a143c481505eb86b-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;seaborn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_style&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"whitegrid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="exploring-the-data"&gt;
&lt;h2&gt;3 Exploring the data&lt;/h2&gt;
&lt;div class="section" id="how-much-fraud-is-there"&gt;
&lt;h3&gt;3.1 How much fraud is there?&lt;/h3&gt;
&lt;p&gt;Import the data from `fraud_data.csv`. What percentage of the observations in the dataset are instances of fraud?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_c8b77711bc1642d88cafb754b79cddb4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;DATA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_667973d723344822bb5c573d38cefb7a-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Fraction of cases that were fraud: {0:.2f}"&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;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Class&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;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Fraction of cases that were fraud: 0.02
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_e5e48572c4604ae7a9904dc13c5ccc06-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;seaborn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;countplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Class"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="fraud.png" src="https://necromuralist.github.io/data_science/posts/evaluating-a-model/fraud.png"&gt;
&lt;p&gt;So it appears that most of the cases aren't fraudulent.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="setting-up-the-training-and-testing-sets"&gt;
&lt;h2&gt;4 Setting up the training and testing sets&lt;/h2&gt;
&lt;p&gt;As always, we split the data into training and testing sets so there's no `data leakage`.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_cdc8fe8b0e6e455dbd8b317a67924715-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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;DATA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_cdc8fe8b0e6e455dbd8b317a67924715-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_cdc8fe8b0e6e455dbd8b317a67924715-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&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="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_cdc8fe8b0e6e455dbd8b317a67924715-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&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="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_cdc8fe8b0e6e455dbd8b317a67924715-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_cdc8fe8b0e6e455dbd8b317a67924715-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&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;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="scores"&gt;
&lt;h2&gt;5 Scores&lt;/h2&gt;
&lt;p&gt;This is a convenience class to store the scores for the models.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ScoreKeeper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""only holds scores, doesn't create them"""&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-4"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"N/A"&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-5"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"N/A"&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-6"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"N/A"&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-7"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__sub__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-10"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""calculates the difference between the three scores&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-11"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-12"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Args:&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-13"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         other (Scores): the right-hand side of the subtraction&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-14"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-15"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-16"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         ScoreKeeper: object with the differences&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-17"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-18"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Raises:&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-19"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         TypeError: one of the values wasn't set on one of the Scores&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-20"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-21"&gt;&lt;/a&gt;        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ScoreKeeper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-22"&gt;&lt;/a&gt;        &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-23"&gt;&lt;/a&gt;        &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-24"&gt;&lt;/a&gt;        &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-25"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-26"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-27"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__gt__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-28"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""compares scores&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-29"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-30"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Args:&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-31"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         other (Scores): object to compare to&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-32"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-33"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-34"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         bool: True if all three scores are greater than other's&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-35"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-36"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Raises:&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-37"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         TypeError: one of the values wasn't set&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-38"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-39"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-40"&gt;&lt;/a&gt;                    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-41"&gt;&lt;/a&gt;                    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-42"&gt;&lt;/a&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-43"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-44"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Precision: {0:.2f}, Accuracy: {1:.2f}, Recall: {2:.2f}"&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;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-45"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-46"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_b2582b1eb2ea4c628801c3a970b660b2-47"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Scores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ScoreKeeper&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""holds scores"""&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-3"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-4"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""fits and scores the model&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Args:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         model: model that has been fit to the data&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         x_test: input for accuracy measurement&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         y_test: labels for scoring the model&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-10"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-11"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-12"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-13"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_accuracy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-14"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_recall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-15"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-16"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-17"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-18"&gt;&lt;/a&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-19"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-20"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-21"&gt;&lt;/a&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-22"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-23"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""the model's predictions&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-24"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-25"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-26"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         array: predictions for x-test&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-27"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-28"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_predictions&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-29"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-30"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_predictions&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-31"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-32"&gt;&lt;/a&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-33"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-34"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""the accuracy of the model's predictions&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-35"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-36"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        the fraction that was correctly predicted&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-37"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-38"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        (tp + tn)/(tp + tn + fp + fn)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-39"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-40"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-41"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         float: accuracy of predictions for x-test&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-42"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-43"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_accuracy&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-44"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_accuracy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-45"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_accuracy&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-46"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-47"&gt;&lt;/a&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-48"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-49"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""the recall score for the predictions&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-50"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-51"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        The fraction of true-positives penalized for missing any&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-52"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        This is the better metric when missing a case is more costly&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-53"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        than accidentally identifying a case.&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-54"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-55"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        tp / (tp + fn)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-56"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-57"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-58"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         float: recall of the predictions&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-59"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-60"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_recall&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-61"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_recall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recall_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-62"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_recall&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-63"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-64"&gt;&lt;/a&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-65"&gt;&lt;/a&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-66"&gt;&lt;/a&gt;        &lt;span class="sd"&gt;"""the precision of the test predictions&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-67"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-68"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        The fraction of true-positives penalized for false-positives&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-69"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        This is the better metric when accidentally identifying a case&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-70"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        is more costly than missing a case&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-71"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-72"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        tp / (tp + fp)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-73"&gt;&lt;/a&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-74"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        Returns:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-75"&gt;&lt;/a&gt;&lt;span class="sd"&gt;         float: precision score&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-76"&gt;&lt;/a&gt;&lt;span class="sd"&gt;        """&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-77"&gt;&lt;/a&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_precision&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-78"&gt;&lt;/a&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;precision_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_278351c6da4b49aabea572b774f1dbdb-79"&gt;&lt;/a&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_precision&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="a-dummy-classifier-baseline"&gt;
&lt;h2&gt;6 A Dummy Classifier (baseline)&lt;/h2&gt;
&lt;p&gt;Using `X_train`, `X_test`, `y_train`, and `y_test` (as defined above), we're going to train a &lt;a class="reference external" href="http://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html"&gt;dummy classifier&lt;/a&gt; that classifies everything as the majority class of the training data, so we will have a baseline to compare with the other models.&lt;/p&gt;
&lt;p&gt;First we create and train it&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_3b575270d44547579e2cf81b4cba8ff5-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"most_frequent"&lt;/span&gt;
&lt;a name="rest_code_3b575270d44547579e2cf81b4cba8ff5-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;dummy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DummyClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3b575270d44547579e2cf81b4cba8ff5-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_3b575270d44547579e2cf81b4cba8ff5-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;dummy_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Scores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Now we make our predctions and score them&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_70a7f538e880419ca3a1af33beb5d846-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Dummy Classifier: {0}"&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;dummy_scores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Dummy Classifier: Precision: 0.00, Accuracy: 0.99, Recall: 0.00
&lt;/pre&gt;
&lt;p&gt;Since the model is always predicting that the data-points are not fraudulent (the majority case), it never returns any true positives and since both precision and recall have true positive as their numerators, they are both 0.&lt;/p&gt;
&lt;p&gt;For the accuracy we can look at the count of each class:&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_20be1a68471a44e29a38f8543e0f494c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
0    5344
1      80
Name: Class, dtype: int64
&lt;/pre&gt;
&lt;p&gt;And since we know it will always predict 0, we can double-check it (the true and false positives are both 0).&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;true_positive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;true_negative&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5344&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;false_positive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;false_negative&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;true_positive&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;true_negative&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;true_positive&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;true_negative&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-6"&gt;&lt;/a&gt;                                            &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;false_positive&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;false_negative&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-7"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Accuracy: {0:.2f}"&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;accuracy&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_5dd35a8fd7cd4388bf6b904d66227425-8"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&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="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dummy_scores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Accuracy: 0.99
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="svc-accuracy-recall-and-precision"&gt;
&lt;h2&gt;7 SVC Accuracy, Recall and Precision&lt;/h2&gt;
&lt;p&gt;Now we're going to create a &lt;a class="reference external" href="http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html"&gt;Support Vector Classifier&lt;/a&gt; that uses the sklearn default valuse.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_142b58de4d81413e8a8c16124c508fe2-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;svc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVC&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_142b58de4d81413e8a8c16124c508fe2-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_142b58de4d81413e8a8c16124c508fe2-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;svc_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Scores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_4e5b0b9c26f049e69bc016220375f325-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SVC: {0}"&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;svc_scores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
SVC: Precision: 1.00, Accuracy: 0.99, Recall: 0.38
&lt;/pre&gt;
&lt;p&gt;We can now compare it to the Dummy Classifier to see how it did against the baseline.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_ad9f3d8960b14f2797019f2496ce87d9-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SVC - Dummy: {0}"&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;svc_scores&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dummy_scores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_ad9f3d8960b14f2797019f2496ce87d9-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;svc_scores&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dummy_scores&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
SVC - Dummy: Precision: 1.00, Accuracy: 0.01, Recall: 0.38
&lt;/pre&gt;
&lt;p&gt;The SVC was much better on precision and recall (as expected) and slightly better on accuracy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="confusion-matrix"&gt;
&lt;h2&gt;8 Confusion Matrix&lt;/h2&gt;
&lt;p&gt;We're going to create a Support Vector Classifier with ``C=1e9`` and ``gamma=1e-07`` (the ``e`` is the equivalent of ``**``). Then, using the &lt;a class="reference external" href="http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC.decision_function"&gt;decision function&lt;/a&gt; and a threshold of -220, we're going to make our predictions and create a confusion matrix. The decision-function calculates the distance of each data point from the label, so the further a value is from 0, the further it is from the separating hyper-plane.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_596bb487f24d4d108af9966f98482ed0-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;error_penalty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;
&lt;a name="rest_code_596bb487f24d4d108af9966f98482ed0-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;kernel_coefficient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1e-07&lt;/span&gt;
&lt;a name="rest_code_596bb487f24d4d108af9966f98482ed0-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;220&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code ipython"&gt;&lt;a name="rest_code_5a291358f696416bace7394800e82e3c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;svc_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;error_penalty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gamma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;kernel_coefficient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5a291358f696416bace7394800e82e3c-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;svc_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_5a291358f696416bace7394800e82e3c-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;svc_scores_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Scores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;svc_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;The decision_function gives us the distances which we then need to convert to labels. In this case we're going to label anything greater than -220 as a 1 and anything less as a 0.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;decisions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;svc_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;decisions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decisions&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;threshold&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;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;decisions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;decisions&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="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;confusion_matrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decisions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Actual Positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Actual Negative"&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="s2"&gt;"Predicted Positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Predicted Negative"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-6"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tabulate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tablefmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"orgtbl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_32fed51d6e154e0198857ed1769a7b7c-7"&gt;&lt;/a&gt;               &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"keys"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="30%"&gt;
&lt;col width="35%"&gt;
&lt;col width="35%"&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;/th&gt;
&lt;th class="head"&gt;Predicted Positive&lt;/th&gt;
&lt;th class="head"&gt;Predicted Negative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Actual Positive&lt;/td&gt;
&lt;td&gt;5320&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Actual Negative&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_af4b8b17231e4ab693c7d62716cabb5d-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SVC 2: {0}"&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;svc_scores_2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_af4b8b17231e4ab693c7d62716cabb5d-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;svc_scores_2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dummy_scores&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
SVC 2: Precision: 0.94, Accuracy: 1.00, Recall: 0.80
&lt;/pre&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_6a0497c9d49c4cd1a586dae040115da0-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SVC 2 - SVC Default: {0}"&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;svc_scores_2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;svc_scores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
SVC 2 - SVC Default: Precision: -0.06, Accuracy: 0.01, Recall: 0.43
&lt;/pre&gt;
&lt;p&gt;This model did slightly worse with precision that the default, slightly better for accuracy but quite a bit better for recall. So if we didn't care as much about false positives it would be the better model.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="logistic-regression"&gt;
&lt;h2&gt;9 Logistic Regression&lt;/h2&gt;
&lt;p&gt;This model will be a Logistic Regression model built with the default parameters.&lt;/p&gt;
&lt;p&gt;For the logisitic regression classifier, we'll create a precision recall curve and a roc curve using y_test and the probability estimates for X_test (probability it is fraud).&lt;/p&gt;
&lt;p&gt;Looking at the precision recall curve, what is the recall when the precision is `0.75`?
Looking at the roc curve, what is the true positive rate when the false positive rate is `0.16`?&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LogisticRegression&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;y_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decision_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thresholds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;precision_recall_curve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;closest_zero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thresholds&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;closest_zero_precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;closest_zero&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;closest_zero_recall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;closest_zero&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.75&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;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;recall_at_precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;figure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-11"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-12"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&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="n"&gt;precision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Precision-Recall Curve"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-13"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&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="n"&gt;closest_zero_precision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;closest_zero_recall&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"o"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;markersize&lt;/span&gt;&lt;span class="o"&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;mew&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fillstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'none'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-14"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Precision"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-15"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Recall"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-16"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axhline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recall_at_precision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-17"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f801614bd33c427691c0c03bf04dfa85-18"&gt;&lt;/a&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Precision vs Recall"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="logistic_regression_precision_recall.png" src="https://necromuralist.github.io/data_science/posts/evaluating-a-model/logistic_regression_precision_recall.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_b7f4a56dea16471783166e82c8daa117-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.75&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;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_b7f4a56dea16471783166e82c8daa117-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;recall_at_precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_b7f4a56dea16471783166e82c8daa117-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Recall at precision 0.75: {0}"&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;recall_at_precision&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
Recall at precision 0.75: 0.825
&lt;/pre&gt;
&lt;p&gt;When the precision is 0.75, the recall is 0.825.&lt;/p&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;y_score_lr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict_proba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;false_positive_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;true_positive_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;roc_curve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_score_lr&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;a name="rest_code_72de484d2dde42788d12e89099251d21-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;area_under_the_curve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;auc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;false_positive_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;true_positive_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;false_positive_rate&lt;/span&gt;&lt;span class="p"&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="mf"&gt;0.16&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;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;figure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&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="n"&gt;false_positive_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;true_positive_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ROC Curve (area={0:.2f})"&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;area_under_the_curve&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axhline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;true_positive_rate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"False Positive Rate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"True Positive Rate"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-11"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ROC Curve"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-12"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&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;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'navy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'--'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-13"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_72de484d2dde42788d12e89099251d21-14"&gt;&lt;/a&gt;&lt;span class="n"&gt;axe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'equal'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="lr_roc.png" src="https://necromuralist.github.io/data_science/posts/evaluating-a-model/lr_roc.png"&gt;
&lt;pre class="code ipython"&gt;&lt;a name="rest_code_14a0aeb6692a4cb784358c2cfdbe79fc-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;false_positive_rate&lt;/span&gt;&lt;span class="p"&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="mf"&gt;0.16&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;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_14a0aeb6692a4cb784358c2cfdbe79fc-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"True positive rate where false positive rate is 0.16: {0}"&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;true_positive_rate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
True positive rate where false positive rate is 0.16: 0.9375
&lt;/pre&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;def true_positive_where_false(model, threshold):&lt;/dt&gt;
&lt;dd&gt;"""get the true-positive value matching the threshold for false-positive&lt;/dd&gt;
&lt;dt&gt;Args:&lt;/dt&gt;
&lt;dd&gt;model: the model fit to the data with predict_proba method&lt;/dd&gt;
&lt;dt&gt;Return:&lt;/dt&gt;
&lt;dd&gt;float: True Positive rate&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;&amp;lt;string&amp;gt;&lt;/tt&gt;, line 466)&lt;/p&gt;
Definition list ends without a blank line; unexpected unindent.&lt;/div&gt;
&lt;p&gt;"""
y_score_lr = model.predict_proba(X_test)
false_positive_rate, true_positive_rate, _ = roc_curve(y_test, y_score_lr[:, 1])
index = numpy.where(numpy.round(false_positive_rate, 2)==0.16)[0][0]
return true_positive_rate[index]&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;def recall_where_precision(model, threshold):&lt;/dt&gt;
&lt;dd&gt;"""return recall where the first precision matches threshold&lt;/dd&gt;
&lt;dt&gt;Args:&lt;/dt&gt;
&lt;dd&gt;model: model fit to the data with decision_function
threshold (float): point to find matching recall&lt;/dd&gt;
&lt;dt&gt;Returns:&lt;/dt&gt;
&lt;dd&gt;float: recall matching precision threshold&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="system-message"&gt;
&lt;p class="system-message-title"&gt;System Message: WARNING/2 (&lt;tt class="docutils"&gt;&amp;lt;string&amp;gt;&lt;/tt&gt;, line 482)&lt;/p&gt;
Definition list ends without a blank line; unexpected unindent.&lt;/div&gt;
&lt;p&gt;"""
y_scores = model.decision_function(X_test)
precision, recall, thresholds = precision_recall_curve(y_test, y_scores)
return recall[numpy.where(precision==threshold)[0][0]]&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;def answer_five():&lt;/dt&gt;
&lt;dd&gt;model = LogisticRegression()
model.fit(X_train, y_train)
recall_score = recall_where_precision(model, 0.75)
true_positive = true_positive_where_false(model, threshold=0.16)
return (recall_score, true_positive)&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;answer_five()&lt;/p&gt;
&lt;p&gt;parameters = dict(penalty=["l1", "l2"], C=[10**power for power in range(-2, 3)])
model = LogisticRegression()&lt;/p&gt;
&lt;p&gt;grid = GridSearchCV(model, parameters, scoring="recall")
grid.fit(X_train, y_train)&lt;/p&gt;
&lt;p&gt;grid.cv_results_&lt;/p&gt;
&lt;p&gt;len(grid.cv_results_["mean_test_score"])&lt;/p&gt;
&lt;p&gt;grid.cv_results_
l1 = [grid.cv_results_["mean_test_score"][index] for index in range(0, len(grid.cv_results_['mean_test_score']), 2)]
l2 = [grid.cv_results_["mean_test_score"][index] for index in range(1, len(grid.cv_results_["mean_test_score"])+ 1, 2)]
l1&lt;/p&gt;
&lt;p&gt;l2&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;def answer_six():&lt;/dt&gt;
&lt;dd&gt;parameters = dict(penalty=["l1", "l2"], C=[10**power for power in range(-2, 3)])
model = LogisticRegression()
grid = GridSearchCV(model, parameters, scoring="recall")
grid.fit(X_train, y_train)
l1 = [grid.cv_results_["mean_test_score"][index] for index in range(0, len(grid.cv_results_['mean_test_score']), 2)]
l2 = [grid.cv_results_["mean_test_score"][index] for index in range(1, len(grid.cv_results_["mean_test_score"])+ 1, 2)]
return numpy.array([l1, l2]).T&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;answer_six()&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;def GridSearch_Heatmap(scores):&lt;/dt&gt;
&lt;dd&gt;get_ipython().magic('matplotlib inline')
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure()
scores = answer_six()
sns.heatmap(scores, xticklabels=['l1','l2'], yticklabels=[0.01, 0.1, 1, 10, 100])
plt.yticks(rotation=0);&lt;/dd&gt;
&lt;dt&gt;if VERBOSE:&lt;/dt&gt;
&lt;dd&gt;GridSearch_Heatmap(answer_six())&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>machinelearning kaggle</category><guid>https://necromuralist.github.io/data_science/posts/evaluating-a-model/</guid><pubDate>Mon, 12 Jun 2017 22:05:00 GMT</pubDate></item><item><title>Predicting Cancer (Course 3, Assignment 1)</title><link>https://necromuralist.github.io/data_science/posts/predicting-cancer/</link><dc:creator>necromuralist</dc:creator><description>&lt;div&gt;&lt;p&gt;This assignment uses the Breast Cancer Wisconsin (Diagnostic) Database to create a classifier that can help diagnose patients.&lt;/p&gt;
&lt;div class="section" id="imports"&gt;
&lt;h2&gt;Imports&lt;/h2&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_c7fc14c3af244e20a9e931c26f7c7995-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt;
&lt;a name="rest_code_c7fc14c3af244e20a9e931c26f7c7995-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt;
&lt;a name="rest_code_c7fc14c3af244e20a9e931c26f7c7995-3"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.datasets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_breast_cancer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="the-data"&gt;
&lt;h2&gt;The data&lt;/h2&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_09e399a144b64db98e1a439b6cdd935b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;cancer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_breast_cancer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This data set has 569 rows (cases) with 30 numeric features. The outcomes are either 1 - &lt;em&gt;malignant&lt;/em&gt;, or 0 - &lt;em&gt;benign&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;From their description:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Features are computed from a digitized image of a fine needle aspirate (FNA) of a breast mass.  They describe characteristics of the cell nuclei present in the image.
&lt;/pre&gt;
&lt;p&gt;The object returned by &lt;tt class="docutils literal"&gt;load_breast_cancer()&lt;/tt&gt; is a scikit-learn Bunch object, which is similar to a dictionary, but like pandas, also supports using dot-notation to retrieve attributes when possible (i.e. no spaces in the keys).&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_168a4d0357164c04a2d0edc233e7da3f-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
dict_keys(['DESCR', 'target', 'feature_names', 'data', 'target_names'])
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-0-example"&gt;
&lt;h2&gt;Question 0 (Example)&lt;/h2&gt;
&lt;p&gt;How many features does the breast cancer dataset have?&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_zero&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""number of feature names in the data&lt;/span&gt;
&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     int: count of feature names in the 'cancer' data-set&lt;/span&gt;
&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_33fc15f77c2245b8b42d16611c721ebf-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'feature_names'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_3a103505aa0e49d397f21a59cf3900fa-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;answer_zero&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
30
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-1"&gt;
&lt;h2&gt;Question 1&lt;/h2&gt;
&lt;p&gt;Scikit-learn works with lists, numpy arrays, scipy-sparse matrices, and pandas DataFrames, so converting the dataset to a DataFrame is not necessary for training this model. Using a DataFrame does however help make many things easier such as munging data, so let's practice creating a classifier with a pandas DataFrame.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""converts the sklearn 'cancer' bunch&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.DataFrame: cancer data&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature_names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_b3d659d1c8f548e9b70b88ddf5abff0f-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pandas&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="n"&gt;data&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="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_1a98be338b894117849c588e30875b68-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_1a98be338b894117849c588e30875b68-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-2"&gt;
&lt;h2&gt;Question 2&lt;/h2&gt;
&lt;p&gt;What is the class distribution? (i.e. how many instances of &lt;tt class="docutils literal"&gt;malignant&lt;/tt&gt; and how many &lt;tt class="docutils literal"&gt;benign&lt;/tt&gt;?)&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_two&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""calculates number of malignent and benign&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     pandas.Series: counts of each&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cancerdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cancerdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"malignant benign"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_42f1476214a8419cac3ecd027425862b-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_4de616c2524042ebb34c2705c4cf6ba7-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_two&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_4de616c2524042ebb34c2705c4cf6ba7-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;malignant&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;212&lt;/span&gt;
&lt;a name="rest_code_4de616c2524042ebb34c2705c4cf6ba7-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;benign&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;357&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-3"&gt;
&lt;h2&gt;Question 3&lt;/h2&gt;
&lt;p&gt;Split the DataFrame into `X` (the data) and `y` (the labels).&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""splits the data into data and labels&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     (pandas.DataFrame, pandas.Series): data, labels&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cancerdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cancerdf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cancerdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&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;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cancerdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;a name="rest_code_14c6a1690a7e4250b0a80cdd98c28fef-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_9919328ff14647d6aef49f90f0829545-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_9919328ff14647d6aef49f90f0829545-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;569&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_9919328ff14647d6aef49f90f0829545-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;569&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-4"&gt;
&lt;h2&gt;Question 4&lt;/h2&gt;
&lt;p&gt;Using &lt;tt class="docutils literal"&gt;train_test_split()&lt;/tt&gt;, split &lt;tt class="docutils literal"&gt;X&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;y&lt;/tt&gt; into training and test sets &lt;tt class="docutils literal"&gt;(X_train, X_test, y_train, and y_test)&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.model_selection&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-4"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""splits data into training and testing sets&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     tuple(pandas.DataFrame): x_train, y_train, x_test, y_test&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_three&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_0c59601156ea4c649b68814e95988aa6-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;426&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&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;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_c9db356cb5b84463b9cff45dcab628d9-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_c9db356cb5b84463b9cff45dcab628d9-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;x_train&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;426&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c9db356cb5b84463b9cff45dcab628d9-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;x_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_c9db356cb5b84463b9cff45dcab628d9-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;426&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;a name="rest_code_c9db356cb5b84463b9cff45dcab628d9-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-5"&gt;
&lt;h2&gt;Question 5&lt;/h2&gt;
&lt;p&gt;Using KNeighborsClassifier, fit a k-nearest neighbors (knn) classifier with &lt;tt class="docutils literal"&gt;X_train&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;y_train&lt;/tt&gt; and using one nearest neighbor (&lt;tt class="docutils literal"&gt;n_neighbors = 1&lt;/tt&gt;).&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.neighbors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KNeighborsClassifier&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-4"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Fits a KNN-1 model to the data&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     sklearn.neighbors.KNeighborsClassifier: trained data&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KNeighborsClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n_neighbors&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;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_125cb1ade5564bf2b226cbb25b82cc85-12"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_5ce594db5f63485e969f541f23bc2615-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;knn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_5ce594db5f63485e969f541f23bc2615-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;KNeighborsClassifier&lt;/span&gt;
&lt;a name="rest_code_5ce594db5f63485e969f541f23bc2615-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_neighbors&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-6"&gt;
&lt;h2&gt;Question 6&lt;/h2&gt;
&lt;p&gt;Using your knn classifier, predict the class label using the mean value for each feature.&lt;/p&gt;
&lt;p&gt;You can use &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cancerdf.mean()[:-1].values.reshape(1,&lt;/span&gt; &lt;span class="pre"&gt;-1)&lt;/span&gt;&lt;/tt&gt; which gets the mean value for each feature, ignores the target column, and reshapes the data from 1 dimension to 2 (necessary for the predict method of KNeighborsClassifier).&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_six&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Predicts the class labels for the means of all features&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     numpy.array: prediction (0 or 1)&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;cancerdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;means&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cancerdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&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="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_2aeb0ee62f104078a3216c39ba55d990-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;means&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_b97acb920cb04b71814ef44e235e35b4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;answer_six&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="literal-block"&gt;
array([ 1.])
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="question-7"&gt;
&lt;h2&gt;Question 7&lt;/h2&gt;
&lt;p&gt;Using your knn classifier, predict the class labels for the test set &lt;tt class="docutils literal"&gt;X_test&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_seven&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""predicts likelihood of cancer for test set&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     numpy.array: vector of predictions&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;knn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_730d1f64e89a4f1689ac989e708b421c-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_d63162c8e44b43fe85f13e3308281ba8-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_seven&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_d63162c8e44b43fe85f13e3308281ba8-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;a name="rest_code_d63162c8e44b43fe85f13e3308281ba8-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predictions&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="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_8bcb0654ef15444a835dfc5bca610e33-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"no cancer: {0}"&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="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;predictions&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;a name="rest_code_8bcb0654ef15444a835dfc5bca610e33-2"&gt;&lt;/a&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cancer: {0}"&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="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;predictions&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;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="question-8"&gt;
&lt;h2&gt;Question 8&lt;/h2&gt;
&lt;p&gt;Find the score (mean accuracy) of your knn classifier using &lt;tt class="docutils literal"&gt;X_test&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;y_test&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;answer_eight&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""calculates the mean accuracy of the KNN model&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     float: mean accuracy of the model predicting cancer&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;knn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_714ff61fb3d84b01949cd891539b61b0-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_2e49b8f6f8ba4835af17d93952a09bc9-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;answer_eight&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="optional-plot"&gt;
&lt;h2&gt;Optional plot&lt;/h2&gt;
&lt;p&gt;Try using the plotting function below to visualize the differet predicition scores between training and test sets, as well as malignant and benign cells.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-1"&gt;&lt;/a&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-3"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;accuracy_plot&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-4"&gt;&lt;/a&gt;    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-5"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_four&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-8"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Find the training and testing accuracies by target value (i.e. malignant, benign)&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;mal_train_X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_train&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;mal_train_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_train&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ben_train_X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_train&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ben_train_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_train&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-13"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-14"&gt;&lt;/a&gt;    &lt;span class="n"&gt;mal_test_X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_test&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-15"&gt;&lt;/a&gt;    &lt;span class="n"&gt;mal_test_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_test&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ben_test_X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_test&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-17"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ben_test_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_test&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-18"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-19"&gt;&lt;/a&gt;    &lt;span class="n"&gt;knn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;answer_five&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-20"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-21"&gt;&lt;/a&gt;    &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mal_train_X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mal_train_y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ben_train_X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ben_train_y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-22"&gt;&lt;/a&gt;              &lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mal_test_X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mal_test_y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;knn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ben_test_X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ben_test_y&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-23"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-24"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-25"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-26"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-27"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# Plot the scores as a bar chart&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-28"&gt;&lt;/a&gt;    &lt;span class="n"&gt;bars&lt;/span&gt; &lt;span class="o"&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;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'#4c72b0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'#4c72b0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'#55a868'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'#55a868'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-29"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-30"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# directly label the score onto the bars&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-31"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-32"&gt;&lt;/a&gt;        &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_height&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-33"&gt;&lt;/a&gt;        &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_x&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_width&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;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'{0:.{1}f}'&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;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-34"&gt;&lt;/a&gt;                     &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'center'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-35"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-36"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# remove all the ticks (both axes), and tick labels on the Y axis&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-37"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'off'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'off'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'off'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'off'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelleft&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'off'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelbottom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'on'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-38"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-39"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# remove the frame of the chart&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-40"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;spine&lt;/span&gt; &lt;span class="ow"&gt;in&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;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&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;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-41"&gt;&lt;/a&gt;        &lt;span class="n"&gt;spine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-42"&gt;&lt;/a&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-43"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Malignant&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Training'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Benign&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Training'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Malignant&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Test'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Benign&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;Test'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-44"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Training and Test Accuracies for Malignant and Benign Cells'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_f5ec1deb255f4ec4bfc6268b690d7429-45"&gt;&lt;/a&gt;&lt;span class="n"&gt;accuracy_plot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;img alt="accuracies.png" src="https://necromuralist.github.io/data_science/posts/predicting-cancer/accuracies.png"&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>machinelearning datascience python</category><guid>https://necromuralist.github.io/data_science/posts/predicting-cancer/</guid><pubDate>Sat, 03 Jun 2017 23:32:14 GMT</pubDate></item><item><title>Bokeh Test</title><link>https://necromuralist.github.io/data_science/posts/bokeh-test/</link><dc:creator>necromuralist</dc:creator><description>&lt;div&gt;&lt;div class="section" id="the-plot"&gt;
&lt;h2&gt;The Plot&lt;/h2&gt;
&lt;script src="https://necromuralist.github.io/data_science/posts/bokeh-test/portland_unemployment.js" id="686c5dd6-168a-4f7d-acbc-524875d93b59" data-bokeh-model-id="c473232a-dc2c-4b75-988c-f9bc6517b4b9" data-bokeh-doc-id="402d8e3c-1595-4d65-9f76-e11068c629ab"&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div class="section" id="what-this-is"&gt;
&lt;h2&gt;What This Is&lt;/h2&gt;
&lt;p&gt;This is a re-do of the final plot done for data-science with python course 2 week 4. The original was done with matplotlib and this was done with bokeh to get some interaction working. When I tried to create it the first time bokeh raised some errors saying that &lt;tt class="docutils literal"&gt;height&lt;/tt&gt; had been defined more than once. I don't know what really caused it - possibly a namespace clash where I was re-using something I didn't intend to re-use - but when I created a new notebook that only created the one plot it worked. Since this uses javascript I used Jupyter and the web-inteface to test it out (emacs ipython doesn't seem to be able to render javascript (unless I'm doing it wrong)).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="how-it-got-exported"&gt;
&lt;h2&gt;How It Got Exported&lt;/h2&gt;
&lt;p&gt;I won't go over the creating of the data (since I just copied it from an earlier notebook) but this is how the bokeh plot was created.&lt;/p&gt;
&lt;div class="section" id="imports"&gt;
&lt;h3&gt;Imports&lt;/h3&gt;
&lt;p&gt;These were the bokeh parts I needed.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-2"&gt;&lt;/a&gt;    &lt;span class="n"&gt;BoxAnnotation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;CustomJS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;Toggle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-8"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.io&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;output_notebook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-12"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-13"&gt;&lt;/a&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-14"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.plotting&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-15"&gt;&lt;/a&gt;    &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ColumnDataSource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-17"&gt;&lt;/a&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-18"&gt;&lt;/a&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-19"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-20"&gt;&lt;/a&gt;    &lt;span class="n"&gt;CrosshairTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-21"&gt;&lt;/a&gt;    &lt;span class="n"&gt;HoverTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-22"&gt;&lt;/a&gt;    &lt;span class="n"&gt;PanTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-23"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ResetTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-24"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ResizeTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-25"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SaveTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-26"&gt;&lt;/a&gt;    &lt;span class="n"&gt;UndoTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-27"&gt;&lt;/a&gt;    &lt;span class="n"&gt;WheelZoomTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-28"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-29"&gt;&lt;/a&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-30"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.layouts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-31"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.resources&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CDN&lt;/span&gt;
&lt;a name="rest_code_6fdd1928445f47c2aee381e930466867-32"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bokeh.embed&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;autoload_static&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="some-constants"&gt;
&lt;h3&gt;Some Constants&lt;/h3&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;NATIONAL_COLOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"slategrey"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;NATIONAL_LABEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"National"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;PORTLAND_COLOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"cornflowerblue"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;PORTLAND_LABEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Portland-Hillsboro-Vancouver"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;S_AND_P_COLOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"#90151B"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;S_AND_P_LABEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"S &amp;amp; P 500 Index"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-7"&gt;&lt;/a&gt;&lt;span class="n"&gt;HOUSING_COLOR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"#D89159"&lt;/span&gt;
&lt;a name="rest_code_006662e13b804d2a9a33b79c74db13f0-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;HOUSING_LABEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"House Price Index"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="the-data"&gt;
&lt;h3&gt;The Data&lt;/h3&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;bokeh&lt;/tt&gt; doesn't work with &lt;tt class="docutils literal"&gt;pandas&lt;/tt&gt; &lt;tt class="docutils literal"&gt;DataFrame&lt;/tt&gt;'s (or at least I couldn't get it to work). Instead you create a DataFrame-like object using the &lt;tt class="docutils literal"&gt;ColumnDataSource&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;portland_source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ColumnDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-2"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&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;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-3"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;portland&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-4"&gt;&lt;/a&gt;        &lt;span class="n"&gt;unemployment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;portland&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unemployment_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-5"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;portland&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-6"&gt;&lt;/a&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-7"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;national_source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ColumnDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&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;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-11"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;national&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-12"&gt;&lt;/a&gt;        &lt;span class="n"&gt;unemployment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;national&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unemployment_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-13"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;national&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-14"&gt;&lt;/a&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-15"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-16"&gt;&lt;/a&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-17"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ColumnDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-18"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&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;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-19"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;house_price_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-20"&gt;&lt;/a&gt;        &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;house_price_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-21"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s_and_p_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-22"&gt;&lt;/a&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-23"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-24"&gt;&lt;/a&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-25"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ColumnDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-26"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&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;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-27"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s_and_p_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-28"&gt;&lt;/a&gt;        &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s_and_p_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VALUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-29"&gt;&lt;/a&gt;        &lt;span class="n"&gt;month_label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s_and_p_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-30"&gt;&lt;/a&gt;        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_84b1f751633c412bac4fa754ba15ffaf-31"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="the-tools"&gt;
&lt;h3&gt;The Tools&lt;/h3&gt;
&lt;p&gt;These are the things that add interactivity to the plot. You have to create new ones for each figure so I made a function to get them.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_tools&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""makes the tools for the figures&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     list: tool objects&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HoverTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tooltips&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-8"&gt;&lt;/a&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@month_label"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-9"&gt;&lt;/a&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"unemployment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@unemployment"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-10"&gt;&lt;/a&gt;    &lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-11"&gt;&lt;/a&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-13"&gt;&lt;/a&gt;        &lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-14"&gt;&lt;/a&gt;        &lt;span class="n"&gt;CrosshairTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-15"&gt;&lt;/a&gt;        &lt;span class="n"&gt;PanTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-16"&gt;&lt;/a&gt;        &lt;span class="n"&gt;ResetTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-17"&gt;&lt;/a&gt;        &lt;span class="n"&gt;ResizeTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-18"&gt;&lt;/a&gt;        &lt;span class="n"&gt;SaveTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-19"&gt;&lt;/a&gt;        &lt;span class="n"&gt;UndoTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-20"&gt;&lt;/a&gt;        &lt;span class="n"&gt;WheelZoomTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-21"&gt;&lt;/a&gt;    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_dea109b0974f472da1ee62dacab2c118-22"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;The &lt;tt class="docutils literal"&gt;HoverTool tooltips&lt;/tt&gt; argument is a list of tuples - one tuple for each dimension of the data. The first argument of the tuple (e.g. "month") is the label that will appear when the user hover's over the data point, while the second (e.g. "@month_label") tells bokeh which column to use for the data (so it has to match the key you used in the &lt;tt class="docutils literal"&gt;ColumnDataSource&lt;/tt&gt; creation).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="helper-functions"&gt;
&lt;h3&gt;Helper Functions&lt;/h3&gt;
&lt;p&gt;The sub-figures needed some common elements so I created functions for them.&lt;/p&gt;
&lt;div class="section" id="scaling-the-timestamps"&gt;
&lt;h4&gt;Scaling The Timestamps&lt;/h4&gt;
&lt;p&gt;The timestamps by default are unreadable (because there are so many). This re-scales them so they are more readable.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""gets the scaled timestamp for element location&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     index: index in the portland.datetime series&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     epoch timestamp used to locate place in plot&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_10864e10bcd84d67978a9addead9edc8-9"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;portland&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;TIME_SCALE&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="drawing-the-recession"&gt;
&lt;h4&gt;Drawing the Recession&lt;/h4&gt;
&lt;p&gt;The recession is indicated as a blue box on each plot.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_recession&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""Makes the box for the recession&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     BoxAnnotation to color the recession&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;BoxAnnotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-8"&gt;&lt;/a&gt;        &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recession_start&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-9"&gt;&lt;/a&gt;        &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recession_end&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-10"&gt;&lt;/a&gt;        &lt;span class="n"&gt;fill_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_dda80a34e41641f3aa46953e365f4eba-11"&gt;&lt;/a&gt;        &lt;span class="n"&gt;fill_alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="vertical-lines"&gt;
&lt;h4&gt;Vertical Lines&lt;/h4&gt;
&lt;p&gt;Things like the unemployment lows and highs are indicated by a vertical line.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_vertical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"darkorange"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""makes a vertical line&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-4"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Args:&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-5"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     location: place on the x-axis for the line&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-6"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     color (str): line-color for the line&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-7"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    Returns:&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-8"&gt;&lt;/a&gt;&lt;span class="sd"&gt;     Span at index&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-9"&gt;&lt;/a&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-10"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Span&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-11"&gt;&lt;/a&gt;        &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-12"&gt;&lt;/a&gt;        &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-13"&gt;&lt;/a&gt;        &lt;span class="n"&gt;dimension&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_fad287d6047f4e6ebee448e1a4fae050-14"&gt;&lt;/a&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="make-verticals"&gt;
&lt;h4&gt;Make Verticals&lt;/h4&gt;
&lt;p&gt;Since there's more than one line, this function adds all the lines.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_verticals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-2"&gt;&lt;/a&gt;    &lt;span class="sd"&gt;"""makes the verticals and adds them to the figures"""&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_vertical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-4"&gt;&lt;/a&gt;        &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unemployment_peaks&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;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-5"&gt;&lt;/a&gt;        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"darkorange"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-6"&gt;&lt;/a&gt;    &lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_vertical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-8"&gt;&lt;/a&gt;        &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s_and_p_nadir&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;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-9"&gt;&lt;/a&gt;        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"crimson"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_vertical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-11"&gt;&lt;/a&gt;        &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;housing_nadir&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;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-12"&gt;&lt;/a&gt;        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"limegreen"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_vertical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-14"&gt;&lt;/a&gt;        &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;scale_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;national_peak&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;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-15"&gt;&lt;/a&gt;        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"grey"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a name="rest_code_153598f0d7f04e17913fb37f0b4e95bd-16"&gt;&lt;/a&gt;    &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="the-figures"&gt;
&lt;h3&gt;The Figures&lt;/h3&gt;
&lt;p&gt;This plot has three sub-figures, each of which is created separately then added to the &lt;tt class="docutils literal"&gt;Column&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="section" id="unemployment"&gt;
&lt;h4&gt;Unemployment&lt;/h4&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_tools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plot_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FIGURE_WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plot_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FIGURE_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;x_axis_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"datetime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Portland Unemployment (2007-2017)"&lt;/span&gt;
&lt;a name="rest_code_2bc8c815bf3d4f789b5af2fcda943dcb-8"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Next the lines for the time-series data are added.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-2"&gt;&lt;/a&gt;    &lt;span class="s2"&gt;"month_data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"unemployment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-3"&gt;&lt;/a&gt;    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;portland_source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-4"&gt;&lt;/a&gt;    &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PORTLAND_COLOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PORTLAND_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-6"&gt;&lt;/a&gt;          &lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-7"&gt;&lt;/a&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-8"&gt;&lt;/a&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-9"&gt;&lt;/a&gt;    &lt;span class="s2"&gt;"month_data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"unemployment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;national_source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NATIONAL_COLOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NATIONAL_LABEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_daa52556f183451c9f5cbdb9c218494d-13"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Now the recession-box and high and low points for each plot is added.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_3911a35ae6af46b3ae37a99f8d6263d4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_recession&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_3911a35ae6af46b3ae37a99f8d6263d4-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;make_verticals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Now some labels are added and the grid is turned off.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_0d99d4a80ad74a75974d96f13088cc19-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"% Unemployment"&lt;/span&gt;
&lt;a name="rest_code_0d99d4a80ad74a75974d96f13088cc19-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Month"&lt;/span&gt;
&lt;a name="rest_code_0d99d4a80ad74a75974d96f13088cc19-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xgrid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;a name="rest_code_0d99d4a80ad74a75974d96f13088cc19-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ygrid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="s-p-500"&gt;
&lt;h4&gt;S &amp;amp; P 500&lt;/h4&gt;
&lt;p&gt;The S &amp;amp; P 500 had didn't have unemployment as the dependent variable so I made a different set of tools to change the label for the hover.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HoverTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tooltips&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-2"&gt;&lt;/a&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@month_label"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-3"&gt;&lt;/a&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@value"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;CrosshairTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;PanTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ResetTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ResizeTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SaveTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;UndoTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;WheelZoomTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-14"&gt;&lt;/a&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-15"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plot_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FIGURE_WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-17"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plot_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FIGURE_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-18"&gt;&lt;/a&gt;    &lt;span class="n"&gt;x_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-19"&gt;&lt;/a&gt;    &lt;span class="n"&gt;x_axis_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"datetime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-20"&gt;&lt;/a&gt;    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-21"&gt;&lt;/a&gt;    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"S &amp;amp; P 500 Index"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-22"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-23"&gt;&lt;/a&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"month_data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-24"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s_and_p_source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-25"&gt;&lt;/a&gt;                    &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;S_AND_P_COLOR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-26"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_recession&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-27"&gt;&lt;/a&gt;&lt;span class="n"&gt;make_verticals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-28"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"S &amp;amp; P 500 Valuation"&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-29"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Month"&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-30"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xgrid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-31"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ygrid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;a name="rest_code_af1fb1c9b24244fbba92e5a3fdbe0966-32"&gt;&lt;/a&gt;&lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bottom_right"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="housing"&gt;
&lt;h4&gt;Housing&lt;/h4&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HoverTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tooltips&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-2"&gt;&lt;/a&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@month_label"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-3"&gt;&lt;/a&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Price"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@price"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-5"&gt;&lt;/a&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;CrosshairTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-8"&gt;&lt;/a&gt;    &lt;span class="n"&gt;PanTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ResetTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;ResizeTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-11"&gt;&lt;/a&gt;    &lt;span class="n"&gt;SaveTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-12"&gt;&lt;/a&gt;    &lt;span class="n"&gt;UndoTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-13"&gt;&lt;/a&gt;    &lt;span class="n"&gt;WheelZoomTool&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-14"&gt;&lt;/a&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-15"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plot_width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FIGURE_WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-17"&gt;&lt;/a&gt;    &lt;span class="n"&gt;plot_height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FIGURE_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-18"&gt;&lt;/a&gt;    &lt;span class="n"&gt;x_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-19"&gt;&lt;/a&gt;    &lt;span class="n"&gt;x_axis_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"datetime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-20"&gt;&lt;/a&gt;    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-21"&gt;&lt;/a&gt;    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"House Price Index"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-22"&gt;&lt;/a&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-23"&gt;&lt;/a&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"month_data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-24"&gt;&lt;/a&gt;                           &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;housing_source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-25"&gt;&lt;/a&gt;                           &lt;span class="n"&gt;line_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HOUSING_COLOR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-26"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_recession&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-27"&gt;&lt;/a&gt;&lt;span class="n"&gt;make_verticals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-28"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Sale Price ($1,000)"&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-29"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Month"&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-30"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xgrid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-31"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ygrid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;a name="rest_code_e8c2026d5451488292ad21b127b65a8b-32"&gt;&lt;/a&gt;&lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bottom_right"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="combining"&gt;
&lt;h3&gt;Combining&lt;/h3&gt;
&lt;p&gt;Once the figures were created I combined them into a &lt;tt class="docutils literal"&gt;column&lt;/tt&gt;, since I wanted them stacked verticallly.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_7f9a96af6524449babcfe03399e43b8d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;combined&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unemployment_figure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s_and_p_figure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;housing_figure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="outputting-the-code"&gt;
&lt;h3&gt;Outputting The Code&lt;/h3&gt;
&lt;p&gt;In order to be able to embed the code, you need to have bokeh export it. There are multiple ways to do this, but I chose the &lt;tt class="docutils literal"&gt;autoload_static&lt;/tt&gt; method.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_7915c39cbee2401f8cf94bf97e6a06a3-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;OUTPUT_JAVASCRIPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"portland_unemployment.js"&lt;/span&gt;
&lt;a name="rest_code_7915c39cbee2401f8cf94bf97e6a06a3-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;autoload_static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CDN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT_JAVASCRIPT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;The third argument (&lt;tt class="docutils literal"&gt;OUTPUT_JAVASCRIPT&lt;/tt&gt;) is the path you want to refer to in the tag. The returned &lt;tt class="docutils literal"&gt;js&lt;/tt&gt; variable contains the javascript you need to save (using the filename you gave &lt;tt class="docutils literal"&gt;autoload_static&lt;/tt&gt;) and the &lt;tt class="docutils literal"&gt;tag&lt;/tt&gt; contains the HTML tag that you embed to let the server know you want to use the javascript that was saved.&lt;/p&gt;
&lt;p&gt;Since both values are just strings, and nothing was saved to disk, I saved it for later.&lt;/p&gt;
&lt;pre class="code python"&gt;&lt;a name="rest_code_d5c6a9157d664f8ebee6661ef66261d8-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OUTPUT_JAVASCRIPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_d5c6a9157d664f8ebee6661ef66261d8-2"&gt;&lt;/a&gt;    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_d5c6a9157d664f8ebee6661ef66261d8-3"&gt;&lt;/a&gt;
&lt;a name="rest_code_d5c6a9157d664f8ebee6661ef66261d8-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"portland_tag.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_d5c6a9157d664f8ebee6661ef66261d8-5"&gt;&lt;/a&gt;    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="getting-it-into-nikola"&gt;
&lt;h3&gt;Getting It Into Nikola&lt;/h3&gt;
&lt;p&gt;The first thing was to create this file using &lt;tt class="docutils literal"&gt;nikola new_post&lt;/tt&gt; (it's called bokeh-test.rst). Next I created a directory in the &lt;tt class="docutils literal"&gt;files&lt;/tt&gt; folder that had the same name as this file (without the ".rst" extension) to put the javascript in so nikola would find it when I built the HTML.&lt;/p&gt;
&lt;pre class="code bash"&gt;&lt;a name="rest_code_3612d3ea9550434c9b0bdc024a3b44c0-1"&gt;&lt;/a&gt;mkdir files/posts/bokeh-test
&lt;/pre&gt;&lt;p&gt;Once I copied the &lt;tt class="docutils literal"&gt;portland_unemployment.js&lt;/tt&gt; file to the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;bokeh-test&lt;/span&gt;&lt;/tt&gt; directory I opened the &lt;tt class="docutils literal"&gt;portland_tag.html&lt;/tt&gt; file and embedded it directly into the post sing the &lt;tt class="docutils literal"&gt;raw&lt;/tt&gt; restructureText directive.&lt;/p&gt;
&lt;pre class="code rst"&gt;&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="ow"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; html
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-2"&gt;&lt;/a&gt;
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-3"&gt;&lt;/a&gt;   &amp;lt;script
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-4"&gt;&lt;/a&gt;       src="portland_unemployment.js"
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-5"&gt;&lt;/a&gt;       id="686c5dd6-168a-4f7d-acbc-524875d93b59"
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-6"&gt;&lt;/a&gt;       data-bokeh-model-id="c473232a-dc2c-4b75-988c-f9bc6517b4b9"
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-7"&gt;&lt;/a&gt;       data-bokeh-doc-id="402d8e3c-1595-4d65-9f76-e11068c629ab"
&lt;a name="rest_code_48c6770af9ce4b528c1dabf1c1e2cc3c-8"&gt;&lt;/a&gt;   &amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;</description><category>bokeh plotting</category><guid>https://necromuralist.github.io/data_science/posts/bokeh-test/</guid><pubDate>Wed, 24 May 2017 19:29:09 GMT</pubDate></item></channel></rss>