From f86cb6fcef123642f0b70e79f29e23e6f3dab49a Mon Sep 17 00:00:00 2001 From: Jasper Tielmann Date: Tue, 21 Nov 2023 13:56:59 +0000 Subject: [PATCH] lab done --- your-code/challenge-1.ipynb | 543 +++++++++++++++++++++++++++++++++--- your-code/challenge-2.ipynb | 387 +++++++++++++++++++++++-- 2 files changed, 874 insertions(+), 56 deletions(-) diff --git a/your-code/challenge-1.ipynb b/your-code/challenge-1.ipynb index c1bb43d..af53008 100755 --- a/your-code/challenge-1.ipynb +++ b/your-code/challenge-1.ipynb @@ -19,12 +19,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Import libraries\n", - "import pandas as pd" + "import pandas as pd\n", + "import numpy as np\n", + "import scipy.stats as st" ] }, { @@ -38,13 +40,274 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
#NameType 1Type 2TotalHPAttackDefenseSp. AtkSp. DefSpeedGenerationLegendary
01BulbasaurGrassPoison3184549496565451False
12IvysaurGrassPoison4056062638080601False
23VenusaurGrassPoison525808283100100801False
33VenusaurMega VenusaurGrassPoison62580100123122120801False
44CharmanderFireNaN3093952436050651False
..........................................
795719DiancieRockFairy60050100150100150506True
796719DiancieMega DiancieRockFairy700501601101601101106True
797720HoopaHoopa ConfinedPsychicGhost6008011060150130706True
798720HoopaHoopa UnboundPsychicDark6808016060170130806True
799721VolcanionFireWater6008011012013090706True
\n", + "

