{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[![img](..\\ep8_2018-57x57.png)](http://endlesspint.com/)\n", "\n", "# Rafa v Fed, Wimbledon '08 Simulation\n", "\n", "**post @** [endlesspint.com](http://endlesspint.com/2019-06-21-rafa-fed-wimbledon-2008-simulation/)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Player():\n", " def __init__(self, name, fsp_in, fsp_win, ssp_win):\n", " self.name = name\n", " self.fsp_in = fsp_in # first serve percentage in\n", " self.fsp_win = fsp_win # first serve percentage win\n", " self.ssp_win = ssp_win # second serve percentage win" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.73, 0.57)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rafa = Player(\"Rafa\", .73, .69, .59)\n", "fedr = Player(\"Fed\" , .65, .73, .57)\n", "\n", "rafa.fsp_in, fedr.ssp_win" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## notes\n", "\n", "* Fed started off the match serving" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 4, 2)\n", "(1, 4, 1)\n", "(1, 4, 0)\n", "(1, 4, 0)\n", "(1, 4, 0)\n", "(1, 4, 1)\n", "(1, 4, 2)\n", "(0, 4, 6)\n", "(1, 4, 0)\n", "(1, 4, 1)\n" ] } ], "source": [ "def serving_game(serving_player):\n", " \n", " server_score = 0\n", " receiver_score = 0\n", " \n", " score_max = np.max((server_score, receiver_score))\n", " score_min = np.min((server_score, receiver_score))\n", " score_dif = score_max - score_min\n", " \n", " # count:\n", " # first serves in\n", " # first serves win\n", " # second serve wins\n", " # total points/player\n", " # receiving points won\n", " # break points\n", " # faced\n", " # converted\n", " \n", " while score_max < 4 or score_dif < 2:\n", " \n", " if np.random.rand() < serving_player.fsp_in:\n", " if np.random.rand() < serving_player.fsp_win:\n", " server_score += 1\n", " else:\n", " receiver_score += 1\n", " else:\n", " if np.random.rand() < serving_player.ssp_win:\n", " server_score += 1\n", " else:\n", " receiver_score += 1\n", " \n", " score_max = np.max((server_score, receiver_score))\n", " score_min = np.min((server_score, receiver_score))\n", " score_dif = score_max - score_min\n", " \n", " hold_serve = [1 if server_score > receiver_score else 0][0]\n", " \n", " return hold_serve, server_score, receiver_score\n", "\n", "\n", "for i in range(10):\n", " print(serving_game(fedr))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 5, 7)\n", "(1, 3, 7)\n", "(0, 7, 2)\n", "(1, 5, 7)\n", "(1, 5, 7)\n", "(0, 7, 4)\n", "(1, 3, 7)\n", "(0, 7, 3)\n", "(1, 6, 8)\n", "(0, 12, 10)\n" ] } ], "source": [ "def tiebreak(serving_list, serving_cnt):\n", " \n", " orig_serving_turn = serving_cnt % 2\n", " serving_turn = serving_cnt % 2\n", " serving_player = serving_list[serving_turn]\n", " \n", " orig_receiving_turn = 1 - serving_turn\n", " receiving_turn = 1 - serving_turn\n", " \n", " player_score_list = ['p1_tiebreak_score', 'p2_tiebreak_score']\n", " player_score_dict = {'p1_tiebreak_score': 0, 'p2_tiebreak_score': 0}\n", " \n", " \n", " score_max = np.max((player_score_dict['p1_tiebreak_score'], player_score_dict['p2_tiebreak_score']))\n", " score_min = np.min((player_score_dict['p1_tiebreak_score'], player_score_dict['p2_tiebreak_score']))\n", " score_dif = score_max - score_min\n", " \n", " pts_played = np.sum((player_score_dict['p1_tiebreak_score'], player_score_dict['p2_tiebreak_score']))\n", " \n", " while score_max < 7 or score_dif < 2:\n", " \n", " if np.random.rand() < serving_player.fsp_in:\n", " if np.random.rand() < serving_player.fsp_win:\n", " player_score_dict[player_score_list[serving_turn]] += 1\n", " else:\n", " player_score_dict[player_score_list[receiving_turn]] += 1\n", " else:\n", " if np.random.rand() < serving_player.ssp_win:\n", " player_score_dict[player_score_list[serving_turn]] += 1\n", " else:\n", " player_score_dict[player_score_list[receiving_turn]] += 1\n", " \n", " pts_played += 1\n", " \n", " if pts_played % 2 > 0:\n", " serving_turn = 1 - serving_turn\n", " receiving_turn = 1 - serving_turn\n", " \n", " score_max = np.max((player_score_dict['p1_tiebreak_score'], player_score_dict['p2_tiebreak_score']))\n", " score_min = np.min((player_score_dict['p1_tiebreak_score'], player_score_dict['p2_tiebreak_score']))\n", " score_dif = score_max - score_min\n", " \n", " hold_serve = [1 if player_score_dict[player_score_list[orig_serving_turn]] > player_score_dict[player_score_list[orig_receiving_turn]] else 0][0]\n", " \n", " \n", " return hold_serve, player_score_dict['p1_tiebreak_score'], player_score_dict['p2_tiebreak_score']\n", "\n", "\n", "for i in range(10):\n", " print(tiebreak([fedr, rafa], 1))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({'player1_score': 2, 'player2_score': 6}, 8)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def serve_alternating(serving_cnt, serving_list, player_score_list, player_score_dict):\n", " \n", " serving_turn = serving_cnt % 2\n", " serving_player = serving_list[serving_turn]\n", "\n", " serve_held = serving_game(serving_player)[0]\n", " serve_broken = 1 - serve_held\n", "\n", " player_score_dict[player_score_list[serving_turn]] += serve_held\n", " serving_cnt += 1\n", " serving_turn = serving_cnt % 2\n", " player_score_dict[player_score_list[serving_turn]] += serve_broken\n", "\n", " score_max = np.max((player_score_dict['player1_score'], player_score_dict['player2_score']))\n", " score_min = np.min((player_score_dict['player1_score'], player_score_dict['player2_score']))\n", " score_dif = score_max - score_min\n", " \n", " return score_max, score_min, score_dif, serving_cnt\n", "\n", "\n", "\n", "# VALID_SERVING_ORDER = {0, 1}\n", "\n", "def set_(player1, player2, serving_cnt = 0, tiebreaker=True):\n", " \n", "# if serving_order not in VALID_SERVING_ORDER:\n", "# raise ValueError(\"set_: serving_order must be one of %r.\" % VALID_SERVING_ORDER)\n", " \n", " serving_list = [player1, player2]\n", " serving_cnt = serving_cnt\n", " \n", " player_score_list = ['player1_score', 'player2_score']\n", " player_score_dict = {'player1_score': 0, 'player2_score': 0}\n", " \n", " score_max = np.max((player_score_dict['player1_score'], player_score_dict['player2_score']))\n", " score_min = np.min((player_score_dict['player1_score'], player_score_dict['player2_score']))\n", " score_dif = score_max - score_min\n", " \n", " if tiebreaker:\n", " \n", " while score_max < 6:\n", " \n", " score_max, score_min, score_dif, serving_cnt = serve_alternating(serving_cnt, serving_list, player_score_list, player_score_dict) \n", "# print(serving_cnt)\n", " \n", " if score_dif < 2:\n", "\n", " score_max, score_min, score_dif, serving_cnt = serve_alternating(serving_cnt, serving_list, player_score_list, player_score_dict)\n", "# print(serving_cnt)\n", "\n", " if score_max == score_min == 6:\n", " \n", " tiebreak_1st_to_serve = serving_cnt % 2\n", " tiebreak_1st_to_receive = 1 - tiebreak_1st_to_serve\n", " \n", " tiebreak_hold = (tiebreak(serving_list, serving_cnt))[0]\n", " tiebreak_break = 1 - tiebreak_hold\n", " \n", " player_score_dict[player_score_list[tiebreak_1st_to_serve]] += tiebreak_hold\n", " player_score_dict[player_score_list[tiebreak_1st_to_receive]] += tiebreak_break\n", " \n", " serving_cnt += 1\n", " \n", "# print(\"TIEBREAKER!\")\n", "# print(\"Starting the tiebreaker, serving: %s\" % serving_list[tiebreak_1st_to_serve].name)\n", "# print(serving_cnt)\n", " else:\n", " \n", " while score_max < 6 or score_dif < 2:\n", " \n", " score_max, score_min, score_dif, serving_cnt = serve_alternating(serving_cnt, serving_list, player_score_list, player_score_dict)\n", "# print(serving_cnt)\n", " \n", " return player_score_dict, serving_cnt\n", " \n", "set_(fedr, rafa, 0, tiebreaker=True)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({1: 6, 2: 6, 3: 7, 4: 6, 5: 0}, {1: 7, 2: 7, 3: 6, 4: 7, 5: 0})" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "VALID_SERVING_ORDER = {0, 1}\n", "\n", "def match_(player1, player2, best_of = 5, serving_order = 0, final_set_tiebreaker = True, verbose = False): \n", " \n", " if serving_order not in VALID_SERVING_ORDER:\n", " raise ValueError(\"set_: serving_order must be one of %r.\" % VALID_SERVING_ORDER)\n", " \n", " serving_cnt = serving_order\n", " \n", " player1_games = {x:0 for x in range(1, best_of + 1)}\n", " player2_games = {x:0 for x in range(1, best_of + 1)}\n", " \n", " player1_sets = 0\n", " player2_sets = 0\n", " \n", " cur_set = 1\n", " \n", " set_max = np.max((player1_sets, player2_sets))\n", " \n", " while set_max < (best_of // 2) + 1:\n", " \n", " if cur_set == best_of and final_set_tiebreaker == False:\n", " set_outcome = set_(player1, player2, serving_cnt, tiebreaker=False)\n", " set_score, serving_cnt = set_outcome[0], set_outcome[1]\n", " else:\n", " set_outcome = set_(player1, player2, serving_cnt)\n", " set_score, serving_cnt = set_outcome[0], set_outcome[1]\n", " \n", " player1_games[cur_set], player2_games[cur_set] = set_score['player1_score'], set_score['player2_score']\n", "\n", " if player1_games[cur_set] > player2_games[cur_set]:\n", " player1_sets += 1\n", " else:\n", " player2_sets += 1\n", " \n", " set_max = np.max((player1_sets, player2_sets))\n", "\n", " cur_set += 1\n", " \n", " if verbose:\n", " if player1_sets > player2_sets:\n", " return player1_games, player2_games, player1.name, cur_set - 1\n", " else:\n", " return player1_games, player2_games, player2.name, cur_set - 1\n", " \n", " return player1_games, player2_games\n", "\n", "match_(fedr, rafa, final_set_tiebreaker=False)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "({1: 4, 2: 7, 3: 7, 4: 6, 5: 0}, {1: 6, 2: 6, 3: 5, 4: 3, 5: 0}, 'Fed', 4)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "match_temp = match_(fedr, rafa, final_set_tiebreaker=False, verbose=True)\n", "match_temp" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
12345
047760
166530
\n", "
" ], "text/plain": [ " 1 2 3 4 5\n", "0 4 7 7 6 0\n", "1 6 6 5 3 0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame([match_temp[0], match_temp[1]])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('Fed', 4)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "match_temp[2:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's run it back, several thousand times" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "np.random.seed(8)\n", "\n", "match_list = []\n", "\n", "for i in range(10000):\n", " match_list.append(match_(fedr, rafa, final_set_tiebreaker=False, verbose=True))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([({1: 7, 2: 6, 3: 3, 4: 6, 5: 0}, {1: 6, 2: 4, 3: 6, 4: 3, 5: 0}, 'Fed', 4),\n", " ({1: 5, 2: 7, 3: 6, 4: 6, 5: 0}, {1: 7, 2: 6, 3: 2, 4: 2, 5: 0}, 'Fed', 4),\n", " ({1: 6, 2: 7, 3: 7, 4: 0, 5: 0}, {1: 3, 2: 5, 3: 6, 4: 0, 5: 0}, 'Fed', 3),\n", " ({1: 6, 2: 7, 3: 7, 4: 6, 5: 6}, {1: 7, 2: 6, 3: 6, 4: 7, 5: 4}, 'Fed', 5),\n", " ({1: 4, 2: 4, 3: 4, 4: 0, 5: 0}, {1: 6, 2: 6, 3: 6, 4: 0, 5: 0}, 'Rafa', 3),\n", " ({1: 6, 2: 6, 3: 7, 4: 0, 5: 0}, {1: 3, 2: 4, 3: 5, 4: 0, 5: 0}, 'Fed', 3),\n", " ({1: 7, 2: 6, 3: 6, 4: 0, 5: 0}, {1: 6, 2: 4, 3: 4, 4: 0, 5: 0}, 'Fed', 3),\n", " ({1: 6, 2: 7, 3: 6, 4: 0, 5: 0}, {1: 3, 2: 5, 3: 4, 4: 0, 5: 0}, 'Fed', 3),\n", " ({1: 6, 2: 6, 3: 6, 4: 0, 5: 0}, {1: 3, 2: 4, 3: 4, 4: 0, 5: 0}, 'Fed', 3),\n", " ({1: 6, 2: 2, 3: 4, 4: 6, 5: 8}, {1: 4, 2: 6, 3: 6, 4: 4, 5: 6}, 'Fed', 5)],\n", " [({1: 6, 2: 6, 3: 6, 4: 6, 5: 6}, {1: 3, 2: 4, 3: 7, 4: 7, 5: 4}, 'Fed', 5),\n", " ({1: 6, 2: 7, 3: 7, 4: 0, 5: 0}, {1: 2, 2: 6, 3: 6, 4: 0, 5: 0}, 'Fed', 3),\n", " ({1: 6, 2: 3, 3: 6, 4: 0, 5: 0}, {1: 7, 2: 6, 3: 7, 4: 0, 5: 0}, 'Rafa', 3),\n", " ({1: 6, 2: 6, 3: 4, 4: 3, 5: 0}, {1: 7, 2: 4, 3: 6, 4: 6, 5: 0}, 'Rafa', 4),\n", " ({1: 7, 2: 4, 3: 7, 4: 6, 5: 0}, {1: 6, 2: 6, 3: 5, 4: 4, 5: 0}, 'Fed', 4),\n", " ({1: 3, 2: 6, 3: 4, 4: 0, 5: 0}, {1: 6, 2: 7, 3: 6, 4: 0, 5: 0}, 'Rafa', 3),\n", " ({1: 4, 2: 2, 3: 6, 4: 0, 5: 0}, {1: 6, 2: 6, 3: 7, 4: 0, 5: 0}, 'Rafa', 3),\n", " ({1: 4, 2: 6, 3: 6, 4: 4, 5: 0}, {1: 6, 2: 4, 3: 7, 4: 6, 5: 0}, 'Rafa', 4),\n", " ({1: 4, 2: 4, 3: 6, 4: 0, 5: 0}, {1: 6, 2: 6, 3: 7, 4: 0, 5: 0}, 'Rafa', 3),\n", " ({1: 7, 2: 3, 3: 4, 4: 7, 5: 3}, {1: 6, 2: 6, 3: 6, 4: 6, 5: 6}, 'Rafa', 5)])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "match_list[:10], match_list[-10:]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01234
fedr47760
rafa66530
\n", "
" ], "text/plain": [ " 0 1 2 3 4\n", "fedr 4 7 7 6 0\n", "rafa 6 6 5 3 0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# match_temp = match_(fedr, rafa, final_set_tiebreaker=False)\n", "pd.DataFrame.from_dict({'fedr': list(match_temp[0].values()), 'rafa': list(match_temp[1].values())}, orient='index')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fedr_gamesrafa_gameswinnersets_needed
0{1: 7, 2: 6, 3: 3, 4: 6, 5: 0}{1: 6, 2: 4, 3: 6, 4: 3, 5: 0}Fed4
1{1: 5, 2: 7, 3: 6, 4: 6, 5: 0}{1: 7, 2: 6, 3: 2, 4: 2, 5: 0}Fed4
2{1: 6, 2: 7, 3: 7, 4: 0, 5: 0}{1: 3, 2: 5, 3: 6, 4: 0, 5: 0}Fed3
3{1: 6, 2: 7, 3: 7, 4: 6, 5: 6}{1: 7, 2: 6, 3: 6, 4: 7, 5: 4}Fed5
4{1: 4, 2: 4, 3: 4, 4: 0, 5: 0}{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}Rafa3
\n", "
" ], "text/plain": [ " fedr_games rafa_games winner \\\n", "0 {1: 7, 2: 6, 3: 3, 4: 6, 5: 0} {1: 6, 2: 4, 3: 6, 4: 3, 5: 0} Fed \n", "1 {1: 5, 2: 7, 3: 6, 4: 6, 5: 0} {1: 7, 2: 6, 3: 2, 4: 2, 5: 0} Fed \n", "2 {1: 6, 2: 7, 3: 7, 4: 0, 5: 0} {1: 3, 2: 5, 3: 6, 4: 0, 5: 0} Fed \n", "3 {1: 6, 2: 7, 3: 7, 4: 6, 5: 6} {1: 7, 2: 6, 3: 6, 4: 7, 5: 4} Fed \n", "4 {1: 4, 2: 4, 3: 4, 4: 0, 5: 0} {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} Rafa \n", "\n", " sets_needed \n", "0 4 \n", "1 4 \n", "2 3 \n", "3 5 \n", "4 3 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list = pd.DataFrame(match_list)\n", "df_match_list.columns = ['fedr_games', 'rafa_games', 'winner', 'sets_needed']\n", "\n", "df_match_list.head(5)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Fed 5533\n", "Rafa 4467\n", "Name: winner, dtype: int64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list.winner.value_counts()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 1, 1, ..., 0, 1, 0],\n", " [1, 0, 1, ..., 1, 0, 1],\n", " [1, 0, 1, ..., 1, 1, 0],\n", " ...,\n", " [1, 0, 0, ..., 1, 0, 0],\n", " [1, 0, 1, ..., 1, 1, 0],\n", " [0, 1, 1, ..., 0, 0, 0]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array(df_match_list.winner == 'Fed').astype(int).reshape(100,100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vis all 10k results" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns; sns.set()\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArgAAAKmCAYAAACmHO3EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3LGO5EiSLdCIh6wCnl7Sllb/sV8//9FajtT6ANkJxBNWGOFVMCdsLawvLc5REyQ9SHenFVF2r7fb7QIAAFv8n797AAAA0EmBCwDAKgpcAABWUeACALCKAhcAgFUUuAAArKLABQBgFQUuAACrKHABAFhFgQsAwCoKXAAAVnmrHPTXn3/cugfyO//3v/777t/+9c9/TAzhS/fGeDS+o9/VrXKfuu97+nN8xvgq86LzOl+ZfI5T96Lb5L2t6t5L7o29+9lXxvCVs86zI+nvim7da+4Z9y9hjUxKeFdcLpfL58f79dFx+IILAMAqClwAAFZR4AIAsIoCFwCAVRS4AACsosAFAGCV6+32eOLXvZiwyRihV4yecq3/nVeLkpmM7pp6VlWTcVXd4zjSPc+mpIxval0943zd8U0Vk/FXKfNiam9KWKeXS86c/vbjl5gwAABemwIXAIBVFLgAAKyiwAUAYBUFLgAAq7z93QO4XGa726e6x1O60buvldDZOdnF3K16rck10q0y9kqn7WTHecqcSU+g6Z6fZ5jvj5pMVpk0meJSUb1/3WuucwxH40iZL9X79Pnx/vC1fMEFAGAVBS4AAKsocAEAWEWBCwDAKgpcAABWUeACALDK9Xa7PXzQX3/+8duDqjEUCdFT3WM/Q2RRQsRQd3RJSoRYelzZPSkRUpPRWBXpMVwJc+lIwj366lrda3jyWSXs7d1S3j1T9yLleaSM49uPX9dHj/EFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWKWUovD2/efjBx1ISRXovFZ6h+blktGBPdndXpGehpF+vuq1Kl4x/SP9GVe82vjSf++kMyerVHnG/5nPj3cpCgAAvDYFLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsMpYTFh6fEp3rFd6/FVVQjxS9V50R8lMxktNrZ/J6JzuCJ+UNVKREj01FbeUEkU4+bsSYqkmxze5t09KeC9VzleVskbEhAEA8PIUuAAArKLABQBgFQUuAACrKHABAFjlbepCk4kI1XHck9AN+oz7N9X9nJ5Q8X//679P0b37O+nd8kcSusovl9l0jfQkj8r5uufMZNLIpMp+1r23p6fCpJyvcq0jCWt48l4cXWuyFvQFl5eX/mIEAB6jwAUAYBUFLgAAqyhwAQBYRYELAMAqClwAAFa53m63hw96+/7ztwdNRt1UTcV6TUqIIPnquMr5KtJjcKrXmowYuufM97YyjmdEpk3FIx1J2C9S4psqJvfHIwkxgAnv7iPPGF96DTF5nyajHj8/3q+PHuMLLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsMpb5aCpju705IUj3V2JR+dL6d6szIvJ5IDJjs/KGCbHntKR3Kl6byu/q/teTO4XndepXiuluz1hHUx2sKfsP93XSUhxmXy/pO/FRybH7gsuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwigIXAIBVSjFh3RIikFIizhLizyZjayqq40uPquuOTON5tsYtTXnG+BLiKyuescdMRZlNxnpV1tXkuzY9umtyX3rGtT4/3h8+xhdcAABWUeACALCKAhcAgFUUuAAArKLABQBglevtdnv4oLfvP397UEqX3pHKOBJ+12S3akqiRPezmlTp6p1MbODfutNEKtc6kvDsU/bvI1Nrrns/27onTN7bzjE8Q0JCzjNqpqk1crlcLp8f79e7f7zDF1wAAFZR4AIAsIoCFwCAVRS4AACsosAFAGAVBS4AAKu0xoQdmYzaqkiPXKlKiCepOnN8Svc4EuLtuu/TmddcSvxQt6m1f/bIooqEiMXJSLKENTL5Luv+TZPPI8XR7/r245eYMAAAXpsCFwCAVRS4AACsosAFAGAVBS4AAKu0pig8ozMyoRu0W8r4urvbJzvzO8eQorsruqJ6/9I7iM8soZt6a9JI9VqdXnGup797Es5XvdZW61IUzlysAADw94gucAEA4FEKXAAAVlHgAgCwigIXAIBVFLgAAKxSign7688/fntQNe6kOwqsW3qcSEpkyNS9SPm9k6ZidVKi/rrPV9mbJiPTUqKiEuLoUiLJKtLfWSlzOl3CO+YMz2ryPq2LCQMAgEcpcAEAWEWBCwDAKgpcAABWUeACALDKW+fJJjttqxK6S7uvk9KB/WqdthUp8yyhK777XlTPl57WkbK+KxLubUq6RrfKPZxMqDhzN3/CvKjO2+41l5DicrlcLp8f7w+fzxdcAABWUeACALCKAhcAgFUUuAAArKLABQBgFQUuAACrXG+328MHvX3/+duDJqOsquebivLYGncy+awquuNsJp9jQszMMyJhKtdKmDOT82JyP0uIb0rfv4+udeb3XMrYO69THUN3ZNrkOp2Mqkt5Jt9+/Lo+ei1fcAEAWEWBCwDAKgpcAABWUeACALCKAhcAgFXeKgc9o9P6nsluwXsqv7e7A7LaeTg59nvHpXTLJ4+heq2E9XG5zI4joUP8SMJ+kd4hXpWSDNLpGfevew7e053y0L1Ou9dB9ZiEOfhqddvlEv4FN+UmAQBwHtEFLgAAPEqBCwDAKgpcAABWUeACALCKAhcAgFVKMWEV6REf3VIiQyrj6I5+6Va9TkIMTkocVMK9OJKyRu5JiP050r3/pKyD7vueEktVkbC3J0TsHUmJYNu6t1eOmazPfMEFAGAVBS4AAKsocAEAWEWBCwDAKgpcAABWaU1RSEkOqEjvBn3G/Uvo9O/uqOxO3uju9u5OgJg8X8q9ePQ6zzrunlfbB1Oe4z0JqTqXS0aiREpnfkXKPKs8x4337wx8weXlveLCB4DNFLgAAKyiwAUAYBUFLgAAqyhwAQBYRYELAMAqpZiwSkzG5PkmIzm6r5UQJ1LVHT2VoDs2K2WN3HPmOLoUkzF7leskRLpVTe6dCe+llNjDblPviu51UL3W5D49+ewnY0M/P94fvpYvuAAArKLABQBgFQUuAACrKHABAFhFgQsAwCrX2+328EF//fnHbw86cxJB9VqTpn5XtcsxYXzd1zqSnnjR/RwnEyVS1ly3hKSRhGf/1XFTptb90bVe7f5VJfzeqjM/x4S0oMvlcvn8eL8+ej5fcE8iYRFstbWYqjDPmGCeAc+mwAUAYBUFLgAAqyhwAQBYRYELAMAqClwAAFZ56zzZGTpjEzrmU2LMKpFAk6bi46oxPd3XOpLwTNLjjLpjx7bGmHX/rq33IkHK+Kai/lL2mO5rJURtPePdkx7x6gsuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwyvV2uz180Nv3n3cP6u6qO1JJAUjv+psce8VkCkB6B3G3ya79lHk7+bsSuv27u6lT9qaKlPV9T8J8uVx2pt1UTaU5HEm5VkXCvajev8+P9+t/PrL/0foFd3Kip2+O3c78e1M24oozjz1dwmabwouR30m/TwnFbfcxVelr5Mz3osp/UQAAYBUFLgAAqyhwAQBYRYELAMAqClwAAFZpjwnr9IxIqqmuz5Quwu4YjyMJcVrd0uOvUiLxEuKq0jvOL5fzzotuz9gruuO0ps5XldC1nxJrmXBvu9+bKVGO3deq+ttjwgAA4O+mwAUAYBUFLgAAqyhwAQBYRYELAMAqClwAAFZ5qxx05jiW7viPqTiRlLiqI1vjhzqvNRklMxkLk7BGjkxGKlXue/f6To8sOlK9t1N7+5ljCtP3nzO/y85Q/9yTUl90ry1fcAEAWEWBCwDAKgpcAABWUeACALCKAhcAgFWut9vt4YPevv98/KAQ3V3M95yhozKhu73bZKdtt5QO4ikp3bkb10FVQnJAVcIaOUPCwrYxTEtIYqpea8oz5sW3H7+ujx7jCy4AAKsocAEAWEWBCwDAKgpcAABWUeACALCKAhcAgFXepi6UHoFUja7oHvvkvahEklXiP54RcdZ5TNXks0+4t1VTc7q6x3Tf28nYsUqsV0okYsXR+LbGI02ZjL9K2M/O/Kwqqr+3clzK/fMFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWOV6u90ePujt+8/HDzqQ0NE92XV8pDK+SQmdtpO6u3q7O1m700lS0kSOJHRgH0m4F1Xp+0/FM7rHK+erXOfMKQVbTa2RyXdFdRz3POOd/+3Hr+uj4/AFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWEWBCwDAKq0xYWeIGKrojpLplhCzduTMUTcJz/dymYsdq4xh2tQzOfN+NrnmJtdVQqRb97xIeb+ceb/ovk+TkY1Ta65q8h195PPjXUwYAACvTYELAMAqClwAAFZR4AIAsIoCFwCAVd4qB011tz+jEy+hM/9IZRwp3Zb3bO307+4eT3hW3Z3ARxI6n4+8YlpH9zi6O85TUgXumeyWT+lun7L1906la6S/Gy+X/uflCy4AAKsocAEAWEWBCwDAKgpcAABWUeACALCKAhcAgFVKMWEV3REV3TEUkxEa6VEyVekRbJPS45Yq9zZlDd8zGUdXNfUczxCPdE/KvKic7xnH3ZO+PybMwWfE0XXvnd2RX5NRown11BFfcAEAWEWBCwDAKgpcAABWUeACALCKAhcAgFVaUxRSkgiOJHT6T3YJd58v/fd2d6OndN93m+x+Tb9P3ckl3bq7mLtTGSZTYY6kz7N7npGEMpXYMJlQMdnNP5mu0X2+yTWXUE8d8QWXl5cSaQIA9FDgAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAq7TGhB2ZjGiajBOpxGF0d+13x8Wc+V6kXKuicv+2RsmcIXKwIiFuqWIykmpyTk/Owe5IpZT1c09ChFjC2q5Kj+s8A19wAQBYRYELAMAqClwAAFZR4AIAsIoCFwCAVVpTFCaTDZ6RsFAx1Q1aPV/F5P2b7HJN6MJNv39nSNCYnDMVZ95/uvfiivRklZTUmiOV59g99oS9afLeVsfxas9qcv/2BZeX94rxKQCwmQIXAIBVFLgAAKyiwAUAYBUFLgAAqyhwAQBYpTUmrGoqoulISsRZ5zGXS38kUHfUVnps1pHuKJSt92lqDCnRNN37xZGpe3iGZ3XvnJP7Wbf0CMiEKLAjz9hTE+bFke7xVdbP5LvsiC+4AACsosAFAGAVBS4AAKsocAEAWEWBCwDAKq0pCs/oBO7u7JxKDqhK6FZO6QbtNplecc9kWkdlHGdYw91pHd33oltCR3LKvTiSvkY2StkfO4+pSrkX3TXOpKNxfH68P3y+6C+4NhIAAB4VXeACAMCjFLgAAKyiwAUAYBUFLgAAqyhwAQBYpRQTlh611R1LVJESdzIZ39Stcq3uKJT0JI/JeXukO7YmPX6veq3utT8Z91Yx9Xur0vfAyXvRHc135Mzr+57Jd0Xl91bvUfe8mKwFfcEFAGAVBS4AAKsocAEAWEWBCwDAKgpcAABWud5ut4cP+uvPPx4+KKH79Ui1sy+hiznlXiRI6XDuNpUokf6bLpda5+5kusaZ1889CV3qX5m6t5PPd/K9NJmi0G1yT+hO3pi6t8/4vZPP//Pj/froMb7gAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAqyhwAQBYJSImLCGaKCX2JyV25Z6piJSj41KieCavdeaYvakxHEnZf+4587xIWT/dY9gYpdc9jpSorcp1zvyuTYk2FBMGAACDFLgAAKyiwAUAYBUFLgAAqyhwAQBYJT5Fobt7szKGipTO4vQO8SPp3cpTncDdYzgaR3pXdPVazxjHPWdOPahcJ2G/fYaE3zXZ3S7R5j+7lnfF/+5a1d+1LkUhPcaDHcwzANglusAFAIBHKXABAFhFgQsAwCoKXAAAVlHgAgCwylvloKmu82dEySTEdVTiSZ4Rn5IQg5MQ+ZQe65Qyjslop4QYqZT958jUvJhMGkmY61Xd+3R17FPvuZRnNRVjdmTy3ZhSQ6TXA77gAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAq1xvt9vDB719//nbg57RsZjQHVnxjK7jhASII90d2FPne4b0pJHuLtwjCckBk0kZlXGkrJFHr/PVtRL26er4Ku+elHuRkG4wmdIzuSe82v7YPYbqtb79+HV99JjoL7iTL550CS8K9jPPANggusAFAIBHKXABAFhFgQsAwCoKXAAAVlHgAgCwytvUhRKiK47G0X2tlG707nikyu+ajGjqjrOpPsf0OKipeKkjUlL+LWGdVp157ClxapXzVZzhvXRPd3TXZHxct/Q4ume88z8/3h8+xhdcAABWUeACALCKAhcAgFUUuAAArKLABQBglevtdnv4oL/+/OPuQQmdoimmui27O+mnx3FPQjfoke5O28lUgcku4al58Yz7V7lWd4f4ke7xvdoarjjDb0p4p6akFEztxc/YH6fWd8J8+cq3H7+ujx7T+gVX7M+/uRfn4Vn9m3vxb2fY9GGT7v3nzPtZ+geoM/BfFAAAWEWBCwDAKgpcAABWUeACALCKAhcAgFXeOk+WEuOR3v08GUEyGYWSEFmUEv1SGcOZ521l7JO/tzIvql3HCfPsSEoEUkX3PEvvLK+OPWEOJsQoPmNdTcYAVqRfq/qMPz/eH76WL7gAAKyiwAUAYBUFLgAAqyhwAQBYRYELAMAqClwAAFa53m63hw/6688/fntQNZ5iMl4qPYrpnmf8pkpUS4KU2LEjCZE2lfs0Oc8mnTmGa/I5JuwJ3e+R6XHcU3lWKdeaHHtFwvhS9sf098iRo7F/+/Hr+uj5fMEFAGAVBS4AAKsocAEAWEWBCwDAKgpcAABWees8mS7Cv+d8Vd1jnxpDd1JCdRyTz3Gqu/0Z97b7WukpH5NzqXteTI39DKkwk2PvPt9Uistk+ke39DqhexzPGENCWtARX3B5eekFEwDwGAUuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwSmtMWFVCF/tkPMmRhIiPo2tNRqskqI6vcm8r1+q+f91xVUfHnfnZJ+xZl0t+rNfkfnbmsXc765rrlh6zVrX1PXw0js+P94fP5wsuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwyvV2uz180Nv3nw8f1N2tmtLh3N1pm3AvJruOJ5/jZGfs1L1IuX8J10ofX/V8CVLWcMUrpigk7D8VKfc2fT1WdCf4fHXObt9+/Lo+eowvuAAArKLABQBgFQUuAACrKHABAFhFgQsAwCoKXAAAVmmNCXvFKJnu803Gk3THLXXHcE3Fej3jnk/d28kYs25bo7bOHEnWHQeVsMd0O0PUX0J8V0psX0XCe6lqcm+fXI+fH+9iwgAAeG0KXAAAVlHgAgCwigIXAIBVFLgAAKxSSlH4688/fntQeidj9VoV3V3HKdealJDKUL1WuvS1mn5vz7zm0tdBytyc+l1n3rMSEj6OjktIL0gaxz0paTxHY5eiAADAy1PgAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAq7x1niw9LuZyuT/G7tifZ8RkPDqGqu6olhSVZ58Q63S59M+L9HuRHhHXLT0Oqlv687hcMtZc9Vrdup/X1HyfrCGOVPbVlDUyOY7uOe0LLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsEopRSGlu6/i3tirHdhTqQfP6BCvJECcudu7u5N1qpv2SHq3/OWSP8b09JfKeuzeE6p74OSzn9pXU/bHyc78qefY/Xur1+o2Ob7KvK2OozKfJvcLX3B5eekFGADwGAUuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwSikmrDseqfM61WtVoysmIzm6z5ce+dU9Z7qjc46cOUqvW/ca6Z4X3XFQk5FACQkg6RFNVVPRgc8w+b6tjCFhzqREpk29KyZ/b8r7zxdcAABWUeACALCKAhcAgFUUuAAArKLABQBglVKKQrfJ7vZHx/DVOKbGXkkHeIaEDtJnJE1MJW+kdJd2j6P7/iWojm+yy34qUWJyDNVrTe2DKck0CakHk/tId/JCyjpNT6WqSEkT8QWXl5deaAEAj1HgAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAq7TGhFWjMCajVbqlx3Uc6Y5+SYgsqnjG87g39pTYmqlomu4xHEkZ39E4puZFZQxfjWNKSqpJ5VlVnuMz5tk9KVFR3eugIuHdM+kZ9VnCfnHEF1wAAFZR4AIAsIoCFwCAVRS4AACsosAFAGCVUopCdzfoZDdjQmdsd1d01b1rdT/H6tgr50vvzD+zlI7Z7v2ncwxfjWNqPzty5u72bt17cfU9UtGdhFI5X0r3/WQqzOQ7+tExpHjG/vj58f7wOKK/4CouAAB4VHSBCwAAj1LgAgCwigIXAIBVFLgAAKyiwAUAYJXr7XZ7+KC37z8fP+hAQuRFd6xFetTN9Djumby33eObvFZ6HF36GjkyOS8qYxCB9DwJv+sZ+3fCfnHmPaEiJQ4zYT87Uv1d3378uj56LV9wAQBYRYELAMAqClwAAFZR4AIAsIoCFwCAVd6mLtTdvXkk/XyVax1dZ/LeHknowE7vHk/pEp7stJ1KAZgcX9VZk0HSu/mr15pMw0hIDpjczyb3/Undczoh8eLI5LW6RX/BTSkG2M08A4BdogtcAAB4lAIXAIBVFLgAAKyiwAUAYBUFLgAAq1xvt9vDB719//nbg1K60ROiUFLiU1KeSafuKLBnmIxH6vSMMUxGfnWO4cjk+p6KWavqvhcJ6/TIGfbUqTi69Pi4Z6yD9EjJlLVfcTT2z4/366Pn8wUXAIBVFLgAAKyiwAUAYBUFLgAAqyhwAQBY5a1yUHdXb3cnXkKHc3enf/X+JXQJdz/7Zzzf9DSMisp9P8PvTZjTVVN7Z0paR2U/m9zrKib39sr5vvrbRlMpD0cS5ubROJ4xz9Lfm77g8vJSCjcAoIcCFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWOV6u90ePuivP//47UHd8TOTcTbdJseeEkl2zzPiSSrXmpwzZ42ZecY9SojmS5m3U3FGKdGBZ450m5q3z5C+/6S8AzulRPNVxnBkci85Ot/nx/v10Wv5ggsAwCoKXAAAVlHgAgCwigIXAIBVFLgAAKzSmqJwJCVVIKEzv3K+6hgSrnXmju6qyr2tnO9IyprrHkNCZ/6Zu8q3dssn7GcVW/eEbin72Vnf+WdY91IUAADggAIXAIBVFLgAAKyiwAUAYBUFLgAAqyhwAQBYpTUm7MyxFlVnjlapSInIqeiOYzmSEGXV7dXm0jP2n6k5eOZorO41lzLPuqMDJyVEWXWbXHMV6fO2es7q7/r245eYMAAAXpsCFwCAVRS4AACsosAFAGAVBS4AAKuUUhTevv98/KADKV16lTFMdlt2d+GeuVO0uws3YZ4d6R7fM7rYpyR0YE+afPbpJjvzJ9N9phIWJt+1CQk5R+N4tTqheq2EOuFyuVw+P953pSiceSPutvXlXdE9L8yzfzPPYJY19zz29tcWXeACAMCjFLgAAKyiwAUAYBUFLgAAqyhwAQBY5W3qQpVO0ZQIkm7dXbOTMTgJMT1nVo1jqcQITUaBVa41GU2TcL5J6c++er6KyTU3+c5Kj/xKePbPMBU7dubIy5TazRdcAABWUeACALCKAhcAgFUUuAAArKLABQBgFQUuAACrlGLCKvEp3aoxFAljP1KJIJmM1TnSfW+nopieEcdy75wp0S+TUTJTa6t7T3jGmpuK46mO79Wi/ibXcOcYnnGtIwmRad1Ro0cSIgLT187lMht9V+ELLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsMr1drs9fNDb958PH3TmbtDO63xlMkUh4ZlUfldKZ2xKakinM3Tu3nOGTv/0pJGEFIWpuX65ePb/qYR0n8lrdet+z6W8yyZriM+P9+uj5/MFl5c3+aIAAJ5PgQsAwCoKXAAAVlHgAgCwigIXAIBVFLgAAKzyVjkoIV7qSGV8kxEklfNVY0ESYnCOVH5X9V5Mja9qcl50HvOV7uipR6/zlYSIuJR70e3VEkrS11z3OFLiqjrHUJVQJ1TPl1JDdPMFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWKWUolAx2S2fYLKju3q+qY7Vyc7YlPuerpJskJJScO981bFX7kV6d3ZKV3TC2k95jvdMvudS5m1C4k636pqbqn+6x3d0XMr+4wsuLy/hJQcA9FHgAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAq4zFhKXEk9xz5iiZI92/azL2pzKGlFidSnxK9/kqz6o7LqY6joQ4qGesubNGWVV1RyAlRE91694TqufsXqeVa6XEZKbEXFXGMLlfpLxv7/EFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWOV6u90ePujt+8/HDypI6R6e6gKvnq9qqtP/SHfH+ZGEBIiqhLFPdu6mXKsyhpQO53sS5tKRyS717v0n/dkfSXgvTSYbpD/HlHXQrfq7Pj/er48e4wsuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwigIXAIBVxmLCumOJJqXEk3Sf795x1fueHoNzz5njWBLibL4ax5SUdXAkIZ5t8nyV60zuP5PRWN2xY90mIxsrUqIDK/vF5DpNeFZHqr/r249fYsIAAHhtClwAAFZR4AIAsIoCFwCAVRS4AACs8tZ5ssl0gCPdnafdHZUJXcxHup9jd1d09/n+9c9/jM7PTilrJGHeTkp49lUJHdgp6R+VezH5fjkyueYmn39lDN3n2zrf75mcF5O/1xdcXt6ZCy0A4P+nwAUAYBUFLgAAqyhwAQBYRYELAMAqClwAAFYpxYR1xzfdMxmtMRlBMtm1nxBB0q16b6cikL4axz0pc6Zbwr1Ij7PpdubYn8l9fzKysfu9edZowyPVdZ8Q13mkO5pvcp6dOY7OF1wAAFZR4AIAsIoCFwCAVRS4AACsosAFAGCVUorCZDd6t0qH4WQX4aTu55jwmyfnYMLvrdLR/bXqntC9lyR0dFek+lTWAAAKrElEQVTPVzGZlPCM4x6Vsg4m006mnvEz3mUJ8z1hH6mqzpnPj/eHr+ULLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsIoCFwCAVUoxYd0RQ1Pnqx4zGfszGT2VEDVS+b2T82JjFFj1mITYn+q1Kuer/qap8X11XOcxKfOionvs3c/qDPe2+x19z+Q6OJLwjp68Fwnr9HLpH4cvuAAArKLABQBgFQUuAACrKHABAFhFgQsAwCqlFIXubtB7/vXPf7R3CSd0C6Z05lee4+T5Ks489oR5kb52jkx2t0+a7IpOmINHEhJt0lMZvjqu81opa6T73lauVZVQ40zOpeo4Pj/eHz5f9Bfc9M2WHcwzANglusAFAIBHKXABAFhFgQsAwCoKXAAAVlHgAgCwSikmbDKSo/t8k5E7Fd0RH5VrpZyvYjI+ZVL6vT2SEiV0T8KaS4meqkh5vt17+9TvekZc1dS9SI+XesYz7L5WQuxYyhru5gsuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwyvV2uz180Nv3n789KKVjcbLreKpjMaWDfbI7m3+bWgeT0tM6npHUMtWNnpImkpDyUDXVmf+Me5Hw3qzYup+duYaoeMbz+Pbj1/XRY6K/4KZENAEAcB7RBS4AADxKgQsAwCoKXAAAVlHgAgCwigIXAIBV3ioHJURyHKmMrzvG40glTiQlsqhyrcnol6nIlelxnDVe6khCdE5VdyRQyr1Iv+8JJuOgXk3C++Cra1XOmVBDHJmMvqv6/Hh/+BhfcAEAWEWBCwDAKgpcAABWUeACALCKAhcAgFWut9vt4YPevv98+KAzdDhPjaFiMomgqtIhXjnfpJT7PpVQ8Yyu43vSkwiqJsee0P185mc1afJZTaWudJvcf1J0vzcfvc5X10pZj58f79dHj/EFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWEWBCwDAKm+Vg7ojhu45Q2RIQjTWZMTH0bWm5kVKpNKR7nmRcG+36o44mzQVwzW55rr3zvS9+BlrLj166sy650XC/pMSIdY9Z3zBBQBgFQUuAACrKHABAFhFgQsAwCoKXAAAVrnebreHD3r7/vPhgyY78SrjSBjDkTN0OXZ3dHc/q4TO8skx8G/d82yyG/1IwvNP76Tvvrcp8yKh+/4MiRdTczDhXTute40cHff58X79z0f2P3zB5eWlbBYA9En4BxZ/HwUuAACrKHABAFhFgQsAwCoKXAAAVlHgAgCwSmtMWHpEytE5U7otp6K2qtLjlrqlx8dVvdo8q3jG85iKR0qYS0eeEYE0Fb945ki3bmfe26sS9pnJSMmE33u5XC7ffvwSEwYAwGtT4AIAsIoCFwCAVRS4AACsosAFAGCVUorCX3/+8duDqh2VCZ356R3iXx1XOV+CyQ7s9M7yI1OdtkfXmkyUONK9J0wmEUxd68z7Y1V3Msg96b/3cplbI0fS19yRhPX4jP32zGt/XYpCykaSIKW4YDdrDtjCe/PfXnFvjy5wAQDgUQpcAABWUeACALCKAhcAgFUUuAAArNIaE1Y12ek4Fclxho7FhPiUSd0xQt0xOAnrYFJK/Mw9zxjf1D6Tvp9NRiCdIQJy6lqT8XGT0uOvJmPCEsb+DOtiwgAA4FEKXAAAVlHgAgCwigIXAIBVFLgAAKyiwAUAYJVSTNjb95+/PegZcUuV81Wkj30yjmMyGquiOz4lJQ5qMuomITLtyNaom3tSIosqY0i5t937z9R9mowOTJhLR7rn2RmitioS1tWRZ6y5z493MWEAALw2BS4AAKsocAEAWEWBCwDAKgpcAABWeasc1N2NntDV293leCSha/tymevsTOlkPbrOvTFOzovua02OvaK70zYleSHhvnePPWVv75Ywvmfsj1NzcPJZVa5VvUfdySApiTYV6c/4iC+4vLyEggQA6KPABQBgFQUuAACrKHABAFhFgQsAwCoKXAAAVinFhN1zhliLs0YMPSMSpvKbJ+NTOo+5XPLTEtLnbbfqXJqMj7tncj+rmIyQ2nq+hP1xUnpUZkKk25H0/ewZUX/dkbHdfMEFAGAVBS4AAKsocAEAWEWBCwDAKgpcAABWud5ut4cPevv+8+GDEjrEq9fq7iI8ktD1KVHif3++zjE8Yxzp3a8V3WN/xr1IeI6d16lKWVdHErr2U+b05Du6YuOzOoOpeupyuVy+/fh1/c9H9j98weXlbd18AOBVKXABAFhFgQsAwCoKXAAAVlHgAgCwigIXAIBV3ioHTUVjPSN2Y6pj/szRNEcqz2RyfN3ROd3jOLpW+rM/kj72lPElxLMlzJmUqL+EOZgShzk1hiMp7/Xu91x31OiZY/uOHI3j8+P94fP5ggsAwCoKXAAAVlHgAgCwigIXAIBVFLgAAKxSSlG45xmdsd0q3aXdnfnpHZDV8011zXZ3Wf/rn/+ImZ/3dHfadv/ehM78IynpGvd0p65sTXFJn2cVk/Ns8l1R2X8m97Pud/6klHWanvDiCy4vL724BQAeo8AFAGAVBS4AAKsocAEAWEWBCwDAKgpcAABWud5ut4cPevv+87cHVWM80iM5jkzF9Ezeo5RnNXUvzhAHlSBlXlSkjz1lDqbED3VKv7cJe+pX45iKFUyJCauMIyWNZ/L9ODl3v/34dX30GF9wAQBYRYELAMAqClwAAFZR4AIAsIoCFwCAVd7+7gFcLrXu0snOvu5rpXRbVsaR0lHZ6V///EdE93hKt3fnMZdLRtJIegd297VS9s6K6jpIH3tC9/3kPUrYH6tjSEgaqc6L7v12cuzdc8YXXF5eyj84AIAeClwAAFZR4AIAsIoCFwCAVRS4AACsosAFAGCV6+12e/igv/784+GDuuNTJmNwurvsu8fQfS+6rzUZTXPmCKTJe5vwrKoS1mPV1HM8kh77k7JGpjxjz5q6F68Y1zk5pzulPKuqz4/366PH+IILAMAqClwAAFZR4AIAsIoCFwCAVRS4AACs8lY5qLtDrtLxmdJpW0ki6LzOV9eqHtd9rYruDvHJ80119SaM4atrnXXNPcNZO7CPdI8hIdXiaByT++2R9HlxZGqtpryvJufFvWulz4nLpX+MvuACALCKAhcAgFUUuAAArKLABQBgFQUuAACrKHABAFjlervdHj7orz//+O1Bk9FYKbojkLolxJWd+V5Ux94dfVcxGZl2pHtepMeBJcQPnTlC6kjCvZicfwlz6avjpqQ8q4T1kx55eaT6TD4/3q+PHuMLLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsMpYisKZu0ETuiarEn5v97N6RjfoVKd/eqfyM3R3P1e65Suese4T5oX97H93rZT0jzM/x3tS0j9SxpEgpa6TogAFWwtLAHhVClwAAFZR4AIAsIoCFwCAVRS4AACsosAFAGCVt8pBCfEp1WslRBZNxox0xw8lxI5N6n6OZ44Kqo49IaXizHPwyGRMT0X3/pgQs/eMsXebilhM38+e8R7urn+6JUTppfAFFwCAVRS4AACsosAFAGAVBS4AAKsocAEAWEWBCwDAKtfb7fZ3jwEAANr4ggsAwCoKXAAAVlHgAgCwigIXAIBVFLgAAKyiwAUAYBUFLgAAqyhwAQBYRYELAMAqClwAAFZR4AIAsIoCFwCAVf4fdrIT+oX8d4AAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12,12))\n", "ax = sns.heatmap(np.array(df_match_list.winner == 'Fed').astype(int).reshape(100,100), cbar=False)\n", "\n", "# Turn off tick labels\n", "ax.set_yticklabels([])\n", "ax.set_xticklabels([])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Profile of wins by set total" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "winner sets_needed\n", "Fed 3 1520\n", " 4 2053\n", " 5 1960\n", "Rafa 3 1076\n", " 4 1682\n", " 5 1709\n", "Name: fedr_games, dtype: int64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list.groupby(['winner', 'sets_needed']).count()['fedr_games']#.plot.bar()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_match_list.pivot_table(index='sets_needed', columns='winner', aggfunc='count')['fedr_games'].plot.bar(figsize=(16,8), title=\"Win Count by Sets Needed\")" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Fed\n", "1 Fed\n", "2 Fed\n", "3 Fed\n", "4 Rafa\n", "Name: winner, dtype: object" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list.winner.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How streaky can 'coin flips' be?" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fedr_gamesrafa_gameswinnersets_neededstreak
0{1: 7, 2: 6, 3: 3, 4: 6, 5: 0}{1: 6, 2: 4, 3: 6, 4: 3, 5: 0}Fed41
1{1: 5, 2: 7, 3: 6, 4: 6, 5: 0}{1: 7, 2: 6, 3: 2, 4: 2, 5: 0}Fed41
2{1: 6, 2: 7, 3: 7, 4: 0, 5: 0}{1: 3, 2: 5, 3: 6, 4: 0, 5: 0}Fed31
3{1: 6, 2: 7, 3: 7, 4: 6, 5: 6}{1: 7, 2: 6, 3: 6, 4: 7, 5: 4}Fed51
4{1: 4, 2: 4, 3: 4, 4: 0, 5: 0}{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}Rafa31
\n", "
" ], "text/plain": [ " fedr_games rafa_games winner \\\n", "0 {1: 7, 2: 6, 3: 3, 4: 6, 5: 0} {1: 6, 2: 4, 3: 6, 4: 3, 5: 0} Fed \n", "1 {1: 5, 2: 7, 3: 6, 4: 6, 5: 0} {1: 7, 2: 6, 3: 2, 4: 2, 5: 0} Fed \n", "2 {1: 6, 2: 7, 3: 7, 4: 0, 5: 0} {1: 3, 2: 5, 3: 6, 4: 0, 5: 0} Fed \n", "3 {1: 6, 2: 7, 3: 7, 4: 6, 5: 6} {1: 7, 2: 6, 3: 6, 4: 7, 5: 4} Fed \n", "4 {1: 4, 2: 4, 3: 4, 4: 0, 5: 0} {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} Rafa \n", "\n", " sets_needed streak \n", "0 4 1 \n", "1 4 1 \n", "2 3 1 \n", "3 5 1 \n", "4 3 1 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list['streak'] = 1\n", "df_match_list.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fedr_gamesrafa_gameswinnersets_neededstreak
0{1: 7, 2: 6, 3: 3, 4: 6, 5: 0}{1: 6, 2: 4, 3: 6, 4: 3, 5: 0}Fed41
1{1: 5, 2: 7, 3: 6, 4: 6, 5: 0}{1: 7, 2: 6, 3: 2, 4: 2, 5: 0}Fed42
2{1: 6, 2: 7, 3: 7, 4: 0, 5: 0}{1: 3, 2: 5, 3: 6, 4: 0, 5: 0}Fed33
3{1: 6, 2: 7, 3: 7, 4: 6, 5: 6}{1: 7, 2: 6, 3: 6, 4: 7, 5: 4}Fed54
4{1: 4, 2: 4, 3: 4, 4: 0, 5: 0}{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}Rafa31
5{1: 6, 2: 6, 3: 7, 4: 0, 5: 0}{1: 3, 2: 4, 3: 5, 4: 0, 5: 0}Fed31
6{1: 7, 2: 6, 3: 6, 4: 0, 5: 0}{1: 6, 2: 4, 3: 4, 4: 0, 5: 0}Fed32
7{1: 6, 2: 7, 3: 6, 4: 0, 5: 0}{1: 3, 2: 5, 3: 4, 4: 0, 5: 0}Fed33
8{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}{1: 3, 2: 4, 3: 4, 4: 0, 5: 0}Fed34
9{1: 6, 2: 2, 3: 4, 4: 6, 5: 8}{1: 4, 2: 6, 3: 6, 4: 4, 5: 6}Fed55
10{1: 7, 2: 3, 3: 4, 4: 7, 5: 3}{1: 6, 2: 6, 3: 6, 4: 6, 5: 6}Rafa51
11{1: 4, 2: 6, 3: 6, 4: 6, 5: 0}{1: 6, 2: 3, 3: 4, 4: 3, 5: 0}Fed41
12{1: 6, 2: 4, 3: 6, 4: 3, 5: 6}{1: 2, 2: 6, 3: 3, 4: 6, 5: 8}Rafa51
13{1: 4, 2: 6, 3: 7, 4: 4, 5: 0}{1: 6, 2: 7, 3: 6, 4: 6, 5: 0}Rafa42
14{1: 6, 2: 6, 3: 6, 4: 4, 5: 3}{1: 3, 2: 3, 3: 7, 4: 6, 5: 6}Rafa53
15{1: 6, 2: 3, 3: 6, 4: 5, 5: 0}{1: 3, 2: 6, 3: 7, 4: 7, 5: 0}Rafa44
16{1: 2, 2: 7, 3: 7, 4: 6, 5: 0}{1: 6, 2: 6, 3: 6, 4: 4, 5: 0}Fed41
17{1: 4, 2: 6, 3: 7, 4: 7, 5: 8}{1: 6, 2: 7, 3: 6, 4: 6, 5: 6}Fed52
18{1: 6, 2: 5, 3: 5, 4: 6, 5: 0}{1: 3, 2: 7, 3: 7, 4: 7, 5: 0}Rafa41
19{1: 6, 2: 6, 3: 6, 4: 6, 5: 0}{1: 3, 2: 4, 3: 7, 4: 2, 5: 0}Fed41
\n", "
" ], "text/plain": [ " fedr_games rafa_games winner \\\n", "0 {1: 7, 2: 6, 3: 3, 4: 6, 5: 0} {1: 6, 2: 4, 3: 6, 4: 3, 5: 0} Fed \n", "1 {1: 5, 2: 7, 3: 6, 4: 6, 5: 0} {1: 7, 2: 6, 3: 2, 4: 2, 5: 0} Fed \n", "2 {1: 6, 2: 7, 3: 7, 4: 0, 5: 0} {1: 3, 2: 5, 3: 6, 4: 0, 5: 0} Fed \n", "3 {1: 6, 2: 7, 3: 7, 4: 6, 5: 6} {1: 7, 2: 6, 3: 6, 4: 7, 5: 4} Fed \n", "4 {1: 4, 2: 4, 3: 4, 4: 0, 5: 0} {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} Rafa \n", "5 {1: 6, 2: 6, 3: 7, 4: 0, 5: 0} {1: 3, 2: 4, 3: 5, 4: 0, 5: 0} Fed \n", "6 {1: 7, 2: 6, 3: 6, 4: 0, 5: 0} {1: 6, 2: 4, 3: 4, 4: 0, 5: 0} Fed \n", "7 {1: 6, 2: 7, 3: 6, 4: 0, 5: 0} {1: 3, 2: 5, 3: 4, 4: 0, 5: 0} Fed \n", "8 {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} {1: 3, 2: 4, 3: 4, 4: 0, 5: 0} Fed \n", "9 {1: 6, 2: 2, 3: 4, 4: 6, 5: 8} {1: 4, 2: 6, 3: 6, 4: 4, 5: 6} Fed \n", "10 {1: 7, 2: 3, 3: 4, 4: 7, 5: 3} {1: 6, 2: 6, 3: 6, 4: 6, 5: 6} Rafa \n", "11 {1: 4, 2: 6, 3: 6, 4: 6, 5: 0} {1: 6, 2: 3, 3: 4, 4: 3, 5: 0} Fed \n", "12 {1: 6, 2: 4, 3: 6, 4: 3, 5: 6} {1: 2, 2: 6, 3: 3, 4: 6, 5: 8} Rafa \n", "13 {1: 4, 2: 6, 3: 7, 4: 4, 5: 0} {1: 6, 2: 7, 3: 6, 4: 6, 5: 0} Rafa \n", "14 {1: 6, 2: 6, 3: 6, 4: 4, 5: 3} {1: 3, 2: 3, 3: 7, 4: 6, 5: 6} Rafa \n", "15 {1: 6, 2: 3, 3: 6, 4: 5, 5: 0} {1: 3, 2: 6, 3: 7, 4: 7, 5: 0} Rafa \n", "16 {1: 2, 2: 7, 3: 7, 4: 6, 5: 0} {1: 6, 2: 6, 3: 6, 4: 4, 5: 0} Fed \n", "17 {1: 4, 2: 6, 3: 7, 4: 7, 5: 8} {1: 6, 2: 7, 3: 6, 4: 6, 5: 6} Fed \n", "18 {1: 6, 2: 5, 3: 5, 4: 6, 5: 0} {1: 3, 2: 7, 3: 7, 4: 7, 5: 0} Rafa \n", "19 {1: 6, 2: 6, 3: 6, 4: 6, 5: 0} {1: 3, 2: 4, 3: 7, 4: 2, 5: 0} Fed \n", "\n", " sets_needed streak \n", "0 4 1 \n", "1 4 2 \n", "2 3 3 \n", "3 5 4 \n", "4 3 1 \n", "5 3 1 \n", "6 3 2 \n", "7 3 3 \n", "8 3 4 \n", "9 5 5 \n", "10 5 1 \n", "11 4 1 \n", "12 5 1 \n", "13 4 2 \n", "14 5 3 \n", "15 4 4 \n", "16 4 1 \n", "17 5 2 \n", "18 4 1 \n", "19 4 1 " ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for i, row in df_match_list.iterrows():\n", " if i != 0:\n", " if row['winner'] == df_match_list.loc[i-1, 'winner']:\n", " df_match_list.loc[i, 'streak'] = df_match_list.loc[i-1, 'streak'] + 1\n", " \n", "df_match_list.head(20)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fedr_gamesrafa_gameswinnersets_neededstreakend_of_streak
0{1: 7, 2: 6, 3: 3, 4: 6, 5: 0}{1: 6, 2: 4, 3: 6, 4: 3, 5: 0}Fed410
1{1: 5, 2: 7, 3: 6, 4: 6, 5: 0}{1: 7, 2: 6, 3: 2, 4: 2, 5: 0}Fed420
2{1: 6, 2: 7, 3: 7, 4: 0, 5: 0}{1: 3, 2: 5, 3: 6, 4: 0, 5: 0}Fed330
3{1: 6, 2: 7, 3: 7, 4: 6, 5: 6}{1: 7, 2: 6, 3: 6, 4: 7, 5: 4}Fed540
4{1: 4, 2: 4, 3: 4, 4: 0, 5: 0}{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}Rafa310
\n", "
" ], "text/plain": [ " fedr_games rafa_games winner \\\n", "0 {1: 7, 2: 6, 3: 3, 4: 6, 5: 0} {1: 6, 2: 4, 3: 6, 4: 3, 5: 0} Fed \n", "1 {1: 5, 2: 7, 3: 6, 4: 6, 5: 0} {1: 7, 2: 6, 3: 2, 4: 2, 5: 0} Fed \n", "2 {1: 6, 2: 7, 3: 7, 4: 0, 5: 0} {1: 3, 2: 5, 3: 6, 4: 0, 5: 0} Fed \n", "3 {1: 6, 2: 7, 3: 7, 4: 6, 5: 6} {1: 7, 2: 6, 3: 6, 4: 7, 5: 4} Fed \n", "4 {1: 4, 2: 4, 3: 4, 4: 0, 5: 0} {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} Rafa \n", "\n", " sets_needed streak end_of_streak \n", "0 4 1 0 \n", "1 4 2 0 \n", "2 3 3 0 \n", "3 5 4 0 \n", "4 3 1 0 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list['end_of_streak'] = 0\n", "df_match_list.head()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fedr_gamesrafa_gameswinnersets_neededstreakend_of_streak
0{1: 7, 2: 6, 3: 3, 4: 6, 5: 0}{1: 6, 2: 4, 3: 6, 4: 3, 5: 0}Fed410
1{1: 5, 2: 7, 3: 6, 4: 6, 5: 0}{1: 7, 2: 6, 3: 2, 4: 2, 5: 0}Fed420
2{1: 6, 2: 7, 3: 7, 4: 0, 5: 0}{1: 3, 2: 5, 3: 6, 4: 0, 5: 0}Fed330
3{1: 6, 2: 7, 3: 7, 4: 6, 5: 6}{1: 7, 2: 6, 3: 6, 4: 7, 5: 4}Fed541
4{1: 4, 2: 4, 3: 4, 4: 0, 5: 0}{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}Rafa311
5{1: 6, 2: 6, 3: 7, 4: 0, 5: 0}{1: 3, 2: 4, 3: 5, 4: 0, 5: 0}Fed310
6{1: 7, 2: 6, 3: 6, 4: 0, 5: 0}{1: 6, 2: 4, 3: 4, 4: 0, 5: 0}Fed320
7{1: 6, 2: 7, 3: 6, 4: 0, 5: 0}{1: 3, 2: 5, 3: 4, 4: 0, 5: 0}Fed330
8{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}{1: 3, 2: 4, 3: 4, 4: 0, 5: 0}Fed340
9{1: 6, 2: 2, 3: 4, 4: 6, 5: 8}{1: 4, 2: 6, 3: 6, 4: 4, 5: 6}Fed551
10{1: 7, 2: 3, 3: 4, 4: 7, 5: 3}{1: 6, 2: 6, 3: 6, 4: 6, 5: 6}Rafa511
11{1: 4, 2: 6, 3: 6, 4: 6, 5: 0}{1: 6, 2: 3, 3: 4, 4: 3, 5: 0}Fed411
12{1: 6, 2: 4, 3: 6, 4: 3, 5: 6}{1: 2, 2: 6, 3: 3, 4: 6, 5: 8}Rafa510
13{1: 4, 2: 6, 3: 7, 4: 4, 5: 0}{1: 6, 2: 7, 3: 6, 4: 6, 5: 0}Rafa420
14{1: 6, 2: 6, 3: 6, 4: 4, 5: 3}{1: 3, 2: 3, 3: 7, 4: 6, 5: 6}Rafa530
15{1: 6, 2: 3, 3: 6, 4: 5, 5: 0}{1: 3, 2: 6, 3: 7, 4: 7, 5: 0}Rafa441
16{1: 2, 2: 7, 3: 7, 4: 6, 5: 0}{1: 6, 2: 6, 3: 6, 4: 4, 5: 0}Fed410
17{1: 4, 2: 6, 3: 7, 4: 7, 5: 8}{1: 6, 2: 7, 3: 6, 4: 6, 5: 6}Fed521
18{1: 6, 2: 5, 3: 5, 4: 6, 5: 0}{1: 3, 2: 7, 3: 7, 4: 7, 5: 0}Rafa411
19{1: 6, 2: 6, 3: 6, 4: 6, 5: 0}{1: 3, 2: 4, 3: 7, 4: 2, 5: 0}Fed410
\n", "
" ], "text/plain": [ " fedr_games rafa_games winner \\\n", "0 {1: 7, 2: 6, 3: 3, 4: 6, 5: 0} {1: 6, 2: 4, 3: 6, 4: 3, 5: 0} Fed \n", "1 {1: 5, 2: 7, 3: 6, 4: 6, 5: 0} {1: 7, 2: 6, 3: 2, 4: 2, 5: 0} Fed \n", "2 {1: 6, 2: 7, 3: 7, 4: 0, 5: 0} {1: 3, 2: 5, 3: 6, 4: 0, 5: 0} Fed \n", "3 {1: 6, 2: 7, 3: 7, 4: 6, 5: 6} {1: 7, 2: 6, 3: 6, 4: 7, 5: 4} Fed \n", "4 {1: 4, 2: 4, 3: 4, 4: 0, 5: 0} {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} Rafa \n", "5 {1: 6, 2: 6, 3: 7, 4: 0, 5: 0} {1: 3, 2: 4, 3: 5, 4: 0, 5: 0} Fed \n", "6 {1: 7, 2: 6, 3: 6, 4: 0, 5: 0} {1: 6, 2: 4, 3: 4, 4: 0, 5: 0} Fed \n", "7 {1: 6, 2: 7, 3: 6, 4: 0, 5: 0} {1: 3, 2: 5, 3: 4, 4: 0, 5: 0} Fed \n", "8 {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} {1: 3, 2: 4, 3: 4, 4: 0, 5: 0} Fed \n", "9 {1: 6, 2: 2, 3: 4, 4: 6, 5: 8} {1: 4, 2: 6, 3: 6, 4: 4, 5: 6} Fed \n", "10 {1: 7, 2: 3, 3: 4, 4: 7, 5: 3} {1: 6, 2: 6, 3: 6, 4: 6, 5: 6} Rafa \n", "11 {1: 4, 2: 6, 3: 6, 4: 6, 5: 0} {1: 6, 2: 3, 3: 4, 4: 3, 5: 0} Fed \n", "12 {1: 6, 2: 4, 3: 6, 4: 3, 5: 6} {1: 2, 2: 6, 3: 3, 4: 6, 5: 8} Rafa \n", "13 {1: 4, 2: 6, 3: 7, 4: 4, 5: 0} {1: 6, 2: 7, 3: 6, 4: 6, 5: 0} Rafa \n", "14 {1: 6, 2: 6, 3: 6, 4: 4, 5: 3} {1: 3, 2: 3, 3: 7, 4: 6, 5: 6} Rafa \n", "15 {1: 6, 2: 3, 3: 6, 4: 5, 5: 0} {1: 3, 2: 6, 3: 7, 4: 7, 5: 0} Rafa \n", "16 {1: 2, 2: 7, 3: 7, 4: 6, 5: 0} {1: 6, 2: 6, 3: 6, 4: 4, 5: 0} Fed \n", "17 {1: 4, 2: 6, 3: 7, 4: 7, 5: 8} {1: 6, 2: 7, 3: 6, 4: 6, 5: 6} Fed \n", "18 {1: 6, 2: 5, 3: 5, 4: 6, 5: 0} {1: 3, 2: 7, 3: 7, 4: 7, 5: 0} Rafa \n", "19 {1: 6, 2: 6, 3: 6, 4: 6, 5: 0} {1: 3, 2: 4, 3: 7, 4: 2, 5: 0} Fed \n", "\n", " sets_needed streak end_of_streak \n", "0 4 1 0 \n", "1 4 2 0 \n", "2 3 3 0 \n", "3 5 4 1 \n", "4 3 1 1 \n", "5 3 1 0 \n", "6 3 2 0 \n", "7 3 3 0 \n", "8 3 4 0 \n", "9 5 5 1 \n", "10 5 1 1 \n", "11 4 1 1 \n", "12 5 1 0 \n", "13 4 2 0 \n", "14 5 3 0 \n", "15 4 4 1 \n", "16 4 1 0 \n", "17 5 2 1 \n", "18 4 1 1 \n", "19 4 1 0 " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_row_num = df_match_list.shape[0] - 1\n", "\n", "for i, row in df_match_list.iterrows():\n", " if i != final_row_num:\n", " if row['winner'] != df_match_list.loc[i+1, 'winner']:\n", " df_match_list.loc[i, 'end_of_streak'] = 1\n", " else:\n", " df_match_list.loc[i, 'end_of_streak'] = 1\n", " \n", "df_match_list.head(20)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fedr_gamesrafa_gameswinnersets_neededstreakend_of_streak
9980{1: 4, 2: 6, 3: 7, 4: 6, 5: 0}{1: 6, 2: 4, 3: 6, 4: 4, 5: 0}Fed410
9981{1: 3, 2: 3, 3: 7, 4: 7, 5: 7}{1: 6, 2: 6, 3: 6, 4: 6, 5: 5}Fed520
9982{1: 6, 2: 7, 3: 4, 4: 6, 5: 0}{1: 3, 2: 6, 3: 6, 4: 4, 5: 0}Fed431
9983{1: 4, 2: 7, 3: 5, 4: 5, 5: 0}{1: 6, 2: 6, 3: 7, 4: 7, 5: 0}Rafa411
9984{1: 1, 2: 7, 3: 4, 4: 6, 5: 6}{1: 6, 2: 6, 3: 6, 4: 1, 5: 4}Fed511
9985{1: 6, 2: 4, 3: 6, 4: 1, 5: 4}{1: 2, 2: 6, 3: 3, 4: 6, 5: 6}Rafa510
9986{1: 6, 2: 6, 3: 3, 4: 4, 5: 4}{1: 3, 2: 2, 3: 6, 4: 6, 5: 6}Rafa521
9987{1: 4, 2: 6, 3: 6, 4: 6, 5: 0}{1: 6, 2: 3, 3: 4, 4: 2, 5: 0}Fed410
9988{1: 6, 2: 6, 3: 7, 4: 6, 5: 0}{1: 7, 2: 3, 3: 6, 4: 3, 5: 0}Fed420
9989{1: 6, 2: 6, 3: 6, 4: 0, 5: 0}{1: 2, 2: 3, 3: 3, 4: 0, 5: 0}Fed330
9990{1: 6, 2: 6, 3: 6, 4: 6, 5: 6}{1: 3, 2: 4, 3: 7, 4: 7, 5: 4}Fed540
9991{1: 6, 2: 7, 3: 7, 4: 0, 5: 0}{1: 2, 2: 6, 3: 6, 4: 0, 5: 0}Fed351
9992{1: 6, 2: 3, 3: 6, 4: 0, 5: 0}{1: 7, 2: 6, 3: 7, 4: 0, 5: 0}Rafa310
9993{1: 6, 2: 6, 3: 4, 4: 3, 5: 0}{1: 7, 2: 4, 3: 6, 4: 6, 5: 0}Rafa421
9994{1: 7, 2: 4, 3: 7, 4: 6, 5: 0}{1: 6, 2: 6, 3: 5, 4: 4, 5: 0}Fed411
9995{1: 3, 2: 6, 3: 4, 4: 0, 5: 0}{1: 6, 2: 7, 3: 6, 4: 0, 5: 0}Rafa310
9996{1: 4, 2: 2, 3: 6, 4: 0, 5: 0}{1: 6, 2: 6, 3: 7, 4: 0, 5: 0}Rafa320
9997{1: 4, 2: 6, 3: 6, 4: 4, 5: 0}{1: 6, 2: 4, 3: 7, 4: 6, 5: 0}Rafa430
9998{1: 4, 2: 4, 3: 6, 4: 0, 5: 0}{1: 6, 2: 6, 3: 7, 4: 0, 5: 0}Rafa340
9999{1: 7, 2: 3, 3: 4, 4: 7, 5: 3}{1: 6, 2: 6, 3: 6, 4: 6, 5: 6}Rafa551
\n", "
" ], "text/plain": [ " fedr_games rafa_games winner \\\n", "9980 {1: 4, 2: 6, 3: 7, 4: 6, 5: 0} {1: 6, 2: 4, 3: 6, 4: 4, 5: 0} Fed \n", "9981 {1: 3, 2: 3, 3: 7, 4: 7, 5: 7} {1: 6, 2: 6, 3: 6, 4: 6, 5: 5} Fed \n", "9982 {1: 6, 2: 7, 3: 4, 4: 6, 5: 0} {1: 3, 2: 6, 3: 6, 4: 4, 5: 0} Fed \n", "9983 {1: 4, 2: 7, 3: 5, 4: 5, 5: 0} {1: 6, 2: 6, 3: 7, 4: 7, 5: 0} Rafa \n", "9984 {1: 1, 2: 7, 3: 4, 4: 6, 5: 6} {1: 6, 2: 6, 3: 6, 4: 1, 5: 4} Fed \n", "9985 {1: 6, 2: 4, 3: 6, 4: 1, 5: 4} {1: 2, 2: 6, 3: 3, 4: 6, 5: 6} Rafa \n", "9986 {1: 6, 2: 6, 3: 3, 4: 4, 5: 4} {1: 3, 2: 2, 3: 6, 4: 6, 5: 6} Rafa \n", "9987 {1: 4, 2: 6, 3: 6, 4: 6, 5: 0} {1: 6, 2: 3, 3: 4, 4: 2, 5: 0} Fed \n", "9988 {1: 6, 2: 6, 3: 7, 4: 6, 5: 0} {1: 7, 2: 3, 3: 6, 4: 3, 5: 0} Fed \n", "9989 {1: 6, 2: 6, 3: 6, 4: 0, 5: 0} {1: 2, 2: 3, 3: 3, 4: 0, 5: 0} Fed \n", "9990 {1: 6, 2: 6, 3: 6, 4: 6, 5: 6} {1: 3, 2: 4, 3: 7, 4: 7, 5: 4} Fed \n", "9991 {1: 6, 2: 7, 3: 7, 4: 0, 5: 0} {1: 2, 2: 6, 3: 6, 4: 0, 5: 0} Fed \n", "9992 {1: 6, 2: 3, 3: 6, 4: 0, 5: 0} {1: 7, 2: 6, 3: 7, 4: 0, 5: 0} Rafa \n", "9993 {1: 6, 2: 6, 3: 4, 4: 3, 5: 0} {1: 7, 2: 4, 3: 6, 4: 6, 5: 0} Rafa \n", "9994 {1: 7, 2: 4, 3: 7, 4: 6, 5: 0} {1: 6, 2: 6, 3: 5, 4: 4, 5: 0} Fed \n", "9995 {1: 3, 2: 6, 3: 4, 4: 0, 5: 0} {1: 6, 2: 7, 3: 6, 4: 0, 5: 0} Rafa \n", "9996 {1: 4, 2: 2, 3: 6, 4: 0, 5: 0} {1: 6, 2: 6, 3: 7, 4: 0, 5: 0} Rafa \n", "9997 {1: 4, 2: 6, 3: 6, 4: 4, 5: 0} {1: 6, 2: 4, 3: 7, 4: 6, 5: 0} Rafa \n", "9998 {1: 4, 2: 4, 3: 6, 4: 0, 5: 0} {1: 6, 2: 6, 3: 7, 4: 0, 5: 0} Rafa \n", "9999 {1: 7, 2: 3, 3: 4, 4: 7, 5: 3} {1: 6, 2: 6, 3: 6, 4: 6, 5: 6} Rafa \n", "\n", " sets_needed streak end_of_streak \n", "9980 4 1 0 \n", "9981 5 2 0 \n", "9982 4 3 1 \n", "9983 4 1 1 \n", "9984 5 1 1 \n", "9985 5 1 0 \n", "9986 5 2 1 \n", "9987 4 1 0 \n", "9988 4 2 0 \n", "9989 3 3 0 \n", "9990 5 4 0 \n", "9991 3 5 1 \n", "9992 3 1 0 \n", "9993 4 2 1 \n", "9994 4 1 1 \n", "9995 3 1 0 \n", "9996 3 2 0 \n", "9997 4 3 0 \n", "9998 3 4 0 \n", "9999 5 5 1 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list.tail(20)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[]],\n", " dtype=object)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_match_list.loc[(df_match_list.end_of_streak==1) & (df_match_list.winner=='Fed')][['winner', 'streak']].hist()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[]],\n", " dtype=object)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_match_list.loc[(df_match_list.end_of_streak==1) & (df_match_list.winner=='Rafa')][['winner', 'streak']].hist()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "winner streak\n", "Fed 1 1138\n", " 2 540\n", " 3 347\n", " 4 193\n", " 5 110\n", " 6 63\n", " 7 30\n", " 8 21\n", " 9 11\n", " 10 6\n", " 11 1\n", " 13 2\n", "Rafa 1 1348\n", " 2 612\n", " 3 291\n", " 4 113\n", " 5 55\n", " 6 24\n", " 7 9\n", " 8 6\n", " 9 1\n", " 10 2\n", " 11 1\n", "Name: end_of_streak, dtype: int64" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_match_list[df_match_list.end_of_streak==1].groupby(['winner', 'streak']).count()['end_of_streak']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comp 1: other runs" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "run 0, Fed win rate: 0.5644\n", "run 1, Fed win rate: 0.5508\n", "run 2, Fed win rate: 0.5663\n", "run 3, Fed win rate: 0.5663\n", "run 4, Fed win rate: 0.5677\n", "run 5, Fed win rate: 0.5582\n", "run 6, Fed win rate: 0.5585\n", "run 7, Fed win rate: 0.5573\n", "run 8, Fed win rate: 0.5533\n", "run 9, Fed win rate: 0.5598\n" ] } ], "source": [ "sims = 10\n", "matches = 10000\n", "\n", "for i in range(sims):\n", " np.random.seed(i)\n", "\n", " match_list = []\n", " fedr_wins = 0\n", "\n", " for j in range(matches):\n", " match_list.append(match_(fedr, rafa, final_set_tiebreaker=False, verbose=True))\n", " \n", " for k in range(len(match_list)):\n", " if match_list[k][2] == \"Fed\":\n", " fedr_wins += 1\n", " \n", " print(\"run %d, Fed win rate: %.4f\" % (i, fedr_wins/float(matches)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comp 2: Wimbledon '07 Final\n", "\n", "- Fed also started off the match serving" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.7, 0.62)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rafa07 = Player(\"Rafa\", .70, .68, .57)\n", "fedr07 = Player(\"Fed\" , .71, .71, .62)\n", "\n", "rafa07.fsp_in, fedr07.ssp_win" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "np.random.seed(8)\n", "\n", "match_list07 = []\n", "\n", "for i in range(10000):\n", " match_list07.append(match_(fedr07, rafa07, final_set_tiebreaker=False, verbose=True))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fed wins 6966 out of 10000\n" ] } ], "source": [ "def sim_win_count(match_list, player, winner_col):\n", " player_wins = 0\n", " \n", " for i in range(len(match_list)):\n", " if match_list[i][winner_col] == player:\n", " player_wins += 1\n", " \n", " return player_wins\n", "\n", "print(\"Fed wins %d out of %d\" % (sim_win_count(match_list07, \"Fed\", 2), len(match_list07)))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }