From 0bd4f424fb764e68f0d946ffc18dca314a67e9f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Crist=C3=B3bal=20Herreros?= Date: Sun, 22 Jan 2023 08:34:57 +0100 Subject: [PATCH 1/2] Doc: document the story and data source --- README.md | 6 +- entrega.ipynb | 2740 ++++--------------------------------------------- 2 files changed, 195 insertions(+), 2551 deletions(-) diff --git a/README.md b/README.md index 6b32ea8..4f9c725 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# ml-entrega2 \ No newline at end of file +# Segunda entrega de machine learning + +Una empresa de apuestas solicita conocer quien gana en un partido de NBA. Para ello, se usan los datos actualizados hasta la tempporada 2022 https://www.kaggle.com/datasets/nathanlauga/nba-games?resource=download + +Para conseguir el objetivo, se decide usar varios algoritmos de machine learning para poder escoger el que mejor resultado pueda satisfacer las necesidades de la empresa. \ No newline at end of file diff --git a/entrega.ipynb b/entrega.ipynb index 967a12a..5132acf 100644 --- a/entrega.ipynb +++ b/entrega.ipynb @@ -1,22 +1,5 @@ { "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "En este ejercicio, el alumno tendrá que plantear y resolver un problema utilizando aprendizaje\n", - "automático. Se tendrán que llevar a cabo todos los pasos necesarios para la resolución del\n", - "problema: planteamiento, diseño, adquisición de los datos, análisis, entrenamiento de\n", - "algoritmos, evaluación, discusión de resultados, etc. Todo este proceso se desarrollará en un\n", - "cuaderno de Jupyter que conformará la entrega final.\n", - "El problema planteado podrá ser inventado o real, y puede estar basado en un problema de\n", - "negocio, un artículo científico, una competición, etc. Existen únicamente dos requisitos en\n", - "cuanto al caso de uso:\n", - "1. Tiene que utilizarse un conjunto de datos para su resolución.\n", - "2. La solución debe estar basada en aprendizaje automático, es decir, se debe haber\n", - "entrenado al menos un algoritmo." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -28,12 +11,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Una empresa dedicada a las apuestas, necesita un modelo de entrenamiento fiable en el cual poder saber si gana un equipo u otro dependiendo de unos datos de entrada. En este ejercicio se haran pruebas de distintos modelos y se seleccionaran distintas variables para probar su eficacia." + "**Una empresa dedicada a las apuestas, necesita un modelo de entrenamiento fiable en el cual poder saber si gana un equipo u otro dependiendo de unos datos de entrada. En este ejercicio se haran pruebas de distintos modelos y se seleccionaran distintas variables para probar su eficacia.**" ] }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -62,14 +45,14 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_14939/1756342927.py:3: DtypeWarning: Columns (6) have mixed types. Specify dtype option on import or set low_memory=False.\n", + "/tmp/ipykernel_5567/1756342927.py:3: DtypeWarning: Columns (6) have mixed types. Specify dtype option on import or set low_memory=False.\n", " df_games_details = pd.read_csv(zf.open('games_details.csv'))\n" ] } @@ -92,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -938,7 +921,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1054,7 +1037,7 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -1251,7 +1234,7 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -1675,7 +1658,7 @@ }, { "cell_type": "code", - "execution_count": 143, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1723,2207 +1706,216 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
GAME_IDTEAM_IDTEAM_ABBREVIATIONTEAM_CITYPLAYER_IDPLAYER_NAMENICKNAMESTART_POSITIONCOMMENTMIN...OREBDREBREBASTSTLBLKTOPFPTSPLUS_MINUS
0222004771610612759SASSan Antonio1629641Romeo LangfordRomeoFNaN18:06...1.01.02.00.01.00.02.05.02.0-2.0
1222004771610612759SASSan Antonio1631110Jeremy SochanJeremyFNaN31:01...6.03.09.06.01.00.02.01.023.0-14.0
2222004771610612759SASSan Antonio1627751Jakob PoeltlJakobCNaN21:42...1.03.04.01.01.00.02.04.013.0-4.0
3222004771610612759SASSan Antonio1630170Devin VassellDevinGNaN30:20...0.09.09.05.03.00.02.01.010.0-18.0
4222004771610612759SASSan Antonio1630200Tre JonesTreGNaN27:44...0.02.02.03.00.00.02.02.019.00.0
..................................................................
668623112000051610612743DENDenver202706Jordan HamiltonNaNNaNNaN19...0.02.02.00.02.00.01.03.017.0NaN
668624112000051610612743DENDenver202702Kenneth FariedNaNNaNNaN23...1.00.01.01.01.00.03.03.018.0NaN
668625112000051610612743DENDenver201585Kosta KoufosNaNNaNNaN15...3.05.08.00.01.00.00.03.06.0NaN
668626112000051610612743DENDenver202389Timofey MozgovNaNNaNNaN19...1.02.03.01.00.00.04.02.02.0NaN
668627112000051610612743DENDenver201951Ty LawsonNaNNaNNaN27...0.02.02.06.02.00.06.01.08.0NaN
\n", - "

668628 rows × 29 columns

