{ "cells": [ { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Библиотеки / данные" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "импортируем библиотеки numpy и pandas" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "импортируем библиотеку datetime для работы с датами" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "from datetime import datetime" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "Задаем некоторые опции библиотеки pandas, которые настраивают вывод" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "pd.options.display.max_rows = 10" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "- считываем данные\n", "- используем столбец Symbol в качестве индекса \n", "- считываем только столбцы ['Symbol', 'Sector', 'Price', 'Book Value']" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "| Column Name | Description\n", "| ------------- |:-------------:|\n", "|Symbol|Сокращенное название организации|\n", "|Name|Полное название организации|\n", "|Sector|Сектор экономики|\n", "|Price|Стоимость акции|\n", "|Dividend Yield|Дивидендная доходность|\n", "|Price/Earnings|Цена / прибыль|\n", "|Earnings/Share|Прибыль на акцию|\n", "|Book Value|Балансовая стоимость компании|\n", "|52 week low|52-недельный минимум|\n", "|52 week high|52-недельный максимум|\n", "|Market Cap|Рыночная капитализация|\n", "|EBITDA|**E**arnings **b**efore **i**nterest, **t**axes, **d**epreciation and **a**mortization|\n", "|Price/Sales|Цена / объём продаж|\n", "|Price/Book|Цена / балансовая стоимость|\n", "|SEC Filings|Ссылка *sec.gov*|" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "sp500 = pd.read_csv(\"../data/sp500.csv\",\n", " index_col='Symbol',\n", " usecols=['Symbol', 'Sector', 'Price', 'Book Value'])" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем датафрейм с 5 строками и 3 столбцами" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.arange(0, 15).reshape(5, 3), \n", " index=['a', 'b', 'c', 'd', 'e'], \n", " columns=['c1', 'c2', 'c3'])\n", "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "- добавляем несколько столбцов и строк в датафрейм столбец c4 со значениями NaN\n", "- строка 'f' со значениями от 15 до 18 \n", "- строка 'g', состоящая из значений NaN\n", "- столбец 'c5', состоящий из значений NaN\n", "- меняем значение в столбце 'c4' строки 'a'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df['c4'] = np.nan\n", "df.loc['f'] = np.arange(15, 19) \n", "df.loc['g'] = np.nan\n", "df['c5'] = np.nan\n", "df['c4']['a'] = 20\n", "df" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Пропущенные значения" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### поиск" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "какие элементы являются значениями NaN?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.isnull()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "какие элементы являются непропущенными значениями? (можем использовать ~df.isnull() )" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.notnull()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "подсчитываем количество значений NaN в каждом столбце" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.isnull().sum(axis=0)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "вычисляем количество значений, отличных от NaN, по каждому столбцу (можем использовать len(df) - df.isnull().sum())\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "scrolled": true }, "outputs": [], "source": [ "df.count(axis=0)" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### удаление" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "отбираем непропущенные значения в столбце c4" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4[df.c4.notnull()]" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "этот программный код извлекает в столбце c4 все значения, кроме значений NaN" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4.dropna()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ ".dropna() возвращает копию с удаленными значениями исходный датафрейм/столбец не изменился" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "метод .dropna() при применении к датафрейму удаляет целиком строки, в которых есть по крайней мере одно значение NaN в данном случае будут удалены все строки" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.dropna()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "используя параметр how='all', удаляем лишь те строки, в которых все значения являются значениями NaN" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.dropna(how = 'all')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "меняем ось, чтобы удалить столбцы со значениями NaN вместо строк" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.dropna(how='all', axis=1) # удаляем c5" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "- создаем копию датафрейма df\n", "- заменяем две ячейки с пропусками значениями 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df2 = df.copy()\n", "df2.loc['g'].c1 = 0\n", "df2.loc['g'].c3 = 0\n", "df2" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "а сейчас удаляем столбцы, в которых есть хотя бы одно значение NaN" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df2.dropna(how='any', axis=1) " ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "удаляем лишь те столбцы, в которых по меньшей мере 3 значений не NaN" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df2.dropna(thresh=2, axis=1)" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### заполнение" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "##### константой" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "возвращаем новый датафрейм, в котором значения NaN заполнены константой - нулями" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "filled = df.fillna(0)\n", "filled" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "значения NaN не учитываются при вычислении средних значений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.mean()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "после замены значений NaN на 0 получаем другие средние значения" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "filled.mean()" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "##### прямое и обратное" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "заполнение в прямом порядке" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4.fillna(method=\"ffill\")" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "либо выполняем обратное заполнение" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4.fillna(method=\"bfill\")" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "##### с помощью индексов" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "новая серия для примеров:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "scrolled": true }, "outputs": [], "source": [ "fill_values = pd.Series([100, 101, 102], index=['a', 'e', 'g'])\n", "fill_values" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "пример заполнения:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.c4.fillna(fill_values)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "заполняем значения NaN в каждом столбце средним значением этого столбца" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.fillna(df.mean())" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### интерполяция пропущенных значений" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "выполняем линейную интерполяцию ( method = 'linear' по умолчанию) значений NaN с 1 по 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "scrolled": true }, "outputs": [], "source": [ "s = pd.Series([1, np.nan, np.nan, np.nan, 2])\n", "s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.interpolate()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем временной ряд, но при этом значение по одной дате будет пропущено" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "ts = pd.Series([1, np.nan, 2], \n", " index=[datetime(2014, 1, 1), \n", " datetime(2014, 2, 1), \n", " datetime(2014, 4, 1)])\n", "ts" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "выполняем линейную интерполяцию на основе количества элементов в данной серии" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "ts.interpolate()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "этот программный код учитывает тот факт, что у нас отсутствует запись для 2014-03-01" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "ts.interpolate(method=\"time\")" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем объект Series, чтобы продемонстрировать интерполяцию, основанную на индексных метках" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s = pd.Series([0, np.nan, 100], index=[0, 2, 10])\n", "s" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "выполняем линейную интерполяцию" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.interpolate()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "выполняем интерполяцию на основе значений индекса" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.interpolate(method=\"index\")" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Повторяющиеся значения " ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем датафрейм с дублирующимися строками" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data = pd.DataFrame({'a': ['x'] * 3 + ['y'] * 4, \n", " 'b': [1, 1, 2, 3, 3, 4, 4]})\n", "data" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "определяем, какие строки являются дублирующимися, то есть какие строки уже ранее встречались в датафрейме" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data.duplicated()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "удаляем дублирующиеся строки, каждый раз оставляя первое из дублирующихся наблюдений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data.drop_duplicates()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "удаляем дублирующиеся строки, каждый раз оставляя последнее из дублирующихся наблюдений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data.drop_duplicates(keep='last')" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "добавляем столбец:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data['c'] = range(7)\n", "data.duplicated()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "но если мы укажем, что нужно удалить дублирующиеся строки с учетом значений в столбцах a и b, результаты будут выглядеть так" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "data.drop_duplicates(['a', 'b'])" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Замена значений" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### метод .map() " ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем два объекта Series для иллюстрации процесса сопоставления значений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "x = pd.Series({\"one\": 1, \"two\": 2, \"three\": 3})\n", "y = pd.Series({1: \"a\", 2: \"b\", 3: \"c\"})\n", "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "y" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "сопоставляем значения серии x значениям серии y " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "x.map(y)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "если между значением серии y и индексной меткой серии x не будет найдено соответствие, будет выдано значение NaN" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "x = pd.Series({\"one\": 1, \"two\": 2, \"three\": 3})\n", "y = pd.Series({1: \"a\", 2: \"b\"})" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "y" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "x.map(y)" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### метод .replace()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "для примера" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s = pd.Series([0., 1., 2., 3., 2., 4.])\n", "s" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "замена 2 на 5" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.replace(2, 5)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "заменяем все элементы новыми значениями" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.replace([0, 1, 2, 3, 4], [4, 3, 2, 1, 0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "заменяем элементы, используя в качестве аргумента словарь" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.replace({0: 10, 2: 100})" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем датафрейм с двумя столбцами" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df = pd.DataFrame({'a': [0, 1, 2, 3, 4], 'b': [5, 6, 7, 8, 9]})\n", "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "задаем разные заменяемые значения для каждого столбца" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.replace({'a': 1, 'b': 8}, {'a': 777, 'b': 888})" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "### Применение функций" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### к стокам / столбцам" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "иллюстрируем применение функции к каждому элементу объекта Series" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s = pd.Series(np.arange(0, 5))\n", "s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "s.apply(lambda v: v * 3)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем датафрейм, чтобы проиллюстрировать применение операции суммирования к каждому столбцу" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.arange(12).reshape(4, 3), \n", " columns=['a', 'b', 'c'])\n", "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "вычисляем сумму элементов в каждом столбце" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.apply(lambda col: col.sum())" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "вычисляем сумму элементов в каждой строке" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.apply(lambda row: row.sum(), axis=1)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "создаем столбец 'interim' путем умножения столбцов a и b" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df['interim'] = df.apply(lambda r: r.a * r.b, axis=1)\n", "df" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "а теперь получаем столбец 'result' путем сложения столбцов 'interim' и 'c'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df['result'] = df.apply(lambda r: r.interim + r.c, axis=1)\n", "df" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "hidden": true }, "source": [ "#### к значениям" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "используем метод .applymap() для всех значений датафрейма, чтобы изменить формат всех элементов объекта DataFrame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true }, "outputs": [], "source": [ "df.applymap(lambda x: np.exp(x)/10)" ] } ], "metadata": { "hide_input": false, "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.0" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "303.391px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 1 }