{ "cells": [ { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "f55a3b6a-a524-4ff2-a40b-d201bba24623" } }, "source": [ "## String Manipulations" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import re" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "nbpresent": { "id": "6ff7a725-0585-44db-82bf-7fd37aa6adf5" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a, b, guido , bajo\n" ] } ], "source": [ "val = 'a, b, guido , bajo'\n", "print(val)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "nbpresent": { "id": "675319a6-254f-4ed3-95e9-fc68682be8c6" } }, "outputs": [ { "data": { "text/plain": [ "['a', 'b', 'guido', 'bajo']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# splitting the data by , and strip the whitespace\n", "val2 = [x.strip() for x in val.split(',')]\n", "val2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "nbpresent": { "id": "c477e6d7-c0c1-482a-96bc-9a314e293520" } }, "outputs": [ { "data": { "text/plain": [ "'a::b::guido'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# tuple assignment\n", "first, second, third, four = val2\n", "first + \"::\" + second + \"::\" + third" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "nbpresent": { "id": "6cd14da3-b1ec-42c0-b305-a79081db3cbe" } }, "outputs": [ { "data": { "text/plain": [ "'a::b::guido::bajo'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# practical method is join\n", "\"::\".join(val2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "nbpresent": { "id": "1ad63279-83e3-4d4e-bab7-4dee2d472b0c" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# checking if guido is in val2\n", "'guido' in val2" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "nbpresent": { "id": "aa870d0b-81cf-4eae-bbd7-dea89e6c2e85" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "index 1\n", "find 1\n" ] } ], "source": [ "# searching in string\n", "print(\"index\",val.index(','))\n", "print(\"find\",val.find(','))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "nbpresent": { "id": "855d6c92-6edd-467a-b096-59d5a8dab53b" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "find -1\n" ] } ], "source": [ "print(\"find\",val.find(':')) # find and index behave same if string is available\n", "# print(\"index\",val.index(':')) # index throws an exception where find returns -1" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "nbpresent": { "id": "c82e217b-78ad-445e-a9d6-a3b2d94c9b2c" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ", -- 3 \n", "a -- 2\n" ] } ], "source": [ "# get string counts\n", "print(\", -- \", val.count(','),\"\\n\"\n", " \"a --\", val.count('a'))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "nbpresent": { "id": "173de4bb-6a63-4594-b3bb-76314ca45d11" } }, "outputs": [ { "data": { "text/plain": [ "'a:: b:: guido :: bajo'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# replace will substitute occurrences of one pattern for another. This is commonly used\n", "# to delete patterns, too, by passing an empty string:\n", "val.replace(',', '::')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "nbpresent": { "id": "44582def-9bec-4ee5-96d8-507e7873442f" } }, "outputs": [ { "data": { "text/plain": [ "'a b guido bajo'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "val.replace(',', '')" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "37d0af44-e133-42aa-981f-25681a03a325" } }, "source": [ "### Python built-in string methods\n", "\n", "```\n", "count Return the number of non-overlapping occurrences of substring in the string.\n", "endswith, startswith Returns True if string ends with suffix (starts with prefix).\n", "join Use string as delimiter for concatenating a sequence of other strings.\n", "index Return position of first character in substring if found in the string. Raises ValueError if not found.\n", "find Return position of first character of first occurrence of substring in the string. Like index, but returns -1 if not found.\n", "rfind Return position of first character of last occurrence of substring in the string. Returns -1 if not found.\n", "replace Replace occurrences of string with another string.\n", "strip, rstrip, lstrip Trim whitespace, including newlines; equivalent to x.strip() (and rstrip, lstrip, respectively) for each element.\n", "split Break string into list of substrings using passed delimiter.\n", "lower, upper Convert alphabet characters to lowercase or uppercase, respectively.\n", "ljust, rjust Left justify or right justify, respectively. Pad opposite side of string with spaces (or some other fill character) to return a string with a minimum width\n", "```" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "f2927429-9669-4ba9-8be3-fb3373d8d2f5" } }, "source": [ "### Regular expressions" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true, "nbpresent": { "id": "20a1b4c7-d63f-4d16-9519-73e950758d52" } }, "outputs": [], "source": [ "import re" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "nbpresent": { "id": "ece8e5b6-6f1c-4bd8-9a2f-10f0497255d8" } }, "outputs": [ { "data": { "text/plain": [ "'foo bar\\t baz \\tqux'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "text = \"foo bar\\t baz \\tqux\"\n", "text" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "nbpresent": { "id": "bfe92638-89ca-4e2a-a4f5-2fbefa73fa64" } }, "outputs": [ { "data": { "text/plain": [ "['foo', 'bar', 'baz', 'qux']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "re.split('\\s+', text)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "nbpresent": { "id": "8230ba10-4154-4b17-9919-0a74582c922a" } }, "outputs": [ { "data": { "text/plain": [ "['foo', 'bar', 'baz', 'qux']" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compiled version of regex\n", "regex = re.compile('\\s+')\n", "regex.split(text)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "nbpresent": { "id": "88648d83-f21b-480a-8e0b-75f71bbad86e" } }, "outputs": [ { "data": { "text/plain": [ "[' ', '\\t ', ' \\t']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# to get a list of all patterns matching the regex, you can use the findall method:\n", "regex.findall(text)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true, "nbpresent": { "id": "aaf62876-f303-46f1-987a-dd31a7495b7d" } }, "outputs": [], "source": [ "# match and search are closely related to findall. While findall returns all matches in a\n", "# string, search returns only the first match. More rigidly, match only matches at the\n", "# beginning of the string.\n", "\n", "text = \"\"\"Dave dave@google.com\n", "Steve steve@gmail.com\n", "Rob rob@gmail.com\n", "Ryan ryan@yahoo.com\n", "\"\"\"\n", "\n", "pattern = r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}'" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true, "nbpresent": { "id": "e9290445-2771-4b7a-9029-0301a33890ec" } }, "outputs": [], "source": [ "# re.IGNORECASE makes the regex case-insensitive\n", "regex = re.compile(pattern, flags=re.IGNORECASE)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "nbpresent": { "id": "61b38434-60e1-4357-9225-a71b79e463ea" } }, "outputs": [ { "data": { "text/plain": [ "['dave@google.com', 'steve@gmail.com', 'rob@gmail.com', 'ryan@yahoo.com']" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regex.findall(text)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "nbpresent": { "id": "57e830be-70e8-4385-9ba7-3e7e7f26b92c" } }, "outputs": [ { "data": { "text/plain": [ "<_sre.SRE_Match object; span=(5, 20), match='dave@google.com'>" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# search returns a special match object for the first email address in the text. For the\n", "# above regex, the match object can only tell us the start and end position of the pattern\n", "# in the string:\n", "\n", "m = regex.search(text)\n", "m" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "nbpresent": { "id": "e8305fa9-30bb-4765-ab91-b6e947ba52a1" } }, "outputs": [ { "data": { "text/plain": [ "'dave@google.com'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "text[m.start():m.end()]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "nbpresent": { "id": "631d33ee-6b5c-4f47-a688-8fd96eea0749" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n" ] } ], "source": [ "# regex.match returns None, as it only will match if the pattern occurs at the start of the string:\n", "\n", "print(regex.match(text))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "nbpresent": { "id": "507243ad-0b49-4a15-91a8-609b423e8021" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dave REDACTED\n", "Steve REDACTED\n", "Rob REDACTED\n", "Ryan REDACTED\n", "\n" ] } ], "source": [ "# sub will return a new string with occurrences of the pattern replaced by the a new string:\n", "\n", "print (regex.sub('REDACTED', text))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true, "nbpresent": { "id": "eb9fdad3-ec25-4a54-b478-cfb5d277e782" } }, "outputs": [], "source": [ "# to find email addresses and simultaneously segment each address\n", "# into its 3 components: username, domain name, and domain suffix. \n", "# To do this, put parentheses around the parts of the pattern to segment:\n", "\n", "pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\\.([A-Z]{2,4})'" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true, "nbpresent": { "id": "2615f8fc-5605-4340-a5cd-0a9f9b920f92" } }, "outputs": [], "source": [ "regex = re.compile(pattern, flags=re.IGNORECASE)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true, "nbpresent": { "id": "308583c3-a0ea-423f-8b3e-5da131fe1663" } }, "outputs": [], "source": [ "# A match object produced by this modified regex returns a tuple of the pattern components\n", "# with its groups method\n", "\n", "m = regex.match('wesm@bright.net')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "nbpresent": { "id": "a3955523-31a8-40be-81ca-fbfc9e50b95b" } }, "outputs": [ { "data": { "text/plain": [ "('wesm', 'bright', 'net')" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.groups()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "nbpresent": { "id": "6d60a737-3c21-4c07-b9d6-65843a8dbf4e" } }, "outputs": [ { "data": { "text/plain": [ "[('dave', 'google', 'com'),\n", " ('steve', 'gmail', 'com'),\n", " ('rob', 'gmail', 'com'),\n", " ('ryan', 'yahoo', 'com')]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# findall returns a list of tuples when the pattern has groups:\n", "regex.findall(text)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "nbpresent": { "id": "b7ef23d5-fc8a-452c-9ad1-49d4feb2353c" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dave Username: dave, Domain: google, Suffix: com\n", "Steve Username: steve, Domain: gmail, Suffix: com\n", "Rob Username: rob, Domain: gmail, Suffix: com\n", "Ryan Username: ryan, Domain: yahoo, Suffix: com\n", "\n" ] } ], "source": [ "# sub also has access to groups in each match using special symbols like \\1, \\2, etc.:\n", "print (regex.sub(r'Username: \\1, Domain: \\2, Suffix: \\3', text))" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "1b3ec19c-e4bd-42e5-bdc8-fa1321208fef" } }, "source": [ "#### Regular expression methods\n", "\n", "```\n", "findall, finditer Return all non-overlapping matching patterns in a string. findall returns a list of all patterns while finditer returns them one by one from an iterator.\n", "match Match pattern at start of string and optionally segment pattern components into groups. If the pattern matches, returns a match object, otherwise None.\n", "search Scan string for match to pattern; returning a match object if so. Unlike match, the match can be anywhere in the string as opposed to only at the beginning.\n", "split Break string into pieces at each occurrence of pattern.\n", "sub, subn Replace all (sub) or first n occurrences (subn) of pattern in string with replacement expression. Use symbols \\1, \\2, ... to refer to match group elements in the replacement string.\n", "```" ] }, { "cell_type": "markdown", "metadata": { "nbpresent": { "id": "61018ee3-b2bb-4937-88f8-0b13b8d6caec" } }, "source": [ "### Vectorized string functions in pandas" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "nbpresent": { "id": "644cbd94-16f8-4ecf-b06a-3cd9155c8f9b" } }, "outputs": [ { "data": { "text/plain": [ "Dave dave@google.com\n", "Rob rob@gmail.com\n", "Steve steve@gmail.com\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = {'Dave': 'dave@google.com', 'Steve': 'steve@gmail.com',\n", " 'Rob': 'rob@gmail.com', 'Wes': np.nan}\n", "data = pd.Series(data)\n", "data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Dave False\n", "Rob True\n", "Steve True\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# String and regular expression methods can be applied (passing a lambda or other function) \n", "# to each value using data.map, but it will fail on the NA. To cope with this, Series\n", "# has concise methods for string operations that skip NA values. These are accessed\n", "# through Series’s str attribute; for example, we could check whether each email address\n", "# has 'gmail' in it with str.contains:\n", "data.str.contains('gmail')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Dave [(dave, google, com)]\n", "Rob [(rob, gmail, com)]\n", "Steve [(steve, gmail, com)]\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pattern = '([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\\\\.([A-Z]{2,4})'\n", "\n", "data.str.findall(pattern, flags=re.IGNORECASE)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\tools\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:4: FutureWarning: In future versions of pandas, match will change to always return a bool indexer.\n" ] }, { "data": { "text/plain": [ "Dave (dave, google, com)\n", "Rob (rob, gmail, com)\n", "Steve (steve, gmail, com)\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# There are a couple of ways to do vectorized element retrieval. Either use str.get or\n", "# index into the str attribute:\n", "\n", "matches = data.str.match(pattern, flags=re.IGNORECASE)\n", "matches" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Dave google\n", "Rob gmail\n", "Steve gmail\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matches.str.get(1) " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Dave dave\n", "Rob rob\n", "Steve steve\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matches.str[0]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Dave dave@\n", "Rob rob@g\n", "Steve steve\n", "Wes NaN\n", "dtype: object" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.str[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Vectorized string method\n", "\n", "```\n", "cat Concatenate strings element-wise with optional delimiter\n", "contains Return boolean array if each string contains pattern/regex\n", "count Count occurrences of pattern\n", "endswith, startswith Equivalent to x.endswith(pattern) or x.startswith(pattern) for each element.\n", "findall Compute list of all occurrences of pattern/regex for each string get Index into each element (retrieve i-th element)\n", "join Join strings in each element of the Series with passed separator\n", "len Compute length of each string\n", "lower, upper Convert cases; equivalent to x.lower() or x.upper() for each element.\n", "match Use re.match with the passed regular expression on each element, returning matched groups as list.\n", "pad Add whitespace to left, right, or both sides of strings\n", "center Equivalent to pad(side='both')\n", "repeat Duplicate values; for example s.str.repeat(3) equivalent to x * 3 for each string.\n", "replace Replace occurrences of pattern/regex with some other string\n", "slice Slice each string in the Series.\n", "split Split strings on delimiter or regular expression\n", "strip, rstrip, lstrip Trim whitespace, including newlines; equivalent to x.strip() (and rstrip, lstrip, respectively) for each element.\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "nbpresent": { "slides": { "030c834c-c187-44ea-b809-40e873ce39a1": { "id": "030c834c-c187-44ea-b809-40e873ce39a1", "prev": "5d60db87-b1fd-454b-aa8d-c6e59f1bf5d9", "regions": { "169027f0-ee6f-4890-84b7-4882f70f1ca7": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "61b38434-60e1-4357-9225-a71b79e463ea", "part": "whole" }, "id": "169027f0-ee6f-4890-84b7-4882f70f1ca7" } } }, "05d5f182-d266-4847-b38b-cf81a7b6a1d7": { "id": "05d5f182-d266-4847-b38b-cf81a7b6a1d7", "prev": "5bca44c5-05eb-4698-ae63-b4f61c1e1c44", "regions": { "a0290ddb-22a7-498e-b9c4-dd7d95ba4428": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "88648d83-f21b-480a-8e0b-75f71bbad86e", "part": "whole" }, "id": "a0290ddb-22a7-498e-b9c4-dd7d95ba4428" } } }, "085ea5bc-3991-446b-8fd3-2c0f7ebec63b": { "id": "085ea5bc-3991-446b-8fd3-2c0f7ebec63b", "prev": "fb1a779e-881c-4970-a96d-960bd069cf56", "regions": { "aaa6da21-9a64-4aa0-a96b-421010b269d2": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "37d0af44-e133-42aa-981f-25681a03a325", "part": "whole" }, "id": "aaa6da21-9a64-4aa0-a96b-421010b269d2" } } }, "2081af60-f126-4e0e-9080-699969da5ce6": { "id": "2081af60-f126-4e0e-9080-699969da5ce6", "prev": "3956abbc-1c31-4dbe-9cdf-25953651a2a2", "regions": { "f22ab161-c61c-4b62-9045-00899639da0b": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "c82e217b-78ad-445e-a9d6-a3b2d94c9b2c", "part": "whole" }, "id": "f22ab161-c61c-4b62-9045-00899639da0b" } } }, "2ec8b8aa-7c6e-405b-839c-c19562815226": { "id": "2ec8b8aa-7c6e-405b-839c-c19562815226", "prev": "adff8582-a7c4-4361-9423-e93098b9e47e", "regions": { "621f0d3b-93d3-41ed-a347-2dbc43bdfd32": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "644cbd94-16f8-4ecf-b06a-3cd9155c8f9b", "part": "whole" }, "id": "621f0d3b-93d3-41ed-a347-2dbc43bdfd32" } } }, "32f4230d-3470-4fde-96c3-29796c8bd998": { "id": "32f4230d-3470-4fde-96c3-29796c8bd998", "prev": "761a6622-413e-4286-816c-81d49fde7c6d", "regions": { "78d3ecaf-3208-4aad-9626-5211b11bb184": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "eb9fdad3-ec25-4a54-b478-cfb5d277e782", "part": "whole" }, "id": "78d3ecaf-3208-4aad-9626-5211b11bb184" } } }, "33af25c7-0396-4484-8db7-5cfa931392be": { "id": "33af25c7-0396-4484-8db7-5cfa931392be", "prev": "9e8d0fd9-c8e7-493f-b82b-153b30b9d9e2", "regions": { "452f20a6-848d-454b-a6ec-8c5e1ea1012e": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "631d33ee-6b5c-4f47-a688-8fd96eea0749", "part": "whole" }, "id": "452f20a6-848d-454b-a6ec-8c5e1ea1012e" } } }, "3956abbc-1c31-4dbe-9cdf-25953651a2a2": { "id": "3956abbc-1c31-4dbe-9cdf-25953651a2a2", "prev": "a62baf50-fbe2-4e30-b7b1-855b11647335", "regions": { "0b81c58e-cf52-42a9-9122-d14468061a98": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "855d6c92-6edd-467a-b096-59d5a8dab53b", "part": "whole" }, "id": "0b81c58e-cf52-42a9-9122-d14468061a98" } } }, "3cec3a19-19c5-46b0-8f01-a32a5a520f13": { "id": "3cec3a19-19c5-46b0-8f01-a32a5a520f13", "prev": "b17f22da-f3f6-41e9-b699-6348d3ee5fcf", "regions": { "c9944a0a-045b-4667-be69-fc8fa17bd164": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "308583c3-a0ea-423f-8b3e-5da131fe1663", "part": "whole" }, "id": "c9944a0a-045b-4667-be69-fc8fa17bd164" } } }, "44b8fc27-ae4c-42d2-8ae8-a1080daa5cde": { "id": "44b8fc27-ae4c-42d2-8ae8-a1080daa5cde", "prev": "8d8c88b7-96ee-4c47-8474-c01006370953", "regions": { "2ef8bda6-61d2-480a-99a9-c176dd9dec70": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "675319a6-254f-4ed3-95e9-fc68682be8c6", "part": "whole" }, "id": "2ef8bda6-61d2-480a-99a9-c176dd9dec70" } } }, "48f8481a-3cdf-4a5e-b2bd-ee185b3bbac9": { "id": "48f8481a-3cdf-4a5e-b2bd-ee185b3bbac9", "prev": "05d5f182-d266-4847-b38b-cf81a7b6a1d7", "regions": { "8367156f-1231-4114-aa17-6f7a887e89db": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "aaf62876-f303-46f1-987a-dd31a7495b7d", "part": "whole" }, "id": "8367156f-1231-4114-aa17-6f7a887e89db" } } }, "497c0a29-0aec-44a1-b8f2-8865e1e544ed": { "id": "497c0a29-0aec-44a1-b8f2-8865e1e544ed", "prev": "9562f51a-ce6d-414d-b2af-560f3d269ffb", "regions": { "6ec114a3-ba67-4a67-98bf-b9ebd1a91018": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "20a1b4c7-d63f-4d16-9519-73e950758d52", "part": "whole" }, "id": "6ec114a3-ba67-4a67-98bf-b9ebd1a91018" } } }, "5bca44c5-05eb-4698-ae63-b4f61c1e1c44": { "id": "5bca44c5-05eb-4698-ae63-b4f61c1e1c44", "prev": "a157ba1a-6b85-4199-a919-cc36dc833cb6", "regions": { "af6c9766-1248-4cef-a348-e6567e3a7308": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "8230ba10-4154-4b17-9919-0a74582c922a", "part": "whole" }, "id": "af6c9766-1248-4cef-a348-e6567e3a7308" } } }, "5d60db87-b1fd-454b-aa8d-c6e59f1bf5d9": { "id": "5d60db87-b1fd-454b-aa8d-c6e59f1bf5d9", "prev": "48f8481a-3cdf-4a5e-b2bd-ee185b3bbac9", "regions": { "18ca3063-258b-4daf-8e8c-99d238111f52": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "e9290445-2771-4b7a-9029-0301a33890ec", "part": "whole" }, "id": "18ca3063-258b-4daf-8e8c-99d238111f52" } } }, "60bba2ed-db51-411d-9c9a-e2fe31240768": { "id": "60bba2ed-db51-411d-9c9a-e2fe31240768", "prev": "2081af60-f126-4e0e-9080-699969da5ce6", "regions": { "89752051-08d5-4858-9a17-1bfbd3ed9c81": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "173de4bb-6a63-4594-b3bb-76314ca45d11", "part": "whole" }, "id": "89752051-08d5-4858-9a17-1bfbd3ed9c81" } } }, "6137d5fc-7bd9-4251-b705-8068fbdc55d7": { "id": "6137d5fc-7bd9-4251-b705-8068fbdc55d7", "prev": "616d6434-da70-4698-a81f-738d24e07d53", "regions": { "a34698f6-2b07-40f4-8b2b-ae4f318ef02b": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6d60a737-3c21-4c07-b9d6-65843a8dbf4e", "part": "whole" }, "id": "a34698f6-2b07-40f4-8b2b-ae4f318ef02b" } } }, "616d6434-da70-4698-a81f-738d24e07d53": { "id": "616d6434-da70-4698-a81f-738d24e07d53", "prev": "3cec3a19-19c5-46b0-8f01-a32a5a520f13", "regions": { "5d50a38b-bc03-4d5c-9ff9-737c077e9fae": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "a3955523-31a8-40be-81ca-fbfc9e50b95b", "part": "whole" }, "id": "5d50a38b-bc03-4d5c-9ff9-737c077e9fae" } } }, "6f108806-30f9-4fec-afc6-1b2c0c279664": { "id": "6f108806-30f9-4fec-afc6-1b2c0c279664", "prev": "497c0a29-0aec-44a1-b8f2-8865e1e544ed", "regions": { "669ff06d-4b29-426f-9a32-ccccd9e71139": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "ece8e5b6-6f1c-4bd8-9a2f-10f0497255d8", "part": "whole" }, "id": "669ff06d-4b29-426f-9a32-ccccd9e71139" } } }, "761a6622-413e-4286-816c-81d49fde7c6d": { "id": "761a6622-413e-4286-816c-81d49fde7c6d", "prev": "33af25c7-0396-4484-8db7-5cfa931392be", "regions": { "6d60c72f-b1d6-4dd1-b6ce-fa5ff0b934a0": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "507243ad-0b49-4a15-91a8-609b423e8021", "part": "whole" }, "id": "6d60c72f-b1d6-4dd1-b6ce-fa5ff0b934a0" } } }, "7f747033-aed7-4cf7-8837-666df11fa6ec": { "id": "7f747033-aed7-4cf7-8837-666df11fa6ec", "prev": "ab27bd08-25e8-459a-90e5-dec6e0d1a2a1", "regions": { "72a329df-e333-45b2-8679-f09fc463e398": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "1ad63279-83e3-4d4e-bab7-4dee2d472b0c", "part": "whole" }, "id": "72a329df-e333-45b2-8679-f09fc463e398" } } }, "85c44869-7e1f-4fc0-9d6b-5efb38909d3e": { "id": "85c44869-7e1f-4fc0-9d6b-5efb38909d3e", "prev": "44b8fc27-ae4c-42d2-8ae8-a1080daa5cde", "regions": { "3f0d9796-cd27-4c3d-a185-b94da7ea64c3": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "c477e6d7-c0c1-482a-96bc-9a314e293520", "part": "whole" }, "id": "3f0d9796-cd27-4c3d-a185-b94da7ea64c3" } } }, "8d8c88b7-96ee-4c47-8474-c01006370953": { "id": "8d8c88b7-96ee-4c47-8474-c01006370953", "prev": "e6292284-76ce-435f-9d6b-cda4d920e59b", "regions": { "c82e0b9d-56bf-4b48-9ebc-95d8afd99eb8": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6ff7a725-0585-44db-82bf-7fd37aa6adf5", "part": "whole" }, "id": "c82e0b9d-56bf-4b48-9ebc-95d8afd99eb8" } } }, "9562f51a-ce6d-414d-b2af-560f3d269ffb": { "id": "9562f51a-ce6d-414d-b2af-560f3d269ffb", "prev": "085ea5bc-3991-446b-8fd3-2c0f7ebec63b", "regions": { "e38b10f8-5ba7-414e-ba41-36c80f40234a": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "f2927429-9669-4ba9-8be3-fb3373d8d2f5", "part": "whole" }, "id": "e38b10f8-5ba7-414e-ba41-36c80f40234a" } } }, "9e8d0fd9-c8e7-493f-b82b-153b30b9d9e2": { "id": "9e8d0fd9-c8e7-493f-b82b-153b30b9d9e2", "prev": "c2307696-c250-460e-aa9b-1e6552aa01eb", "regions": { "64a6d996-76dd-4b0a-9549-4c867b4b9e86": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "e8305fa9-30bb-4765-ab91-b6e947ba52a1", "part": "whole" }, "id": "64a6d996-76dd-4b0a-9549-4c867b4b9e86" } } }, "a157ba1a-6b85-4199-a919-cc36dc833cb6": { "id": "a157ba1a-6b85-4199-a919-cc36dc833cb6", "prev": "6f108806-30f9-4fec-afc6-1b2c0c279664", "regions": { "0cce6903-4090-4875-b4e9-81f32c097836": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "bfe92638-89ca-4e2a-a4f5-2fbefa73fa64", "part": "whole" }, "id": "0cce6903-4090-4875-b4e9-81f32c097836" } } }, "a62baf50-fbe2-4e30-b7b1-855b11647335": { "id": "a62baf50-fbe2-4e30-b7b1-855b11647335", "prev": "7f747033-aed7-4cf7-8837-666df11fa6ec", "regions": { "e5cfd21e-c75e-4846-8c84-538bcf034ead": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "aa870d0b-81cf-4eae-bbd7-dea89e6c2e85", "part": "whole" }, "id": "e5cfd21e-c75e-4846-8c84-538bcf034ead" } } }, "ab27bd08-25e8-459a-90e5-dec6e0d1a2a1": { "id": "ab27bd08-25e8-459a-90e5-dec6e0d1a2a1", "prev": "85c44869-7e1f-4fc0-9d6b-5efb38909d3e", "regions": { "7e32f070-da93-495d-885e-ee65c7f39d5b": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6cd14da3-b1ec-42c0-b305-a79081db3cbe", "part": "whole" }, "id": "7e32f070-da93-495d-885e-ee65c7f39d5b" } } }, "accdfb75-1442-48d9-8e63-bd8db5f50ed1": { "id": "accdfb75-1442-48d9-8e63-bd8db5f50ed1", "prev": "6137d5fc-7bd9-4251-b705-8068fbdc55d7", "regions": { "3b3939b0-93f3-4dff-9008-8b16aedc113e": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "b7ef23d5-fc8a-452c-9ad1-49d4feb2353c", "part": "whole" }, "id": "3b3939b0-93f3-4dff-9008-8b16aedc113e" } } }, "adff8582-a7c4-4361-9423-e93098b9e47e": { "id": "adff8582-a7c4-4361-9423-e93098b9e47e", "prev": "b0b82203-1837-4402-9824-239fc3efa35a", "regions": { "bc2e9e56-0e98-4556-8bf2-25612123d307": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "61018ee3-b2bb-4937-88f8-0b13b8d6caec", "part": "whole" }, "id": "bc2e9e56-0e98-4556-8bf2-25612123d307" } } }, "b0b82203-1837-4402-9824-239fc3efa35a": { "id": "b0b82203-1837-4402-9824-239fc3efa35a", "prev": "accdfb75-1442-48d9-8e63-bd8db5f50ed1", "regions": { "ba264b7e-bee4-4a61-b8e7-35a7cd4380b4": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "1b3ec19c-e4bd-42e5-bdc8-fa1321208fef", "part": "whole" }, "id": "ba264b7e-bee4-4a61-b8e7-35a7cd4380b4" } } }, "b17f22da-f3f6-41e9-b699-6348d3ee5fcf": { "id": "b17f22da-f3f6-41e9-b699-6348d3ee5fcf", "prev": "32f4230d-3470-4fde-96c3-29796c8bd998", "regions": { "fb099201-d631-4dc9-973a-3bdf332cd050": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "2615f8fc-5605-4340-a5cd-0a9f9b920f92", "part": "whole" }, "id": "fb099201-d631-4dc9-973a-3bdf332cd050" } } }, "c2307696-c250-460e-aa9b-1e6552aa01eb": { "id": "c2307696-c250-460e-aa9b-1e6552aa01eb", "prev": "030c834c-c187-44ea-b809-40e873ce39a1", "regions": { "e34be526-3960-4490-b374-b246a9f469f6": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "57e830be-70e8-4385-9ba7-3e7e7f26b92c", "part": "whole" }, "id": "e34be526-3960-4490-b374-b246a9f469f6" } } }, "e6292284-76ce-435f-9d6b-cda4d920e59b": { "id": "e6292284-76ce-435f-9d6b-cda4d920e59b", "prev": null, "regions": { "c158ff7c-798a-42c0-80fe-9aeea71ba832": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "6ff7a725-0585-44db-82bf-7fd37aa6adf5", "part": "whole" }, "id": "c158ff7c-798a-42c0-80fe-9aeea71ba832" } } }, "fb1a779e-881c-4970-a96d-960bd069cf56": { "id": "fb1a779e-881c-4970-a96d-960bd069cf56", "prev": "60bba2ed-db51-411d-9c9a-e2fe31240768", "regions": { "cbdde187-77be-4021-979a-74d72b182892": { "attrs": { "height": 0.8, "width": 0.8, "x": 0.1, "y": 0.1 }, "content": { "cell": "44582def-9bec-4ee5-96d8-507e7873442f", "part": "whole" }, "id": "cbdde187-77be-4021-979a-74d72b182892" } } } }, "themes": {} } }, "nbformat": 4, "nbformat_minor": 1 }