800 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " # Name Type 1 Type 2 Total HP Attack Defense \\\n", + "0 1 Bulbasaur Grass Poison 318 45 49 49 \n", + "1 2 Ivysaur Grass Poison 405 60 62 63 \n", + "2 3 Venusaur Grass Poison 525 80 82 83 \n", + "3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 \n", + "4 4 Charmander Fire NaN 309 39 52 43 \n", + ".. ... ... ... ... ... .. ... ... \n", + "795 719 Diancie Rock Fairy 600 50 100 150 \n", + "796 719 DiancieMega Diancie Rock Fairy 700 50 160 110 \n", + "797 720 HoopaHoopa Confined Psychic Ghost 600 80 110 60 \n", + "798 720 HoopaHoopa Unbound Psychic Dark 680 80 160 60 \n", + "799 721 Volcanion Fire Water 600 80 110 120 \n", + "\n", + " Sp. Atk Sp. Def Speed Generation Legendary \n", + "0 65 65 45 1 False \n", + "1 80 80 60 1 False \n", + "2 100 100 80 1 False \n", + "3 122 120 80 1 False \n", + "4 60 50 65 1 False \n", + ".. ... ... ... ... ... \n", + "795 100 150 50 6 True \n", + "796 160 110 110 6 True \n", + "797 150 130 70 6 True \n", + "798 170 130 80 6 True \n", + "799 130 90 70 6 True \n", + "\n", + "[800 rows x 13 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here:\n" + "df = pd.read_csv(\"pokemon.csv\")\n", + "df" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -58,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -74,8 +337,9 @@ " dict: a dictionary of t-test scores for each feature where the feature name is the key and the p-value is the value\n", " \"\"\"\n", " results = {}\n", - "\n", - " # Your code here\n", + " for i in features:\n", + " t_score = st.ttest_ind(s1[i], s2[i], equal_var = False)[1]\n", + " results[i] = t_score\n", " \n", " return results" ] @@ -101,11 +365,34 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'HP': 1.0026911708035284e-13,\n", + " 'Attack': 2.520372449236646e-16,\n", + " 'Defense': 4.8269984949193316e-11,\n", + " 'Sp. Atk': 1.5514614112239812e-21,\n", + " 'Sp. Def': 2.2949327864052826e-15,\n", + " 'Speed': 1.049016311882451e-18,\n", + " 'Total': 9.357954335957446e-47}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here\n" + "features=['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed', 'Total']\n", + "s1 = df[df[\"Legendary\"]==True]\n", + "s2 = df[df[\"Legendary\"]==False]\n", + "\n", + "t_test_features(s1, s2, features)" ] }, { @@ -117,11 +404,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n" + ] + } + ], "source": [ - "# Your comment here" + "# H0: No Significant Difference between Legendary and non-Legendary Pokemons\n", + "# H1: Significant Difference between Legendary and non-Legendary Pokemons\n", + "\n", + "\n", + "result = t_test_features(s1, s2, features)\n", + "\n", + "for i in result.values():\n", + " if i<0.05:\n", + " print(\"Can reject null hypothesis\")\n", + " else:\n", + " print(\"Can not reject null hypothesis\")" ] }, { @@ -133,11 +444,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'HP': 0.14551697834219623,\n", + " 'Attack': 0.24721958967217725,\n", + " 'Defense': 0.5677711011725426,\n", + " 'Sp. Atk': 0.12332165977104388,\n", + " 'Sp. Def': 0.18829872292645752,\n", + " 'Speed': 0.00239265937312135,\n", + " 'Total': 0.5631377907941676}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here\n" + "g1 = df[df[\"Generation\"]==1]\n", + "g2 = df[df[\"Generation\"]==2]\n", + "\n", + "t_test_features(g1, g2, features)" ] }, { @@ -149,11 +480,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can not reject null hypothesis\n", + "Can not reject null hypothesis\n", + "Can not reject null hypothesis\n", + "Can not reject null hypothesis\n", + "Can not reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can not reject null hypothesis\n" + ] + } + ], "source": [ - "# Your comment here" + "# H0: No Significant Difference between Generation 1 and Generation 2 Pokemons\n", + "# H1: ignificant Difference between Generation 1 and Generation 2 Pokemons\n", + "\n", + "\n", + "result = t_test_features(g1, g2, features)\n", + "\n", + "for i in result.values():\n", + " if i<0.05:\n", + " print(\"Can reject null hypothesis\")\n", + " else:\n", + " print(\"Can not reject null hypothesis\")" ] }, { @@ -165,11 +520,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'HP': 0.14551697834219623,\n", + " 'Attack': 0.24721958967217725,\n", + " 'Defense': 0.5677711011725426,\n", + " 'Sp. Atk': 0.12332165977104388,\n", + " 'Sp. Def': 0.18829872292645752,\n", + " 'Speed': 0.00239265937312135,\n", + " 'Total': 0.5631377907941676}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here\n" + "t1 = df[df[\"Type 2\"].isnull()]\n", + "t2 = df.dropna(subset=[\"Type 2\"])\n", + "\n", + "t_test_features(g1, g2, features)" ] }, { @@ -181,11 +556,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can not reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n", + "Can reject null hypothesis\n" + ] + } + ], "source": [ - "# Your comment here" + "# H0: No Significant Difference between single type and two types Pokemons\n", + "# H1: Significant Difference between singe type and two types Pokemons\n", + "\n", + "\n", + "result = t_test_features(t1, t2, features)\n", + "\n", + "for i in result.values():\n", + " if i<0.05:\n", + " print(\"Can reject null hypothesis\")\n", + " else:\n", + " print(\"Can not reject null hypothesis\")" ] }, { @@ -199,11 +598,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attack vs Defense: 1.7140303479358558e-05\n" + ] + } + ], + "source": [ + " t_score = st.ttest_rel(df[\"Attack\"], df[\"Defense\"])[1]\n", + "print(\"Attack vs Defense: \", t_score)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sp. Atk vs Sp. Def: 0.3933685997548122\n" + ] + } + ], "source": [ - "# Your code here\n" + " t_score1 = st.ttest_rel(df[\"Sp. Atk\"], df[\"Sp. Def\"])[1]\n", + "print(\"Sp. Atk vs Sp. Def: \", t_score1)" ] }, { @@ -215,17 +641,64 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can reject null hypothesis\n", + "Can not reject null hypothesis\n" + ] + } + ], "source": [ - "# Your comment here" + "# H0: No Significant Difference\n", + "# H1: Significant Difference\n", + "\n", + "for i in [t_score, t_score1] :\n", + " if i<0.05:\n", + " print(\"Can reject null hypothesis\")\n", + " else:\n", + " print(\"Can not reject null hypothesis\")" ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nFor defence and attack we can exclude the opportunity of a signifcant difference between these two measure.\\nFor sp. Atl and Sp. Def we can not reject just mentioned opportunity and be therefore not be certain that there \\nis no signifcant difference.\\n'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "For defence and attack we can exclude the opportunity of a signifcant difference between these two measure.\n", + "For sp. Atl and Sp. Def we can not reject just mentioned opportunity and be therefore not be certain that there \n", + "is no signifcant difference.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -239,7 +712,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/your-code/challenge-2.ipynb b/your-code/challenge-2.ipynb index 1f0e335..3cfd2e3 100755 --- a/your-code/challenge-2.ipynb +++ b/your-code/challenge-2.ipynb @@ -17,21 +17,277 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Import libraries\n", - "import pandas as pd" + "import pandas as pd\n", + "import numpy as np\n", + "from scipy.stats import stats " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
#NameType 1Type 2TotalHPAttackDefenseSp. AtkSp. DefSpeedGenerationLegendary
01BulbasaurGrassPoison3184549496565451False
12IvysaurGrassPoison4056062638080601False
23VenusaurGrassPoison525808283100100801False
33VenusaurMega VenusaurGrassPoison62580100123122120801False
44CharmanderFireNaN3093952436050651False
..........................................
795719DiancieRockFairy60050100150100150506True
796719DiancieMega DiancieRockFairy700501601101601101106True
797720HoopaHoopa ConfinedPsychicGhost6008011060150130706True
798720HoopaHoopa UnboundPsychicDark6808016060170130806True
799721VolcanionFireWater6008011012013090706True
\n", + "

800 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " # Name Type 1 Type 2 Total HP Attack Defense \\\n", + "0 1 Bulbasaur Grass Poison 318 45 49 49 \n", + "1 2 Ivysaur Grass Poison 405 60 62 63 \n", + "2 3 Venusaur Grass Poison 525 80 82 83 \n", + "3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 \n", + "4 4 Charmander Fire NaN 309 39 52 43 \n", + ".. ... ... ... ... ... .. ... ... \n", + "795 719 Diancie Rock Fairy 600 50 100 150 \n", + "796 719 DiancieMega Diancie Rock Fairy 700 50 160 110 \n", + "797 720 HoopaHoopa Confined Psychic Ghost 600 80 110 60 \n", + "798 720 HoopaHoopa Unbound Psychic Dark 680 80 160 60 \n", + "799 721 Volcanion Fire Water 600 80 110 120 \n", + "\n", + " Sp. Atk Sp. Def Speed Generation Legendary \n", + "0 65 65 45 1 False \n", + "1 80 80 60 1 False \n", + "2 100 100 80 1 False \n", + "3 122 120 80 1 False \n", + "4 60 50 65 1 False \n", + ".. ... ... ... ... ... \n", + "795 100 150 50 6 True \n", + "796 160 110 110 6 True \n", + "797 150 130 70 6 True \n", + "798 170 130 80 6 True \n", + "799 130 90 70 6 True \n", + "\n", + "[800 rows x 13 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Load the data:\n" + "df = pd.read_csv(\"pokemon.csv\")\n", + "df" ] }, { @@ -58,13 +314,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Your code here\n", - "\n", - "\n", + "unique_types = list(df[\"Type 1\"].unique())\n", + "unique_type2 = df[\"Type 2\"].unique()\n", + "for i in unique2:\n", + " if i not in unique_types:\n", + " unique_types.append(i)\n", "len(unique_types) # you should see 19" ] }, @@ -85,13 +354,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "18" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "pokemon_totals = []\n", + "for i in unique_types:\n", + " if type(i)==str:\n", + " total = df[(df[\"Type 1\"]==i)|(df[\"Type 2\"]==i)][\"Total\"]\n", + " pokemon_totals.append(total)\n", "\n", - "# Your code here\n", "\n", "len(pokemon_totals) # you should see 18" ] @@ -111,11 +394,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value: 2.6457458815984803e-15\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Jacob\\AppData\\Local\\Temp\\ipykernel_23200\\4167364940.py:1: DeprecationWarning: Please use `f_oneway` from the `scipy.stats` namespace, the `scipy.stats.stats` namespace is deprecated.\n", + " p_value = stats.f_oneway(*pokemon_totals)[1]\n" + ] + } + ], "source": [ - "# Your code here\n" + "p_value = stats.f_oneway(*pokemon_totals)[1]\n", + "print(\"p-value:\", p_value)" ] }, { @@ -127,17 +427,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can reject Null Hypothesis\n" + ] + } + ], "source": [ - "# Your comment here" + "# H0: All Values are similiar\n", + "# H1: Not all Values are similiar\n", + "\n", + "if p_value<0.05:\n", + " print(\"Can reject Null Hypothesis\")\n", + "else:\n", + " print(\"Can not reject Null hypothesis\")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\nAs the P-Value is lower than our alpha (0.05), we can reject the null hypothesis. Therefore there is a significant\\ndifference between the totals.\\n'" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "As the P-Value is lower than our alpha (0.05), we can reject the null hypothesis. Therefore there is a significant\n", + "difference between the totals.\n", + "\"\"\"" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -151,7 +496,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.11.3" } }, "nbformat": 4,