{ "cells": [ { "cell_type": "markdown", "id": "4756194f", "metadata": {}, "source": [ "# 📍 Recipe: Cumulative xG by Time per Team\n", "\n", "In this example, we'll load event data for a match from StatsBomb's open dataset, extract shots and their xG values, and calculate the cumulative expected goals (xG) for each team over time.\n", "\n", "We'll then plot the result using a stepped line chart in matplotlib to show the ebb and flow of attacking threat.\n", "\n", "## 🧰 What You'll Learn\n", "\n", "- How to access StatsBomb data using `Flow.statsbomb` methods\n", "- How to filter for shot events and extract time and xG values\n", "- Use `.group_by(...).cumulative(...)` to compute cumulative stats\n", "- How to add a zero point to each team's cumulative xG so the chart starts at (0,0) using `.pipe()`\n", "- How to convert to pandas and visualize using matplotlib\n", "\n", "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "4248fe6e", "metadata": {}, "outputs": [], "source": [ "from penaltyblog.matchflow import Flow, get_field, where_equals\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "4f53ac10", "metadata": {}, "source": [ "## Filter Shot Events" ] }, { "cell_type": "code", "execution_count": 2, "id": "350cf117", "metadata": {}, "outputs": [], "source": [ "match_id = 22912 # Champions League Final 2018/2019\n", "\n", "shots = (\n", " Flow.statsbomb.events(match_id)\n", " .filter(where_equals(\"type.name\", \"Shot\"))\n", " .assign(\n", " team=lambda r: get_field(r, \"team.name\"),\n", " xg=lambda r: get_field(r, \"shot.statsbomb_xg\") or 0,\n", " time=lambda r: r.get(\"minute\", 0) * 60 + r.get(\"second\", 0),\n", " )\n", " .select(\"time\", \"team\", \"xg\")\n", " .sort_by(\"time\")\n", ")" ] }, { "cell_type": "markdown", "id": "d7680381", "metadata": {}, "source": [ "## Group by Team and Compute Cumulative xG\n", "\n", "Note how we use the `.pipe()` method to add the zero point to each team's cumulative xG so the chart starts at (0,0)" ] }, { "cell_type": "code", "execution_count": null, "id": "5c61dd1a", "metadata": {}, "outputs": [], "source": [ "def add_zero_point(flow: Flow) -> Flow:\n", " teams = flow.select(\"team\").distinct().collect()\n", " zeros = [{\"team\": t[\"team\"], \"time\": 0, \"cumulative_xg\": 0.0} for t in teams]\n", " return Flow.from_records(zeros).concat(flow)\n", "\n", "\n", "cum_xg = (\n", " shots.group_by(\"team\")\n", " .cumulative(field=\"xg\", alias=\"cumulative_xg\")\n", " .pipe(add_zero_point)\n", " .sort_by(\"time\")\n", ")" ] }, { "cell_type": "markdown", "id": "6def64b6", "metadata": {}, "source": [ "## Plot Chart" ] }, { "cell_type": "code", "execution_count": 4, "id": "72ad7c75", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/martin/repos/penaltyblog/venv/lib/python3.13/site-packages/statsbombpy/api_client.py:21: NoAuthWarning: credentials were not supplied. open data access only\n", " warnings.warn(\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAHWCAYAAABkNgFvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZQ0lEQVR4nO3deVxU9f7H8fewDJuAC8qiuOO+poloLl0pcku7LWSWa5pbWmYp5damZmlqabapddO0xcybZhm5pNLmbpqFF5ergpoGIigI398f/pzrCCooMAy+no/HPB7MOd9zzufMwXrzne/5HosxxggAAABwQi6OLgAAAAC4XoRZAAAAOC3CLAAAAJwWYRYAAABOizALAAAAp0WYBQAAgNMizAIAAMBpEWYBAADgtAizAAAAcFqEWQA3vT59+qhq1aoFus8FCxbIYrFo//79Bbrf4mbixImyWCw6ceKEo0sBcJMizAIoEPv27dNjjz2m6tWry9PTU35+fmrdurVmzpyp9PR0R5dXaCZNmqRly5Y5uozrtmPHDvXt21fVqlWTp6enSpUqpSZNmuiZZ57Rf/7zH0eXZ/uj4Fqvgv5jBIDzcHN0AQCc34oVK3T//ffLw8NDvXr1UoMGDZSRkaENGzbo6aef1m+//aZ33nnH0WUWikmTJum+++5T9+7d7ZY/8sgjevDBB+Xh4eGYwvLg3Xff1eDBgxUQEKCePXuqTp06On/+vHbt2qUPP/xQM2bMUHp6ulxdXR1WY9u2bfWvf/3Lbtmjjz6qFi1aaODAgbZlpUqVKurSABQThFkANyQhIUEPPvigqlSpou+//17BwcG2dUOHDlV8fLxWrFjhwAodw9XV1aEh8Fo2bdqkwYMHq3Xr1vrqq6/k6+trt37atGl6+eWXHVTd/1SvXl3Vq1e3WzZo0CBVr15dDz/8sIOqAlCcMMwAwA2ZOnWqUlNT9f7779sF2Ytq1qypESNGSJL2798vi8WiBQsW5GhnsVg0ceJE2/uLYzH/+OMPPfzww/L391f58uU1btw4GWN06NAhdevWTX5+fgoKCtK0adPs9nelMatr166VxWLR2rVrr3per732mlq1aqVy5crJy8tLzZo102effZaj5jNnzuiDDz6wfd3dp0+fXI/fpUuXHKHsooiICDVv3txu2UcffaRmzZrJy8tLZcuW1YMPPqhDhw5dteb09HTVqVNHderUsRvacfLkSQUHB6tVq1bKysqSJD3//POyWCxauHBhjiArSZ6ennrxxRfzHMhPnDihBx54QH5+fipXrpxGjBihs2fP2ta3a9dOjRs3znXb2rVrKyoqKk/HuZLDhw+rX79+CgwMlIeHh+rXr6958+bZtcnIyND48ePVrFkz+fv7y8fHR23atNGaNWvs2l38PX3ttdc0e/ZsVa9eXd7e3rrzzjt16NAhGWP04osvqlKlSvLy8lK3bt108uTJG6ofwPUjzAK4If/+979VvXp1tWrVqlD2Hx0drezsbE2ZMkXh4eF66aWXNGPGDN1xxx2qWLGiXnnlFdWsWVOjRo3S+vXrC+y4M2fOVNOmTfXCCy9o0qRJcnNz0/3332/Xy/yvf/1LHh4eatOmjf71r3/pX//6lx577LErnkdCQoJ++eUXu+UHDhzQjz/+qAcffNC27OWXX1avXr0UFham6dOn64knnlBsbKzatm2rv//++4o1e3l56YMPPlB8fLyee+452/KhQ4cqOTlZCxYskKurq9LS0vT999+rffv2qlSp0nV+QvYeeOABnT17VpMnT1anTp00a9Ysu2EAjzzyiHbs2KFdu3bZbffLL7/Y/mC5XklJSWrZsqW+++47DRs2TDNnzlTNmjXVv39/zZgxw9YuJSVF7733ntq3b69XXnlFEydO1PHjxxUVFaVt27bl2O/ChQs1Z84cPf7443rqqae0bt06PfDAAxo7dqxWrVql0aNHa+DAgfr3v/+tUaNGXXf9AG6QAYDrlJycbCSZbt265al9QkKCkWTmz5+fY50kM2HCBNv7CRMmGElm4MCBtmXnz583lSpVMhaLxUyZMsW2/NSpU8bLy8v07t3btmz+/PlGkklISLA7zpo1a4wks2bNGtuy3r17mypVqti1S0tLs3ufkZFhGjRoYP7xj3/YLffx8bE77pWOn5ycbDw8PMxTTz1l127q1KnGYrGYAwcOGGOM2b9/v3F1dTUvv/yyXbudO3caNze3HMtzExMTY1xcXMz69evNp59+aiSZGTNm2NZv377dSDJPPPFEjm3/+usvc/z4cdvr3LlzVz3Wxet099132y0fMmSIkWS2b99ujDHm77//Np6enmb06NF27YYPH258fHxMamrqNc/ross/8/79+5vg4GBz4sQJu3YPPvig8ff3t13L8+fP5zifU6dOmcDAQNOvXz/bsou/p+XLlzd///23bXlMTIyRZBo3bmwyMzNty3v06GGsVqs5e/Zsns8BQMGhZxbAdUtJSZGkXL+mLiiPPvqo7WdXV1c1b95cxhj179/ftrx06dKqXbt2gd597+XlZfv51KlTSk5OVps2bbRly5br2p+fn586duyoTz75RMYY2/IlS5aoZcuWqly5siRp6dKlys7O1gMPPKATJ07YXkFBQQoLC8vxlXhuJk6cqPr166t3794aMmSI2rVrp+HDh9vWX7xuud00Vb16dZUvX972Wr58eZ7Ob+jQoXbvH3/8cUnSypUrJUn+/v7q1q2bPv74Y9v5Z2VlacmSJerevbt8fHzydJzLGWP0+eefq2vXrjLG2H1mUVFRSk5Otl0zV1dXWa1WSVJ2drZOnjyp8+fPq3nz5rle1/vvv1/+/v629+Hh4ZKkhx9+WG5ubnbLMzIydPjw4es6BwA3hhvAAFw3Pz8/SdLp06cL7RgXQ95F/v7+8vT0VEBAQI7lf/31V4Ed96uvvtJLL72kbdu26dy5c7blFovluvcZHR2tZcuWKS4uTq1atdK+ffu0efNmu6/C//zzTxljFBYWlus+3N3dr3kcq9WqefPm6dZbb5Wnp6fmz59vV/fFPz5SU1NzbPvll18qMzNT27dvz9dX55fXW6NGDbm4uNiNWe7Vq5eWLFmiH374QW3bttV3332npKQkPfLII3k+zuWOHz+uv//+W++8884VZ8w4duyY7ecPPvhA06ZN0++//67MzEzb8mrVquXYLrffPUkKDQ3NdfmpU6eu7yQA3BDCLIDr5ufnp5CQkBzjIK/kSkHw4k1JucntBqQr3ZR0aY/n9Rzroh9++EF333232rZtqzlz5ig4OFju7u6aP3++Fi1adM3tr6Rr167y9vbWJ598olatWumTTz6Ri4uL7r//flub7OxsWSwWff3117meZ16noPrmm28kSWfPntWff/5pF9Zq1qwpNze3XK9bu3btJMmu5/F65Pb5R0VFKTAwUB999JHatm2rjz76SEFBQYqMjLzu42RnZ0u60Fvau3fvXNs0atRI0oWb6vr06aPu3bvr6aefVoUKFeTq6qrJkydr3759Oba70u9ZXn7/ABQdwiyAG9KlSxe98847iouLU0RExFXblilTRpJy3MR04MCBAq/rRo71+eefy9PTU998843dPLHz58/P0TY/PbU+Pj7q0qWLPv30U02fPl1LlixRmzZtFBISYmtTo0YNGWNUrVo11apVK8/7vtSOHTv0wgsvqG/fvtq2bZseffRR7dy509aD6OPjo/bt22vdunU6fPiwKlaseF3HudTlgTk+Pl7Z2dl2DzNwdXXVQw89pAULFuiVV17RsmXLNGDAgBuawqx8+fLy9fVVVlbWNUPxZ599purVq2vp0qV2123ChAnXfXwAjseYWQA35JlnnpGPj48effRRJSUl5Vi/b98+zZw5U9KFntyAgIAcsw7MmTOnwOuqUaOGJNkdKysrK08Pb3B1dZXFYrHrxd2/f3+uT/ry8fG56gwDl4uOjtaRI0f03nvvafv27YqOjrZb/89//lOurq56/vnnc/T0GWOuOZQiMzNTffr0UUhIiGbOnKkFCxYoKSlJTz75pF278ePHKysrSw8//HCuww3y28s4e/Zsu/dvvPGGJKljx452yx955BGdOnVKjz32mFJTU294rlhXV1fde++9+vzzz3PtaT5+/LhdW8n+3H766SfFxcXdUA0AHIueWQA3pEaNGlq0aJGio6NVt25duyeAbdq0SZ9++qlt7lXpwg1dU6ZM0aOPPqrmzZtr/fr1+uOPPwq8rvr166tly5aKiYnRyZMnVbZsWS1evFjnz5+/5radO3fW9OnTddddd+mhhx7SsWPHNHv2bNWsWVM7duywa9usWTN99913mj59ukJCQlStWjXbjUK56dSpk3x9fTVq1ChbELtUjRo19NJLLykmJkb79+9X9+7d5evrq4SEBH3xxRcaOHDgVceyXhznGxsbK19fXzVq1Ejjx4/X2LFjdd9996lTp06SpDZt2ujNN9/U448/rrCwMNsTwDIyMvTHH39o4cKFslqtCgoKuubnJV14eMbdd9+tu+66S3Fxcfroo4/00EMP5ZhbtmnTpmrQoIE+/fRT1a1bV7fcckue9n81U6ZM0Zo1axQeHq4BAwaoXr16OnnypLZs2aLvvvvONgdsly5dtHTpUt1zzz3q3LmzEhISNHfuXNWrVy/XQA/ASThkDgUAJc4ff/xhBgwYYKpWrWqsVqvx9fU1rVu3Nm+88YbdlEVpaWmmf//+xt/f3/j6+poHHnjAHDt27IpTcx0/ftzuOL179zY+Pj45jt+uXTtTv359u2X79u0zkZGRxsPDwwQGBppnn33WrF69Ok9Tc73//vsmLCzMeHh4mDp16pj58+fbarrU77//btq2bWu8vLyMJNuUUVeaGswYY3r27GkkmcjIyCt+np9//rm57bbbjI+Pj/Hx8TF16tQxQ4cONXv37r3iNps3bzZubm7m8ccft1t+/vx5c+utt5qQkBBz6tQpu3Vbt241vXr1MpUrVzZWq9X4+PiYRo0amaeeesrEx8df8VgXXfxMdu/ebe677z7j6+trypQpY4YNG2bS09Nz3Wbq1KlGkpk0adI195+b3KZDS0pKMkOHDjWhoaHG3d3dBAUFmQ4dOph33nnH1iY7O9tMmjTJVKlSxXh4eJimTZuar776Ksf1vzg116uvvmp3jIvTun366ad2yy9e619++eW6zgfAjbEYw4h1AEDRmTlzpp588knt378/x4wBAJBfhFkAQJExxqhx48YqV65cnubMBYBrYcwsAKDQnTlzRsuXL9eaNWu0c+dOffnll44uCUAJQc8sAKDQ7d+/X9WqVVPp0qU1ZMgQvfzyy44uCUAJQZgFAACA02KeWQAAADgtwiwAAACc1k13A1h2draOHDkiX1/ffD2GEgAAAEXDGKPTp08rJCRELi5X73u96cLskSNHFBoa6ugyAAAAcA2HDh1SpUqVrtrmpguzvr6+ki58OH5+fg6uBgAAAJdLSUlRaGioLbddzU0XZi8OLfDz8yPMAgAAFGN5GRLKDWAAAABwWoRZAAAAOC3CLAAAAJzWTTdmNi+MMTp//ryysrIcXQpww1xdXeXm5sZUdACAEokwe5mMjAwdPXpUaWlpji4FKDDe3t4KDg6W1Wp1dCkAABQowuwlsrOzlZCQIFdXV4WEhMhqtdKbBadmjFFGRoaOHz+uhIQEhYWFXXPyaQAAnAlh9hIZGRnKzs5WaGiovL29HV0OUCC8vLzk7u6uAwcOKCMjQ56eno4uCQCAAkMXTS7ouUJJw+80AKCk4v9wAAAAcFqEWQAAADgtwuxNwGKxaNmyZY4uo8C0b99eTzzxhKPLAAAAxYBDw+z69evVtWtXhYSE5ClwLV26VHfccYfKly8vPz8/RURE6JtvvimaYou5Pn36qHv37rmuO3r0qDp27Fi0BQEAABQBh4bZM2fOqHHjxpo9e3ae2q9fv1533HGHVq5cqc2bN+v2229X165dtXXr1kKu1LkFBQXJw8Oj0PaflZWl7OzsQts/AAA3E2OM0jLOKy3jvIwxji6n2HNomO3YsaNeeukl3XPPPXlqP2PGDD3zzDO69dZbFRYWpkmTJiksLEz//ve/C63GS3+hivpVUL/Al/Z6t2rVSqNHj7Zbf/z4cbm7u2v9+vWSpHPnzmnUqFGqWLGifHx8FB4errVr19raL1iwQKVLl9by5ctVr149eXh46ODBg7be4eeff97Wez5o0CBlZGTYtj137pyGDx+uChUqyNPTU7fddpt++eUXu3rWrVunFi1ayMPDQ8HBwRozZozOnz9fIJ8FAADFXXpmluqN/0b1xn+j9EyeRnotTj3PbHZ2tk6fPq2yZctesc25c+d07tw52/uUlJR8HePiL5Qj7H4hSt7Wgr1EPXv21NSpUzVlyhTbAyGWLFmikJAQtWnTRpI0bNgw7d69W4sXL1ZISIi++OIL3XXXXdq5c6fCwsIkSWlpaXrllVf03nvvqVy5cqpQoYIkKTY2Vp6enlq7dq3279+vvn37qly5cnr55ZclSc8884w+//xzffDBB6pSpYqmTp2qqKgoxcfHq2zZsjp8+LA6deqkPn366MMPP9Tvv/+uAQMGyNPTUxMnTizQzwIAADg/p74B7LXXXlNqaqoeeOCBK7aZPHmy/P39ba/Q0NAirLD4eeCBB3TkyBFt2LDBtmzRokXq0aOHLBaLDh48qPnz5+vTTz9VmzZtVKNGDY0aNUq33Xab5s+fb9smMzNTc+bMUatWrVS7dm3bQyasVqvmzZun+vXrq3PnznrhhRc0a9YsZWdn68yZM3rrrbf06quvqmPHjqpXr57effddeXl56f3335ckzZkzR6GhoXrzzTdVp04dW0/vtGnTGMoAAABycNqe2UWLFun555/Xl19+aesVzE1MTIxGjhxpe5+SkpKvQOvl7qrdL0TdUK3Xy8vdtcD3Wb58ed15551auHCh2rRpo4SEBMXFxentt9+WJO3cuVNZWVmqVauW3Xbnzp1TuXLlbO+tVqsaNWqUY/+NGze2e3paRESEUlNTdejQISUnJyszM1OtW7e2rXd3d1eLFi20Z88eSdKePXsUERFh9xjh1q1bKzU1Vf/9739VuXLlgvkgAABAieCUYXbx4sV69NFH9emnnyoyMvKqbT08PG7o5ieLxVLgX/U7Ws+ePTV8+HC98cYbWrRokRo2bKiGDRtKklJTU+Xq6qrNmzfL1dU+TJcqVcr2s5eXl13gBAAAcASnG2bw8ccfq2/fvvr444/VuXNnR5fjlLp166azZ89q1apVWrRokXr27Glb17RpU2VlZenYsWOqWbOm3SsoKOia+96+fbvS09Nt73/88UeVKlVKoaGhqlGjhqxWqzZu3Ghbn5mZqV9++UX16tWTJNWtW1dxcXF2N79t3LhRvr6+qlSpUkGcPgAAKEEc2uWYmpqq+Ph42/uEhARt27ZNZcuWVeXKlRUTE6PDhw/rww8/lHRhaEHv3r01c+ZMhYeHKzExUdKFXkJ/f3+HnENxkpycrG3bttktu3RowEU+Pj7q3r27xo0bpz179qhHjx62dbVq1VLPnj3Vq1cvTZs2TU2bNtXx48cVGxurRo0aXfMPiIyMDPXv319jx47V/v37NWHCBA0bNkwuLi7y8fHR4MGD9fTTT9uu8dSpU5WWlqb+/ftLkoYMGaIZM2bo8ccf17Bhw7R3715NmDBBI0eOlIuL0/3tBQAACplDw+yvv/6q22+/3fb+4tjW3r17a8GCBTp69KgOHjxoW//OO+/o/PnzGjp0qIYOHWpbfrH9zW7t2rVq2rSp3bKLIfFyPXv2VKdOndS2bdsc41Dnz5+vl156SU899ZQOHz6sgIAAtWzZUl26dLlmDR06dFBYWJjatm2rc+fOqUePHnazEEyZMkXZ2dl65JFHdPr0aTVv3lzffPONypQpI0mqWLGiVq5cqaefflqNGzdW2bJlbeEYAADgchZzk83Gm5KSIn9/fyUnJ8vPz89u3dmzZ5WQkKBq1arJ09PTQRU6rz59+ujvv/8uUY/OLSn43QYA55GWcd42LWhhTNPpDK6W1y7H97YAAABwWoRZAAAAOK2br98ahYZxywAAoKjRMwsAAACnRZgFAACA0yLMAgAAwGkRZgEAAOC0CLMAAABwWoRZAAAAOC3CLIpc1apVNWPGDEeXAQAASgDCbAlgsViu+po4ceIVt92/f78sFou2bdtmt7xPnz7q3r17odZdHEycOFFNmjTJsfxKn8vVtG/fXk888USB1QYAAK6NhyaUAEePHrX9vGTJEo0fP1579+61LStVqpQjyoKDZGRkyGq1OroMAACKBD2z12KMlHHGMS9j8lRiUFCQ7eXv7y+LxWJ7X6FCBU2fPl2VKlWSh4eHmjRpolWrVtm2rVatmiSpadOmslgsat++vSZOnKgPPvhAX375pa13d+3atZKkQ4cO6YEHHlDp0qVVtmxZdevWTfv377ft72KP7muvvabg4GCVK1dOQ4cOVWZmpl3NaWlp6tevn3x9fVW5cmW98847dutHjx6tWrVqydvbW9WrV9e4cePs9nGxR3XevHmqXLmySpUqpSFDhigrK0tTp061nfvLL7+cn6t9VevWrVOLFi3k4eGh4OBgjRkzRufPn7ed97p16zRz5kzbZ7Z//36dOnVKPXv2VPny5eXl5aWwsDDNnz9f0v96fxcvXqxWrVrJ09NTDRo00Lp162zHXLBggUqXLm1Xx7Jly2SxWHJ8Fu+9956qVasmT0/PAjtnAACKO3pmryUzTZoU4phjP3tEsvrc0C5mzpypadOm6e2331bTpk01b9483X333frtt98UFhamn3/+WS1atNB3332n+vXry2q1ymq1as+ePUpJSbEFr7JlyyozM1NRUVGKiIjQDz/8IDc3N7300ku66667tGPHDltv4Jo1axQcHKw1a9YoPj5e0dHRatKkiQYMGGCra9q0aXrxxRf17LPP6rPPPtPgwYPVrl071a5dW5Lk6+urBQsWKCQkRDt37tSAAQPk6+urZ555xraPffv26euvv9aqVau0b98+3XffffrPf/6jWrVqad26ddq0aZP69eunyMhIhYeH39DnePjwYXXq1El9+vTRhx9+qN9//10DBgyQp6enJk6cqJkzZ+qPP/5QgwYN9MILL0iSypcvrxEjRmj37t36+uuvFRAQoPj4eKWnp9vt++mnn9aMGTNUr149TZ8+XV27dlVCQoLKlSuX5/ri4+P1+eefa+nSpXJ1db2hcwUAOFYe+7Lw/wizJdxrr72m0aNH68EHH5QkvfLKK1qzZo1mzJih2bNnq3z58pKkcuXKKSgoyLadl5eXzp07Z7fso48+UnZ2tt577z1bz+D8+fNVunRprV27VnfeeackqUyZMnrzzTfl6uqqOnXqqHPnzoqNjbULs506ddKQIUMkXeiFff3117VmzRpbmB07dqytbdWqVTVq1CgtXrzYLsxmZ2dr3rx58vX1Vb169XT77bdr7969WrlypVxcXFS7dm3b+V4tzO7cuTPHUAxz2X9J5syZo9DQUL355puyWCyqU6eOjhw5otGjR2v8+PHy9/eX1WqVt7e33Wd28OBBNW3a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b71Vvr6+qlChgrp37669e/fatTl79qyGDh2qcuXKqVSpUrr33nuVlJRk1+bgwYPq3LmzvL29VaFCBT399NM6f/68XZu1a9fqlltukYeHh2rWrKkFCxYU9uk5pbfeekuNGjWyTeYeERGhr7/+2rae6+F4U6ZMkcVi0RNPPGFbxnUpehMnTpTFYrF71alTx7aea1LMGRSaxYsXG6vVaubNm2d+++03M2DAAFO6dGmTlJTk6NJKhJUrV5rnnnvOLF261EgyX3zxhd36KVOmGH9/f7Ns2TKzfft2c/fdd5tq1aqZ9PR0W5u77rrLNG7c2Pz444/mhx9+MDVr1jQ9evSwrU9OTjaBgYGmZ8+eZteuXebjjz82Xl5e5u233y6q03QaUVFRZv78+WbXrl1m27ZtplOnTqZy5comNTXV1mbQoEEmNDTUxMbGml9//dW0bNnStGrVyrb+/PnzpkGDBiYyMtJs3brVrFy50gQEBJiYmBhbm//85z/G29vbjBw50uzevdu88cYbxtXV1axatapIz9cZLF++3KxYscL88ccfZu/evebZZ5817u7uZteuXcYYroej/fzzz6Zq1aqmUaNGZsSIEbblXJeiN2HCBFO/fn1z9OhR2+v48eO29VyT4o0wW4hatGhhhg4danuflZVlQkJCzOTJkx1YVcl0eZjNzs42QUFB5tVXX7Ut+/vvv42Hh4f5+OOPjTHG7N6920gyv/zyi63N119/bSwWizl8+LAxxpg5c+aYMmXKmHPnztnajB492tSuXbuQz8j5HTt2zEgy69atM8Zc+Pzd3d3Np59+amuzZ88eI8nExcUZYy78geLi4mISExNtbd566y3j5+dnuwbPPPOMqV+/vt2xoqOjTVRUVGGfUolQpkwZ895773E9HOz06dMmLCzMrF692rRr184WZrkujjFhwgTTuHHjXNdxTYo/hhkUkoyMDG3evFmRkZG2ZS4uLoqMjFRcXJwDK7s5JCQkKDEx0e7z9/f3V3h4uO3zj4uLU+nSpdW8eXNbm8jISLm4uOinn36ytWnbtq2sVqutTVRUlPbu3atTp04V0dk4p+TkZElS2bJlJUmbN29WZmam3TWpU6eOKleubHdNGjZsqMDAQFubqKgopaSk6LfffrO1uXQfF9vw7+rqsrKytHjxYp05c0YRERFcDwcbOnSoOnfunOOz47o4zp9/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28vb21tlypRRVFSUTp06Zdt++PDhqlChgjw9PXXbbbfpl19+sW27du1aWSwWxcbGqnnz5vL29larVq20d+9eu2NMmTJFgYGB8vX1Vf/+/XX27Fm79WvXrlWLFi3k4+Oj0qVLq3Xr1jpw4IBtfdeuXbV8+XK7P4wAOD/CLIBir1+/fpo/f77t/bx589S3b98c7c6cOaORI0fq119/VWxsrFxcXHTPPfcoOztbkvTzzz9Lkr777jsdPXrUFpDfeustDR06VAMHDtTOnTu1fPly1axZ027fzz//vB544AHt2LFDnTp1Us+ePXXy5MkCPc/XX39drVu31tatW9W5c2c98sgj6tWrlx5++GFt2bJFNWrUUK9evWSMkSTt27dPd911l+69917t2LFDS5Ys0YYNG3IE8Utt2LBB3t7eqlu3rm3Z559/rtdff11vv/22/vzzTy1btkwNGza0rR82bJji4uK0ePFi7dixQ/fff7/uuusu/fnnn5Kkbdu2qUOHDqpXr57i4uK0YcMGde3aVVlZWZKkZ555Rp9//rk++OADbdmyRTVr1lRUVFSOz++5557TtGnT9Ouvv8rNzU39+vWzrfvkk080ceJETZo0Sb/++quCg4M1Z84c2/rz58+re/fuateunXbs2KG4uDgNHDhQFovF1qZ58+Y6f/68fvrpp+u5PACKKwMAxVTv3r1Nt27dzLFjx4yHh4fZv3+/2b9/v/H09DTHjx833bp1M717977i9sePHzeSzM6dO40xxiQkJBhJZuvWrXbtQkJCzHPPPXfF/UgyY8eOtb1PTU01kszXX399zXOYMGGCady4cY7l7dq1MyNGjLC9r1Klinn44Ydt748ePWokmXHjxtmWxcXFGUnm6NGjxhhj+vfvbwYOHGi33x9++MG4uLiY9PT0XOt5/fXXTfXq1e2WTZs2zdSqVctkZGTkaH/gwAHj6upqDh8+bLe8Q4cOJiYmxhhjTI8ePUzr1q1zPV5qaqpxd3c3CxcutC3LyMgwISEhZurUqcYYY9asWWMkme+++87WZsWKFUaS7TwiIiLMkCFD7PYdHh5u+2z/+usvI8msXbs21zouKlOmjFmwYMFV2wBwLvTMAij2ypcvr86dO2vBggWaP3++OnfurICAgBzt/vzzT/Xo0UPVq1eXn5+fqlatKkk6ePDgFfd97NgxHTlyRB06dLhqDY0aNbL97OPjIz8/Px07duz6TigPxwgMDJQkux7Si8suHnf79u1asGCBSpUqZXtFRUUpOztbCQkJuR4jPT1dnp6edsvuv/9+paenq3r16howYIC++OILnT9/XpK0c+dOZWVlqVatWnbHWbdunW0Ix8We2dzs27dPmZmZat26tW2Zu7u7WrRooT179lzx/IODg+3Odc+ePQoPD7drHxERYfu5bNmy6tOnj6KiotS1a1fNnDlTR48ezVGPl5eX0tLScq0VgHNyc3QBAJAX/fr1s319Pnv27FzbdO3aVVWqVNG7776rkJAQZWdnq0GDBsrIyLjifr28vPJ0fHd3d7v3FovFNnyhoFx6jItfj+e27OJxU1NT9dhjj9mNb73oSjfHBQQE2MayXhQaGqq9e/fqu+++0+rVqzVkyBC9+uqrWrdunVJTU+Xq6qrNmzfL1dXVbrtSpUpJyvtneC1XO9e8mD9/voYPH65Vq1ZpyZIlGjt2rFavXq2WLVva2pw8eVLly5cvkHoBFA/0zAJwCnfddZcyMjKUmZmpqKioHOv/+usv7d27V2PHjlWHDh1Ut27dHKHNarVKkm0spyT5+vqqatWqio2NLdwTKAS33HKLdu/erZo1a+Z4XTzXyzVt2lSJiYk5PhsvLy917dpVs2bN0tq1axUXF6edO3eqadOmysrK0rFjx3IcIygoSNKFHtUrfX41atSQ1WrVxo0bbcsyMzP1yy+/qF69enk+17p16+YY6/rjjz/men4xMTHatGmTGjRoYDeX7r59+3T27NkcNw4CcG70zAJwCq6urravpS/vIZSkMmXKqFy5cnrnnXcUHBysgwcPasyYMXZtKlSoIC8vL61atUqVKlWSp6en/P39NXHiRA0aNEgVKlRQx44ddfr0aW3cuFGPP/54kZzb9Ro9erRatmypYcOG6dFHH5WPj492796t1atX680338x1m6ZNmyogIEAbN25Uly5dJEkLFixQVlaWwsPD5e3trY8++kheXl6qUqWKypUrp549e6pXr16aNm2amjZtquPHjys2NlaNGjVS586dFRMTo4YNG2rIkCEaNGiQrFar1qxZo/vvv18BAQEaPHiwnn76aZUtW1aVK1fW1KlTlZaWpv79++f5XEeMGKE+ffqoefPmat26tRYuXKjffvtN1atXlyQlJCTonXfe0d13362QkBDt3btXf/75p3r16mXbxw8//KDq1aurRo0aN/CpAyhu6JkF4DT8/Pzk5+eX6zoXFxctXrxYmzdvVoMGDfTkk0/q1VdftWvj5uamWbNm6e2331ZISIi6desmSerdu7dmzJihOXPmqH79+urSpYvtTv3irFGjRlq3bp3++OMPtWnTRk2bNtX48eMVEhJyxW1cXV3Vt29fLVy40LasdOnSevfdd9W6dWs1atRI3333nf7973+rXLlyki58fd+rVy899dRTql27trp3765ffvnFNpShVq1a+vbbb7V9+3a1aNFCERER+vLLL+XmdqG/ZMqUKbr33nv1yCOP6JZbblF8fLy++eYblSlTJs/nGh0drXHjxumZZ55Rs2bNdODAAQ0ePNi23tvbW7///rvuvfde1apVSwMHDtTQoUP12GOP2dp8/PHHGjBgQJ6PCcA5WIz5/zleAAA3hcTERNWvX19btmxRlSpVHF1Okfjtt9/0j3/8Q3/88Yf8/f0dXQ6AAkTPLADcZIKCgvT+++9fdZaHkubo0aP68MMPCbJACUTPLAAAAJwWPbMAAABwWoRZAAAAOC3CLAAAAJwWYRYAAABOizALAAAAp0WYBQAAgNMizAIAAMBpEWYBAADgtAizAAAAcFr/B6Jv956oMwM4AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(8, 5))\n", "\n", "for team, records in cum_xg.grouped(\"team\"):\n", " times = [r[\"time\"] for r in records]\n", " xgs = [r[\"cumulative_xg\"] for r in records]\n", " ax.step(times, xgs, where=\"post\", label=team)\n", "\n", "ax.set_xlabel(\"Match Time (seconds)\")\n", "ax.set_ylabel(\"Cumulative xG\")\n", "ax.set_title(\"Cumulative xG by Team\")\n", "ax.legend()" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "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.13.1" } }, "nbformat": 4, "nbformat_minor": 5 }