{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "---\n",
    "\n",
    "Documentation\n",
    "=============\n",
    "\n",
    "In this part I will provide full guide for `lingtypology` package. It is\n",
    "divided into four parts: Installation, Interactive Maps, Glottolog\n",
    "functions and the API for databases.\n",
    "\n",
    "Installation\n",
    "------------\n",
    "\n",
    "The package is uploaded to PyPI software repository, therefore it can be\n",
    "installed with the `pip` utility with the following command:\n",
    "\n",
    "`pip3 install lingtypology –user`\n",
    "\n",
    "Interactive Maps\n",
    "----------------\n",
    "\n",
    "Interactive maps can be created with `lingtypology.maps` module.\n",
    "\n",
    "### LingMap Class\n",
    "\n",
    "*class* lingtypology.maps.**LingMap** *(languages=\\[\\],\n",
    "glottocode=False)*\n",
    "\n",
    "Bases: *object*\n",
    "\n",
    "**Parameters**:\n",
    "\n",
    "**languages**: *list* or *pandas.Series* of strings, default *\\[\\]*.\n",
    "\n",
    "A list of languages. The language names should correspond to their names\n",
    "from Glottolog unless you use *add\\_custom\\_coordinates* method.\n",
    "\n",
    "Instead of language names you could use Glottocodes (language ID in\n",
    "Glottolog). In this case you need to set *glottocode* parameter to true.\n",
    "\n",
    "**glottocode**: *bool*, default *False*.\n",
    "\n",
    "Whether to treat *languages* as Glottocodes.\n",
    "\n",
    "**Attributes**:\n",
    "\n",
    "-   **tiles**: *str*, default *'OpenStreetMap'*\n",
    "\n",
    "    Tiles for the map. You can use one of these tiles (list of tiles is\n",
    "    borrowed from the Folium Documentation:\n",
    "\n",
    "    -   \"OpenStreetMap\"\n",
    "\n",
    "    -   \"Mapbox Bright\" (Limited levels of zoom for free tiles)\n",
    "\n",
    "    -   \"Mapbox Control Room\" (Limited levels of zoom for free tiles)\n",
    "\n",
    "    -   \"Stamen\" (Terrain, Toner, and Watercolor)\n",
    "\n",
    "    -   \"Cloudmade\" (Must pass API key)\n",
    "\n",
    "    -   \"Mapbox\" (Must pass API key)\n",
    "\n",
    "    -   \"CartoDB\" (positron and dark\\_matter)\n",
    "\n",
    "    -   or pass the custum URL.\n",
    "\n",
    "-   **start\\_location**: *(float, float)* or *str*, default *(0, 0)*\n",
    "\n",
    "    Coordinates of the start location for the map *(latitude,\n",
    "    longitude)* or a text shortcut. List of available shortcuts:\n",
    "    *\\\"Central Europe\\\", \\\"Caucasus\\\", \\\"Australia & Oceania\\\", \\\"Papua\n",
    "    New Guinea\\\", \\\"Africa\\\", \\\"Asia\\\", \\\"North America\\\", \\\"Central\n",
    "    America\\\", \\\"South America\\\"*.\n",
    "\n",
    "-   **start\\_zoom**: *int*, default *2*\n",
    "\n",
    "    Initial zoom level. Bypassed if you are using a shortcut\n",
    "    *start\\_location*.\n",
    "\n",
    "-   **control\\_scale**: *bool*, default *True*\n",
    "\n",
    "    Whether to add control scale.\n",
    "\n",
    "-   **prefer\\_canvas**: *bool*, default *False*\n",
    "\n",
    "    Use canvas instead of SVG. If set to True, the map may be more\n",
    "    responsive in case you have a lot of markers.\n",
    "\n",
    "-   **base\\_map**: *folium.Map*, default *None*\n",
    "\n",
    "    In case you want to draw something on particular *folium.Map*.\n",
    "\n",
    "-   **title**: *str*, default *None*\n",
    "\n",
    "    You can add a title to the map.\n",
    "\n",
    "-   **legend**: *bool*, default *True*\n",
    "\n",
    "    Whether to add legend for features (*add\\_features* method).\n",
    "\n",
    "-   **stroke\\_legend**: *bool*, default *True*.\n",
    "\n",
    "    Whether to add legend for stroke features (*add\\_stroke\\_features*\n",
    "    method)\n",
    "\n",
    "-   **legend\\_title**: *str*, default *'Legend'*\n",
    "\n",
    "    Legend title.\n",
    "\n",
    "-   **stroke\\_legend\\_title**: *str*, default *'Legend'*\n",
    "\n",
    "    Stroke legend title.\n",
    "\n",
    "-   **legend\\_position**: *str*, default *'bottomright'*\n",
    "\n",
    "    Legend position. Available values: 'right', 'left', 'top', 'bottom',\n",
    "    'bottomright', 'bottomleft', 'topright', 'topleft'.\n",
    "\n",
    "-   **stroke\\_legend\\_position**: *str*, default *'bottomleft'*\n",
    "\n",
    "    Stroke legend position. Available values: 'right', 'left', 'top',\n",
    "    'bottom', 'bottomright', 'bottomleft', 'topright', 'topleft'.\n",
    "\n",
    "-   **colors**: *list* of html codes for colors (*str*).\n",
    "\n",
    "    Colors that represent features. You can either use the 20 default\n",
    "    colors or set yours.\n",
    "\n",
    "-   **stroke\\_colors**: *list* of html codes for colors (*str*)\n",
    "\n",
    "    Colors that represent additional (stroke) features.\n",
    "\n",
    "-   **shapes**: *list* of characters (*str*)\n",
    "\n",
    "    If you use shapes instead of colors, you can either use the default\n",
    "    shapes or set yours. Shapes are Unicode symbols.\n",
    "\n",
    "-   **stroked**: *bool*, default *True*\n",
    "\n",
    "    Whether to add stroke to markers.\n",
    "\n",
    "-   **unstroked**: *bool*, default *True*\n",
    "\n",
    "    If set to True, circle marker will merge if you zoom out without\n",
    "    stroke between them. It multiplies the number of markers by 2. For\n",
    "    better performance set it to False. More information and examples in\n",
    "    Chapter 2, Paragraph 4.4.\n",
    "\n",
    "-   **languages\\_in\\_popups**: *bool*, default *True*\n",
    "\n",
    "    Whether to show links to Glottolog website in popups.\n",
    "\n",
    "-   **control**: *bool*, default *False*\n",
    "\n",
    "    Whether to add LayerControls and group by features.\n",
    "\n",
    "-   **stroke\\_control**: *bool*, default *False*\n",
    "\n",
    "    Whether to add LayerControls and group by stroke features.\n",
    "\n",
    "-   **control\\_position**: *str*, default *'topright'*\n",
    "\n",
    "    Position of LayerControls. May be 'topleft', 'topright',\n",
    "    'bottomleft' or 'bottomright'.\n",
    "\n",
    "-   **colormap\\_colors**: *tuple*, default *('white', 'green')*\n",
    "\n",
    "    Colors for the colormap.\n",
    "\n",
    "\\bigskip\n",
    "**Methods**:\n",
    "\n",
    "-   **add\\_custom\\_coordinates** *(custom\\_coordinates)*\n",
    "\n",
    "    Set custom coordinates. By default cooordinates for the languages\n",
    "    are taken from the Glottolog database. If you have coordinates and\n",
    "    want to use them, use this function.\n",
    "\n",
    "    It could be useful if you are using data from a dataset which\n",
    "    provides coordinates and you do not need to rely on the Glottolog\n",
    "    data.\n",
    "\n",
    "    **Parameter** custom\\_coordinates: *list* of custom\\_coordinates\n",
    "    (*tuples*)\n",
    "\n",
    "    Length of the list should equal to length of languages.\n",
    "\n",
    "-   **add\\_features***(features, radius=7, opacity=1, numeric=False,\n",
    "    control=False, use\\_shapes=False)*\n",
    "\n",
    "    Add features to the map.\n",
    "\n",
    "    **Parameters**:\n",
    "\n",
    "    -   **features**: *list*\n",
    "\n",
    "        List of features. Amount of features should be equal to the\n",
    "        amount of languages. By default, if you add features, a legend\n",
    "        will appear. To shut it down set *legend* attribute to *False*.\n",
    "        To change the title of the legend use *legend\\_title* attribute.\n",
    "        To change legend position use use *legend\\_position* attribute.\n",
    "\n",
    "    -   **radius**: *int*, default *7*\n",
    "\n",
    "        Marker radius.\n",
    "\n",
    "    -   **numeric**: *bool*, default *False*\n",
    "\n",
    "        Whether to assign different color to each feature (*False*), or\n",
    "        to assign a color from colormap (*True*). You can set it to True\n",
    "        only in case your features are numeric and stroke features are\n",
    "        not given. To change the default colors of the color scale use\n",
    "        *colormap\\_colors* attribute.\n",
    "\n",
    "    -   **control**: *bool*, default *False*\n",
    "\n",
    "        Whether to add LayerControls to the map. It allows interactive\n",
    "        turning on/off given features.\n",
    "\n",
    "    -   **use\\_shapes**: *bool*, default *False*\n",
    "\n",
    "        Whether to use shapes instead of colors. This option allows to\n",
    "        represent features as shapes. Shapes are Unicode charaters. You\n",
    "        can replace or add to default symbols by changing *shapes*\n",
    "        attribute. If colors are not a viable option for you, you can\n",
    "        set this option to True.\n",
    "\n",
    "-   **add\\_stroke\\_features***(features, radius=12, opacity=1,\n",
    "    numeric=False, control=False)*:\n",
    "\n",
    "    Add additional set of features that look like strokes around\n",
    "    markers.\n",
    "\n",
    "    -   **features**: *list*\n",
    "\n",
    "        List of additional features. Amount of features should be equal\n",
    "        to the amount of languages. By default, if you add stroke\n",
    "        features, a legend will appear. To shut it down set\n",
    "        *stroke\\_legend* attribute to *False*. To change the title of\n",
    "        the legend use *stroke\\_legend\\_title* attribute. To change\n",
    "        legend position use use *stroke\\_legend\\_position* attribute.\n",
    "\n",
    "    -   **radius**: *int*, default *12*\n",
    "\n",
    "        Marker radius. Note that this radius is absolute as well.\n",
    "\n",
    "    -   **control**: *bool*, default *False*\n",
    "\n",
    "        Whether to add LayerControls to the map. It allows interactive\n",
    "        turning on/off given stroke features.\n",
    "\n",
    "-   **add\\_overlapping\\_features** *(features, radius=7,\n",
    "    radius\\_increment=4, mapping=None)*:\n",
    "\n",
    "    Add overlapping features. For example, if you want to draw on map\n",
    "    whether language 'is ergative', 'is slavic', 'is spoken in Russia'.\n",
    "    It will draw several markers of different size for each feature.\n",
    "\n",
    "    **Parameters**:\n",
    "\n",
    "    -   **features**: *list* of lists\n",
    "\n",
    "        List of features. Amount of features should be equal to the\n",
    "        amount of languages.\n",
    "\n",
    "    -   **radius**: *int*, default 7\n",
    "\n",
    "        Radius of the smallest circle.\n",
    "\n",
    "    -   **radius\\_increment**: *int*, default *4*\n",
    "\n",
    "        Step by which the size of the marker for each feature will be\n",
    "        incremented.\n",
    "\n",
    "    -   **mapping**: *dict*, default *None*\n",
    "\n",
    "        Mapping for the legend.\n",
    "\n",
    "-   **add\\_minicharts** *(\\*minicharts, typ='pie', size=0.6, names=None,\n",
    "    textprops=None, labels=False, colors=\\[\\], startangle=90)*:\n",
    "\n",
    "    Create minicharts using Maplotlib.\n",
    "\n",
    "    **Parameters**:\n",
    "\n",
    "    -   **\\*minicharts**: list-like objects\n",
    "\n",
    "        Data for minicharts. Two list-like objects.\n",
    "\n",
    "    -   **typ**: *str*, default *pie*\n",
    "\n",
    "        Type of the minicharts. Either *pie* or *bar*.\n",
    "\n",
    "    -   **size**: *float*\n",
    "\n",
    "        Size of the minicharts.\n",
    "\n",
    "    -   **texprops**: *dict*, default *None*\n",
    "\n",
    "        Textprops for Matplotlib.\n",
    "\n",
    "    -   **labels**: *bool*, default *False*\n",
    "\n",
    "        Whether to display labels.\n",
    "\n",
    "    -   **colors**: *list*, default *\\[\\]*\n",
    "\n",
    "        Minicharts colors.\n",
    "\n",
    "    -   **startange**: *int*, default *90*\n",
    "\n",
    "        Start angle of pie-charts (pie-charts only).\n",
    "\n",
    "-   **add\\_heatmap**: *(heatmap=\\[\\])*\n",
    "\n",
    "    Add heatmap.\n",
    "\n",
    "    **Parameter** heatmap: list-like object with tuples\n",
    "\n",
    "    Coordinates for the heatmap. To create a heatmap-only map, do not\n",
    "    pass any languages.\n",
    "\n",
    "-   **add\\_popups** *(popups, parse\\_html=False)*\n",
    "\n",
    "    Add popups to markers.\n",
    "\n",
    "    **Parameters**:\n",
    "\n",
    "    -   **popups**: *list* of strings List of popups. Length of the list\n",
    "        should equal to length of languages.\n",
    "\n",
    "    -   **parse\\_html**: *bool*, default *False* By default (*False*)\n",
    "        you can add HTML elements. If you need to add full HTML pages to\n",
    "        popups, you need to set the option to *True*.\n",
    "\n",
    "-   **add\\_tooltips** *(tooltips)*:\n",
    "\n",
    "    Add tooltips to markers.\n",
    "\n",
    "    **Parameter** tooltips: *list* of strings\n",
    "\n",
    "    List of tooltips. Length of the list should equal to length of\n",
    "    languages.\n",
    "\n",
    "-   **add\\_minimap** *(position='bottomleft', width=150, height=150,\n",
    "    collapsed\\_width=25, collapsed\\_height=25, zoom\\_animation=True)*\n",
    "\n",
    "    Add minimap.\n",
    "\n",
    "    **Parameters**:\n",
    "\n",
    "    -   **position**: *str*, default *'bottomleft'*\n",
    "\n",
    "    -   **width** and **height**: *int*, default *150*\n",
    "\n",
    "    -   **collapsed\\_width** and **collapsed\\_height**: *int*, default\n",
    "        *25*\n",
    "\n",
    "    -   **zoom\\_animation**: *bool*, default *True*\n",
    "\n",
    "        You can disable zoom animation for better performance.\n",
    "\n",
    "-   **add\\_line** and **add\\_rectangle** *(locations, tooltip=\",\n",
    "    popup=\", color='black')*\n",
    "\n",
    "    **Parameters**:\n",
    "\n",
    "    -   **locations**: list-like object of tuples\n",
    "\n",
    "        Coordinates necessary ro draw the figure.\n",
    "\n",
    "    -   **tooltip**: *str*, default \"\n",
    "\n",
    "        Tooltip for the figure.\n",
    "\n",
    "    -   **popup**: *str*, default \"\n",
    "\n",
    "        Popup for the figure.\n",
    "\n",
    "    -   **color**: **str**, default 'black'\n",
    "\n",
    "        Color of the figure.\n",
    "\n",
    "-   **create\\_map** *()*\n",
    "\n",
    "    Create the map. To display the map in Jupyter Notebook, use this\n",
    "    method.\n",
    "\n",
    "    **Returns** folium.Map\n",
    "\n",
    "-   **render***()*\n",
    "\n",
    "    **Returns** the HTML code as *str*. It might be useful in case you\n",
    "    want to implement it into a website.\n",
    "\n",
    "-   **save** *(path)*\n",
    "\n",
    "    Save the map as HTML. It is useful when you need to include a map\n",
    "    into a web-publication.\n",
    "\n",
    "    **Parameter** path, *str*\n",
    "\n",
    "    Path to the file.\n",
    "\n",
    "-   **save\\_static** *(path=None)*\n",
    "\n",
    "    Save the map as PNG. Experimental function. Requires additional\n",
    "    Python package Selenium and additional application Geckodriver.\n",
    "\n",
    "    It is useful for handouts, presentations and publications in paper\n",
    "    journals.\n",
    "\n",
    "    If path is not given **returns** the PNG as *bytes*.\n",
    "\n",
    "### Functions\n",
    "\n",
    "*function* lingtypology.maps.**merge** *(\\*maps)*\n",
    "\n",
    "Accepts *LingMap* objects and creates map of them.\n",
    "\n",
    "It is impossible to add, for example, features and minicharts. If you\n",
    "need it, you can create two *LingMap* objects and then use the *merge*\n",
    "function.\n",
    "\n",
    "**Parameter** \\*maps: *lingtypology.maps.LingMap* objects.\n",
    "\n",
    "**Returns** lingtypology.maps.LingMap\n",
    "\n",
    "*function* lingtypology.maps.**get\\_elevations** *(languages)*\n",
    "\n",
    "Get data on elevation for languages. More information in Chapter 2,\n",
    "Paragraph 4.2.\n",
    "\n",
    "**Parameter** lagnauges: *list* of strings\n",
    "\n",
    "**Returns** list\n",
    "\n",
    "*function* lingtypology.maps.**gradient** *(iterations, color1='white',\n",
    "color2='green')*\n",
    "\n",
    "Creates color gradient of given length.\n",
    "\n",
    "**Returns** list of HEX-colors\n",
    "\n",
    "Glottolog\n",
    "---------\n",
    "\n",
    "### Functions\n",
    "\n",
    "Glottolog module includes various functions to work with Glottolog data.\n",
    "\n",
    "The only funcntion that accepts list-like objects and returns *list* is\n",
    "**get\\_affiliations**. Its **parameter** is language names, it\n",
    "**returns** the genealogical information for the given languages.\n",
    "\n",
    "The **parameter** of all the other functions is *str* and they\n",
    "**return** *str*.\n",
    "\n",
    "The following functions use language name as the **parameter** and\n",
    "**return** coordinates, Glottocode, macro area and ISO code\n",
    "respectively:\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_coordinates**\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_glot\\_id**\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_macroarea**\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_iso**\n",
    "\n",
    "The following functions use Glottocode as the **parameter** and\n",
    "**return** coordinates, language name and ISO code respectively:\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_coordinates\\_by\\_glot\\_id**\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_by\\_glot\\_id**\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_iso\\_by\\_glot\\_id**\n",
    "\n",
    "The following functions use ISO code as the **parameter** and **return**\n",
    "language name and Glottocode respectively.\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_by\\_iso**\n",
    "\n",
    "-   lingtypology.glottolog.**get\\_glot\\_id\\_by\\_iso**\n",
    "\n",
    "### Versions\n",
    "\n",
    "Processed Glottolog data is stored statically in the package directory.\n",
    "It is updated with each new release of `lingtypology`.\n",
    "\n",
    "The version of the Glottolog data which is currently used is stored in\n",
    "lingtypology.glottolog.**version** variable.\n",
    "\n",
    "It is possible to use local Glottolog data. To do so, it is necessary to\n",
    "perform the following steps:\n",
    "\n",
    "-   Download the current version of the Glottolog data.\n",
    "\n",
    "-   Create directory `.lingtypology_data` in your home directory.\n",
    "\n",
    "-   Move `glottolog` to `.lingtypology_data`.\n",
    "\n",
    "-   Run the following command: `glottolog –repos=glottolog languoids`\n",
    "\n",
    "-   It will generate two small files (csv and json). Now you can delete\n",
    "    everything except for these files from the directory.\n",
    "\n",
    "-   Lingtypology will automatically use the local data.\n",
    "\n",
    "Databases API\n",
    "-------------\n",
    "\n",
    "### General\n",
    "\n",
    "One of the objectives of LingTypology is to provide a simple interface\n",
    "for linguistic databases. Therefore, classes used for acccessing them\n",
    "have unified API: most attributes and methods overlap among all of them.\n",
    "In this subsection I will describe this universal interface.\n",
    "\n",
    "**Attributes**:\n",
    "\n",
    "-   **citation**: *str*\n",
    "\n",
    "    Citation for the database.\n",
    "\n",
    "-   **show\\_citation**: *bool*, default *True*\n",
    "\n",
    "    Whether to print the citation when *get\\_df* method is called.\n",
    "\n",
    "-   **features\\_list** or **subsets\\_list**: *list* of strings\n",
    "\n",
    "    List of available features for all the databases except for\n",
    "    *Phoible*. In the case of *Phoible* it is list of available subsets\n",
    "    (UPSID, SPA etc.).\n",
    "\n",
    "**Methods**:\n",
    "\n",
    "-   **get\\_df**\n",
    "\n",
    "    In all cases **parameters** are optional. They depend on the\n",
    "    particular class.\n",
    "\n",
    "    In the case of *Wals* it has optional *str* parameter *join\\_how*:\n",
    "    the way multiple WALS pages will be joined (either *'inner'* or\n",
    "    *'outer'*). If the value is *'inner'*, the resulting table will only\n",
    "    contain data for languages mentioned in all the given pages. Else,\n",
    "    the resulting table will contain values mentioned in at least one of\n",
    "    the pages. Default: *'inner'*.\n",
    "\n",
    "    In the case of *Autotyp* and *Phoible* it has optional *list*\n",
    "    parameter *strip\\_na*. It is a list of columns. If this parameter is\n",
    "    given, the rows where some values in the given columns are not\n",
    "    present will be dropped. Default: *\\[\\]*.\n",
    "\n",
    "    **Returns** the dataset as *pandas.DataFrame*.\n",
    "\n",
    "-   **get\\_json**\n",
    "\n",
    "    It works the same way as *get\\_df* but it **returns** *dict* object\n",
    "    where keys are headers of the table.\n",
    "\n",
    "### WALS\n",
    "\n",
    "*class* lingtypology.db\\_apis.**Wals** *(\\*features)*\n",
    "\n",
    "**Parameter** features, *list*\n",
    "\n",
    "List of WALS pages that will be present in the resulting table. E.g.\n",
    "*\\['1A'\\]*\n",
    "\n",
    "**Additional attribite** general\\_citation, *str*\n",
    "\n",
    "The general citation for **all** the WALS pages.\n",
    "\n",
    "### Autotyp\n",
    "\n",
    "*class* lingtypology.db\\_apis.**Autotyp** *(\\*tables)*\n",
    "\n",
    "**Parameter** \\*tables: *list* of strings\n",
    "\n",
    "List of the Autoptyp tables that will be merged in the resulting table.\n",
    "E.g. *\\['gender'\\]*\n",
    "\n",
    "### AfBo\n",
    "\n",
    "*class* lingtypology.db\\_apis.**AfBo** *(\\*features)*\n",
    "\n",
    "**Parameter** \\*features: *list* of strings\n",
    "\n",
    "List of Autotyp features that will be present in the resulting table.\n",
    "E.g. *\\['adjectivizer'\\]*.\n",
    "\n",
    "### SAILS\n",
    "\n",
    "*class* lingtypology.db\\_apis.**Sails** *(\\*features)*\n",
    "\n",
    "**Parameter** \\*features: *list* of strings\n",
    "\n",
    "List of SAILS pages that will be included in the resulting table.\n",
    "\n",
    "**Additional attribute** feature**s**\\_descriptions: *pandas.DataFrame*\n",
    "\n",
    "Table that contain description for all the SAILS pages.\n",
    "\n",
    "**Additional method** feature\\_descriptions *(\\*features)*\n",
    "\n",
    "**Returns** table with description for each given **feature**.\n",
    "\n",
    "### PHOIBLE\n",
    "\n",
    "*class* lingtypology.db\\_apis.**Phoible** *(subset='all',\n",
    "aggregated=True)*\n",
    "\n",
    "**Parameters**:\n",
    "\n",
    "-   **subset**: *str*, default *'all'*\n",
    "\n",
    "    One of the PHOIBLE datasets or all of them.\n",
    "\n",
    "-   **aggregated**: *bool*, default *True*\n",
    "\n",
    "    If is *True* only aggregated data (e.g. amount of consonants) will\n",
    "    be included into the resulting table. The table will be small and\n",
    "    easy to operate.\n",
    "\n",
    "    Else, full PHOIBLE data will be included.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.3rc1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