\n", - "
" - ], - "text/plain": [ - " GAME_ID TEAM_ID TEAM_ABBREVIATION TEAM_CITY PLAYER_ID \\\n", - "0 22200477 1610612759 SAS San Antonio 1629641 \n", - "1 22200477 1610612759 SAS San Antonio 1631110 \n", - "2 22200477 1610612759 SAS San Antonio 1627751 \n", - "3 22200477 1610612759 SAS San Antonio 1630170 \n", - "4 22200477 1610612759 SAS San Antonio 1630200 \n", - "... ... ... ... ... ... \n", - "668623 11200005 1610612743 DEN Denver 202706 \n", - "668624 11200005 1610612743 DEN Denver 202702 \n", - "668625 11200005 1610612743 DEN Denver 201585 \n", - "668626 11200005 1610612743 DEN Denver 202389 \n", - "668627 11200005 1610612743 DEN Denver 201951 \n", - "\n", - " PLAYER_NAME NICKNAME START_POSITION COMMENT MIN ... OREB \\\n", - "0 Romeo Langford Romeo F NaN 18:06 ... 1.0 \n", - "1 Jeremy Sochan Jeremy F NaN 31:01 ... 6.0 \n", - "2 Jakob Poeltl Jakob C NaN 21:42 ... 1.0 \n", - "3 Devin Vassell Devin G NaN 30:20 ... 0.0 \n", - "4 Tre Jones Tre G NaN 27:44 ... 0.0 \n", - "... ... ... ... ... ... ... ... \n", - "668623 Jordan Hamilton NaN NaN NaN 19 ... 0.0 \n", - "668624 Kenneth Faried NaN NaN NaN 23 ... 1.0 \n", - "668625 Kosta Koufos NaN NaN NaN 15 ... 3.0 \n", - "668626 Timofey Mozgov NaN NaN NaN 19 ... 1.0 \n", - "668627 Ty Lawson NaN NaN NaN 27 ... 0.0 \n", - "\n", - " DREB REB AST STL BLK TO PF PTS PLUS_MINUS \n", - "0 1.0 2.0 0.0 1.0 0.0 2.0 5.0 2.0 -2.0 \n", - "1 3.0 9.0 6.0 1.0 0.0 2.0 1.0 23.0 -14.0 \n", - "2 3.0 4.0 1.0 1.0 0.0 2.0 4.0 13.0 -4.0 \n", - "3 9.0 9.0 5.0 3.0 0.0 2.0 1.0 10.0 -18.0 \n", - "4 2.0 2.0 3.0 0.0 0.0 2.0 2.0 19.0 0.0 \n", - "... ... ... ... ... ... ... ... ... ... \n", - "668623 2.0 2.0 0.0 2.0 0.0 1.0 3.0 17.0 NaN \n", - "668624 0.0 1.0 1.0 1.0 0.0 3.0 3.0 18.0 NaN \n", - "668625 5.0 8.0 0.0 1.0 0.0 0.0 3.0 6.0 NaN \n", - "668626 2.0 3.0 1.0 0.0 0.0 4.0 2.0 2.0 NaN \n", - "668627 2.0 2.0 6.0 2.0 0.0 6.0 1.0 8.0 NaN \n", - "\n", - "[668628 rows x 29 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"--------- DETALLES PARTIDOS ----------\")\n", - "print(\"--------------------------------------\")\n", - "display(df_games_details.isnull().sum())\n", - "display(df_games_details[df_games_details.isna().any(axis=1)])" - ] - }, - { - "cell_type": "code", - "execution_count": 144, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------- JUGADORES ----------\n", - "------------------------------\n" - ] - }, - { - "data": { - "text/plain": [ - "PLAYER_NAME 0\n", - "TEAM_ID 0\n", - "PLAYER_ID 0\n", - "SEASON 0\n", - "dtype: int64" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PLAYER_NAMETEAM_IDPLAYER_IDSEASON
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [PLAYER_NAME, TEAM_ID, PLAYER_ID, SEASON]\n", - "Index: []" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"--------- JUGADORES ----------\")\n", - "print(\"------------------------------\")\n", - "display(df_players.isnull().sum())\n", - "display(df_players[df_players.isna().any(axis=1)])" - ] - }, - { - "cell_type": "code", - "execution_count": 145, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------- RANKING LIGA ----------\n", - "---------------------------------\n" - ] - }, - { - "data": { - "text/plain": [ - "TEAM_ID 0\n", - "LEAGUE_ID 0\n", - "SEASON_ID 0\n", - "STANDINGSDATE 0\n", - "CONFERENCE 0\n", - "TEAM 0\n", - "G 0\n", - "W 0\n", - "L 0\n", - "W_PCT 0\n", - "HOME_RECORD 0\n", - "ROAD_RECORD 0\n", - "RETURNTOPLAY 206352\n", - "dtype: int64" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "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", - "
TEAM_IDLEAGUE_IDSEASON_IDSTANDINGSDATECONFERENCETEAMGWLW_PCTHOME_RECORDROAD_RECORDRETURNTOPLAY
016106127430220222022-12-22WestDenver3019110.63310-39-8NaN
116106127630220222022-12-22WestMemphis3019110.63313-26-9NaN
216106127400220222022-12-22WestNew Orleans3119120.61313-46-8NaN
316106127560220222022-12-22WestPhoenix3219130.59414-45-9NaN
416106127460220222022-12-22WestLA Clippers3319140.57611-78-7NaN
..........................................
21033716106127650220132014-09-01EastDetroit8229530.35417-2412-29NaN
21033816106127380220132014-09-01EastBoston8225570.30516-259-32NaN
21033916106127530220132014-09-01EastOrlando8223590.28019-224-37NaN
21034016106127550220132014-09-01EastPhiladelphia8219630.23210-319-32NaN
21034116106127490220132014-09-01EastMilwaukee8215670.18310-315-36NaN
\n", - "

206352 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " TEAM_ID LEAGUE_ID SEASON_ID STANDINGSDATE CONFERENCE \\\n", - "0 1610612743 0 22022 2022-12-22 West \n", - "1 1610612763 0 22022 2022-12-22 West \n", - "2 1610612740 0 22022 2022-12-22 West \n", - "3 1610612756 0 22022 2022-12-22 West \n", - "4 1610612746 0 22022 2022-12-22 West \n", - "... ... ... ... ... ... \n", - "210337 1610612765 0 22013 2014-09-01 East \n", - "210338 1610612738 0 22013 2014-09-01 East \n", - "210339 1610612753 0 22013 2014-09-01 East \n", - "210340 1610612755 0 22013 2014-09-01 East \n", - "210341 1610612749 0 22013 2014-09-01 East \n", - "\n", - " TEAM G W L W_PCT HOME_RECORD ROAD_RECORD RETURNTOPLAY \n", - "0 Denver 30 19 11 0.633 10-3 9-8 NaN \n", - "1 Memphis 30 19 11 0.633 13-2 6-9 NaN \n", - "2 New Orleans 31 19 12 0.613 13-4 6-8 NaN \n", - "3 Phoenix 32 19 13 0.594 14-4 5-9 NaN \n", - "4 LA Clippers 33 19 14 0.576 11-7 8-7 NaN \n", - "... ... .. .. .. ... ... ... ... \n", - "210337 Detroit 82 29 53 0.354 17-24 12-29 NaN \n", - "210338 Boston 82 25 57 0.305 16-25 9-32 NaN \n", - "210339 Orlando 82 23 59 0.280 19-22 4-37 NaN \n", - "210340 Philadelphia 82 19 63 0.232 10-31 9-32 NaN \n", - "210341 Milwaukee 82 15 67 0.183 10-31 5-36 NaN \n", - "\n", - "[206352 rows x 13 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"--------- RANKING LIGA ----------\")\n", - "print(\"---------------------------------\")\n", - "display(df_ranking.isnull().sum())\n", - "display(df_ranking[df_ranking.isna().any(axis=1)])" - ] - }, - { - "cell_type": "code", - "execution_count": 146, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--------- EQUIPOS ----------\n", - "----------------------------\n" - ] - }, - { - "data": { - "text/plain": [ - "LEAGUE_ID 0\n", - "TEAM_ID 0\n", - "MIN_YEAR 0\n", - "MAX_YEAR 0\n", - "ABBREVIATION 0\n", - "NICKNAME 0\n", - "YEARFOUNDED 0\n", - "CITY 0\n", - "ARENA 0\n", - "ARENACAPACITY 4\n", - "OWNER 0\n", - "GENERALMANAGER 0\n", - "HEADCOACH 0\n", - "DLEAGUEAFFILIATION 0\n", - "dtype: int64" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "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", - "
LEAGUE_IDTEAM_IDMIN_YEARMAX_YEARABBREVIATIONNICKNAMEYEARFOUNDEDCITYARENAARENACAPACITYOWNERGENERALMANAGERHEADCOACHDLEAGUEAFFILIATION
20161061274020022019NOPPelicans2002New OrleansSmoothie King CenterNaNTom BensonTrajan LangdonAlvin GentryNo Affiliate
120161061275119762019BKNNets1976BrooklynBarclays CenterNaNJoe TsaiSean MarksKenny AtkinsonLong Island Nets
160161061275519492019PHI76ers1949PhiladelphiaWells Fargo CenterNaNJoshua HarrisElton BrandBrett BrownDelaware Blue Coats
170161061275619682019PHXSuns1968PhoenixTalking Stick Resort ArenaNaNRobert SarverJames JonesMonty WilliamsNorthern Arizona Suns
\n", - "
" - ], - "text/plain": [ - " LEAGUE_ID TEAM_ID MIN_YEAR MAX_YEAR ABBREVIATION NICKNAME \\\n", - "2 0 1610612740 2002 2019 NOP Pelicans \n", - "12 0 1610612751 1976 2019 BKN Nets \n", - "16 0 1610612755 1949 2019 PHI 76ers \n", - "17 0 1610612756 1968 2019 PHX Suns \n", - "\n", - " YEARFOUNDED CITY ARENA ARENACAPACITY \\\n", - "2 2002 New Orleans Smoothie King Center NaN \n", - "12 1976 Brooklyn Barclays Center NaN \n", - "16 1949 Philadelphia Wells Fargo Center NaN \n", - "17 1968 Phoenix Talking Stick Resort Arena NaN \n", - "\n", - " OWNER GENERALMANAGER HEADCOACH DLEAGUEAFFILIATION \n", - "2 Tom Benson Trajan Langdon Alvin Gentry No Affiliate \n", - "12 Joe Tsai Sean Marks Kenny Atkinson Long Island Nets \n", - "16 Joshua Harris Elton Brand Brett Brown Delaware Blue Coats \n", - "17 Robert Sarver James Jones Monty Williams Northern Arizona Suns " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(\"--------- EQUIPOS ----------\")\n", - "print(\"----------------------------\")\n", - "display(df_teams.isnull().sum())\n", - "display(df_teams[df_teams.isna().any(axis=1)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "En el df de partidos podemos ver que hay NaN en el 2003, borramos todas las filas con partidos anteriores al 2010 y comprobamos si se han quedado NaN" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 147, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAH6CAYAAAAtE7c8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVy0lEQVR4nO3deVxUZf8+8GuGVVYBFUVBMBE33NPcUVHcl/xZ+aipmZapueWCKaa5l0puaWnuubSoaT4u4Za5L+CW+wKh4AoIBKJ8fn/w5eQIuPQg5x653q/XvHLmjHA1yJzrvuec+xhEREBERESkEKPeAYiIiIiexIJCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlKOpd4B/o309HRcv34djo6OMBgMeschIiKi5yAiuH//Pjw8PGA0Pn2OxCwLyvXr1+Hp6al3DCIiIvoXoqKiUKJEiac+xywLiqOjI4CM/0EnJyed0xAREdHzSEhIgKenp7YffxqzLCiZH+s4OTmxoBAREZmZ5zk8gwfJEhERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuW8cEHZs2cP2rRpAw8PDxgMBqxfv95ku4ggJCQExYoVQ4ECBRAYGIgLFy6YPOfu3bvo0qULnJycULBgQfTq1QuJiYn/0/8IERERvTpeuKAkJSWhcuXKmDt3brbbp02bhlmzZmH+/Pk4ePAg7O3tERQUhJSUFO05Xbp0wenTp7F9+3Zs2rQJe/bsQZ8+ff79/wURERG9UgwiIv/6LxsMWLduHdq3bw8gY/bEw8MDQ4cOxSeffAIAiI+Ph7u7O5YsWYJ33nkHf/75J8qXL4/Dhw+jRo0aAIAtW7agZcuW+Ouvv+Dh4ZHl+6SmpiI1NVW7n7mWf3x8PJe6JyIiMhMJCQlwdnZ+rv13rh6DcuXKFcTExCAwMFB7zNnZGbVq1cL+/fsBAPv370fBggW1cgIAgYGBMBqNOHjwYLZfd/LkyXB2dtZuvJIxERHRqy1XC0pMTAwAwN3d3eRxd3d3bVtMTAyKFClist3S0hKurq7ac54UHByM+Ph47RYVFZWbsYmIiEgxZnE1YxsbG9jY2Ogdg4iIiPJIrs6gFC1aFAAQGxtr8nhsbKy2rWjRorh586bJ9ocPH+Lu3bvac4iIiCh/y9UZFB8fHxQtWhRhYWGoUqUKgIwDYg4ePIi+ffsCAGrXro24uDgcPXoU1atXBwDs2LED6enpqFWrVm7GAQB4j/w117/m1Smtcv1r5nZOc8gI5H5Oc8gI8OedW8whI8Cfd24xh4wAf9655YULSmJiIi5evKjdv3LlCsLDw+Hq6govLy8MGjQIEyZMgK+vL3x8fDBmzBh4eHhoZ/qUK1cOzZs3R+/evTF//nykpaWhf//+eOedd7I9g4eIiIjynxcuKEeOHEGjRo20+0OGDAEAdO/eHUuWLMHw4cORlJSEPn36IC4uDvXq1cOWLVtga2ur/Z2VK1eif//+aNKkCYxGIzp27IhZs2blwv8OERERvQpeuKAEBATgaUunGAwGjB8/HuPHj8/xOa6urvj+++9f9FsTERFRPsFr8RAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSTq4XlEePHmHMmDHw8fFBgQIF8Nprr+Hzzz+HiGjPERGEhISgWLFiKFCgAAIDA3HhwoXcjkJERERmKtcLytSpU/H1119jzpw5+PPPPzF16lRMmzYNs2fP1p4zbdo0zJo1C/Pnz8fBgwdhb2+PoKAgpKSk5HYcIiIiMkOWuf0F9+3bh3bt2qFVq1YAAG9vb6xatQqHDh0CkDF7EhoaitGjR6Ndu3YAgGXLlsHd3R3r16/HO++8k+VrpqamIjU1VbufkJCQ27GJiIhIIbk+g1KnTh2EhYXh/PnzAICIiAjs3bsXLVq0AABcuXIFMTExCAwM1P6Os7MzatWqhf3792f7NSdPngxnZ2ft5unpmduxiYiISCG5PoMycuRIJCQkoGzZsrCwsMCjR48wceJEdOnSBQAQExMDAHB3dzf5e+7u7tq2JwUHB2PIkCHa/YSEBJYUIiKiV1iuF5S1a9di5cqV+P7771GhQgWEh4dj0KBB8PDwQPfu3f/V17SxsYGNjU0uJyUiIiJV5XpBGTZsGEaOHKkdS+Lv749r165h8uTJ6N69O4oWLQoAiI2NRbFixbS/FxsbiypVquR2HCIiIjJDuX4MSnJyMoxG0y9rYWGB9PR0AICPjw+KFi2KsLAwbXtCQgIOHjyI2rVr53YcIiIiMkO5PoPSpk0bTJw4EV5eXqhQoQKOHz+OGTNm4L333gMAGAwGDBo0CBMmTICvry98fHwwZswYeHh4oH379rkdh4iIiMxQrheU2bNnY8yYMfjoo49w8+ZNeHh44IMPPkBISIj2nOHDhyMpKQl9+vRBXFwc6tWrhy1btsDW1ja34xAREZEZyvWC4ujoiNDQUISGhub4HIPBgPHjx2P8+PG5/e2JiIjoFcBr8RAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSzkspKNHR0ejatSvc3NxQoEAB+Pv748iRI9p2EUFISAiKFSuGAgUKIDAwEBcuXHgZUYiIiMgM5XpBuXfvHurWrQsrKyv897//xZkzZzB9+nS4uLhoz5k2bRpmzZqF+fPn4+DBg7C3t0dQUBBSUlJyOw4RERGZIcvc/oJTp06Fp6cnFi9erD3m4+Oj/VlEEBoaitGjR6Ndu3YAgGXLlsHd3R3r16/HO++8k9uRiIiIyMzk+gzKL7/8gho1aqBTp04oUqQIqlatim+//VbbfuXKFcTExCAwMFB7zNnZGbVq1cL+/fuz/ZqpqalISEgwuREREdGrK9cLyuXLl/H111/D19cXW7duRd++ffHxxx9j6dKlAICYmBgAgLu7u8nfc3d317Y9afLkyXB2dtZunp6euR2biIiIFJLrBSU9PR3VqlXDpEmTULVqVfTp0we9e/fG/Pnz//XXDA4ORnx8vHaLiorKxcRERESkmlwvKMWKFUP58uVNHitXrhwiIyMBAEWLFgUAxMbGmjwnNjZW2/YkGxsbODk5mdyIiIjo1ZXrBaVu3bo4d+6cyWPnz59HyZIlAWQcMFu0aFGEhYVp2xMSEnDw4EHUrl07t+MQERGRGcr1s3gGDx6MOnXqYNKkSXjrrbdw6NAhfPPNN/jmm28AAAaDAYMGDcKECRPg6+sLHx8fjBkzBh4eHmjfvn1uxyEiIiIzlOsF5fXXX8e6desQHByM8ePHw8fHB6GhoejSpYv2nOHDhyMpKQl9+vRBXFwc6tWrhy1btsDW1ja34xAREZEZyvWCAgCtW7dG69atc9xuMBgwfvx4jB8//mV8eyIiIjJzvBYPERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuW89IIyZcoUGAwGDBo0SHssJSUF/fr1g5ubGxwcHNCxY0fExsa+7ChERERkJl5qQTl8+DAWLFiASpUqmTw+ePBgbNy4ET/88AN2796N69ev480333yZUYiIiMiMvLSCkpiYiC5duuDbb7+Fi4uL9nh8fDwWLVqEGTNmoHHjxqhevToWL16Mffv24cCBAy8rDhEREZmRl1ZQ+vXrh1atWiEwMNDk8aNHjyItLc3k8bJly8LLywv79+/P9mulpqYiISHB5EZERESvLsuX8UVXr16NY8eO4fDhw1m2xcTEwNraGgULFjR53N3dHTExMdl+vcmTJ2PcuHEvIyoREREpKNdnUKKiojBw4ECsXLkStra2ufI1g4ODER8fr92ioqJy5esSERGRmnK9oBw9ehQ3b95EtWrVYGlpCUtLS+zevRuzZs2CpaUl3N3d8eDBA8TFxZn8vdjYWBQtWjTbr2ljYwMnJyeTGxEREb26cv0jniZNmuDkyZMmj/Xs2RNly5bFiBEj4OnpCSsrK4SFhaFjx44AgHPnziEyMhK1a9fO7ThERERkhnK9oDg6OqJixYomj9nb28PNzU17vFevXhgyZAhcXV3h5OSEAQMGoHbt2njjjTdyOw4RERGZoZdykOyzzJw5E0ajER07dkRqaiqCgoIwb948PaIQERGRgvKkoOzatcvkvq2tLebOnYu5c+fmxbcnIiIiM8Nr8RAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQERGRclhQiIiISDksKERERKQcFhQiIiJSDgsKERERKYcFhYiIiJTDgkJERETKYUEhIiIi5bCgEBERkXJYUIiIiEg5LChERESkHBYUIiIiUg4LChERESmHBYWIiIiUw4JCREREymFBISIiIuWwoBAREZFyWFCIiIhIOSwoREREpBwWFCIiIlIOCwoREREphwWFiIiIlMOCQkRERMphQSEiIiLlsKAQ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "df_games.isna().sum()[df_games.isna().sum()>0].plot(kind='bar')" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": {}, - "outputs": [], - "source": [ - "df_games = df_games.loc[df_games['GAME_DATE_EST'] >= \"2004-01-01\"].reset_index(drop=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "GAME_DATE_EST 0\n", - "GAME_ID 0\n", - "GAME_STATUS_TEXT 0\n", - "HOME_TEAM_ID 0\n", - "VISITOR_TEAM_ID 0\n", - "SEASON 0\n", - "TEAM_ID_home 0\n", - "PTS_home 0\n", - "FG_PCT_home 0\n", - "FT_PCT_home 0\n", - "FG3_PCT_home 0\n", - "AST_home 0\n", - "REB_home 0\n", - "TEAM_ID_away 0\n", - "PTS_away 0\n", - "FG_PCT_away 0\n", - "FT_PCT_away 0\n", - "FG3_PCT_away 0\n", - "AST_away 0\n", - "REB_away 0\n", - "HOME_TEAM_WINS 0\n", - "dtype: int64" - ] - }, - "execution_count": 149, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_games.isnull().sum()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Para saber que equipo es, podríamos fusionar algunos datos del dataframe de partidos con el de equipos de alguna manera" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['GAME_DATE_EST', 'GAME_ID', 'GAME_STATUS_TEXT', 'HOME_TEAM_ID',\n", - " 'VISITOR_TEAM_ID', 'SEASON', 'TEAM_ID_home', 'PTS_home', 'FG_PCT_home',\n", - " 'FT_PCT_home', 'FG3_PCT_home', 'AST_home', 'REB_home', 'TEAM_ID_away',\n", - " 'PTS_away', 'FG_PCT_away', 'FT_PCT_away', 'FG3_PCT_away', 'AST_away',\n", - " 'REB_away', 'HOME_TEAM_WINS'],\n", - " dtype='object')" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "Index(['LEAGUE_ID', 'TEAM_ID', 'MIN_YEAR', 'MAX_YEAR', 'ABBREVIATION',\n", - " 'NICKNAME', 'YEARFOUNDED', 'CITY', 'ARENA', 'ARENACAPACITY', 'OWNER',\n", - " 'GENERALMANAGER', 'HEADCOACH', 'DLEAGUEAFFILIATION'],\n", - " dtype='object')" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(df_games.columns)\n", - "display(df_teams.columns)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Vemos como podemos sustituir los IDS por los nombres de los equipos" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [], - "source": [ - "df_teams = df_teams[['TEAM_ID', 'NICKNAME']]\n", - "\n", - "# Reemplaza HOME_TEAM_ID por los nombres del dataframe teams\n", - "nombres_local = df_teams.copy()\n", - "nombres_local.columns = ['HOME_TEAM_ID', 'NICKNAME']\n", - "# Se unen el ID de lequipo por el nickname\n", - "result_1 = pd.merge(df_games['HOME_TEAM_ID'], nombres_local, how =\"left\", on=\"HOME_TEAM_ID\") \n", - "df_games['HOME_TEAM_ID'] = result_1['NICKNAME']\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Vemos como se ha cambiado el HOME_TEAM_ID por el nombre del equipo, haremos lo mismo con el visitante" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": { - "scrolled": true - }, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
GAME_DATE_ESTGAME_IDGAME_STATUS_TEXTHOME_TEAM_IDVISITOR_TEAM_IDSEASONTEAM_ID_homePTS_homeFG_PCT_homeFT_PCT_home...AST_homeREB_homeTEAM_ID_awayPTS_awayFG_PCT_awayFT_PCT_awayFG3_PCT_awayAST_awayREB_awayHOME_TEAM_WINS
02022-12-2222200477FinalPelicans161061275920221610612740126.00.4840.926...25.046.01610612759117.00.4780.8150.32123.044.01
12022-12-2222200478FinalJazz161061276420221610612762120.00.4880.952...16.040.01610612764112.00.5610.7650.33320.037.01
22022-12-2122200466FinalCavaliers161061274920221610612739114.00.4820.786...22.037.01610612749106.00.4700.6820.43320.046.01
32022-12-2122200467Final76ers161061276520221610612755113.00.4410.909...27.049.0161061276593.00.3920.7350.26115.046.01
42022-12-2122200468FinalHawks161061274120221610612737108.00.4291.000...22.047.01610612741110.00.5000.7730.29220.047.00
52022-12-2122200469FinalCeltics161061275420221610612738112.00.3860.840...26.062.01610612754117.00.4690.7780.46227.047.00
62022-12-2122200470FinalNets161061274420221610612751143.00.6430.875...42.032.01610612744113.00.4940.7600.36432.036.01
72022-12-2122200471FinalKnicks161061276120221610612752106.00.5530.611...25.038.01610612761113.00.4470.9090.26517.038.00
82022-12-2122200472FinalRockets161061275320221610612745110.00.4660.647...22.049.01610612753116.00.4510.6970.29719.045.00
92022-12-2122200473FinalTimberwolves16106127422022161061275099.00.4940.700...23.039.01610612742104.00.4530.8520.33317.039.00
102022-12-2122200474FinalThunder161061275720221610612760101.00.4680.840...19.037.0161061275798.00.4940.6670.38929.036.01
112022-12-2122200475FinalKings161061274720221610612758134.00.5050.750...29.046.01610612747120.00.5000.8330.45825.039.01
122022-12-2122200476FinalClippers161061276620221610612746126.00.5060.913...29.048.01610612766105.00.4020.7590.29025.040.01
132022-12-2022200461FinalPistons161061276220221610612765111.00.5060.741...22.043.01610612762126.00.5050.6320.43527.043.00
142022-12-2022200462FinalHeat161061274120221610612748103.00.4690.706...26.035.01610612741113.00.5480.8330.41924.039.00
152022-12-2022200463FinalKnicks161061274420221610612752132.00.5170.781...27.047.0161061274494.00.4730.9230.34323.029.01
162022-12-2022200464FinalSuns161061276420221610612756110.00.4610.789...26.044.01610612764113.00.4750.7030.40722.041.00
172022-12-2022200465FinalNuggets161061276320221610612743105.00.4490.600...28.048.0161061276391.00.4440.6670.19225.042.01
182022-12-1922200452FinalCavaliers161061276220221610612739122.00.6140.808...24.045.0161061276299.00.3870.7390.29419.035.01
192022-12-1922200453Final76ers161061276120221610612755104.00.4000.926...22.041.01610612761101.00.4200.8000.27524.050.01
\n", - "

20 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " GAME_DATE_EST GAME_ID GAME_STATUS_TEXT HOME_TEAM_ID VISITOR_TEAM_ID \\\n", - "0 2022-12-22 22200477 Final Pelicans 1610612759 \n", - "1 2022-12-22 22200478 Final Jazz 1610612764 \n", - "2 2022-12-21 22200466 Final Cavaliers 1610612749 \n", - "3 2022-12-21 22200467 Final 76ers 1610612765 \n", - "4 2022-12-21 22200468 Final Hawks 1610612741 \n", - "5 2022-12-21 22200469 Final Celtics 1610612754 \n", - "6 2022-12-21 22200470 Final Nets 1610612744 \n", - "7 2022-12-21 22200471 Final Knicks 1610612761 \n", - "8 2022-12-21 22200472 Final Rockets 1610612753 \n", - "9 2022-12-21 22200473 Final Timberwolves 1610612742 \n", - "10 2022-12-21 22200474 Final Thunder 1610612757 \n", - "11 2022-12-21 22200475 Final Kings 1610612747 \n", - "12 2022-12-21 22200476 Final Clippers 1610612766 \n", - "13 2022-12-20 22200461 Final Pistons 1610612762 \n", - "14 2022-12-20 22200462 Final Heat 1610612741 \n", - "15 2022-12-20 22200463 Final Knicks 1610612744 \n", - "16 2022-12-20 22200464 Final Suns 1610612764 \n", - "17 2022-12-20 22200465 Final Nuggets 1610612763 \n", - "18 2022-12-19 22200452 Final Cavaliers 1610612762 \n", - "19 2022-12-19 22200453 Final 76ers 1610612761 \n", - "\n", - " SEASON TEAM_ID_home PTS_home FG_PCT_home FT_PCT_home ... AST_home \\\n", - "0 2022 1610612740 126.0 0.484 0.926 ... 25.0 \n", - "1 2022 1610612762 120.0 0.488 0.952 ... 16.0 \n", - "2 2022 1610612739 114.0 0.482 0.786 ... 22.0 \n", - "3 2022 1610612755 113.0 0.441 0.909 ... 27.0 \n", - "4 2022 1610612737 108.0 0.429 1.000 ... 22.0 \n", - "5 2022 1610612738 112.0 0.386 0.840 ... 26.0 \n", - "6 2022 1610612751 143.0 0.643 0.875 ... 42.0 \n", - "7 2022 1610612752 106.0 0.553 0.611 ... 25.0 \n", - "8 2022 1610612745 110.0 0.466 0.647 ... 22.0 \n", - "9 2022 1610612750 99.0 0.494 0.700 ... 23.0 \n", - "10 2022 1610612760 101.0 0.468 0.840 ... 19.0 \n", - "11 2022 1610612758 134.0 0.505 0.750 ... 29.0 \n", - "12 2022 1610612746 126.0 0.506 0.913 ... 29.0 \n", - "13 2022 1610612765 111.0 0.506 0.741 ... 22.0 \n", - "14 2022 1610612748 103.0 0.469 0.706 ... 26.0 \n", - "15 2022 1610612752 132.0 0.517 0.781 ... 27.0 \n", - "16 2022 1610612756 110.0 0.461 0.789 ... 26.0 \n", - "17 2022 1610612743 105.0 0.449 0.600 ... 28.0 \n", - "18 2022 1610612739 122.0 0.614 0.808 ... 24.0 \n", - "19 2022 1610612755 104.0 0.400 0.926 ... 22.0 \n", - "\n", - " REB_home TEAM_ID_away PTS_away FG_PCT_away FT_PCT_away FG3_PCT_away \\\n", - "0 46.0 1610612759 117.0 0.478 0.815 0.321 \n", - "1 40.0 1610612764 112.0 0.561 0.765 0.333 \n", - "2 37.0 1610612749 106.0 0.470 0.682 0.433 \n", - "3 49.0 1610612765 93.0 0.392 0.735 0.261 \n", - "4 47.0 1610612741 110.0 0.500 0.773 0.292 \n", - "5 62.0 1610612754 117.0 0.469 0.778 0.462 \n", - "6 32.0 1610612744 113.0 0.494 0.760 0.364 \n", - "7 38.0 1610612761 113.0 0.447 0.909 0.265 \n", - "8 49.0 1610612753 116.0 0.451 0.697 0.297 \n", - "9 39.0 1610612742 104.0 0.453 0.852 0.333 \n", - "10 37.0 1610612757 98.0 0.494 0.667 0.389 \n", - "11 46.0 1610612747 120.0 0.500 0.833 0.458 \n", - "12 48.0 1610612766 105.0 0.402 0.759 0.290 \n", - "13 43.0 1610612762 126.0 0.505 0.632 0.435 \n", - "14 35.0 1610612741 113.0 0.548 0.833 0.419 \n", - "15 47.0 1610612744 94.0 0.473 0.923 0.343 \n", - "16 44.0 1610612764 113.0 0.475 0.703 0.407 \n", - "17 48.0 1610612763 91.0 0.444 0.667 0.192 \n", - "18 45.0 1610612762 99.0 0.387 0.739 0.294 \n", - "19 41.0 1610612761 101.0 0.420 0.800 0.275 \n", - "\n", - " AST_away REB_away HOME_TEAM_WINS \n", - "0 23.0 44.0 1 \n", - "1 20.0 37.0 1 \n", - "2 20.0 46.0 1 \n", - "3 15.0 46.0 1 \n", - "4 20.0 47.0 0 \n", - "5 27.0 47.0 0 \n", - "6 32.0 36.0 1 \n", - "7 17.0 38.0 0 \n", - "8 19.0 45.0 0 \n", - "9 17.0 39.0 0 \n", - "10 29.0 36.0 1 \n", - "11 25.0 39.0 1 \n", - "12 25.0 40.0 1 \n", - "13 27.0 43.0 0 \n", - "14 24.0 39.0 0 \n", - "15 23.0 29.0 1 \n", - "16 22.0 41.0 0 \n", - "17 25.0 42.0 1 \n", - "18 19.0 35.0 1 \n", - "19 24.0 50.0 1 \n", - "\n", - "[20 rows x 21 columns]" - ] - }, - "execution_count": 152, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "df_games.head(20)" + "print(\"--------- DETALLES PARTIDOS ----------\")\n", + "print(\"--------------------------------------\")\n", + "display(df_games_details.isnull().sum())\n", + "display(df_games_details[df_games_details.isna().any(axis=1)])" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ - "Haremos lo mismo con los equipos visitantes" + "print(\"--------- JUGADORES ----------\")\n", + "print(\"------------------------------\")\n", + "display(df_players.isnull().sum())\n", + "display(df_players[df_players.isna().any(axis=1)])" ] }, { "cell_type": "code", - "execution_count": 153, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "# Reemplaza VISITOR_TEAM_ID por los nombres del dataframe teams\n", - "nombres_visitante = df_teams.copy()\n", - "nombres_visitante.columns = ['VISITOR_TEAM_ID', 'NICKNAME']\n", - "# Se unen el ID del equipo por el nickname\n", - "result_2 = pd.merge(df_games['VISITOR_TEAM_ID'], nombres_visitante, how =\"left\", on=\"VISITOR_TEAM_ID\") \n", - "df_games['VISITOR_TEAM_ID'] = result_2['NICKNAME']" + "print(\"--------- RANKING LIGA ----------\")\n", + "print(\"---------------------------------\")\n", + "display(df_ranking.isnull().sum())\n", + "display(df_ranking[df_ranking.isna().any(axis=1)])" ] }, { "cell_type": "code", - "execution_count": 154, + "execution_count": null, "metadata": { "scrolled": true }, - "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", - "
GAME_DATE_ESTGAME_IDGAME_STATUS_TEXTHOME_TEAM_IDVISITOR_TEAM_IDSEASONTEAM_ID_homePTS_homeFG_PCT_homeFT_PCT_home...AST_homeREB_homeTEAM_ID_awayPTS_awayFG_PCT_awayFT_PCT_awayFG3_PCT_awayAST_awayREB_awayHOME_TEAM_WINS
02022-12-2222200477FinalPelicansSpurs20221610612740126.00.4840.926...25.046.01610612759117.00.4780.8150.32123.044.01
12022-12-2222200478FinalJazzWizards20221610612762120.00.4880.952...16.040.01610612764112.00.5610.7650.33320.037.01
22022-12-2122200466FinalCavaliersBucks20221610612739114.00.4820.786...22.037.01610612749106.00.4700.6820.43320.046.01
32022-12-2122200467Final76ersPistons20221610612755113.00.4410.909...27.049.0161061276593.00.3920.7350.26115.046.01
42022-12-2122200468FinalHawksBulls20221610612737108.00.4291.000...22.047.01610612741110.00.5000.7730.29220.047.00
\n", - "

5 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " GAME_DATE_EST GAME_ID GAME_STATUS_TEXT HOME_TEAM_ID VISITOR_TEAM_ID \\\n", - "0 2022-12-22 22200477 Final Pelicans Spurs \n", - "1 2022-12-22 22200478 Final Jazz Wizards \n", - "2 2022-12-21 22200466 Final Cavaliers Bucks \n", - "3 2022-12-21 22200467 Final 76ers Pistons \n", - "4 2022-12-21 22200468 Final Hawks Bulls \n", - "\n", - " SEASON TEAM_ID_home PTS_home FG_PCT_home FT_PCT_home ... AST_home \\\n", - "0 2022 1610612740 126.0 0.484 0.926 ... 25.0 \n", - "1 2022 1610612762 120.0 0.488 0.952 ... 16.0 \n", - "2 2022 1610612739 114.0 0.482 0.786 ... 22.0 \n", - "3 2022 1610612755 113.0 0.441 0.909 ... 27.0 \n", - "4 2022 1610612737 108.0 0.429 1.000 ... 22.0 \n", - "\n", - " REB_home TEAM_ID_away PTS_away FG_PCT_away FT_PCT_away FG3_PCT_away \\\n", - "0 46.0 1610612759 117.0 0.478 0.815 0.321 \n", - "1 40.0 1610612764 112.0 0.561 0.765 0.333 \n", - "2 37.0 1610612749 106.0 0.470 0.682 0.433 \n", - "3 49.0 1610612765 93.0 0.392 0.735 0.261 \n", - "4 47.0 1610612741 110.0 0.500 0.773 0.292 \n", - "\n", - " AST_away REB_away HOME_TEAM_WINS \n", - "0 23.0 44.0 1 \n", - "1 20.0 37.0 1 \n", - "2 20.0 46.0 1 \n", - "3 15.0 46.0 1 \n", - "4 20.0 47.0 0 \n", - "\n", - "[5 rows x 21 columns]" - ] - }, - "execution_count": 154, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], + "source": [ + "print(\"--------- EQUIPOS ----------\")\n", + "print(\"----------------------------\")\n", + "display(df_teams.isnull().sum())\n", + "display(df_teams[df_teams.isna().any(axis=1)])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "En el df de partidos podemos ver que hay NaN en el 2003, borramos todas las filas con partidos anteriores al 2010 y comprobamos si se han quedado NaN" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_games.isna().sum()[df_games.isna().sum()>0].plot(kind='bar')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "df_games.head()" + "df_games = df_games.loc[df_games['GAME_DATE_EST'] >= \"2004-01-01\"].reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "df_games.isnull().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Exploración de los valores únicos de las variables del dataframe de partidos" + "Para saber que equipo es, podríamos fusionar algunos datos del dataframe de partidos con el de equipos de alguna manera" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "display(df_games.columns)\n", + "display(df_teams.columns)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Vemos como podemos sustituir los IDS por los nombres de los equipos" ] }, { "cell_type": "code", - "execution_count": 155, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GAME_STATUS_TEXT ['Final']\n", - "HOME_TEAM_WINS [1 0]\n" - ] - } - ], + "outputs": [], "source": [ + "df_teams = df_teams[['TEAM_ID', 'NICKNAME']]\n", "\n", - "for column in df_games.columns:\n", - " if len(df_games[column].unique()) < 10:\n", - " print(column, df_games[column].unique())\n", - " else:\n", - " continue" + "# Reemplaza HOME_TEAM_ID por los nombres del dataframe teams\n", + "nombres_local = df_teams.copy()\n", + "nombres_local.columns = ['HOME_TEAM_ID', 'NICKNAME']\n", + "# Se unen el ID de lequipo por el nickname\n", + "result_1 = pd.merge(df_games['HOME_TEAM_ID'], nombres_local, how =\"left\", on=\"HOME_TEAM_ID\") \n", + "df_games['HOME_TEAM_ID'] = result_1['NICKNAME']\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Al menos GAME_STATUS_TEXT nos sobra ya que solo tiene un valor unico y no tiene relevancia" + "Vemos como se ha cambiado el HOME_TEAM_ID por el nombre del equipo, haremos lo mismo con el visitante" ] }, { "cell_type": "code", - "execution_count": 156, + "execution_count": null, "metadata": { "scrolled": true }, - "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", - "
GAME_DATE_ESTGAME_IDHOME_TEAM_IDVISITOR_TEAM_IDSEASONTEAM_ID_homePTS_homeFG_PCT_homeFT_PCT_homeFG3_PCT_homeAST_homeREB_homeTEAM_ID_awayPTS_awayFG_PCT_awayFT_PCT_awayFG3_PCT_awayAST_awayREB_awayHOME_TEAM_WINS
02022-12-2222200477PelicansSpurs20221610612740126.00.4840.9260.38225.046.01610612759117.00.4780.8150.32123.044.01
12022-12-2222200478JazzWizards20221610612762120.00.4880.9520.45716.040.01610612764112.00.5610.7650.33320.037.01
22022-12-2122200466CavaliersBucks20221610612739114.00.4820.7860.31322.037.01610612749106.00.4700.6820.43320.046.01
32022-12-212220046776ersPistons20221610612755113.00.4410.9090.29727.049.0161061276593.00.3920.7350.26115.046.01
42022-12-2122200468HawksBulls20221610612737108.00.4291.0000.37822.047.01610612741110.00.5000.7730.29220.047.00
\n", - "
" - ], - "text/plain": [ - " GAME_DATE_EST GAME_ID HOME_TEAM_ID VISITOR_TEAM_ID SEASON TEAM_ID_home \\\n", - "0 2022-12-22 22200477 Pelicans Spurs 2022 1610612740 \n", - "1 2022-12-22 22200478 Jazz Wizards 2022 1610612762 \n", - "2 2022-12-21 22200466 Cavaliers Bucks 2022 1610612739 \n", - "3 2022-12-21 22200467 76ers Pistons 2022 1610612755 \n", - "4 2022-12-21 22200468 Hawks Bulls 2022 1610612737 \n", - "\n", - " PTS_home FG_PCT_home FT_PCT_home FG3_PCT_home AST_home REB_home \\\n", - "0 126.0 0.484 0.926 0.382 25.0 46.0 \n", - "1 120.0 0.488 0.952 0.457 16.0 40.0 \n", - "2 114.0 0.482 0.786 0.313 22.0 37.0 \n", - "3 113.0 0.441 0.909 0.297 27.0 49.0 \n", - "4 108.0 0.429 1.000 0.378 22.0 47.0 \n", - "\n", - " TEAM_ID_away PTS_away FG_PCT_away FT_PCT_away FG3_PCT_away AST_away \\\n", - "0 1610612759 117.0 0.478 0.815 0.321 23.0 \n", - "1 1610612764 112.0 0.561 0.765 0.333 20.0 \n", - "2 1610612749 106.0 0.470 0.682 0.433 20.0 \n", - "3 1610612765 93.0 0.392 0.735 0.261 15.0 \n", - "4 1610612741 110.0 0.500 0.773 0.292 20.0 \n", - "\n", - " REB_away HOME_TEAM_WINS \n", - "0 44.0 1 \n", - "1 37.0 1 \n", - "2 46.0 1 \n", - "3 46.0 1 \n", - "4 47.0 0 " - ] - }, - "execution_count": 156, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], + "source": [ + "df_games.head(20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Haremos lo mismo con los equipos visitantes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Reemplaza VISITOR_TEAM_ID por los nombres del dataframe teams\n", + "nombres_visitante = df_teams.copy()\n", + "nombres_visitante.columns = ['VISITOR_TEAM_ID', 'NICKNAME']\n", + "# Se unen el ID del equipo por el nickname\n", + "result_2 = pd.merge(df_games['VISITOR_TEAM_ID'], nombres_visitante, how =\"left\", on=\"VISITOR_TEAM_ID\") \n", + "df_games['VISITOR_TEAM_ID'] = result_2['NICKNAME']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "df_games.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Exploración de los valores únicos de las variables del dataframe de partidos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "for column in df_games.columns:\n", + " if len(df_games[column].unique()) < 10:\n", + " print(column, df_games[column].unique())\n", + " else:\n", + " continue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Al menos GAME_STATUS_TEXT nos sobra ya que solo tiene un valor unico y no tiene relevancia" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "df_games = df_games.drop(columns=['GAME_STATUS_TEXT'])\n", "df_games.head()" @@ -3938,7 +1930,7 @@ }, { "cell_type": "code", - "execution_count": 157, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -3954,20 +1946,9 @@ }, { "cell_type": "code", - "execution_count": 158, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(542, 20)" - ] - }, - "execution_count": 158, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df_games_2022.shape" ] @@ -3981,19 +1962,11 @@ }, { "cell_type": "code", - "execution_count": 159, + "execution_count": null, "metadata": { "scrolled": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['GAME_DATE_EST', 'GAME_ID', 'HOME_TEAM_ID', 'VISITOR_TEAM_ID', 'SEASON', 'TEAM_ID_home', 'PTS_home', 'FG_PCT_home', 'FT_PCT_home', 'FG3_PCT_home', 'AST_home', 'REB_home', 'TEAM_ID_away', 'PTS_away', 'FG_PCT_away', 'FT_PCT_away', 'FG3_PCT_away', 'AST_away', 'REB_away', 'HOME_TEAM_WINS']\n" - ] - } - ], + "outputs": [], "source": [ "variables = list(df_games_2022.columns)\n", "print(variables)" @@ -4008,7 +1981,7 @@ }, { "cell_type": "code", - "execution_count": 160, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -4025,7 +1998,7 @@ }, { "cell_type": "code", - "execution_count": 161, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -4042,160 +2015,11 @@ }, { "cell_type": "code", - "execution_count": 162, + "execution_count": null, "metadata": { "scrolled": true }, - "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", - "
PTS_homeFG_PCT_homeFT_PCT_homeFG3_PCT_homeAST_homeREB_homePTS_awayFG_PCT_awayFT_PCT_awayFG3_PCT_awayAST_awayREB_away
0126.00.4840.9260.38225.046.0117.00.4780.8150.32123.044.0
1120.00.4880.9520.45716.040.0112.00.5610.7650.33320.037.0
2114.00.4820.7860.31322.037.0106.00.4700.6820.43320.046.0
3113.00.4410.9090.29727.049.093.00.3920.7350.26115.046.0
4108.00.4291.0000.37822.047.0110.00.5000.7730.29220.047.0
\n", - "
" - ], - "text/plain": [ - " PTS_home FG_PCT_home FT_PCT_home FG3_PCT_home AST_home REB_home \\\n", - "0 126.0 0.484 0.926 0.382 25.0 46.0 \n", - "1 120.0 0.488 0.952 0.457 16.0 40.0 \n", - "2 114.0 0.482 0.786 0.313 22.0 37.0 \n", - "3 113.0 0.441 0.909 0.297 27.0 49.0 \n", - "4 108.0 0.429 1.000 0.378 22.0 47.0 \n", - "\n", - " PTS_away FG_PCT_away FT_PCT_away FG3_PCT_away AST_away REB_away \n", - "0 117.0 0.478 0.815 0.321 23.0 44.0 \n", - "1 112.0 0.561 0.765 0.333 20.0 37.0 \n", - "2 106.0 0.470 0.682 0.433 20.0 46.0 \n", - "3 93.0 0.392 0.735 0.261 15.0 46.0 \n", - "4 110.0 0.500 0.773 0.292 20.0 47.0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "0 1\n", - "1 1\n", - "2 1\n", - "3 1\n", - "4 0\n", - "Name: HOME_TEAM_WINS, dtype: int64" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display(X.head())\n", "display(y.head())" @@ -4210,7 +2034,7 @@ }, { "cell_type": "code", - "execution_count": 163, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -4229,7 +2053,7 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -4244,154 +2068,11 @@ }, { "cell_type": "code", - "execution_count": 165, + "execution_count": null, "metadata": { "scrolled": true }, - "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", - "
PTS_home_normFG_PCT_home_normFT_PCT_home_normFG3_PCT_home_normAST_home_normREB_home_normPTS_away_normFG_PCT_away_normFT_PCT_away_normFG3_PCT_away_normAST_away_normREB_away_norm
4400.2054790.3901730.4000.3670100.080.4418600.4761900.4316110.8814290.4574710.6296300.684211
2470.1506850.0953760.6880.2288660.040.5813950.2698410.2492400.6828570.3103450.4814810.578947
4340.3287670.4104050.6000.1628870.480.3720930.3809520.3647420.7357140.4873560.2592590.763158
570.7534250.5809250.6660.7030930.560.5116280.6666670.5471120.8414290.4252870.6666670.421053
2340.6438360.8612720.4660.7587630.760.4883720.5238100.3465050.3542860.3816090.5925930.552632
\n", - "
" - ], - "text/plain": [ - " PTS_home_norm FG_PCT_home_norm FT_PCT_home_norm FG3_PCT_home_norm \\\n", - "440 0.205479 0.390173 0.400 0.367010 \n", - "247 0.150685 0.095376 0.688 0.228866 \n", - "434 0.328767 0.410405 0.600 0.162887 \n", - "57 0.753425 0.580925 0.666 0.703093 \n", - "234 0.643836 0.861272 0.466 0.758763 \n", - "\n", - " AST_home_norm REB_home_norm PTS_away_norm FG_PCT_away_norm \\\n", - "440 0.08 0.441860 0.476190 0.431611 \n", - "247 0.04 0.581395 0.269841 0.249240 \n", - "434 0.48 0.372093 0.380952 0.364742 \n", - "57 0.56 0.511628 0.666667 0.547112 \n", - "234 0.76 0.488372 0.523810 0.346505 \n", - "\n", - " FT_PCT_away_norm FG3_PCT_away_norm AST_away_norm REB_away_norm \n", - "440 0.881429 0.457471 0.629630 0.684211 \n", - "247 0.682857 0.310345 0.481481 0.578947 \n", - "434 0.735714 0.487356 0.259259 0.763158 \n", - "57 0.841429 0.425287 0.666667 0.421053 \n", - "234 0.354286 0.381609 0.592593 0.552632 " - ] - }, - "execution_count": 165, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "X_train.head()" ] @@ -4405,7 +2086,7 @@ }, { "cell_type": "code", - "execution_count": 166, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -4426,30 +2107,9 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['PTS_home_norm' 'FG_PCT_home_norm' 'AST_home_norm' 'PTS_away_norm'\n", - " 'FG_PCT_away_norm' 'FG3_PCT_away_norm']\n", - "Variable PTS_home_norm: 4.3868\n", - "Variable FG_PCT_home_norm: 3.7384\n", - "Variable FT_PCT_home_norm: 0.3319\n", - "Variable FG3_PCT_home_norm: 3.0046\n", - "Variable AST_home_norm: 3.0950\n", - "Variable REB_home_norm: 0.5436\n", - "Variable PTS_away_norm: 5.7462\n", - "Variable FG_PCT_away_norm: 3.8130\n", - "Variable FT_PCT_away_norm: 0.1706\n", - "Variable FG3_PCT_away_norm: 4.5008\n", - "Variable AST_away_norm: 2.6714\n", - "Variable REB_away_norm: 1.6384\n" - ] - } - ], + "outputs": [], "source": [ "selector = SelectKBest(chi2, k=6)\n", "\n", @@ -4475,18 +2135,9 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy en train: 0.9287598944591029\n", - "Accuracy en test: 0.9141104294478528\n" - ] - } - ], + "outputs": [], "source": [ "# Creamos el objeto del modelo con parámetros por defecto, fijando la semilla para evitar aleatoriedad\n", "logreg = LogisticRegression(random_state=42)\n", @@ -4506,20 +2157,9 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.9447852760736196" - ] - }, - "execution_count": 169, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pipe = Pipeline([('scaler', StandardScaler()), ('svc', SVC())])\n", "pipe.fit(X_train, y_train)\n", From 510cb89feaa5c32cc406269587511d4f448f0b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Crist=C3=B3bal=20Herreros?= Date: Sun, 22 Jan 2023 08:38:46 +0100 Subject: [PATCH 2/2] Fix: remove typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f9c725..c85d51b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Segunda entrega de machine learning -Una empresa de apuestas solicita conocer quien gana en un partido de NBA. Para ello, se usan los datos actualizados hasta la tempporada 2022 https://www.kaggle.com/datasets/nathanlauga/nba-games?resource=download +Una empresa de apuestas solicita conocer quien gana en un partido de NBA. Para ello, se usan los datos actualizados hasta la temporada 2022 https://www.kaggle.com/datasets/nathanlauga/nba-games?resource=download Para conseguir el objetivo, se decide usar varios algoritmos de machine learning para poder escoger el que mejor resultado pueda satisfacer las necesidades de la empresa. \ No newline at end of file