Files
fantabeto/.ipynb_checkpoints/5_scraping_match_probable_players-checkpoint.ipynb
T
2023-09-21 07:51:22 +02:00

784 lines
23 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>Ochoa</td>\n",
" <td>1</td>\n",
" <td>90.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Lovato</td>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Gyomber</td>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Pirola</td>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Mazzocchi</td>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>471</th>\n",
" <td>Pisilli</td>\n",
" <td>0</td>\n",
" <td>10.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>472</th>\n",
" <td>Aouar</td>\n",
" <td>0</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>473</th>\n",
" <td>El Shaarawy</td>\n",
" <td>0</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>474</th>\n",
" <td>Belotti</td>\n",
" <td>0</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>475</th>\n",
" <td>Azmoun</td>\n",
" <td>0</td>\n",
" <td>35.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>476 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" player starter percentage\n",
"0 Ochoa 1 90.0\n",
"1 Lovato 1 80.0\n",
"2 Gyomber 1 80.0\n",
"3 Pirola 1 80.0\n",
"4 Mazzocchi 1 80.0\n",
".. ... ... ...\n",
"471 Pisilli 0 10.0\n",
"472 Aouar 0 55.0\n",
"473 El Shaarawy 0 55.0\n",
"474 Belotti 0 60.0\n",
"475 Azmoun 0 35.0\n",
"\n",
"[476 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[1].contents[0]\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>Ikwuemesi</td>\n",
" <td>Botheim</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Jovane</td>\n",
" <td>Kastanos</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Okoli</td>\n",
" <td>Monterisi</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Caso</td>\n",
" <td>Baez</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Vasquez</td>\n",
" <td>Martin</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Malinovskyi</td>\n",
" <td>De Winter</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Kjaer</td>\n",
" <td>Thiaw</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Rafael Leao</td>\n",
" <td>Chukwueze</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Giroud</td>\n",
" <td>Jovic</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Bonazzoli</td>\n",
" <td>Djuric</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Mboula</td>\n",
" <td>Folorunsho</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Tressoldi</td>\n",
" <td>Viti</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Vina</td>\n",
" <td>Pedersen</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Bajrami</td>\n",
" <td>Thorstvedt</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Fagioli</td>\n",
" <td>Miretti</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Mckennie</td>\n",
" <td>Weah</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Zaccagni</td>\n",
" <td>Pedro</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Romagnoli</td>\n",
" <td>Patric</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Guendouzi</td>\n",
" <td>Kamada</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Birindelli</td>\n",
" <td>Kyriakopoulos</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Maleh</td>\n",
" <td>Bastoni S.</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Fazzini</td>\n",
" <td>Grassi</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Bereszynski</td>\n",
" <td>Ebuehi</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Thuram</td>\n",
" <td>Arnautovic</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Dimarco</td>\n",
" <td>Carlos Augusto</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>Pavard</td>\n",
" <td>Darmian</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>De Vrij</td>\n",
" <td>Acerbi</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Frattesi</td>\n",
" <td>Mkhitaryan</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Zappacosta</td>\n",
" <td>Zortea</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Ruggeri</td>\n",
" <td>Bakker</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>Toloi</td>\n",
" <td>Djimsiti</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>Jankto</td>\n",
" <td>Deiola</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>Obert</td>\n",
" <td>Prati</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>Ebosele</td>\n",
" <td>Ferreira J.</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>Kamara H.</td>\n",
" <td>Zemura</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>Nzola</td>\n",
" <td>Beltran L.</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>Mandragora</td>\n",
" <td>Duncan</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>Ranieri L.</td>\n",
" <td>Martinez Quarta</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>Kouame'</td>\n",
" <td>Sottil</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>Moro N.</td>\n",
" <td>Aebischer</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>Ndoye</td>\n",
" <td>Orsolini</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>Zielinski</td>\n",
" <td>Elmas</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>Juan Jesus</td>\n",
" <td>Natan</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>Politano</td>\n",
" <td>Raspadori</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>Mario Rui</td>\n",
" <td>Olivera</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>Vlasic</td>\n",
" <td>Seck</td>\n",
" <td>65.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>Ilic</td>\n",
" <td>Tameze</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>Paredes</td>\n",
" <td>Aouar</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>Kristensen</td>\n",
" <td>Celik</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>Spinazzola</td>\n",
" <td>Zalewski</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" player1 player2 percentage\n",
"0 Ikwuemesi Botheim 55.0\n",
"1 Jovane Kastanos 55.0\n",
"2 Okoli Monterisi 55.0\n",
"3 Caso Baez 55.0\n",
"4 Vasquez Martin 60.0\n",
"5 Malinovskyi De Winter 60.0\n",
"6 Kjaer Thiaw 60.0\n",
"7 Rafael Leao Chukwueze 60.0\n",
"8 Giroud Jovic 60.0\n",
"9 Bonazzoli Djuric 60.0\n",
"10 Mboula Folorunsho 55.0\n",
"11 Tressoldi Viti 60.0\n",
"12 Vina Pedersen 65.0\n",
"13 Bajrami Thorstvedt 60.0\n",
"14 Fagioli Miretti 60.0\n",
"15 Mckennie Weah 55.0\n",
"16 Zaccagni Pedro 60.0\n",
"17 Romagnoli Patric 60.0\n",
"18 Guendouzi Kamada 55.0\n",
"19 Birindelli Kyriakopoulos 65.0\n",
"20 Maleh Bastoni S. 55.0\n",
"21 Fazzini Grassi 60.0\n",
"22 Bereszynski Ebuehi 60.0\n",
"23 Thuram Arnautovic 60.0\n",
"24 Dimarco Carlos Augusto 55.0\n",
"25 Pavard Darmian 60.0\n",
"26 De Vrij Acerbi 60.0\n",
"27 Frattesi Mkhitaryan 65.0\n",
"28 Zappacosta Zortea 60.0\n",
"29 Ruggeri Bakker 60.0\n",
"30 Toloi Djimsiti 55.0\n",
"31 Jankto Deiola 55.0\n",
"32 Obert Prati 55.0\n",
"33 Ebosele Ferreira J. 60.0\n",
"34 Kamara H. Zemura 60.0\n",
"35 Nzola Beltran L. 60.0\n",
"36 Mandragora Duncan 55.0\n",
"37 Ranieri L. Martinez Quarta 55.0\n",
"38 Kouame' Sottil 55.0\n",
"39 Moro N. Aebischer 55.0\n",
"40 Ndoye Orsolini 55.0\n",
"41 Zielinski Elmas 65.0\n",
"42 Juan Jesus Natan 55.0\n",
"43 Politano Raspadori 60.0\n",
"44 Mario Rui Olivera 55.0\n",
"45 Vlasic Seck 65.0\n",
"46 Ilic Tameze 55.0\n",
"47 Paredes Aouar 60.0\n",
"48 Kristensen Celik 60.0\n",
"49 Spinazzola Zalewski 60.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[1].contents[0]\n",
" player2 = players[1].contents[1].contents[0]\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>Ochoa</th>\n",
" <td>1</td>\n",
" <td>90.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lovato</th>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gyomber</th>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Pirola</th>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Mazzocchi</th>\n",
" <td>1</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Pisilli</th>\n",
" <td>0</td>\n",
" <td>10.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Aouar</th>\n",
" <td>0.4</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>El Shaarawy</th>\n",
" <td>0</td>\n",
" <td>55.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Belotti</th>\n",
" <td>0</td>\n",
" <td>60.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Azmoun</th>\n",
" <td>0</td>\n",
" <td>35.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>476 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" starter percentage\n",
"player \n",
"Ochoa 1 90.0\n",
"Lovato 1 80.0\n",
"Gyomber 1 80.0\n",
"Pirola 1 80.0\n",
"Mazzocchi 1 80.0\n",
"... ... ...\n",
"Pisilli 0 10.0\n",
"Aouar 0.4 55.0\n",
"El Shaarawy 0 55.0\n",
"Belotti 0 60.0\n",
"Azmoun 0 35.0\n",
"\n",
"[476 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') "
]
}
],
"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
}