{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# style - 自定义样式输出\n", "\n", "\n", "```{admonition} 在线刷题\n", ":class: seealso\n", "\n", "检查 or 强化 `Pandas` 数据分析操作?👉在线体验「Pandas进阶修炼300题」\n", "```\n", "\n", "```{note} \n", "本页面代码可以[在线编辑、执行](../指引/在线执行.md)!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上面基于 `option` 的 `pandas` 相关设置是全局配置,一次设置会在关闭notebook前一直有效\n", "\n", "但相关常用的设置并不多,不能满足更多的个性化需求。\n", "\n", "幸运的是在 `pandas` 中提供 `Styler` 对象让我们进一步个性化展示数据。\n", "\n", "注意:基于 `style` 个性化设置**同样不会修改数据**,所有 `data.style.xxxx` 输出的数据均是一次性的(可以复用、导出),因此你应该在合适的时间选择使用该方法。\n", "\n", "下面仅列举常用的方法,若想了解更多可以查阅[**pandas官方文档对应文章👉**](https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 本页面数据说明\n", "\n", "为了更好的介绍相关操作,本页面使用 **某招聘数据** 数据进行展开,你应该对数据字段、数值、类型等相关信息做一个大致了解!" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input", "thebe-init" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
positionNamecreateTimesalarysubwaylinematchScore
0数据分析2020-03-16 11:00:0037500NaN15.101875
1数据建模2020-03-16 11:08:0015000NaN32.559414
2数据分析2020-03-16 10:33:0035004号线14.972357
3数据分析2020-03-16 10:10:00450001号线12.874153
4数据分析2020-03-16 09:56:0030000NaN12.755375
\n", "
" ], "text/plain": [ " positionName createTime salary subwayline matchScore\n", "0 数据分析 2020-03-16 11:00:00 37500 NaN 15.101875\n", "1 数据建模 2020-03-16 11:08:00 15000 NaN 32.559414\n", "2 数据分析 2020-03-16 10:33:00 3500 4号线 14.972357\n", "3 数据分析 2020-03-16 10:10:00 45000 1号线 12.874153\n", "4 数据分析 2020-03-16 09:56:00 30000 NaN 12.755375" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "data = pd.read_csv(\"data.csv\", usecols=[\n", " 'positionName', 'createTime', 'salary', 'subwayline', 'matchScore'], nrows=20, parse_dates=['createTime'])\n", "\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 隐藏索引\n", "\n", "\n", "隐藏索引列" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
positionName createTime salary subwayline matchScore
数据分析2020-03-16 11:00:0037500nan15.101875
数据建模2020-03-16 11:08:0015000nan32.559414
数据分析2020-03-16 10:33:0035004号线14.972357
数据分析2020-03-16 10:10:00450001号线12.874153
数据分析2020-03-16 09:56:0030000nan12.755375
数据分析2020-03-16 09:54:0050000nan12.718732
数据分析2020-03-16 09:41:0030000nan12.615116
数据建模工程师2020-03-16 11:18:00350002号线3.033237
数据分析专家2020-03-16 10:57:0060000nan1.141952
数据分析师2020-03-16 11:18:00400002号线1.177361
数据分析师2020-03-16 10:57:0030000nan1.161869
大数据分析工程师(J11108)2020-03-16 09:25:00300002号线4.245066
数据分析工程师2020-03-16 11:18:00200002号线1.091051
资深数据分析师2020-03-16 10:57:0030000nan1.075559
数据分析师2020-03-16 10:59:0037500nan1.053428
产品运营(偏数据分析)2020-03-16 10:59:0027500nan1.015806
资深数据分析师(杭州)2020-03-16 10:59:0037500nan1.009167
大数据建模总监2020-03-16 11:08:0037500nan2.719454
数据建模专家-杭州-015462020-03-16 11:17:0030000nan3.033237
数据分析专家(游戏业务)2020-03-16 10:19:00375002号线0.834333
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.style.hide_index().set_table_attributes('style=\"font-size: 10px\"')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 调整精度\n", "\n", "将带有小数点的列精度调整为小数点后2位" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
positionName createTime salary subwayline matchScore
0数据分析2020-03-16 11:00:0037500nan15.10
1数据建模2020-03-16 11:08:0015000nan32.56
2数据分析2020-03-16 10:33:0035004号线14.97
3数据分析2020-03-16 10:10:00450001号线12.87
4数据分析2020-03-16 09:56:0030000nan12.76
5数据分析2020-03-16 09:54:0050000nan12.72
6数据分析2020-03-16 09:41:0030000nan12.62
7数据建模工程师2020-03-16 11:18:00350002号线3.03
8数据分析专家2020-03-16 10:57:0060000nan1.14
9数据分析师2020-03-16 11:18:00400002号线1.18
10数据分析师2020-03-16 10:57:0030000nan1.16
11大数据分析工程师(J11108)2020-03-16 09:25:00300002号线4.25
12数据分析工程师2020-03-16 11:18:00200002号线1.09
13资深数据分析师2020-03-16 10:57:0030000nan1.08
14数据分析师2020-03-16 10:59:0037500nan1.05
15产品运营(偏数据分析)2020-03-16 10:59:0027500nan1.02
16资深数据分析师(杭州)2020-03-16 10:59:0037500nan1.01
17大数据建模总监2020-03-16 11:08:0037500nan2.72
18数据建模专家-杭州-015462020-03-16 11:17:0030000nan3.03
19数据分析专家(游戏业务)2020-03-16 10:19:00375002号线0.83
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.style.set_precision(2).set_table_attributes('style=\"font-size: 10px\"')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 标记缺失值\n", "\n", "将缺失值标记为`数据缺失`" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
positionName createTime salary subwayline matchScore
0数据分析2020-03-16 11:00:0037500数据缺失15.101875
1数据建模2020-03-16 11:08:0015000数据缺失32.559414
2数据分析2020-03-16 10:33:0035004号线14.972357
3数据分析2020-03-16 10:10:00450001号线12.874153
4数据分析2020-03-16 09:56:0030000数据缺失12.755375
5数据分析2020-03-16 09:54:0050000数据缺失12.718732
6数据分析2020-03-16 09:41:0030000数据缺失12.615116
7数据建模工程师2020-03-16 11:18:00350002号线3.033237
8数据分析专家2020-03-16 10:57:0060000数据缺失1.141952
9数据分析师2020-03-16 11:18:00400002号线1.177361
10数据分析师2020-03-16 10:57:0030000数据缺失1.161869
11大数据分析工程师(J11108)2020-03-16 09:25:00300002号线4.245066
12数据分析工程师2020-03-16 11:18:00200002号线1.091051
13资深数据分析师2020-03-16 10:57:0030000数据缺失1.075559
14数据分析师2020-03-16 10:59:0037500数据缺失1.053428
15产品运营(偏数据分析)2020-03-16 10:59:0027500数据缺失1.015806
16资深数据分析师(杭州)2020-03-16 10:59:0037500数据缺失1.009167
17大数据建模总监2020-03-16 11:08:0037500数据缺失2.719454
18数据建模专家-杭州-015462020-03-16 11:17:0030000数据缺失3.033237
19数据分析专家(游戏业务)2020-03-16 10:19:00375002号线0.834333
" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(data\n", ".style\n", ".set_na_rep(\"数据缺失\")\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 高亮缺失值\n", "\n", "将缺失值高亮,颜色名`skyblue`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
positionName createTime salary subwayline matchScore
0数据分析2020-03-16 11:00:0037500数据缺失15.101875
1数据建模2020-03-16 11:08:0015000数据缺失32.559414
2数据分析2020-03-16 10:33:0035004号线14.972357
3数据分析2020-03-16 10:10:00450001号线12.874153
4数据分析2020-03-16 09:56:0030000数据缺失12.755375
5数据分析2020-03-16 09:54:0050000数据缺失12.718732
6数据分析2020-03-16 09:41:0030000数据缺失12.615116
7数据建模工程师2020-03-16 11:18:00350002号线3.033237
8数据分析专家2020-03-16 10:57:0060000数据缺失1.141952
9数据分析师2020-03-16 11:18:00400002号线1.177361
10数据分析师2020-03-16 10:57:0030000数据缺失1.161869
11大数据分析工程师(J11108)2020-03-16 09:25:00300002号线4.245066
12数据分析工程师2020-03-16 11:18:00200002号线1.091051
13资深数据分析师2020-03-16 10:57:0030000数据缺失1.075559
14数据分析师2020-03-16 10:59:0037500数据缺失1.053428
15产品运营(偏数据分析)2020-03-16 10:59:0027500数据缺失1.015806
16资深数据分析师(杭州)2020-03-16 10:59:0037500数据缺失1.009167
17大数据建模总监2020-03-16 11:08:0037500数据缺失2.719454
18数据建模专家-杭州-015462020-03-16 11:17:0030000数据缺失3.033237
19数据分析专家(游戏业务)2020-03-16 10:19:00375002号线0.834333
" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(data\n", ".style\n", ".set_na_rep(\"数据缺失\")\n", ".highlight_null(null_color='skyblue')\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 高亮数值列最大值\n", "\n", "将 数值格式列的最大值进行高亮" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "data.style.highlight_max().set_table_attributes('style=\"font-size: 10px\"')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 高亮数值列最小值\n", "\n", "将 数值格式列的最小值进行高亮" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "data.style.highlight_min().set_table_attributes('style=\"font-size: 10px\"')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 同时高亮最大最小值\n", "\n", "\n", "同时高亮最大值(颜色代码为`#F77802`)与最小值(颜色代码为`#26BE49`)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "(data\n", ".style\n", ".highlight_max(color='#F77802')\n", ".highlight_min(color='#26BE49')\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 指定区间高亮\n", "\n", "\n", "高亮 salary 列范围在 3000 - 10000 的数值" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "# 需要 pandas 版本大于 1.3.0 才可以执行\n", "# (data\n", "# .style\n", "# .highlight_between(left=3000, right=10000, subset=['salary'])\n", "# .set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 渐变显示数值列\n", "\n", "\n", "将数值格式的列使用渐变色(绿色)进行显示,以突出趋势" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "import seaborn as sns\n", "\n", "cm = sns.light_palette(\"green\", as_cmap=True)\n", "\n", "(data\n", ".style\n", ".background_gradient(cmap=cm)\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 修改字体颜色\n", "\n", "将 `salary` 列修改为红色字体" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "(data\n", ".style\n", ".set_properties(\n", " subset=['salary'], **{'color': 'red'})\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 修改背景颜色、对齐方式、字体大小\n", "\n", "将整个 `dataframe` 进行如下设置:\n", "- 居中\n", "- 背景色修改为 `#F8F8FF`\n", "- 字体:13px" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "(data\n", ".style\n", ".set_properties(**{'background-color': '#F8F8FF','text-align':'center', 'font-size': '13px'})\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 综合(链式)设置\n", "\n", "\n", "除了上面的单个设置,还可以将多个设置进行结合,下面对整个 `dataframe` 进行如下设置:\n", "- 居中\n", "- 背景色修改为 `#F8F8FF`\n", "- 字体:13px\n", "\n", "并将 `salary` 列字体修改为红色" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "(data\n", ".style\n", ".set_properties(**{'background-color': '#F8F8FF','text-align':'center', 'font-size': '13px'})\n", ".set_properties(\n", " subset=['salary'], **{'color': 'red'})\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 导出样式\n", "\n", "\n", "将上一题带有样式的 pandas 数据框导出为本地 Excel(.xlsx格式)" ] }, { "cell_type": "code", "execution_count": 171, "metadata": {}, "outputs": [], "source": [ "(data\n", ".style\n", ".set_properties(**{'background-color': '#F8F8FF','text-align':'center', 'font-size': '13px'})\n", ".set_properties(\n", " subset=['salary'], **{'color': 'red'})).to_excel('带有样式导出.xlsx')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 制作指定列条形图\n", "\n", "在 `pandas` 中对 `salary` 列使用条形图进行可视化,指定颜色`skyblue`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "(data\n", ".style\n", ".bar(subset=['salary'],color='skyblue')\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 自定义样式\n", "\n", "将 `salary` 列数值大于 30000 的单元格字体修改为红色" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "def my_style(val):\n", "\n", " color = 'red' if val > 30000 else 'black'\n", " return 'color: %s' % color\n", "\n", "\n", "data.style.applymap(my_style, subset=\"salary\").set_table_attributes('style=\"font-size: 10px\"')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 格式化输出日期类型\n", "\n", "\n", "将 `createTime` 列格式化输出为 `xx年xx月xx日` " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "data.style.format({\"createTime\": lambda t: t.strftime(\"%Y年%m月%d日\")}).set_table_attributes('style=\"font-size: 10px\"')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 自定义格式化数据\n", "\n", "\n", "- 在 `salary` 列后增加\"元\"\n", "- 对 `matchScore` 列保留两位小数并增加\"分\"\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "output_scroll" ] }, "outputs": [], "source": [ "(data\n", ".style\n", ".format(\"{0:,.2f}分\", subset=\"matchScore\")\n", ".format(\"{\"\"}元\", subset=\"salary\")\n", ".set_table_attributes('style=\"font-size: 10px\"'))" ] } ], "metadata": { "celltoolbar": "Tags", "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.8.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "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": "384px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }