Files
fantabeto/.ipynb_checkpoints/5_scraping_match_probable_players-checkpoint.ipynb
T
2022-11-15 20:10:35 +01:00

827 lines
25 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "fd8a6cb9",
"metadata": {},
"source": [
"Scraping for playing probability for the current Serie A matchday.\n",
"\n",
"Data from http://fantacalcio.it"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "4c7b7d26",
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from bs4 import BeautifulSoup\n",
"import pandas as pd\n",
"import numpy as np\n",
"import re\n",
"import sys, getopt\n",
"import csv\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "91897dbb",
"metadata": {},
"outputs": [],
"source": [
"res = requests.get('https://www.fantacalcio.it/probabili-formazioni-serie-a')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7ba89027",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>player</th>\n",
" <th>starter</th>\n",
" <th>percentage</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Vicario</td>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Ebuehi</td>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Ismajli</td>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Walukiewicz</td>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Parisi</td>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>444</th>\n",
" <td>Basic</td>\n",
" <td>0</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>445</th>\n",
" <td>Bertini</td>\n",
" <td>0</td>\n",
" <td>10.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>446</th>\n",
" <td>Marcos Antonio</td>\n",
" <td>0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>447</th>\n",
" <td>Romero L.</td>\n",
" <td>0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>448</th>\n",
" <td>Cancellieri</td>\n",
" <td>0</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>449 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" player starter percentage\n",
"0 Vicario 1 100.0\n",
"1 Ebuehi 1 100.0\n",
"2 Ismajli 1 100.0\n",
"3 Walukiewicz 1 100.0\n",
"4 Parisi 1 100.0\n",
".. ... ... ...\n",
"444 Basic 0 55.0\n",
"445 Bertini 0 10.0\n",
"446 Marcos Antonio 0 50.0\n",
"447 Romero L. 0 50.0\n",
"448 Cancellieri 0 55.0\n",
"\n",
"[449 rows x 3 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"soup = BeautifulSoup(res.text)\n",
"\n",
"groups = soup.findAll('ul', attrs = {'class' : 'player-list'})\n",
"\n",
"probables = pd.DataFrame(columns = ['player', 'starter', 'percentage'])\n",
"\n",
"for i in range (len(groups)):\n",
" players = groups[i].findAll('a', attrs = {'class' : 'player-name'})\n",
" bars = groups[i].findAll('div', attrs = {'class' : 'progress-bar'})\n",
" \n",
" starter_string = groups[i]['class'][1]\n",
" if(starter_string == 'starters'):\n",
" starter = 1\n",
" else:\n",
" starter = 0\n",
" \n",
" for j in range(len(players)):\n",
" player = players[j].contents[0].replace('\\n \\n ', '')\n",
" perc = float(bars[j]['aria-valuenow'])\n",
" \n",
" row_df = pd.DataFrame([[player, starter, perc]], columns = probables.columns)\n",
" \n",
" probables = pd.concat([probables, row_df], ignore_index = True)\n",
" \n",
"probables "
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "29e5b389",
"metadata": {},
"outputs": [],
"source": [
"probables = probables.set_index('player')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "d711726e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>player1</th>\n",
" <th>player2</th>\n",
" <th>percentage</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Lozano</td>\n",
" <td>Politano</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Zambo Anguissa</td>\n",
" <td>Ndombele'</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Mario Rui</td>\n",
" <td>Olivera</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Elmas</td>\n",
" <td>Raspadori</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Beto</td>\n",
" <td>Success</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Lovric</td>\n",
" <td>Samardzic</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Ehizibue</td>\n",
" <td>Nuytinck</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Rincon</td>\n",
" <td>Vieira</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Augello</td>\n",
" <td>Murru</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Djuricic</td>\n",
" <td>Leris</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Caputo</td>\n",
" <td>Montevago</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Di Francesco F.</td>\n",
" <td>Banda</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Colombo</td>\n",
" <td>Ceesay</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Gonzalez J.</td>\n",
" <td>Bistrovic</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Lykogiannis</td>\n",
" <td>Cambiaso</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Barrow</td>\n",
" <td>Orsolini</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Ferguson</td>\n",
" <td>Schouten</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Traore' Hj.</td>\n",
" <td>Berardi</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Rogerio</td>\n",
" <td>Kyriakopoulos</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Djimsiti</td>\n",
" <td>Scalvini</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Zapata D.</td>\n",
" <td>Hojlund</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Pasalic</td>\n",
" <td>Malinovskyi</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Bastoni</td>\n",
" <td>Acerbi</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Brozovic</td>\n",
" <td>Mkhitaryan</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Skriniar</td>\n",
" <td>D'ambrosio</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>Lazovic</td>\n",
" <td>Depaoli</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Verdi</td>\n",
" <td>Hongla</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Dawidowicz</td>\n",
" <td>Hien</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Verde</td>\n",
" <td>Gyasi</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Bastoni S.</td>\n",
" <td>Amian</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>Carlos Augusto</td>\n",
" <td>D'alessandro</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>Birindelli</td>\n",
" <td>Ciurria</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>Petagna</td>\n",
" <td>Gytkjaer</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>Caldirola</td>\n",
" <td>Carboni</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>Lovato</td>\n",
" <td>Bronn</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>Piatek</td>\n",
" <td>Bonazzoli</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>Candreva</td>\n",
" <td>Bradaric</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>Zalewski</td>\n",
" <td>El Shaarawy</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>Volpato</td>\n",
" <td>Dybala</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>Matic</td>\n",
" <td>Camara Ma.</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>Vojvoda</td>\n",
" <td>Singo</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>Sanabria</td>\n",
" <td>Pellegri</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>Miranchuk</td>\n",
" <td>Radonjic</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>Kjaer</td>\n",
" <td>Gabbia</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>De Ketelaere</td>\n",
" <td>Diaz B.</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>Bennacer</td>\n",
" <td>Pobega</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>Martinez Quarta</td>\n",
" <td>Igor</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>Bonaventura</td>\n",
" <td>Mandragora</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>Dodo'</td>\n",
" <td>Venuti</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>Ikone'</td>\n",
" <td>Saponara</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <td>Locatelli</td>\n",
" <td>Paredes</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>Milik</td>\n",
" <td>Vlahovic</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>Miretti</td>\n",
" <td>Di Maria</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>Immobile</td>\n",
" <td>Cancellieri</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>Vecino</td>\n",
" <td>Luis Alberto</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" player1 player2 percentage\n",
"0 Lozano Politano 60.0\n",
"1 Zambo Anguissa Ndombele' 60.0\n",
"2 Mario Rui Olivera 55.0\n",
"3 Elmas Raspadori 55.0\n",
"4 Beto Success 60.0\n",
"5 Lovric Samardzic 55.0\n",
"6 Ehizibue Nuytinck 60.0\n",
"7 Rincon Vieira 60.0\n",
"8 Augello Murru 55.0\n",
"9 Djuricic Leris 65.0\n",
"10 Caputo Montevago 60.0\n",
"11 Di Francesco F. Banda 55.0\n",
"12 Colombo Ceesay 55.0\n",
"13 Gonzalez J. Bistrovic 60.0\n",
"14 Lykogiannis Cambiaso 55.0\n",
"15 Barrow Orsolini 55.0\n",
"16 Ferguson Schouten 55.0\n",
"17 Traore' Hj. Berardi 55.0\n",
"18 Rogerio Kyriakopoulos 60.0\n",
"19 Djimsiti Scalvini 60.0\n",
"20 Zapata D. Hojlund 60.0\n",
"21 Pasalic Malinovskyi 55.0\n",
"22 Bastoni Acerbi 55.0\n",
"23 Brozovic Mkhitaryan 55.0\n",
"24 Skriniar D'ambrosio 65.0\n",
"25 Lazovic Depaoli 55.0\n",
"26 Verdi Hongla 60.0\n",
"27 Dawidowicz Hien 60.0\n",
"28 Verde Gyasi 55.0\n",
"29 Bastoni S. Amian 55.0\n",
"30 Carlos Augusto D'alessandro 60.0\n",
"31 Birindelli Ciurria 60.0\n",
"32 Petagna Gytkjaer 55.0\n",
"33 Caldirola Carboni 65.0\n",
"34 Lovato Bronn 55.0\n",
"35 Piatek Bonazzoli 55.0\n",
"36 Candreva Bradaric 55.0\n",
"37 Zalewski El Shaarawy 60.0\n",
"38 Volpato Dybala 55.0\n",
"39 Matic Camara Ma. 55.0\n",
"40 Vojvoda Singo 60.0\n",
"41 Sanabria Pellegri 55.0\n",
"42 Miranchuk Radonjic 55.0\n",
"43 Kjaer Gabbia 55.0\n",
"44 De Ketelaere Diaz B. 55.0\n",
"45 Bennacer Pobega 60.0\n",
"46 Martinez Quarta Igor 55.0\n",
"47 Bonaventura Mandragora 55.0\n",
"48 Dodo' Venuti 55.0\n",
"49 Ikone' Saponara 55.0\n",
"50 Locatelli Paredes 60.0\n",
"51 Milik Vlahovic 65.0\n",
"52 Miretti Di Maria 55.0\n",
"53 Immobile Cancellieri 60.0\n",
"54 Vecino Luis Alberto 55.0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"groups = soup.findAll('ul', attrs = {'class' : 'ballot-list'})\n",
"\n",
"ballots = pd.DataFrame(columns = ['player1', 'player2', 'percentage'])\n",
"for i in range (len(groups)):\n",
" players = groups[i].findAll('a', attrs = {'class' : 'player-name'})\n",
" percs = groups[i].findAll('strong', attrs = {'class' : 'percentage'})\n",
" \n",
" player1 = players[0].contents[0].replace('\\n \\n ', '')\n",
" player2 = players[1].contents[0].replace('\\n \\n ', '')\n",
" perc = float(percs[0].contents[0].replace('%', ''))\n",
" \n",
" row_df = pd.DataFrame([[player1, player2, perc]], columns = ballots.columns)\n",
" \n",
" ballots = pd.concat([ballots, row_df], ignore_index = True)\n",
" \n",
"ballots"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0171c61d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>starter</th>\n",
" <th>percentage</th>\n",
" </tr>\n",
" <tr>\n",
" <th>player</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Vicario</th>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Ebuehi</th>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Ismajli</th>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Walukiewicz</th>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Parisi</th>\n",
" <td>1</td>\n",
" <td>100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Basic</th>\n",
" <td>0</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Bertini</th>\n",
" <td>0</td>\n",
" <td>10.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Marcos Antonio</th>\n",
" <td>0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Romero L.</th>\n",
" <td>0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Cancellieri</th>\n",
" <td>0.4</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>449 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" starter percentage\n",
"player \n",
"Vicario 1 100.0\n",
"Ebuehi 1 100.0\n",
"Ismajli 1 100.0\n",
"Walukiewicz 1 100.0\n",
"Parisi 1 100.0\n",
"... ... ...\n",
"Basic 0 55.0\n",
"Bertini 0 10.0\n",
"Marcos Antonio 0 50.0\n",
"Romero L. 0 50.0\n",
"Cancellieri 0.4 55.0\n",
"\n",
"[449 rows x 2 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for i in range(ballots.shape[0]):\n",
" p1 = ballots['player1'][i]\n",
" p2 = ballots['player2'][i]\n",
" \n",
" perc = float(ballots['percentage'][i])\n",
" \n",
" probables.at[p1, 'starter'] = perc/100\n",
" probables.at[p2, 'starter'] = 1 - perc/100\n",
" \n",
"probables"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "8b5468aa",
"metadata": {},
"outputs": [],
"source": [
"probables.to_excel('mid_outputs/match_probable_players.xlsx') "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cf992051",
"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.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}