{ "cells": [ { "cell_type": "markdown", "id": "b217ed15", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "# GraphMDL for graph pattern mining" ] }, { "cell_type": "code", "execution_count": 2, "id": "4c2d5ee8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This tutorial was tested with the following version of skmine : 1.0.0\n" ] } ], "source": [ "import skmine\n", "\n", "print(\"This tutorial was tested with the following version of skmine :\", skmine.__version__)" ] }, { "cell_type": "markdown", "id": "275d8981", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "In this example, we are going to use the GraphMDL+ approach for mining a small set of graph patterns from graph data.\n", "\n", "GraphMDL+ is a heuristic anytime algorithm that uses the Minimum Description Length principle to select small but descriptive sets of patterns from graph data. The resulting set of patterns is significantly smaller than the complete set of patterns that can be generated by classic complete algorithms.\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "8bcf5617", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "# First we import the needed modules\n", "import networkx as nx\n", "from skmine.graph.graphmdl.graph_mdl import GraphMDL\n", "from skmine.graph.graphmdl import utils" ] }, { "cell_type": "markdown", "id": "d84522ac", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "First, we create a data graph, from which the patterns will be extracted.\n", "\n", "\n", "GraphMDL need edges to have exactly one label." ] }, { "cell_type": "code", "execution_count": 3, "id": "5ce1da5a", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "data_graph = nx.DiGraph() # Create new directed graph\n", "#Add eight nodes (from 1 to 8) to the graph\n", "data_graph.add_nodes_from(range(1,9))\n", "#Add some labels to the nodes\n", "data_graph.nodes[1]['label'] = 'y'\n", "data_graph.nodes[2]['label'] = 'x'\n", "data_graph.nodes[3]['label'] = 'z'\n", "data_graph.nodes[4]['label'] = 'x'\n", "data_graph.nodes[5]['label'] = 'z'\n", "data_graph.nodes[6]['label'] = 'x'\n", "data_graph.nodes[7]['label'] = 'z'\n", "data_graph.nodes[8]['label'] = 'w','x' # A node can have multiple labels\n", "\n", "#Add edges between nodes\n", "data_graph.add_edge(2,1,label='a')\n", "data_graph.add_edge(4,1,label='a')\n", "data_graph.add_edge(6,1,label='a')\n", "data_graph.add_edge(6,8,label='a')\n", "data_graph.add_edge(8,6,label='a')\n", "data_graph.add_edge(1,3,label='b')\n", "data_graph.add_edge(1,5,label='b')\n", "data_graph.add_edge(1,7,label='b')\n" ] }, { "cell_type": "markdown", "id": "48b5198a", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "We can automatically draw the graph." ] }, { "cell_type": "code", "execution_count": 4, "id": "a94256ed", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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MLYPHTL6FVx3nWOLliK+vjBsmPFVMGXxU0/BP/9pjPooOGb8eBg92iklpqam8uqrr/LGG29gMpkYP348EyZMoGHDhk6pR0QUCMQRfv8d/vijaDsqyvizYMihtzc0bAinThV9SpXq4eFh9Ol47DG480745RejX0doqNE6UM2zSZ46dYpZs2bx+uuvY7PZePTRR3niiSdqxkycIrWcAoFcvl27jF7sYPQhCA42LkIFndVSUoqaqQHatKn2Et1awUX/iiuMVgMnOH36NK+99hqzZ88mPz+fcePGMXHiRBo1auSUekTkYgoEcnkslqLbBSaT0bt9/Xpj4huTCfLy4PvvjWmMwWiqbtnyorexWq0cO3aMgIAA/P1r1gRSUrqMjAxef/11Zs2axdmzZ3n44Yf55z//SZMmTZxdmohcQIFALk92tnHLAIxx7xkZRodCq9W4TbB6tdG5zWw2xsMPHlzi25jNZp5++mk++ugj2rZtS2RkZLHZFjUjXc2SmZnJm2++ySuvvEJOTg4PPfQQTz31FFdeeaWzSxORUtSqmQrFCfbsMUYTnFupkf79jSmMC4a+HT1aNDdB587w8stFfQwueqs9rFu3rnAypd9++428vDzMZjPh4eHFQkKnTp20op0LysrK4j//+Q8vv/wymZmZPPjgg0yaNIlmzZo5uzQRt1TrVzsUF2K1wk8/wdq18L//GRPefP650YktL884xmQyRhvMmVOpYW55eXnFZlvcuHEjiYmJWCwW6tSpQ0RERLGQEB4eTh2trlhMXl5e4TTVNpsNcxWtKZGTk8Pbb7/NzJkzSU9P54EHHmDy5MmEhIRUyflEpGIUCMS58vJg82bjVsHu3cZqe/fcAw74lHj27NnC2RYLvnbs2IHNZqNu3brFZlvs0aMH7dq1q/hsi7XQm2++yaxZs+jTpw8ffPCBw9ewOHPmDO+++y4zZ84kNTWV++67j3//+980b97coecRkUujQCBuJSsri99++61YSNh9buVFX19funXrViwktGrVqso+KbuaP/74g65du7JgwQKuc+DcD2fPnmXOnDm8+OKLpKSkcO+99/L000/zpz/9yWHnEJHLp0Agbi89PZ1NmzYVCwlJSUkABAYG0r1792IhoUWLFpiqeUx+VanKVT9zc3N5//33mTFjBkePHuXuu+/mmWeeoWUJI0dExPkUCERKkJqa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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "utils.draw_graph(data_graph)" ] }, { "cell_type": "markdown", "id": "fd0855d6", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The automatic drawing is not always clear. For illustration purposes, here is a hand-made illustration as well.\n", "\n", "![example_data_graph.jpg](example_directed_graph.png)\n" ] }, { "cell_type": "markdown", "id": "30393387", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "Now we can run the GraphMDL+ approach on the data graph." ] }, { "cell_type": "code", "execution_count": 5, "id": "52ff38e6", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "graphmdl = GraphMDL() # Initialize the approach\n", "graphmdl.fit(data_graph, timeout=2.5) # Run the approach on the data graph. Timeout is optional and in seconds." ] }, { "cell_type": "markdown", "id": "56f78d6b", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "Now we can process the extracted patterns, the initial and the final description length.\n", "For example, we can draw the extracted patterns, as each pattern is a graph, and compute a compression ratio with the description lengths." ] }, { "cell_type": "code", "execution_count": 6, "id": "f429aabb", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of selected patterns 3\n" ] } ], "source": [ "patterns = list(graphmdl.patterns())\n", "print(\"Number of selected patterns\",len(patterns))" ] }, { "cell_type": "code", "execution_count": 7, "id": "d493b18f", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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w8GH93mx9wE+f3yiYcTctGVzgwusWz0X4K/2/aLJk8c7PRjruW039Wx1ajDWF5ZO9c3n//O8rzlr8P77AKNDEMCI2bxxvJkLPElw9TyCLe8sVPWr629q8eov9k71/NS2qiZPfjA/4JmZDwfBzJZNbd7oQacwSgQBjKA9t2075zkEZ/362u29Nnn9OcueGr+qY++fEXjqty4N/Gbz73Xw+i+ds2zD2KA9t25b4xED600QwAj69u6ZC37F8ep5BFW/mN/fsf/9j6r+a9WDic63bZ15DsF37ppZo5ECnxWD4XB48S9GrxYWFpqamuro0aNNTk7+rs2Bz4C//pe9Pf3KkQuGwcexYWzQ3Tu29NB3d6/ZPoHL56Mcv50hgBH14H23N36eywafxPjYoAfv+/BZA+DzTxDAiJq+blN/f+/ONd3nj+7d6auPYUQJAhhh39o10w++ceua7OtvvnFb39xl7gCMKvcNwYi7f88tbb1mYz987IWWlocfaU7BhrFB42ODfnTvTjEAI84ZArgCfGvXTD///te7e8eWqvPekrja2fV379jSz7//dTEAVwBnCOAKMX3dph767u4OvrHYw3tne/zA4WaPnDjni5AGnXno0J5bt/Wdu2a6edvEeg0X+JS57RCuYMdPLnXoyPFOLS139fhYN23Z7AmEMEI+yvHbJx+uYJs3jrdz+9R6DwP4DDCHAAAQBACAIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIAEAQCQIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIAEAQCQIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIAEAQCQIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIAEAQCQIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIAEAQCQIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIAEAQCQIAAAEgQAQIIAAEgQAAAJAgAgQQAAJAgAgAQBAJAgAAASBABAggAASBAAAAkCACBBAAAkCACABAEAkCAAABIEAECCAABIEAAACQIAIEEAACQIAIBq/FI2Gg6HVS0sLFzWwQAAa+fscfvscfxiLikIFhcXq5qenv4EwwIA1sPi4mJTU1MX3WYwvIRsWF5ebn5+vomJiQaDwZoNEAC4fIbDYYuLi23fvr2xsYvPErikIAAARptJhQCAIAAABAEAkCAAABIEAECCAABIEAAA1f8DJkQFaBFlBhMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "utils.draw_graph(patterns[0])" ] }, { "cell_type": "code", "execution_count": 8, "id": "a9513282", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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GaZnAS6NIADgkMqUKaMNGzZo2LBheuONN9S4cWP99ttvpmcBLosgAOCwPD09NWLECG3YsEHffPONrFarNm7caHoW4JIIAgAO75FHHtGePXtUrVo1Pfroo3r99dc5hADkMIIAgFMoVaqU1q5dq5EjR2rUqFFq2LChjh07ZnoW4DIIAgBOw9PTU0OHDtXmzZt18OBBVa9eXevWrTM9C3AJBAEAp1OvXj3ZbDYFBQUpIiJCr776qtLT003PApwaQQDAKd19991avXq1xowZo3feeUcNGjTQr7/+anoW4LQIAgBOy8PDQ0OGDNG2bdt05MgRWa1WrV692vQswCkRBACcXq1atZSQkKDatWurWbNmeumll3Tp0iXTswCnQhAAcAnFixfXypUr9e6772rSpEmqV6+eDh8+bHoW4DQIAgAuw2KxaODAgdq+fbt+++03+fv7a8WKFaZnAU6BIADgckJCQpSQkKCwsDC1bNlS/fr1U1pamulZgEMjCAC4pLvuuktLly7V+++/r48++ki1a9fWjz/+aHoW4LAIAgAuy2KxqHfv3oqKitK5c+cUEBCgJUuWmJ4FOCSCAIDLCwwMVFxcnCIiItS2bVu98MIL+v33303PAhwKQQDALfj5+WnhwoX68MMP9cknn6hmzZo6ePCg6VmAwyAIALgNi8WiXr16adeuXUpNTVVAQIAWLFhgehbgEAgCAG6nevXq2r17t5544gl16NBBzz77rFJTU03PAowiCAC4JR8fH82bN08zZszQ/PnzFRISou+//970LMAYggCA27JYLOrevbtiYmKUkZGhoKAgzZkzx/QswAiCAIDbe+ihhxQbG6u2bdvqmWee0TPPPKOUlBTTs4A8RRAAgKTChQtr1qxZmjNnjpYsWaLg4GB98803pmcBeYYgAIC/6dy5s+Li4uTp6ang4GDNnDlTdrvd9Cwg1xEEAPD/PPDAA4qJiVGnTp3Uo0cPderUScnJyaZnAbmKIACAayhYsKA+/vhjffbZZ1q5cqWCgoK0Z88e07OAXEMQAMANtG/fXnFxcSpUqJBCQkL00UcfcQgBLokgAICbqFy5snbu3Knu3bvr+eefV7t27XT+/HnTs4AcRRAAQDYUKFBAU6dO1eLFi7V27dorX5gEuAqCAABuQZs2bRQfH6+iRYuqVq1aev/99zmEAJdAEADALapYsaJ27Nih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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "utils.draw_graph(patterns[1])" ] }, { "cell_type": "code", "execution_count": 9, "id": "d26782c0", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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egQA3AZBALijBx7IPJHwq68yDxVY//inwGKRqlXLPLnQw8PsRgC5iiAA3F1goHThQuafn3gi8+2HhQtf8658eiLguggCwN01aiT98EPmVQvDwjID4RpSU1N17NgxHTx4MJcHAsgNBAGAzEMIq1dLffte9y5Wq1W9evWSn5+f5s+fn4vjAOQGggDA/7Ne/58Eq9WqBQsWqEWLFurYsaO6d++u5OTkXBwHICcRBACyrGDBgpo7d65mzZqlzz//XMHBwfrhhx9MzwKQDQgCALfEYrGoa9euio6OVlpamgIDA/Xpp5+angXgDhEEAG5LpUqVFB0drWeffVbPPfecwsLClJSUZHoWgNtEEAC4bd7e3vrkk080d+5cffnllwoMDNTevXtNzwJwGwgCAHesU6dOiomJUZ48eVSlShXNnDmTaxYAToYgAJAtHn74Ye3atUudO3fW888/r44dOyoxMdH0LABZRBAAyDb58+fX9OnTtWDBAq1cuVIBAQGy2+2mZwHIAoIAQLZr27atYmNj5e3trapVq+rDDz/kEALg4AgCADmifPny2rlzp7p3766XXnpJzz77rC78+ZkJABwOQQAgx+TLl09Tp07VF198obVr18rf31+7d+82PQvANRAEAHJcq1atFBcXpyJFiqh69ep67733OIQAOBiCAECuePDBB7V9+3b16tVL/fr1U8uWLXXu3DnTswD8gSAAkGu8vLw0adIkLV++XJs3b5afn5927dplehYAEQQADGjWrJnsdrvuvfde1axZU++88w6HEADDCAIARtx///3aunWrBgwYoJdffllNmzZVfHy86VmA2yIIABiTJ08evfXWW/r666+1c+dO2Ww27dixw/QswC0RBACMa9Sokex2u8qWLas6depo/PjxSk9PNz0LcCsEAQCHUKpUKYWHh2vIkCF69dVX1bBhQ50+fdr0LMBtEAQAHIanp6fGjRunNWvWKDY2VjabTVu2bDE9C3ALBAEAh1O/fn3Z7XZVrFhRTz75pMaMGaO0tDTTswCXRhAAcEglS5bUhg0bNHz4cI0cOVL169fXb7/9ZnoW4LIIAgAOy8PDQ6NGjdKGDRv03XffyWazaePGjaZnAS6JIADg8J588knt2bNHjz/+uJ5++mm9/vrrHEIAshlBAMAplChRQmvWrNGYMWM0duxYPfXUUzpx4oTpWYDLIAgAOA0PDw8NGzZM4eHhOnjwoCpXrqy1a9eangW4BIIAgNOpXbu27Ha7AgMD1aBBA7366qtKTU01PQtwagQBAKd09913a9WqVRo/frzefvtt1a1bV8eOHTM9C3BaBAEAp2W1WjV06FBt3bpVR48elc1m06pVq0zPApwSQQDA6VWvXl1xcXGqUaOGGjdurJdffllXrlwxPQtwKgQBAJdQtGhRrVixQu+8846mTJmi2rVr68iRI6ZnAU6DIADgMiwWiwYOHKjt27frt99+k5+fn5YvX256FuAUCAIALic4OFhxcXEKCQlRixYt1K9fP6WkpJieBTg0ggCASypcuLCWLFmi999/Xx999JFq1Kihn376yfQswGERBABclsViUe/evRUREaHz58/L399fX3zxhelZgEMiCAC4vICAAMXExKhBgwZq06aNXnrpJV2+fNn0LMChEAQA3IKvr68WLlyoDz/8UJ988omqVaumgwcPmp4FOAyCAIDbsFgs6tmzp3bt2qXk5GT5+/trwYIFpmcBDoEgAOB2KleurN27d6tZs2Zq3769nn/+eSUnJ5ueBRhFEABwSz4+Ppo3b55mzpyp+fPnKzg4WD/88IPpWYAxBAEAt2WxWNStWzdFRUUpLS1NgYGB+vTTT03PAowgCAC4vccee0zR0dFq06aNnnvuOT333HNKSkoyPQvIVQQBAEjy9vbW7Nmz9emnn+qLL75QUFCQvvvuO9OzgFxDEADA33Tu3FkxMTHy8PBQUFCQZs2apYyMDNOzgBxHEADA/3j44YcVFRWlTp06qXv37urUqZMSExNNzwJyFEEAANeQP39+ffzxx/r888+1YsUKBQYGas+ePaZnATmGIACAG2jXrp1iYmJUoEABBQcH66OPPuIQAlwSQQAAN1GhQgXt3LlT3bp104svvqi2bdvqwoULpmcB2YogAIAsyJcvn6ZNm6bFixdrzZo1f31gEuAqCAIAuAWtW7dWbGys7rrrLlWvXl3vv/8+hxDgEggCALhF5cqV044dO/Tiiy+qb9++euaZZ3Tu3DnTs4A7QhAAwG3w8vLS5MmTtWzZMoWHh8vf31+7du0yPQu4bQQBANyB5s2by263q0SJEqpZs6beffddDiHAKREEAHCH7r//fm3btk39+/fXoEGD1LRpU8XHx5ueBdwSggAAskGePHn09ttv6+uvv1ZERIT8/PwUERFhehaQZQQBAGSjRo0ayW63q0yZMqpdu7YmTJig9PR007OAmyIIACCblS5dWps3b9aQIUP0yiuvqFGjRvr9999NzwJuiCAAgBzg6empcePGac2aNYqJiZHNZtPWrVtNzwKuiyAAgBxUv3592e12VahQQSEhIXrjjTeUlpZmehbwLwQBAOSwkiVLasOGDRo+fLhef/111a9fX6dOnTI9C/gHggAAcoGHh4dGjRql9evX67vvvlPlypW1ceNG07OAvxAEAJCLnnrqKdntdj322GN6+umnNXLkSA4hwCEQBACQy+655x6tXbtWo0eP1htvvKHQ0FCdOHHC9Cy4OYIAAAzw8PDQ8OHDtWnTJv3444+y2Wxau3at6VlwYwQBABhUp04d2e12BQQEqEGDBnrttdeUmppqehbcEEEAAIbdfffdWrVqlcaPH6+33npLISEhOn78uOlZcDMEAQA4AKvVqqFDh2rLli06cuSIbDabVq1aZXoW3AhBAAAOpEaNGrLb7apWrZoaN26swYMH6+rVq6ZnwQ0QBADgYIoWLaqVK1fqnXfe0eTJk1W7dm398ssvpmfBxREEAOCALBaLBg4cqO3bt+vkyZOy2Wxavny56VlwYQQBADiw4OBgxcXFqW7dumrRooX69++vK1eumJ4FF0QQAICDK1y4sJYuXar33ntPH374oWrUqKHDhw+bngUXQxAAgBOwWCzq06ePIiIidPbsWfn5+enLL780PQsuhCAAACcSEBCg2NhY1a9fX61bt1avXr10+fJl07PgAggCAHAyvr6+WrRokT788EPNmjVL1apV08GDB03PgpMjCADACVksFvXs2VORkZFKSkqSv7+/FixYYHoWnBhBAABOzGazKSYmRk2bNlX79u31wgsv6NKlS6ZnwQkRBADg5Hx8fPTZZ59p5syZmjdvnoKDg7V//37Ts+BkCAIAcAEWi0XdunVTdHS0UlNTFRAQoLlz55qeBSdCEACAC3nssccUHR2t1q1bKywsTF26dFFSUpLpWXACBAEAuBhvb2/NmTNHc+bM0eLFi1WlShXt27fP9Cw4OIIAAFxUWFiYdu/eLavVqqCgIM2aNUsZGRmmZ8FBEQQA4MIeeeQR7dq1Sx06dFD37t3VqVMnJSYmmp4FB0QQAICLK1CggGbMmKH58+drxYoVCgwM1J49e0zPgoMhCADA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "utils.draw_graph(patterns[2])" ] }, { "cell_type": "code", "execution_count": 10, "id": "cef42eef", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "initial description length = 279.5681873994845\n", "Final description length = 136.06648569569322\n", "Compression ratio = 48.67 %\n" ] } ], "source": [ "print(f\"initial description length = {graphmdl.initial_description_length()}\")\n", "print(f\"Final description length = {graphmdl.description_length()}\")\n", "print(f\"Compression ratio = {round((graphmdl.description_length()/ graphmdl.initial_description_length())*100, 2)} %\")" ] }, { "cell_type": "code", "execution_count": null, "id": "2749d1d3", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.9" }, "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": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }