Skip to content

Instantly share code, notes, and snippets.

@doctorpangloss
Created December 27, 2016 22:10
Show Gist options
  • Save doctorpangloss/d28bba3c4d3b91b1a5026249c87b6eac to your computer and use it in GitHub Desktop.
Save doctorpangloss/d28bba3c4d3b91b1a5026249c87b6eac to your computer and use it in GitHub Desktop.
Single Card Replacement Deck Improvements
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# What card should I add to my deck?\n",
"\n",
"Good card choices can significantly improve the performance of two otherwise very similar decks. Using data from [**Visualizing the Metagame**](https://hearthsim.info/blog/2016/visualizing-the-metagame/), we'll look for decks that differ by exactly two cards (one replacement) and calculate the difference in their win rates.\n",
"\n",
"### Limitations\n",
"\n",
"There are some confounding factors in a deck-to-deck comparison from this data:\n",
"\n",
" - **The player is not controlled.** Two decks that differ by one replacement may actually differ in terms of players. The difference in win rate may be explained by a better player rather than a better choice of cards.\n",
" - **The data is not a random sample of all decks and matches.** This analysis is based on the best performing decks. Deck archetypes that outperform generally will be overrepresented in deck-to-deck comparisons. One-card-replacement differences in a high-performing archetype will be overrepresented, so improvements to less-known deck archetypes will not show up in this analysis.\n",
" \n",
"### Procedure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we'll dump the JSON data from **Visualizing** with [D3 Deconstructor](https://ucbvislab.github.io/d3-deconstructor/) and store it in a table."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of decks: 115\n",
"Example deck:\n"
]
},
{
"data": {
"text/plain": [
"archetype MALY_DRUID\n",
"card_ids [EX1_169, EX1_169, CS2_008, CS2_008, AT_037, A...\n",
"card_list [Innervate, Innervate, Moonfire, Moonfire, Liv...\n",
"day 11\n",
"deck_id 3031911\n",
"deconID 9\n",
"match_count 209\n",
"month 10\n",
"player_class 2\n",
"win_rate 53.59\n",
"year 2016\n",
"Name: 0, dtype: object"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import json\n",
"import pandas as pd\n",
"import re\n",
"\n",
"visualizing_the_metagame = json.load(open('generators/resources/meta/visualizing_the_metagame.json'))[2]['data']\n",
"for x in {'card_ids', 'card_list'}:\n",
" visualizing_the_metagame[x] = [map(lambda s: re.sub(r\"([\\[\\]'])|(^\\s+)|(\\s+$)\", '', s), i.split(',')) for i in visualizing_the_metagame[x]]\n",
" \n",
"vmdf = pd.DataFrame.from_dict(visualizing_the_metagame)\n",
"print 'Number of decks: {}'.format(len(vmdf))\n",
"print('Example deck:')\n",
"vmdf.transpose()[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll now look at every pair of decks and find those with two card (single replacement) differences."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Decks with two card (single replacement) differences: 157\n",
"Example difference:\n",
"Archetype MIDRANGE_SHAMAN: Harrison Jones replaced with Fire Elemental\n"
]
}
],
"source": [
"from itertools import combinations\n",
"from collections import Counter\n",
"\n",
"diff_pairs = set()\n",
"\n",
"for (i, j) in combinations(range(len(vmdf)), 2):\n",
" r_i, r_j = vmdf.loc[i, 'card_list'], vmdf.loc[j, 'card_list']\n",
" s_r_i, s_r_j = set(Counter(r_i).most_common()), set(Counter(r_j).most_common())\n",
" # Duplicate\n",
" for s in [s_r_i, s_r_j]:\n",
" to_add = set()\n",
" for (card, k) in s:\n",
" if k == 2:\n",
" to_add.add((card, 1))\n",
" s |= to_add\n",
" diff = s_r_i ^ s_r_j\n",
" if len(diff) == 2:\n",
" card_i = frozenset(s_r_i - s_r_j)\n",
" card_j = frozenset(s_r_j - s_r_i)\n",
" diff_pairs.add((i, j, card_i, card_j))\n",
"print 'Decks with two card (single replacement) differences: {}'.format(len(diff_pairs))\n",
"print 'Example difference:'\n",
"i, j, card_i, card_j = next(iter(diff_pairs))\n",
"print 'Archetype {}: {} replaced with {}'.format(vmdf.loc[i, 'archetype'], next(iter(card_i))[0], next(iter(card_j))[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Statistically Significant Differences\n",
"\n",
"We'll use two approaches to determine a statistically significant difference in win rates between two decks with a one-card replacement.\n",
"\n",
"Deck performance is *binomially-distributed* data. We have the number of matches won ($p$) and the number of total matches ($n$). Naturally, the more matches we play, the more certain we are that the win rate we observe is accurate. We can account for this in our statistically comparison.\n",
"\n",
"First, we'll use the normal approximation of binomial distributions to find statistically significant differences in win rates. [This approach](http://stats.stackexchange.com/a/113607) depends on large $n$ to be accurate. We'll use 95% confidence for now."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Deck 1</th>\n",
" <th>Deck 2</th>\n",
" <th>Win Rate Difference</th>\n",
" <th>Matches</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>54</td>\n",
" <td>85</td>\n",
" <td>0.0661</td>\n",
" <td>1981</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>60</td>\n",
" <td>89</td>\n",
" <td>0.0667</td>\n",
" <td>1949</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>70</td>\n",
" <td>91</td>\n",
" <td>0.0606</td>\n",
" <td>1553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>61</td>\n",
" <td>78</td>\n",
" <td>0.0303</td>\n",
" <td>4778</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>51</td>\n",
" <td>92</td>\n",
" <td>0.1055</td>\n",
" <td>467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>60</td>\n",
" <td>78</td>\n",
" <td>0.0341</td>\n",
" <td>4088</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>11</td>\n",
" <td>19</td>\n",
" <td>0.0708</td>\n",
" <td>3910</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>49</td>\n",
" <td>85</td>\n",
" <td>0.0959</td>\n",
" <td>518</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Deck 1 Deck 2 Win Rate Difference Matches\n",
"0 54 85 0.0661 1981\n",
"1 60 89 0.0667 1949\n",
"2 70 91 0.0606 1553\n",
"3 61 78 0.0303 4778\n",
"4 51 92 0.1055 467\n",
"5 60 78 0.0341 4088\n",
"6 11 19 0.0708 3910\n",
"7 49 85 0.0959 518"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from __future__ import division\n",
"import scipy\n",
"from math import sqrt\n",
"\n",
"def different(p_1,n_1,p_2,n_2):\n",
" p_hat = (n_1*p_1+n_2*p_2)/(n_1+n_2)\n",
" z = (p_1-p_2)/sqrt(p_hat*(1-p_hat)*(1/n_1+1/n_2))\n",
" is_significant = z > 1.96\n",
" return is_significant, p_1 - p_2\n",
"\n",
"significant_diffs = []\n",
"for i, j, card_i, card_j in diff_pairs:\n",
" x_i = vmdf.loc[i,'win_rate']*0.01\n",
" x_j = vmdf.loc[j,'win_rate']*0.01\n",
" n_i = vmdf.loc[i,'match_count']\n",
" n_j = vmdf.loc[j,'match_count']\n",
" is_different, amount = different(x_i, n_i, x_j, n_j)\n",
" if is_different:\n",
" significant_diffs.append((i,j,amount, n_i+n_j))\n",
"pd.DataFrame.from_records(significant_diffs, columns=['Deck 1', 'Deck 2', 'Win Rate Difference', 'Matches'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clearly there are some decks with statistically significant differences under this criteria. Since we're dealing with binomial data though, we can use an *exact* difference test. No approximation needed. In this case, we will use [Fisher's Exact Test](https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.stats.fisher_exact.html)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Deck ID</th>\n",
" <th>Archetype</th>\n",
" <th>Old Card</th>\n",
" <th>Copy #</th>\n",
" <th>Replacement Card</th>\n",
" <th>Copy #</th>\n",
" <th>Win Rate Improvement PP</th>\n",
" <th>Match Count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>6.09</td>\n",
" <td>2808</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>10.55</td>\n",
" <td>467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>70</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>6.06</td>\n",
" <td>1553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>60</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>3.41</td>\n",
" <td>4088</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>61</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>3.03</td>\n",
" <td>4778</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>54</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>6.61</td>\n",
" <td>1981</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>60</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Argent Horserider</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>6.67</td>\n",
" <td>1949</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Deck ID Archetype Old Card Copy # Replacement Card \\\n",
"0 51 MIDRANGE_SHAMAN Harrison Jones 1 Barnes \n",
"1 51 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 Barnes \n",
"2 70 MIDRANGE_SHAMAN Barnes 1 Harrison Jones \n",
"3 60 MIDRANGE_SHAMAN Mana Tide Totem 2 Fire Elemental \n",
"4 61 MIDRANGE_SHAMAN Bloodlust 1 Fire Elemental \n",
"5 54 MIDRANGE_SHAMAN Fire Elemental 2 Barnes \n",
"6 60 MIDRANGE_SHAMAN Argent Horserider 1 Fire Elemental \n",
"\n",
" Copy # Win Rate Improvement PP Match Count \n",
"0 1 6.09 2808 \n",
"1 1 10.55 467 \n",
"2 1 6.06 1553 \n",
"3 2 3.41 4088 \n",
"4 2 3.03 4778 \n",
"5 1 6.61 1981 \n",
"6 2 6.67 1949 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import scipy.stats as stats\n",
"\n",
"\n",
"def get_differences(confidence=0.95):\n",
" fisher_diffs = set()\n",
" p = 1 - confidence\n",
" for i, j, card_i, card_j in diff_pairs:\n",
" x_i = vmdf.loc[i,'win_rate']*0.01\n",
" x_j = vmdf.loc[j,'win_rate']*0.01\n",
" n_i = vmdf.loc[i,'match_count']\n",
" n_j = vmdf.loc[j,'match_count']\n",
" odds_ratio, p_value = stats.fisher_exact([[int(x_i*n_i), int(x_j*n_j)], [int(n_i-x_i*n_i), int(n_j-x_j*n_j)]])\n",
" if p_value < p:\n",
" fisher_diffs.add((i,j, card_i, card_j,odds_ratio,p_value, n_i, n_j))\n",
"\n",
" records = []\n",
" for i, j, card_1, card_2, _, _, n_i, n_j in fisher_diffs:\n",
" name_1, number_1, name_2, number_2 = list(card_1)[0][0], list(card_1)[0][1], list(card_2)[0][0], list(card_2)[0][1]\n",
" win_rate = vmdf.loc[j, 'win_rate']-vmdf.loc[i, 'win_rate']\n",
" match_count = n_i+n_j\n",
" archetype = vmdf.loc[i, 'archetype']\n",
" if win_rate < 0:\n",
" name_1, number_1, name_2, number_2 = name_2, number_2, name_1, number_1\n",
" win_rate = -win_rate\n",
" archetype = vmdf.loc[j, 'archetype']\n",
" records.append([\n",
" i,\n",
" archetype,\n",
" name_1,\n",
" number_1,\n",
" name_2,\n",
" number_2,\n",
" win_rate,\n",
" match_count])\n",
" return pd.DataFrame.from_records(records, columns=['Deck ID', 'Archetype', 'Old Card', 'Copy #', 'Replacement Card', 'Copy #', 'Win Rate Improvement PP', 'Match Count'])\n",
"\n",
"diff_95 = get_differences(confidence=0.95)\n",
"diff_95"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Clearly **Barnes** and **Fire Elemental** helped out these decks.\n",
"\n",
"Let's try reducing our confidence in a win-rate difference and see which other cards appear. We'll choose 60% instead."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Deck ID</th>\n",
" <th>Archetype</th>\n",
" <th>Old Card</th>\n",
" <th>Copy #</th>\n",
" <th>Replacement Card</th>\n",
" <th>Copy #</th>\n",
" <th>Win Rate Improvement PP</th>\n",
" <th>Match Count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>8.33</td>\n",
" <td>526</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>53</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>5.32</td>\n",
" <td>480</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>101</td>\n",
" <td>DRAGON_WARRIOR</td>\n",
" <td>Grommash Hellscream</td>\n",
" <td>1</td>\n",
" <td>Ravaging Ghoul</td>\n",
" <td>2</td>\n",
" <td>5.27</td>\n",
" <td>781</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>87</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Lightning Storm</td>\n",
" <td>1</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>2.15</td>\n",
" <td>1797</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>53</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>6.64</td>\n",
" <td>590</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>11</td>\n",
" <td>SECRET_HUNTER</td>\n",
" <td>Leeroy Jenkins</td>\n",
" <td>1</td>\n",
" <td>Reckless Rocketeer</td>\n",
" <td>1</td>\n",
" <td>7.08</td>\n",
" <td>3910</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>4.23</td>\n",
" <td>559</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>54</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>6.61</td>\n",
" <td>1981</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>4.36</td>\n",
" <td>974</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>64</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Lightning Storm</td>\n",
" <td>2</td>\n",
" <td>3.85</td>\n",
" <td>6236</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>59</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>3.55</td>\n",
" <td>3095</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>64</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>2.87</td>\n",
" <td>6362</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>78</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>4.46</td>\n",
" <td>2721</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>83</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>3.22</td>\n",
" <td>2012</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>60</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Flamewreathed Faceless</td>\n",
" <td>1</td>\n",
" <td>Lightning Storm</td>\n",
" <td>2</td>\n",
" <td>4.57</td>\n",
" <td>1793</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>53</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>4.71</td>\n",
" <td>434</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>10.55</td>\n",
" <td>467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>54</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>5.19</td>\n",
" <td>1811</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>65</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Lightning Storm</td>\n",
" <td>2</td>\n",
" <td>3.20</td>\n",
" <td>603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>62</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>3.02</td>\n",
" <td>3060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Flamewreathed Faceless</td>\n",
" <td>1</td>\n",
" <td>6.35</td>\n",
" <td>794</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Flamewreathed Faceless</td>\n",
" <td>1</td>\n",
" <td>5.12</td>\n",
" <td>2411</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>52</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Argent Squire</td>\n",
" <td>1</td>\n",
" <td>5.67</td>\n",
" <td>525</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>67</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>3.24</td>\n",
" <td>984</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>78</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Argent Horserider</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>3.26</td>\n",
" <td>2923</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>54</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Feral Spirit</td>\n",
" <td>2</td>\n",
" <td>4.10</td>\n",
" <td>1921</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>1</td>\n",
" <td>3.07</td>\n",
" <td>806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>60</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Argent Horserider</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>6.67</td>\n",
" <td>1949</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>61</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>4.47</td>\n",
" <td>2601</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>4.29</td>\n",
" <td>907</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>66</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>6.37</td>\n",
" <td>390</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>10</td>\n",
" <td>SECRET_HUNTER</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Explosive Trap</td>\n",
" <td>1</td>\n",
" <td>8.49</td>\n",
" <td>440</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>70</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>2.84</td>\n",
" <td>1221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>53</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>Feral Spirit</td>\n",
" <td>2</td>\n",
" <td>4.13</td>\n",
" <td>530</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>54</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>4.51</td>\n",
" <td>2053</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>53</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>5.20</td>\n",
" <td>2767</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>20</td>\n",
" <td>TEMPO_MAGE</td>\n",
" <td>Rhonin</td>\n",
" <td>1</td>\n",
" <td>Flamestrike</td>\n",
" <td>1</td>\n",
" <td>3.71</td>\n",
" <td>1090</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>56</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Flamewreathed Faceless</td>\n",
" <td>2</td>\n",
" <td>4.15</td>\n",
" <td>683</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>73</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>1</td>\n",
" <td>Argent Horserider</td>\n",
" <td>2</td>\n",
" <td>4.74</td>\n",
" <td>812</td>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <td>17</td>\n",
" <td>SECRET_HUNTER</td>\n",
" <td>Fiery Bat</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>3.46</td>\n",
" <td>4399</td>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>5.46</td>\n",
" <td>6164</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>53</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>4.54</td>\n",
" <td>662</td>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <td>69</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Argent Horserider</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>4.99</td>\n",
" <td>1089</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>59</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>2.89</td>\n",
" <td>990</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <td>62</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Argent Horserider</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>5.38</td>\n",
" <td>730</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>Flamewreathed Faceless</td>\n",
" <td>1</td>\n",
" <td>8.17</td>\n",
" <td>348</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>4.18</td>\n",
" <td>477</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>61</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>3.03</td>\n",
" <td>4778</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>70</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>6.06</td>\n",
" <td>1553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55</th>\n",
" <td>60</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Mana Tide Totem</td>\n",
" <td>2</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>3.41</td>\n",
" <td>4088</td>\n",
" </tr>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>51</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>6.11</td>\n",
" <td>461</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>49</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Flamewreathed Faceless</td>\n",
" <td>1</td>\n",
" <td>9.59</td>\n",
" <td>518</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>60</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Ragnaros the Firelord</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>3.53</td>\n",
" <td>1801</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>57</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>4.10</td>\n",
" <td>757</td>\n",
" </tr>\n",
" <tr>\n",
" <th>60</th>\n",
" <td>54</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Bloodlust</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>3.26</td>\n",
" <td>1827</td>\n",
" </tr>\n",
" <tr>\n",
" <th>61</th>\n",
" <td>28</td>\n",
" <td>FREEZE_MAGE</td>\n",
" <td>Evolved Kobold</td>\n",
" <td>1</td>\n",
" <td>Ice Barrier</td>\n",
" <td>2</td>\n",
" <td>3.18</td>\n",
" <td>4245</td>\n",
" </tr>\n",
" <tr>\n",
" <th>62</th>\n",
" <td>50</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Fire Elemental</td>\n",
" <td>1</td>\n",
" <td>Barnes</td>\n",
" <td>1</td>\n",
" <td>4.69</td>\n",
" <td>525</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>70</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Argent Squire</td>\n",
" <td>1</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>3.65</td>\n",
" <td>809</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>67</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Acidic Swamp Ooze</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>6.26</td>\n",
" <td>820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>67</td>\n",
" <td>MIDRANGE_SHAMAN</td>\n",
" <td>Harrison Jones</td>\n",
" <td>1</td>\n",
" <td>Fire Elemental</td>\n",
" <td>2</td>\n",
" <td>1.80</td>\n",
" <td>3161</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>66 rows × 8 columns</p>\n",
"</div>"
],
"text/plain": [
" Deck ID Archetype Old Card Copy # \\\n",
"0 49 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"1 53 MIDRANGE_SHAMAN Bloodlust 1 \n",
"2 101 DRAGON_WARRIOR Grommash Hellscream 1 \n",
"3 87 MIDRANGE_SHAMAN Lightning Storm 1 \n",
"4 53 MIDRANGE_SHAMAN Fire Elemental 2 \n",
"5 11 SECRET_HUNTER Leeroy Jenkins 1 \n",
"6 49 MIDRANGE_SHAMAN Bloodlust 1 \n",
"7 54 MIDRANGE_SHAMAN Fire Elemental 2 \n",
"8 51 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"9 64 MIDRANGE_SHAMAN Bloodlust 1 \n",
"10 59 MIDRANGE_SHAMAN Bloodlust 1 \n",
"11 64 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"12 78 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"13 83 MIDRANGE_SHAMAN Barnes 1 \n",
"14 60 MIDRANGE_SHAMAN Flamewreathed Faceless 1 \n",
"15 53 MIDRANGE_SHAMAN Fire Elemental 2 \n",
"16 51 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"17 54 MIDRANGE_SHAMAN Fire Elemental 2 \n",
"18 65 MIDRANGE_SHAMAN Fire Elemental 2 \n",
"19 62 MIDRANGE_SHAMAN Fire Elemental 1 \n",
"20 49 MIDRANGE_SHAMAN Bloodlust 1 \n",
"21 49 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"22 52 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"23 67 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"24 78 MIDRANGE_SHAMAN Argent Horserider 1 \n",
"25 54 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"26 51 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"27 60 MIDRANGE_SHAMAN Argent Horserider 1 \n",
"28 61 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"29 51 MIDRANGE_SHAMAN Fire Elemental 2 \n",
".. ... ... ... ... \n",
"36 66 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"37 10 SECRET_HUNTER Harrison Jones 1 \n",
"38 70 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"39 53 MIDRANGE_SHAMAN Barnes 1 \n",
"40 54 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"41 53 MIDRANGE_SHAMAN Bloodlust 1 \n",
"42 20 TEMPO_MAGE Rhonin 1 \n",
"43 56 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"44 73 MIDRANGE_SHAMAN Fire Elemental 1 \n",
"45 17 SECRET_HUNTER Fiery Bat 1 \n",
"46 49 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"47 53 MIDRANGE_SHAMAN Barnes 1 \n",
"48 69 MIDRANGE_SHAMAN Argent Horserider 1 \n",
"49 59 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"50 62 MIDRANGE_SHAMAN Argent Horserider 1 \n",
"51 49 MIDRANGE_SHAMAN Barnes 1 \n",
"52 51 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"53 61 MIDRANGE_SHAMAN Bloodlust 1 \n",
"54 70 MIDRANGE_SHAMAN Barnes 1 \n",
"55 60 MIDRANGE_SHAMAN Mana Tide Totem 2 \n",
"56 51 MIDRANGE_SHAMAN Fire Elemental 2 \n",
"57 49 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"58 60 MIDRANGE_SHAMAN Ragnaros the Firelord 1 \n",
"59 57 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"60 54 MIDRANGE_SHAMAN Bloodlust 1 \n",
"61 28 FREEZE_MAGE Evolved Kobold 1 \n",
"62 50 MIDRANGE_SHAMAN Fire Elemental 1 \n",
"63 70 MIDRANGE_SHAMAN Argent Squire 1 \n",
"64 67 MIDRANGE_SHAMAN Acidic Swamp Ooze 1 \n",
"65 67 MIDRANGE_SHAMAN Harrison Jones 1 \n",
"\n",
" Replacement Card Copy # Win Rate Improvement PP Match Count \n",
"0 Mana Tide Totem 2 8.33 526 \n",
"1 Mana Tide Totem 2 5.32 480 \n",
"2 Ravaging Ghoul 2 5.27 781 \n",
"3 Ragnaros the Firelord 1 2.15 1797 \n",
"4 Harrison Jones 1 6.64 590 \n",
"5 Reckless Rocketeer 1 7.08 3910 \n",
"6 Mana Tide Totem 2 4.23 559 \n",
"7 Barnes 1 6.61 1981 \n",
"8 Mana Tide Totem 2 4.36 974 \n",
"9 Lightning Storm 2 3.85 6236 \n",
"10 Barnes 1 3.55 3095 \n",
"11 Harrison Jones 1 2.87 6362 \n",
"12 Harrison Jones 1 4.46 2721 \n",
"13 Ragnaros the Firelord 1 3.22 2012 \n",
"14 Lightning Storm 2 4.57 1793 \n",
"15 Mana Tide Totem 2 4.71 434 \n",
"16 Barnes 1 10.55 467 \n",
"17 Ragnaros the Firelord 1 5.19 1811 \n",
"18 Lightning Storm 2 3.20 603 \n",
"19 Barnes 1 3.02 3060 \n",
"20 Flamewreathed Faceless 1 6.35 794 \n",
"21 Flamewreathed Faceless 1 5.12 2411 \n",
"22 Argent Squire 1 5.67 525 \n",
"23 Bloodlust 1 3.24 984 \n",
"24 Mana Tide Totem 2 3.26 2923 \n",
"25 Feral Spirit 2 4.10 1921 \n",
"26 Fire Elemental 1 3.07 806 \n",
"27 Fire Elemental 2 6.67 1949 \n",
"28 Harrison Jones 1 4.47 2601 \n",
"29 Barnes 1 4.29 907 \n",
".. ... ... ... ... \n",
"36 Ragnaros the Firelord 1 6.37 390 \n",
"37 Explosive Trap 1 8.49 440 \n",
"38 Harrison Jones 1 2.84 1221 \n",
"39 Feral Spirit 2 4.13 530 \n",
"40 Mana Tide Totem 2 4.51 2053 \n",
"41 Ragnaros the Firelord 1 5.20 2767 \n",
"42 Flamestrike 1 3.71 1090 \n",
"43 Flamewreathed Faceless 2 4.15 683 \n",
"44 Argent Horserider 2 4.74 812 \n",
"45 Barnes 1 3.46 4399 \n",
"46 Mana Tide Totem 2 5.46 6164 \n",
"47 Mana Tide Totem 2 4.54 662 \n",
"48 Barnes 1 4.99 1089 \n",
"49 Mana Tide Totem 2 2.89 990 \n",
"50 Barnes 1 5.38 730 \n",
"51 Flamewreathed Faceless 1 8.17 348 \n",
"52 Barnes 1 4.18 477 \n",
"53 Fire Elemental 2 3.03 4778 \n",
"54 Harrison Jones 1 6.06 1553 \n",
"55 Fire Elemental 2 3.41 4088 \n",
"56 Bloodlust 1 6.11 461 \n",
"57 Flamewreathed Faceless 1 9.59 518 \n",
"58 Fire Elemental 2 3.53 1801 \n",
"59 Bloodlust 1 4.10 757 \n",
"60 Barnes 1 3.26 1827 \n",
"61 Ice Barrier 2 3.18 4245 \n",
"62 Barnes 1 4.69 525 \n",
"63 Harrison Jones 1 3.65 809 \n",
"64 Fire Elemental 2 6.26 820 \n",
"65 Fire Elemental 2 1.80 3161 \n",
"\n",
"[66 rows x 8 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff_60 = get_differences(confidence=0.60)\n",
"diff_60"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Which replacement card appears the most?"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Replacement Card\n",
"Argent Horserider 1\n",
"Loot Hoarder 1\n",
"Ice Barrier 1\n",
"Ravaging Ghoul 1\n",
"Flamestrike 1\n",
"Reckless Rocketeer 1\n",
"Explosive Trap 1\n",
"Argent Squire 1\n",
"Bloodlust 3\n",
"Feral Spirit 3\n",
"Lightning Storm 4\n",
"Ragnaros the Firelord 6\n",
"Flamewreathed Faceless 6\n",
"Fire Elemental 7\n",
"Harrison Jones 7\n",
"Mana Tide Totem 10\n",
"Barnes 12\n",
"dtype: int64"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%matplotlib inline\n",
"diff_60.groupby('Replacement Card').size().sort_values()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These Shaman-heavey results come from an overrepresentation of the Midrange Shaman archetypes in the **Visualizing** dataset:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"archetype\n",
" 1\n",
"CTHUN_WARRIOR 1\n",
"ZOO_LOCK 1\n",
"BEAST_DRUID 1\n",
"TOKEN_DRUID 2\n",
"NZOTH_WARRIOR 2\n",
"RENO_LOCK 2\n",
"MALY_DRUID 3\n",
"MIDRANGE_HUNTER 3\n",
"CONTROL_WARRIOR 3\n",
"MURLOC_PALADIN 3\n",
"PIRATE_WARRIOR 3\n",
"CURATOR_DRUID 4\n",
"DISCARD_LOCK 5\n",
"DRAGON_WARRIOR 5\n",
"FREEZE_MAGE 5\n",
"RESSURECT_PRIEST 5\n",
"SECRET_HUNTER 7\n",
"TEMPO_MAGE 7\n",
"MIRACLE_ROGUE 8\n",
"MIDRANGE_SHAMAN 44\n",
"dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vmdf.groupby('archetype').size().sort_values()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll skip other deck archetypes for now, because it's not reasonable that we have enough data to really analyze them.\n",
"\n",
"Looking at only midrange Shaman, what was the average improvement each card delivered to a deck?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Replacement Card\n",
"Fire Elemental 3.967143\n",
"Lightning Storm 4.175000\n",
"Feral Spirit 4.216667\n",
"Ragnaros the Firelord 4.285000\n",
"Harrison Jones 4.427143\n",
"Bloodlust 4.483333\n",
"Argent Horserider 4.740000\n",
"Mana Tide Totem 4.761000\n",
"Barnes 5.146364\n",
"Argent Squire 5.670000\n",
"Flamewreathed Faceless 6.446667\n",
"Name: Win Rate Improvement PP, dtype: float64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff_60[diff_60['Archetype'] == 'MIDRANGE_SHAMAN'].groupby('Replacement Card')['Win Rate Improvement PP'].mean().sort_values()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A mediocre midrange Shaman deck can be made great by adding **Flamewreathed Faceless**, **Argent Squire**, **Barnes** and **Mana Tide Totem.**\n",
"\n",
"Tune in next time when this analysis is run on the entire family of replays and addresses the limitations we previously discussed."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment