Explorar el Código

add exercise version of hands on 1&2

sprenger hace 2 años
padre
commit
c66ed374be
Se han modificado 6 ficheros con 290 adiciones y 63 borrados
  1. 1 1
      day_3/README.md
  2. 131 0
      day_3/hands_on_1.ipynb
  3. 89 0
      day_3/hands_on_2.ipynb
  4. 3 1
      day_3/hands_on_2_solution.ipynb
  5. 34 40
      day_3/tutorial_1.ipynb
  6. 32 21
      day_3/tutorial_2.ipynb

+ 1 - 1
day_3/README.md

@@ -16,4 +16,4 @@ We recommend running the Jupyter notebooks locally, but you can also use the fol
 - [Day 3 - Tutorial 02 - Data Introduction and Advanced Neo](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Ftutorial_2.ipynb)
 - [Day 3 - Hands On 02 - Data Introduction and Advanced Neo](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Fhands_on_2.ipynb)
 - [Day 3 - Tutorial 03 - Elephant](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Ftutorial_3.ipynb)
-- [Day 3 - Hands On 03 - Elephant](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Fhands_on_.ipynb)
+- [Day 3 - Hands On 03 - Elephant](https://mybinder.org/v2/git/https%3A%2F%2Fgin.g-node.org%2FINCF-workshop-2021%2FNIX-Neo-workshop/HEAD?filepath=day_3%2Fhands_on_3.ipynb)

+ 131 - 0
day_3/hands_on_1.ipynb

@@ -0,0 +1,131 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "a20f7712",
+   "metadata": {},
+   "source": [
+    "# Hands-on session 1: Neo basics\n",
+    "\n",
+    "These exercises cover the basics introduced in Tutorial 1\n",
+    "\n",
+    "## Preparation: Download public ephys dataset\n",
+    "On Linux you can download the publicly available dataset via the command below. On other systems, please download the files manually from [l101210-001.ns2](https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns2), [l101210-001.nev](https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.nev) and [l101210-001.ns5](https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns5) and save them in the same folder as this notebook.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f914945d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!wget -O l101210-001.ns2 https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns2\n",
+    "!wget -O l101210-001.nev https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.nev\n",
+    "!wget -O l101210-001.ns5 https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/blackrock/blackrock_2_1/l101210-001.ns5"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "95c26202",
+   "metadata": {},
+   "source": [
+    "\n",
+    "## Exercise 1: Exploring an ephys dataset\n",
+    "\n",
+    "1. Load the dataset you just downloaded with Neo. Which IO seems suitable for this dataset?\n",
+    "2. How many continuous recording parts (segments) does this dataset contain?\n",
+    "3. How many channels were recorded in this dataset and at what sampling rates?\n",
+    "4. How many spiketrains does this dataset contain?\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4fa3decf",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "31ba447a",
+   "metadata": {},
+   "source": [
+    "## Exercise 2: Extracting data for visualization\n",
+    "1. Visualize the channels 10 to 19 of the `AnalogSignal` with the highest temporal resolution. \n",
+    "2. Add axis labels, title and legend based on metadata provided by the `AnalogSignal`. Check the `array_annotations` to label each channel.\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "feceba8f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "766cb710",
+   "metadata": {},
+   "source": [
+    "## Exercise 3: Saving the dataset using NIX\n",
+    "- Save the complete dataset in a new file named `l101210-001.nix`\n",
+    "- What is the size of the resulting nix file?\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cc5336bb",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f9c5d03b",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "81aa0351",
+   "metadata": {},
+   "source": [
+    "## Bonus Exercise\n",
+    "Did you bring your own data? Check if your format is supported by Neo and load your data!"
+   ]
+  }
+ ],
+ "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.9.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

+ 89 - 0
day_3/hands_on_2.ipynb

@@ -0,0 +1,89 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "503cb687",
+   "metadata": {},
+   "source": [
+    "# Hands-on session 2: Advanced Neo\n",
+    "\n",
+    "These exercises build on concepts introduced in Tutorial 2\n",
+    "\n",
+    "## Preparation: Download public ephys dataset\n",
+    "On Linux you can download the compiled nix file via the command below. On other systems, please download the file manually from [here](https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix) and save it in the same folder as this notebook. This is the same file as already used in Tutorial 2."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5fa6ae14",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!wget -O i140703-001.nix https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4d1cd9a4",
+   "metadata": {},
+   "source": [
+    "### SpikeTrain visualization\n",
+    "1. Load the data `i140703-001.nix` file using the `neo.io.NixIO` into a neo Block.\n",
+    "3. Here we will only investigate data measured between 2 second - 12 seconds of the datasets. Create a new neo Segment that only contains data of that time range.\n",
+    "2. Select all SpikeTrains that are marked as single unit activity and have `unit_id` 1. How many of those SpikeTrains exist in the dataset?\n",
+    "\n",
+    "4. Plot the spike times in a raster plot. Use the `connector_aligned_id` as vertical offset for each Spiketrain avoid overlapping spike markers.\n",
+    "5. Add vertical lines to indicate event times labeled as `TS-ON`, `SR`, `OT` and `RW-ON`.\n",
+    "\n",
+    "### Your solution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "63dafe3f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  },
+  {
+   "cell_type": "markdown",
+   "id": "544d74f6",
+   "metadata": {},
+   "source": [
+    "## Bonus Exercise\n",
+    "Did you bring your own data? Visualize your own data. Note that it might be useful to load the data in lazy mode to spare your memory."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "24b21014",
+   "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.9.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

+ 3 - 1
day_3/hands_on_2_solution.ipynb

@@ -52,7 +52,9 @@
     "2. Select all SpikeTrains that are marked as single unit activity and have `unit_id` 1. How many of those SpikeTrains exist in the dataset?\n",
     "\n",
     "4. Plot the spike times in a raster plot. Use the `connector_aligned_id` as vertical offset for each Spiketrain avoid overlapping spike markers.\n",
-    "5. Add vertical lines to indicate event times labeled as `TS-ON`, `SR`, `OT` and `RW-ON`."
+    "5. Add vertical lines to indicate event times labeled as `TS-ON`, `SR`, `OT` and `RW-ON`.\n",
+    "\n",
+    "### Your solution"
    ]
   },
   {

+ 34 - 40
day_3/tutorial_1.ipynb

@@ -79,6 +79,8 @@
    },
    "source": [
     "##  Neo - Generic representation of common ephys modalities\n",
+    "- [Neo on PyPi](https://pypi.org/project/neo/) & [github](https://github.com/NeuralEnsemble/python-neo)\n",
+    "- [Neo documentation](https://neo.readthedocs.io)\n",
     "- Standardized representation of ephys data during runtime\n",
     "- Efficient handling of large data arrays thanks to `numpy`\n",
     "- Description of physical units and unit conversion thanks to `quantities`"
@@ -86,7 +88,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 1,
    "id": "6e5df85c",
    "metadata": {
     "slideshow": {
@@ -127,7 +129,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 2,
    "id": "ecfbe500",
    "metadata": {
     "slideshow": {
@@ -167,7 +169,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 37,
+   "execution_count": 3,
    "id": "9ba68d73",
    "metadata": {
     "slideshow": {
@@ -269,7 +271,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 4,
    "id": "d7efe06e",
    "metadata": {
     "slideshow": {
@@ -351,7 +353,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 5,
    "id": "321dc012",
    "metadata": {
     "slideshow": {
@@ -397,7 +399,7 @@
     "- `.concatenate()` to append multiple signal objects\n",
     "- `.downsample()` to create a new signal with a different sampling rate\n",
     "- `.magnitude` to extract the underlying numpy array\n",
-    "- check out the [documentation](https://neo.readthedocs.io/en/latest/core.html) to discover more!"
+    "- check out the jupyter `help()` to discover more in the documentation!"
    ]
   },
   {
@@ -458,10 +460,16 @@
     "                SpikeTrain 0\n",
     "                SpikeTrain 1\n",
     "                SpikeTrain 2\n",
-    "Block 1\n",
-    "    .segments\n",
-    "        Segment 0\n",
-    "    ...\n",
+    "    .groups\n",
+    "        Group 0\n",
+    "            .analogsignals\n",
+    "                ...\n",
+    "            .spiketrains\n",
+    "                ...\n",
+    "            .events\n",
+    "                ...\n",
+    "            .epochs\n",
+    "            ...\n",
     "```"
    ]
   },
@@ -488,7 +496,7 @@
    },
    "source": [
     "# Automatic generation of Neo objects\n",
-    "<img src=\"./neo_material/IODiagram.svg\" alt=\"IODiagram\" style=\"width: 500px;\"/>"
+    "<img src=\"./neo_material/IODiagram.svg\" alt=\"IODiagram\" style=\"width: 600px;\"/>"
    ]
   },
   {
@@ -506,7 +514,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 51,
+   "execution_count": 6,
    "id": "27a022ab",
    "metadata": {
     "slideshow": {
@@ -533,7 +541,7 @@
        "      time: 1.2992 s to 11.8976 s"
       ]
      },
-     "execution_count": 51,
+     "execution_count": 6,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -561,7 +569,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 60,
+   "execution_count": 7,
    "id": "da4d5648",
    "metadata": {
     "slideshow": {
@@ -579,7 +587,7 @@
        "time: 1.2992 s to 11.8976 s"
       ]
      },
-     "execution_count": 60,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -606,7 +614,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 67,
+   "execution_count": 8,
    "id": "18359d77",
    "metadata": {
     "slideshow": {
@@ -620,7 +628,7 @@
        "SpikeTrain name: 'STp106.0n0#0' annotations: {'id': 'STp106.0n0#0'}"
       ]
      },
-     "execution_count": 67,
+     "execution_count": 8,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -632,7 +640,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 70,
+   "execution_count": 9,
    "id": "3eed0a74",
    "metadata": {
     "slideshow": {
@@ -656,7 +664,7 @@
        "       1.599125, 1.654425]) * s"
       ]
      },
-     "execution_count": 70,
+     "execution_count": 9,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -686,7 +694,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 109,
+   "execution_count": 10,
    "id": "e516de90",
    "metadata": {
     "slideshow": {
@@ -700,7 +708,7 @@
        "AnalogSignalProxy name: 'Signals CH' annotations: {'stream_id': 'CH'}"
       ]
      },
-     "execution_count": 109,
+     "execution_count": 10,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -728,7 +736,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 90,
+   "execution_count": 11,
    "id": "f50bc7a3",
    "metadata": {
     "slideshow": {
@@ -766,7 +774,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 85,
+   "execution_count": 12,
    "id": "2aa4d7e9",
    "metadata": {
     "slideshow": {
@@ -780,7 +788,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 93,
+   "execution_count": 13,
    "id": "7a4dca6d",
    "metadata": {
     "slideshow": {
@@ -847,28 +855,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 119,
+   "execution_count": 14,
    "id": "18593599",
    "metadata": {
     "slideshow": {
      "slide_type": "fragment"
     }
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "[<AnalogSignal(array([[-95.6 ,  26.55],\n",
-      "       [-92.3 ,  27.8 ],\n",
-      "       [-92.  ,  26.65],\n",
-      "       ...,\n",
-      "       [  0.  ,   0.  ],\n",
-      "       [  0.  ,   0.  ],\n",
-      "       [  0.  ,   0.  ]], dtype=float32) * V, [1.2992 s, 11.8976 s], sampling rate: 40000.0 Hz)>]\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "filename = 'my_first_neo_dataset.nix'\n",
     "with neo.io.NixIO(filename, 'ow') as io:\n",

+ 32 - 21
day_3/tutorial_2.ipynb

@@ -84,7 +84,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 55,
+   "execution_count": 1,
    "id": "10d61396",
    "metadata": {
     "slideshow": {
@@ -96,16 +96,16 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "--2021-08-25 19:36:28--  https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix\n",
+      "--2021-08-30 14:37:26--  https://gin.g-node.org/sprenger/multielectrode_grasp/raw/dataset_nix/datasets_nix/i140703-001_cut_74sec.nix\n",
       "Resolving gin.g-node.org (gin.g-node.org)... 141.84.41.219\n",
       "Connecting to gin.g-node.org (gin.g-node.org)|141.84.41.219|:443... connected.\n",
       "HTTP request sent, awaiting response... 200 OK\n",
       "Length: 47349440 (45M) [application/octet-stream]\n",
       "Saving to: 'i140703-001.nix’\n",
       "\n",
-      "i140703-001.nix     100%[===================>]  45,16M  5,97MB/s    in 8,6s    \n",
+      "i140703-001.nix     100%[===================>]  45,16M  3,41MB/s    in 16s     \n",
       "\n",
-      "2021-08-25 19:36:37 (5,28 MB/s) - 'i140703-001.nix’ saved [47349440/47349440]\n",
+      "2021-08-30 14:37:42 (2,84 MB/s) - 'i140703-001.nix’ saved [47349440/47349440]\n",
       "\n"
      ]
     }
@@ -173,6 +173,18 @@
     "block"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "id": "a6213f01",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "This summary already tells us that we only need to take care of a single segment with one event, one analogsignal and multiple spiketrain objects. The 96 continuously sampled channels are sampled a 'low' sampling rate of 1kHz and contain neural data, so data comparable to local-field potential measurements."
+   ]
+  },
   {
    "cell_type": "markdown",
    "id": "c15de13b",
@@ -183,13 +195,12 @@
    },
    "source": [
     "### Dataset overview - SpikeTrains\n",
-    "This summary already tell us that we only need to take care of a single segment with one event, one analogsignal and multiple spiketrain objects. The 96 continuously sampled channels are sampled a 'low' sampling rate of 1kHz and contain neural data, so data comparable to local-field potential measurements.\n",
     "To learn more about the spiketrains, we print the spiketrain annotations:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 3,
    "id": "02a207fc",
    "metadata": {
     "slideshow": {
@@ -216,7 +227,7 @@
        " 'noise': True}"
       ]
      },
-     "execution_count": 49,
+     "execution_count": 3,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -242,7 +253,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 50,
+   "execution_count": 4,
    "id": "d5e4a903",
    "metadata": {
     "slideshow": {
@@ -256,7 +267,7 @@
        "dict_keys(['channel_names', 'channel_ids', 'file_origin', 'connector_ID', 'connector_pinID', 'nev_dig_factor', 'nb_sorted_units', 'nev_hi_freq_order', 'nev_hi_freq_type', 'nev_lo_freq_order', 'nev_lo_freq_type', 'nsx_hi_freq_order', 'nsx_lo_freq_order', 'nsx_hi_freq_type', 'nsx_lo_freq_type', 'description', 'nsx', 'hi_pass_freq', 'lo_pass_freq', 'hi_pass_order', 'lo_pass_order', 'filter_type', 'electrode_reject_HFC', 'electrode_reject_LFC', 'electrode_reject_IFC', 'connector_aligned_ids', 'coordinates_x', 'coordinates_y'])"
       ]
      },
-     "execution_count": 50,
+     "execution_count": 4,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -274,7 +285,7 @@
     }
    },
    "source": [
-    "We see that both, spiketrains as well as channels are annotated with a 'connector_aligned_id', indicating the spatial source of the signal. In addition the coordinates in x and y direction are provided in physical units for each channel and spiketrain. Spiketrains also carry information about 'noise', 'mua' or 'sua' assignment, indicating that the spikes were spikesorted and assigned to on of the three\n",
+    "We see that both, spiketrains as well as channels are annotated with a 'connector_aligned_id', indicating the spatial source of the signal. In addition the coordinates in x and y direction are provided in physical units for each channel and spiketrain. Spiketrains also carry information about 'noise', 'mua' or 'sua' assignment, indicating that the spikes were spikesorted and assigned to one of the three unit categories:\n",
     "- *noise*: non-neural threshold crossing events)\n",
     "- *mua*: multi-unit-activity - neural threshold crossing events that can not be uniquely assigned to a virtual neuron unit\n",
     "- *sua*: single-unit-activity - neural threshold crossing events that are assigned to a single virtual neuron unit"
@@ -295,7 +306,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 65,
+   "execution_count": 5,
    "id": "765fde73",
    "metadata": {
     "slideshow": {
@@ -367,7 +378,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 80,
+   "execution_count": 6,
    "id": "27ce9e97",
    "metadata": {
     "slideshow": {
@@ -395,7 +406,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 81,
+   "execution_count": 7,
    "id": "fe323fd4",
    "metadata": {
     "slideshow": {
@@ -420,7 +431,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 89,
+   "execution_count": 8,
    "id": "6096013b",
    "metadata": {
     "slideshow": {
@@ -449,7 +460,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 90,
+   "execution_count": 9,
    "id": "192dd147",
    "metadata": {
     "slideshow": {
@@ -464,7 +475,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 98,
+   "execution_count": 10,
    "id": "daabfccf",
    "metadata": {
     "slideshow": {
@@ -497,7 +508,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 92,
+   "execution_count": 11,
    "id": "adf48780",
    "metadata": {
     "slideshow": {
@@ -536,7 +547,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 94,
+   "execution_count": 12,
    "id": "42d33b10",
    "metadata": {
     "slideshow": {
@@ -553,7 +564,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 95,
+   "execution_count": 13,
    "id": "f58bca34",
    "metadata": {
     "slideshow": {
@@ -567,7 +578,7 @@
        "11"
       ]
      },
-     "execution_count": 95,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -590,7 +601,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 96,
+   "execution_count": 14,
    "id": "8c34c004",
    "metadata": {
     "slideshow": {