{ "cells": [ { "cell_type": "markdown", "id": "5c9991b1", "metadata": {}, "source": [ "Generate player votes database, containing votes for Serie A matchday and player.\n", "\n", "Votes data is manually downloaded from https://www.fantacalcio.it/voti-fantacalcio-serie-a\n", "\n", "Serie A calendar is loaded from another file, to add information not containing in votes files: home/away, team opponent." ] }, { "cell_type": "code", "execution_count": 1, "id": "b63beb69", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "id": "a3c39376", "metadata": {}, "outputs": [], "source": [ "cal = np.array(pd.read_excel('fantacalcio/seriea_calendar.xlsx', header = None))\n", "\n", "cal_df = pd.DataFrame(columns = ['matchday', 'team1', 'team2'])\n", "\n", "matchday = 0\n", "\n", "for i in range(cal.shape[0]):\n", " if(cal[i, 0][0].isnumeric()):\n", " matchday = matchday + 1\n", " continue\n", " \n", " teams = cal[i, 0].split('-')\n", " \n", " frame = pd.DataFrame([[matchday, teams[0], teams[1]]], columns = cal_df.columns)\n", "\n", " cal_df = pd.concat([cal_df, frame], ignore_index = True)\n", " " ] }, { "cell_type": "code", "execution_count": 3, "id": "92d3c6fb", "metadata": {}, "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", "
matchdayteam1team2
01BolognaMilan
11EmpoliVerona
21FrosinoneNapoli
31GenoaFiorentina
41InterMonza
............
37538VeronaInter
37638JuventusMonza
37738LazioSassuolo
37838MilanSalernitana
37938NapoliLecce
\n", "

380 rows × 3 columns

\n", "
" ], "text/plain": [ " matchday team1 team2\n", "0 1 Bologna Milan\n", "1 1 Empoli Verona\n", "2 1 Frosinone Napoli\n", "3 1 Genoa Fiorentina\n", "4 1 Inter Monza\n", ".. ... ... ...\n", "375 38 Verona Inter\n", "376 38 Juventus Monza\n", "377 38 Lazio Sassuolo\n", "378 38 Milan Salernitana\n", "379 38 Napoli Lecce\n", "\n", "[380 rows x 3 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cal_df" ] }, { "cell_type": "code", "execution_count": 4, "id": "0d4a330d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loaded votes for matchday 1\n", "loaded votes for matchday 2\n", "loaded votes for matchday 3\n" ] } ], "source": [ "df = pd.DataFrame(columns = ['matchday', 'player', 'team', 'oppteam', 'home', 'vote', 'goals', 'assists', 'cards_malus', 'fantavote'])\n", "\n", "LAST_MATCH = 38\n", "\n", "for matchday in range(1, LAST_MATCH + 1):\n", " \n", " votes_file = 'fantacalcio/voti/Voti_Fantacalcio_Stagione_2023_24_Giornata_' + str(matchday) + '.xlsx'\n", "\n", " try:\n", " rx = np.array(pd.read_excel(votes_file, header = None))\n", " except:\n", " break\n", "\n", " read = 0\n", " for i in range(rx.shape[0]):\n", " if(rx[i, 0] == \"Cod.\"):\n", " read = 1\n", " team = rx[i-1, 0];\n", " continue\n", "\n", " if(read):\n", " if(isinstance(rx[i, 0], int)):\n", " if((isinstance(rx[i, 3], float) or isinstance(rx[i, 3], int)) and rx[i, 1] != \"ALL\") :\n", " player = rx[i, 2];\n", " vote = float(rx[i, 3])\n", " goals = rx[i, 4] + rx[i, 8] - rx[i, 5]\n", " assists = rx[i, 12]\n", " cards_malus = rx[i, 10] * 0.5 + rx[i, 11]\n", " \n", " oppteam = ''\n", " home = 0\n", " for j in range(cal_df.shape[0]):\n", " if(cal_df['matchday'][j] == matchday):\n", " if(cal_df['team1'][j] == team):\n", " oppteam = cal_df['team2'][j] \n", " home = 1\n", " elif(cal_df['team2'][j] == team):\n", " oppteam = cal_df['team1'][j] \n", " home = 0\n", "\n", " goals_gen = goals * 3;\n", " if(goals < 0):\n", " goals_gen = goals\n", " \n", " fantavote = vote + goals_gen + assists - cards_malus \n", " \n", " frame = pd.DataFrame([[matchday, player, team, oppteam, home, vote, goals, assists, cards_malus, fantavote]], columns = df.columns)\n", "\n", " df = pd.concat([df, frame], axis = 0, ignore_index = True)\n", " else:\n", " read = 0\n", " continue\n", " \n", " print('loaded votes for matchday ' + str(matchday))\n", "\n", " df" ] }, { "cell_type": "code", "execution_count": 5, "id": "6ade957d", "metadata": {}, "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", "
matchdayplayerteamoppteamhomevotegoalsassistscards_malusfantavote
01MussoAtalantaSassuolo06.5000.06.5
11ZappacostaAtalantaSassuolo06.5000.06.5
21DjimsitiAtalantaSassuolo06.0000.06.0
31KolasinacAtalantaSassuolo06.5000.06.5
41ZorteaAtalantaSassuolo07.0100.010.0
.................................
8593FolorunshoVeronaSassuolo05.0000.05.0
8603SerdarVeronaSassuolo05.5000.05.5
8613BonazzoliVeronaSassuolo05.5000.05.5
8623DjuricVeronaSassuolo06.0000.06.0
8633NgongeVeronaSassuolo06.5100.09.5
\n", "

864 rows × 10 columns

\n", "
" ], "text/plain": [ " matchday player team oppteam home vote goals assists \\\n", "0 1 Musso Atalanta Sassuolo 0 6.5 0 0 \n", "1 1 Zappacosta Atalanta Sassuolo 0 6.5 0 0 \n", "2 1 Djimsiti Atalanta Sassuolo 0 6.0 0 0 \n", "3 1 Kolasinac Atalanta Sassuolo 0 6.5 0 0 \n", "4 1 Zortea Atalanta Sassuolo 0 7.0 1 0 \n", ".. ... ... ... ... ... ... ... ... \n", "859 3 Folorunsho Verona Sassuolo 0 5.0 0 0 \n", "860 3 Serdar Verona Sassuolo 0 5.5 0 0 \n", "861 3 Bonazzoli Verona Sassuolo 0 5.5 0 0 \n", "862 3 Djuric Verona Sassuolo 0 6.0 0 0 \n", "863 3 Ngonge Verona Sassuolo 0 6.5 1 0 \n", "\n", " cards_malus fantavote \n", "0 0.0 6.5 \n", "1 0.0 6.5 \n", "2 0.0 6.0 \n", "3 0.0 6.5 \n", "4 0.0 10.0 \n", ".. ... ... \n", "859 0.0 5.0 \n", "860 0.0 5.5 \n", "861 0.0 5.5 \n", "862 0.0 6.0 \n", "863 0.0 9.5 \n", "\n", "[864 rows x 10 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 6, "id": "230213fe", "metadata": {}, "outputs": [], "source": [ "df.to_excel('mid_outputs/players_votes.xlsx')" ] }, { "cell_type": "markdown", "id": "ef91ece3", "metadata": {}, "source": [ "Elaborate data for past seasons.\n", "\n", "Do not repeat if data is already present." ] }, { "cell_type": "code", "execution_count": 13, "id": "da35bdf9", "metadata": {}, "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", "
matchdayteam1team2
01VeronaSassuolo
11InterGenoa
21EmpoliLazio
31TorinoAtalanta
41BolognaSalernitana
............
37538SpeziaNapoli
37638SassuoloMilan
37738InterSampdoria
37838SalernitanaUdinese
37938VeneziaCagliari
\n", "

380 rows × 3 columns

\n", "
" ], "text/plain": [ " matchday team1 team2\n", "0 1 Verona Sassuolo\n", "1 1 Inter Genoa\n", "2 1 Empoli Lazio\n", "3 1 Torino Atalanta\n", "4 1 Bologna Salernitana\n", ".. ... ... ...\n", "375 38 Spezia Napoli\n", "376 38 Sassuolo Milan\n", "377 38 Inter Sampdoria\n", "378 38 Salernitana Udinese\n", "379 38 Venezia Cagliari\n", "\n", "[380 rows x 3 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# BACKUP CODE FOR SEASON 2122 and 2021 (different calendar file format than 2223 and 2324)\n", "\n", "cal_df = pd.read_excel('fantacalcio/season2122/seriea_calendar.xlsx')\n", "\n", "to_drop = list()\n", "\n", "for i in range(cal_df.shape[0]):\n", " if(not isinstance(cal_df['matchday'][i], int)):\n", " to_drop.append(i)\n", " \n", "cal_df = cal_df.drop(to_drop)\n", "\n", "cal_df = cal_df.reset_index(drop = True)\n", "\n", "cal_df" ] }, { "cell_type": "code", "execution_count": 14, "id": "a0b100da", "metadata": {}, "outputs": [], "source": [ "cal = np.array(pd.read_excel('fantacalcio/season2223/seriea_calendar.xlsx', header = None))\n", "\n", "cal_df = pd.DataFrame(columns = ['matchday', 'team1', 'team2'])\n", "\n", "matchday = 0\n", "\n", "for i in range(cal.shape[0]):\n", " if(cal[i, 0][0].isnumeric()):\n", " matchday = matchday + 1\n", " continue\n", " \n", " teams = cal[i, 0].split('-')\n", " \n", " frame = pd.DataFrame([[matchday, teams[0], teams[1]]], columns = cal_df.columns)\n", "\n", " cal_df = pd.concat([cal_df, frame], ignore_index = True)\n", " " ] }, { "cell_type": "code", "execution_count": 15, "id": "0313a0f4", "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(columns = ['matchday', 'player', 'team', 'oppteam', 'home', 'vote', 'goals', 'assists', 'cards_malus', 'fantavote'])\n", "\n", "LAST_MATCH = 38\n", "\n", "for matchday in range(1, LAST_MATCH + 1):\n", " \n", " votes_file = 'fantacalcio/season2223/voti/Voti_Fantacalcio_Stagione_2022_23_Giornata_' + str(matchday) + '.xlsx'\n", "\n", "\n", "\n", "\n", " rx = np.array(pd.read_excel(votes_file, header = None))\n", "\n", " read = 0\n", " for i in range(rx.shape[0]):\n", " if(rx[i, 0] == \"Cod.\"):\n", " read = 1\n", " team = rx[i-1, 0];\n", " continue\n", "\n", " if(read):\n", " if(isinstance(rx[i, 0], int)):\n", " if((isinstance(rx[i, 3], float) or isinstance(rx[i, 3], int)) and rx[i, 1] != \"ALL\") :\n", " player = rx[i, 2];\n", " vote = float(rx[i, 3])\n", " goals = rx[i, 4] + rx[i, 8] - rx[i, 5]\n", " assists = rx[i, 12]\n", " cards_malus = rx[i, 10] * 0.5 + rx[i, 11]\n", " \n", " oppteam = ''\n", " home = 0\n", " for j in range(cal_df.shape[0]):\n", " if(cal_df['matchday'][j] == matchday):\n", " if(cal_df['team1'][j] == team):\n", " oppteam = cal_df['team2'][j] \n", " home = 1\n", " elif(cal_df['team2'][j] == team):\n", " oppteam = cal_df['team1'][j] \n", " home = 0\n", "\n", " goals_gen = goals * 3;\n", " if(goals < 0):\n", " goals_gen = goals\n", " \n", " fantavote = vote + goals_gen + assists - cards_malus \n", " \n", " frame = pd.DataFrame([[matchday, player, team, oppteam, home, vote, goals, assists, cards_malus, fantavote]], columns = df.columns)\n", "\n", " df = pd.concat([df, frame], axis = 0, ignore_index = True)\n", " else:\n", " read = 0\n", " continue\n", "\n", " df" ] }, { "cell_type": "code", "execution_count": 16, "id": "82b1cfc8", "metadata": {}, "outputs": [], "source": [ "df.to_excel('mid_outputs/season2223/players_votes.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 }