Skip to content

Instantly share code, notes, and snippets.

@harpiechoise
Created January 17, 2020 03:51
Show Gist options
  • Save harpiechoise/6fcd89349a777a8758dd76e004f67e7f to your computer and use it in GitHub Desktop.
Save harpiechoise/6fcd89349a777a8758dd76e004f67e7f to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Copia de Te damos la bienvenida a Colaboratory",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/harpiechoise/980702e834bb03c6e2828a8841cf6d1b/copia-de-te-damos-la-bienvenida-a-colaboratory.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "QgUlBuTYINjY",
"colab_type": "code",
"outputId": "8170a1a5-0e19-4ff4-b8a2-601fe218dbef",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.lines as mlines\n",
"import matplotlib.patches as patches\n",
"ax = plt.gca()\n",
"ax.scatter(x=[50, 50,100, 100], y=[0, 100, 0, 100], c='white', edgecolors='black',s=20)\n",
"ax.scatter(x=[50], y=[50], s=5000, facecolors='none', edgecolors='r')\n",
"ax.scatter(x=[50], y=[50], s=300, c='w', edgecolors='blue')\n",
"ax.scatter(x=[100], y=[50], s=300,facecolors='none', marker='s' ,edgecolors='blue')\n",
"ax.scatter(x=[100], y=[50], s=300*10,facecolors='none', marker='s' ,edgecolors='blue')\n",
"ax.scatter(x=[80], y=[57], s=300,facecolors='none', c='green')\n",
"ax.axvline(x=50)\n",
"ax.plot([100, 80], [50, 57])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f3598eaf438>]"
]
},
"metadata": {
"tags": []
},
"execution_count": 70
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "z8p5aXSRIwOw",
"colab_type": "code",
"colab": {}
},
"source": [
"import math\n",
"A = (80, 57)\n",
"B = (100, 50)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "susEgkR7NM3o",
"colab_type": "code",
"colab": {}
},
"source": [
"from abc import ABCMeta, abstractmethod\n",
"import numpy as np\n",
"from scipy.special import expit"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "T6ioqJceQAKn",
"colab_type": "code",
"colab": {}
},
"source": [
"# 91,4 Cm\n",
"YARDA = 0.9144\n",
"REG = 10e-7\n",
"\n",
"def log_reg_dot(beta_dict, parametros_de_tiro):\n",
" \"\"\"\n",
" :param beta_dict: diccionario con los coeficientes beta\n",
" :param parametros_de_tiro: diccionario con los puntos de dato\n",
" :return: sigmoide del producto beta * punto de datos\n",
" >>> log_reg_dot({'1': 1, 'a': -1, 'b': -0.5, 'c': 1000}, {'a': 0.5, 'b': 1, 'foo': 2000})\n",
" 0.5\n",
" \"\"\"\n",
" res = 0.\n",
"\n",
" for k in beta_dict.keys():\n",
" if k in parametros_de_tiro:\n",
" res += beta_dict[k] * parametros_de_tiro[k]\n",
" elif isinstance(k, tuple):\n",
" arguments = []\n",
" for key in k:\n",
" if key in parametros_de_tiro:\n",
" arg = parametros_de_tiro[key]\n",
" elif key.startswith('inverse_'):\n",
" k_inv = key.replace('inverse_', '')\n",
" if k_inv in parametros_de_tiro:\n",
" arg = 1.0 / (parametros_de_tiro[k_inv] + REG)\n",
" else:\n",
" arg = 0.\n",
" else:\n",
" arg = 0.\n",
" arguments.append(arg)\n",
" res += beta_dict[k] * np.prod(arguments)\n",
" elif k.startswith('inverse_'):\n",
" k_inv = k.replace('inverse_', '')\n",
" if k_inv in parametros_de_tiro:\n",
" res += beta_dict[k] / (parametros_de_tiro[k_inv] + REG)\n",
" res += beta_dict['1']\n",
" # Player adjustment for Caley's XG\n",
" player_adjustment = parametros_de_tiro.get('player_adjustment', 1.)\n",
" if res < 0:\n",
" player_adjustment = 1. / player_adjustment\n",
" return expit(res * player_adjustment)\n",
"\n",
"\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Joe5o5SybxzT",
"colab_type": "code",
"colab": {}
},
"source": [
"class XGCalculator(object):\n",
" __metaclass__ = ABCMeta\n",
"\n",
" def __init__(self):\n",
" \"\"\"\n",
" Trabajamos con coordenadas para saber donde esta ubicado el arco \n",
" La frontera del arco está entre los puntos 0 < x < 68, 0 < y < 105, con la posicion de gol situada (100, 50) \n",
" \"\"\"\n",
" self.palo_izquierdo = np.array([100, 20], np.float64) # Chequar\n",
" self.palo_derecho = np.array([101, 80], np.float64) # Chequar\n",
" self.centro_del_arco = np.array([100, 50], np.float64) # El centro del arco\n",
" self.ancho_de_accion = self.palo_derecho[0] - self.palo_izquierdo[0]\n",
"\n",
" @abstractmethod\n",
" def _angulo_relativo(self, x, y):\n",
" \"\"\"\n",
" Angulo de (x, y) hasta el palo mas cercano pi / 2 as descrito por Caley\n",
" >>> xg = CaleyXGCalculator()\n",
" >>> xg._angulo_relativo(x=44.948, y=1.392857)\n",
" 0.12021884320255356\n",
" \"\"\"\n",
" if self.palo_izquierdo[0] <= x <= self.palo_derecho[0]:\n",
" return 1.\n",
" elif x < self.palo_izquierdo[0]:\n",
" x_a_palo = self.palo_izquierdo[0] - x\n",
" else:\n",
" x_a_palo = x - self.palo_derecho[0]\n",
"\n",
" return 2 * np.arctan(y / x_a_palo) / np.pi\n",
"\n",
" @staticmethod\n",
" def _distancia(x, y, punto, yardas=False):\n",
" \"\"\"\n",
" Retorna la distancia (x, y) hacia el punto\n",
" :param yardas: Si quieres que devuelva el resultado en yardas\n",
" \"\"\"\n",
" return np.linalg.norm(np.asarray([x, y]) - np.asarray(punto)) / (YARDA if yardas else 1)\n",
"\n",
" def _angulo_entre_los_palos(self, x, y):\n",
" \"\"\"\n",
" Retorna el angulo hecho por la posicion de tiro\n",
" \"\"\"\n",
" dist_left = self._distance(x, y, self.palo_izquierdo)\n",
" dist_right = self._distance(x, y, self.palo_derecho)\n",
"\n",
" cos_angle = (dist_left ** 2 + dist_right ** 2 - self.goal_width ** 2) / (2 * dist_left * dist_right)\n",
" return np.arccos(cos_angle)\n",
"\n",
" def _esta_entre_las_zonas_altas_de_valor(self, x, y):\n",
" # POR FAVOR CHEQUEA LAS MEDIDAS DEL AREA CHICA\n",
" # y < 5.5 and (self.palo_izquierdo.x < x < centro_arco or (self.palo_izquierdo.x - 5.5 < x < palo_derecho.x + 5.5 and self._relative_angle(x, y) > 0.75))\n",
" return y < 5.5 and (100 < x < 100 or (100 - 5.5 < x < 101 + 5.5 and self._angulo_relativo(x, y) > 0.75))\n",
"\n",
"def tiro_en_el_area(x, y):\n",
" # DAME LAS MEDIDAS DEL AREA GRANDE\n",
" if not (0 <= x <= 68 and 0 <= y <= 105):\n",
" raise ValueError('Tiro fuera del area'.format((x, y)))\n",
"\n",
"class CaleyXGCalculator(XGCalculator):\n",
" \"\"\"\n",
" XG model introduced by Caley in\n",
" http://cartilagefreecaptain.sbnation.com/2015/10/19/9295905/premier-league-projections-and-new-expected-goals\n",
" \"\"\"\n",
" def __init__(self):\n",
" super(CaleyXGCalculator, self).__init__()\n",
"\n",
" @staticmethod\n",
" def _beta(driveo, patada_directa, cruzado, cabeza):\n",
" if driveo:\n",
" return {'1': -0.61, 'distance': -0.09, 'inverse_distance': 7.4, 'angle': 1.04, 'big_chance': 1.1,\n",
" 'following_error': 0.67, ('inverse_distance', 'inverse_angle'): -3.2}\n",
" elif patada_directa:\n",
" return {'1': -3.84, 'distance': -0.1, 'inverse_distance': 98.7, 'inverse_angle': 3.54,\n",
" ('inverse_distance', 'inverse_angle'): -91.1}\n",
" elif cruzado:\n",
" if cabeza:\n",
" return {'1': -2.88, 'distance': -0.21, 'angle': 2.13, 'inverse_assist_distance': 4.31,\n",
" 'assist_angle': 0.46, 'fastbreak': 0.2, 'counterattack': 0.11, 'set_piece': 0.12,\n",
" 'corner': -0.24, 'otherbodypart': -0.18, 'big_chance': 1.2, 'following_error': 1.1,\n",
" 'EPL': 0.18, 'LaLiga': 0.15}\n",
" else:\n",
" return {'1': -2.8, 'distance': -0.11, 'inverse_distance': 3.52, 'angle': 1.14,\n",
" 'assist_across_face': 0.14, 'inverse_assist_distance': 6.94, 'assist_angle': 0.59,\n",
" 'corner': -0.12, 'fastbreak': 0.24, 'counterattack': 0.11, 'big_chance': 1.25,\n",
" 'following_error': 1.1, 'EPL': -0.2}\n",
" elif cabeza:\n",
" return {'1': -3.85, 'distance': -0.1, 'inverse_distance': 2.56, 'angle': 1.94,\n",
" 'throughball_assist': 0.51, 'fastbreak': 0.44, 'counterattack': 0.26, 'rebound': 0.7,\n",
" 'established_possession': 0.44, 'otherbodypart': 1.14, 'big_chance': 1.3, 'following_error': 1.1,\n",
" 'EPL': -0.29, 'LaLiga': -0.24, 'SerieA': -0.26}\n",
" else:\n",
" # Tiro Regular\n",
" return {'1': -3.19, 'distance': -0.095, 'inverse_distance': 3.18, 'angle': 1.88,\n",
" 'inverse_angle': 0.24, ('inverse_distance', 'inverse_angle'): -2.09, 'throughball_assist': 0.45,\n",
" 'throughball_2nd_assist': 0.64, 'assist_across_face': 0.31, 'cutback_assist': -0.15,\n",
" 'inverse_assist_distance': 2.18, 'assist_angle': 0.12, 'fastbreak': 0.23, 'counterattack': 0.18,\n",
" 'established_possession': 0.09, 'following_corner': -0.18, 'big_chance': 1.2,\n",
" 'following_error': 1.1, 'following_dribble': 0.39, 'dribble_distance': 0.14, 'rebound': 0.37,\n",
" 'game_state_sgn': 0.03, 'Bundesliga': 0.07, 'EPL': 0.05, 'LaLiga': 0.05, 'SerieA': -0.07}\n",
"\n",
" def eval(self, **kwargs):\n",
" x = kwargs['x']\n",
" y = kwargs['y']\n",
" tiro_en_el_area(x, y) # Si el tiro no esta en el area dera error\n",
" # y < 5.5 and (self.palo_izquierdo.x < x < centro_arco or (self.palo_izquierdo.x - 5.5 < x < palo_derecho.x + 5.5 and self._relative_angle(x, y) > 0.75))\n",
" if not kwargs.get('dribble_goalkeeper', False) and y < 5.5 and 100 < x < 101:\n",
" y = max(0.5, y)\n",
" empieza_carrera_x, empieza_carrera_y = kwargs.pop('start_run_x', None), kwargs.pop('start_run_y', None)\n",
" assistencia_x, asistencia_y = kwargs.pop('assist_x', None), kwargs.pop('assist_y', None)\n",
" \n",
"\n",
" parte_del_cuerpo = kwargs.pop('body_part', 'RightFoot')\n",
" kwargs['header'] = parte_del_cuerpo == 'header' or body_part == 'otherbodypart'\n",
" kwargs['otherbodypart'] = parte_del_cuerpo == 'otherbodypart'\n",
"\n",
" kwargs['game_state_sgn'] = np.sign(kwargs.get('game_state', 0))\n",
" kwargs[kwargs.pop('league', None)] = True\n",
" kwargs[kwargs.pop('pass_type', None)] = True\n",
" kwargs[kwargs.pop('attack_type', 'open_play')] = True\n",
" kwargs['counterattack'] = kwargs.get('counterattack', False) or kwargs.get('fastbreak', False)\n",
"\n",
" cruzado_o_cabeza = kwargs.get('cross', False) or kwargs['header']\n",
"\n",
" shot_params = {k: (float(v) if not isinstance(v, tuple) else v) for k, v in kwargs.iteritems()}\n",
" if cruzado_o_cabeza:\n",
" shot_params['distance'] = self._distance(x, y, self.goal_center, yards=True)\n",
" else:\n",
" shot_params['distance'] = y / YARD\n",
"\n",
" shot_params['angle'] = self._relative_angle(x, y)\n",
"\n",
" if start_run_x is not None and start_run_y is not None and not cross_or_header:\n",
" start_distance = max(0.5, start_run_y) / YARD\n",
" shot_params['dribble_distance'] = (start_distance - shot_params['distance']) / start_distance\n",
"\n",
" if assist_x is not None and assist_y is not None:\n",
" assist_x = float(assist_x)\n",
" assist_y = float(assist_y)\n",
" shot_params['assist_distance'] = self._distance(assist_x, assist_y, self.goal_center, yards=True)\n",
" shot_params['assist_angle'] = self._relative_angle(assist_x, assist_y)\n",
"\n",
" return log_reg_dot(self._beta(kwargs.get('dribble_goalkeeper', False),\n",
" kwargs.get('direct_free_kick', False),\n",
" kwargs.get('cross', False),\n",
" kwargs.get('header', False)),\n",
" shot_params, verbose=verbose)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "lLf894-_iDkf",
"colab_type": "code",
"colab": {}
},
"source": [
"import itertools\n",
"\n",
"import numpy as np\n",
"\n",
"INCREDIBLY_BIG_NUMBER_OF_GOALS = 10\n",
"\n",
"\n",
"def number_of_goals_probabilities(p_shots):\n",
" \"\"\"\n",
" :param p_shots: array or list: Probabilidades de que cada tiro sea gol\n",
" :return: array donde la posicion de k tiene siempre la probabilidad de hacer gol\n",
" >>> number_of_goals_probabilities([0.1, 0.1])\n",
" array([ 0.81, 0.18, 0.01])\n",
" >>> number_of_goals_probabilities([0.8, 0.2, 0.2])\n",
" array([ 0.128, 0.576, 0.264, 0.032])\n",
" >>> number_of_goals_probabilities([0.1] * 15).shape\n",
" (11,)\n",
" >>> p_shots = np.random.exponential(0.1, 10)\n",
" >>> np.sum(number_of_goals_probabilities(p_shots) * np.arange(11)) - p_shots.sum() < 1e-3\n",
" True\n",
" \"\"\"\n",
" p_shots = np.sort(np.asarray(p_shots, dtype=np.float64))\n",
" p_compl = 1.0 - p_shots\n",
"\n",
" all_idx = set(range(len(p_shots)))\n",
"\n",
" p_goals = np.zeros(min(len(p_shots), INCREDIBLY_BIG_NUMBER_OF_GOALS) + 1)\n",
"\n",
" for k in xrange(len(p_goals)):\n",
" if k > 5:\n",
" binom_nom = len(p_shots) - np.arange(k)\n",
" binom_den = k - np.arange(k)\n",
" max_proba = np.prod(binom_nom * p_shots[-k:] / binom_den) * np.prod(p_compl[:-k])\n",
" # Debemos suponer que la probabilidad maxima es 1.5 veces mas pequeña que la probabilidad actual\n",
" # Esto puede ser sobrescrito solo si muchos tiros tienen la probabilidad de Gol Esperado >= 0.5 \n",
" # Pero en ese caso el equipo tiene mucha mas probabilidad de ganar que el oponente\n",
" max_proba_for_greater_k = max_proba * 3\n",
"\n",
" if max_proba_for_greater_k < 1e-3:\n",
" return p_goals\n",
"\n",
" for idx_scored in itertools.combinations(range(len(p_shots)), k):\n",
" scored_proba = np.prod(p_shots[list(idx_scored)])\n",
" idx_missed = list(all_idx - set(idx_scored))\n",
" missed_proba = np.prod(p_compl[idx_missed])\n",
"\n",
" p_goals[k] += scored_proba * missed_proba\n",
"\n",
" return p_goals\n",
"\n",
"\n",
"def match_result_probabilities(p_shots_home, p_shots_away):\n",
" \"\"\"\n",
" :param p_shots_home:Lista de probabilidad que para todos los equipos que juegan en casa hagan gol\n",
" :param p_shots_away: array or list: probabilidad para que cada equipo de otra parte haga gol\n",
" :return: Da un arreglo con 3 probabilidades (gana la casa, empate, o gana el invitado)\n",
" >>> match_result_probabilities([0.4], [0.3])\n",
" array([ 0.28, 0.54, 0.18])\n",
" >>> match_result_probabilities([0.1, 0.1], [0.05, 0.15])\n",
" array([ 0.1553, 0.6875, 0.1573])\n",
" >>> match_result_probabilities([0.1, 0.1, 0.1], [0.2, 0.1])\n",
" array([ 0.2024, 0.5886, 0.209 ])\n",
" \"\"\"\n",
" p_home = number_of_goals_probabilities(p_shots_home)\n",
" p_away = number_of_goals_probabilities(p_shots_away)\n",
"\n",
" p_home_win = 0.\n",
" p_draw = 0.\n",
" p_away_win = 0.\n",
" for goals_home in xrange(len(p_home)):\n",
" for goals_away in xrange(len(p_away)):\n",
" p = p_home[goals_home] * p_away[goals_away]\n",
" if goals_home > goals_away:\n",
" p_home_win += p\n",
" elif goals_home < goals_away:\n",
" p_away_win += p\n",
" else:\n",
" p_draw += p\n",
"\n",
" return np.round([p_home_win, p_draw, p_away_win], 4)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "4zAJGyA5kB-z",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "phfeQLrCkDIk",
"colab_type": "text"
},
"source": [
"# SEGUNDO APROACH\n",
"\n",
"Explicacion:\n",
"- Calcular el modo en que fue lanzada la pelota\n",
" - corner\n",
" - cabeza\n",
" - tiro libre\n",
" - juego abierto\n",
" - cruzado\n",
" - etc.\n",
"\n",
"Este sera nuestro X y nuestro y sera\n",
" - y: fue o no gol\n",
"\n",
"NO TENGO DATOS ESO FUE "
]
},
{
"cell_type": "code",
"metadata": {
"id": "_xdmqFffkFve",
"colab_type": "code",
"colab": {}
},
"source": [
"import statsmodels.api as sm\n",
"X = dataset[['corner', 'cabeza', 'tiro libre', 'juego abierto', 'cruzado', 'angulo']]\n",
"y = dataset.fue_gol.values\n",
"logit_model = sm.Logi(y, X)\n",
"retult = logit_model.fit()\n",
"print(result.summary2()) # Analiza los p valores p > 0.05\n",
"\n",
"# APLICA REGRESION LOGISTICA\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.cross_validation import train_test_split\n",
"X_train X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n",
"log_r,fit(X_train, y_train)\n",
"# Si lo hiciste bien tendras un accuracy del 90%\n",
"# Y simplemente lo pasas por el dataset y predices\n",
"\n",
"def funcion_sigmoide(scores):\n",
" return 1 / (1 + np.exp(-scores))\n",
"\n",
"def regresion_logistica(X, y, epocas, learning_rate, intercecsion = False):\n",
" if intercecsion:\n",
" intercept = np.ones((features.shape[0], 1))\n",
" features = np.hstack((intercept, features))\n",
" \n",
" weights = np.zeros(features.shape[1])\n",
" \n",
" for paso in xrange(epocas):\n",
" scores = np.dot(features, weights)\n",
" predictions = funcion_sigmoide(scores)\n",
"\n",
" output_error_signal = target - predictions\n",
" gradient = np.dot(features.T, output_error_signal)\n",
" weights += learning_rate * gradient\n",
" \n",
" if paso % 10000 == 0:\n",
" print log_likelihood(X, y, weights)\n",
" \n",
" return weights\n",
"\n",
"def log_likelihood(X, y, pesos):\n",
" scores = np.dot(X, pesos)\n",
" ll = np.sum( y*scores - np.log(1 + np.exp(scores)) )\n",
" return ll\n",
"\n",
"weights = regresion_logistica(X, y,\n",
" epocas = 300000, learning_rate = 5e-5, add_intercept=True)"
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment