# # Importing Packages
import os
import copy
import config
import dota2api
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.naive_bayes import MultinomialNB
%matplotlib inline
# # STEAM Client API Key to access the dota2 api
API_KEY = config.STEAM_API_KEY
api = dota2api.Initialise(API_KEY)
data = pd.read_csv('../data/draft/capmodedata.csv')
data.head(5)
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
match_id | radiant_win | duration | 1is_pick | 1team_id | 1hero_id | 2is_pick | 2team_id | 2hero_id | 3is_pick | ... | 17hero_id | 18is_pick | 18team_id | 18hero_id | 19is_pick | 19team_id | 19hero_id | 20is_pick | 20team_id | 20hero_id | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1928898739 | True | 2885 | False | 0 | 73 | False | 1 | 69 | False | ... | 41.0 | False | 0.0 | 81.0 | True | 1.0 | 105.0 | True | 0.0 | 94.0 |
1 | 1928932285 | True | 1894 | False | 0 | 69 | False | 1 | 102 | False | ... | 40.0 | False | 0.0 | 28.0 | True | 1.0 | 97.0 | True | 0.0 | 62.0 |
2 | 1928903165 | True | 2424 | False | 1 | 85 | False | 0 | 68 | False | ... | 30.0 | False | 1.0 | 47.0 | True | 0.0 | 58.0 | True | 1.0 | 33.0 |
3 | 1928907204 | True | 2588 | False | 1 | 71 | False | 0 | 73 | False | ... | 30.0 | False | 1.0 | 68.0 | True | 0.0 | 50.0 | True | 1.0 | 21.0 |
4 | 1928865084 | True | 3658 | False | 1 | 12 | False | 0 | 42 | False | ... | 93.0 | False | 1.0 | 67.0 | True | 0.0 | 72.0 | True | 1.0 | 40.0 |
5 rows ร 63 columns
data.columns
Index(['match_id', 'radiant_win', 'duration', '1is_pick', '1team_id',
'1hero_id', '2is_pick', '2team_id', '2hero_id', '3is_pick', '3team_id',
'3hero_id', '4is_pick', '4team_id', '4hero_id', '5is_pick', '5team_id',
'5hero_id', '6is_pick', '6team_id', '6hero_id', '7is_pick', '7team_id',
'7hero_id', '8is_pick', '8team_id', '8hero_id', '9is_pick', '9team_id',
'9hero_id', '10is_pick', '10team_id', '10hero_id', '11is_pick',
'11team_id', '11hero_id', '12is_pick', '12team_id', '12hero_id',
'13is_pick', '13team_id', '13hero_id', '14is_pick', '14team_id',
'14hero_id', '15is_pick', '15team_id', '15hero_id', '16is_pick',
'16team_id', '16hero_id', '17is_pick', '17team_id', '17hero_id',
'18is_pick', '18team_id', '18hero_id', '19is_pick', '19team_id',
'19hero_id', '20is_pick', '20team_id', '20hero_id'],
dtype='object')
# # # Getting Heroes ID according to the name
heroes = api.get_heroes()
heroes_dict = {}
for i in range (len(heroes['heroes'])):
hero_id = heroes['heroes'][i]['id']
hero_name = heroes['heroes'][i]['localized_name']
heroes_dict[hero_id]= hero_name
def change_hero_name(row):
if row in heroes_dict:
return heroes_dict[row]
columns = [
'1hero_id',
'2hero_id',
'3hero_id',
'4hero_id',
'5hero_id',
'6hero_id',
'7hero_id',
'8hero_id',
'9hero_id',
'10hero_id',
'11hero_id',
'12hero_id',
'13hero_id',
'14hero_id',
'15hero_id',
'16hero_id',
'17hero_id',
'18hero_id',
'19hero_id',
'20hero_id'
]
for i in range(len(columns)):
data[columns[i]] = data[columns[i]].apply(change_hero_name)
data.head(5)
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
match_id | radiant_win | duration | 1is_pick | 1team_id | 1hero_id | 2is_pick | 2team_id | 2hero_id | 3is_pick | ... | 17hero_id | 18is_pick | 18team_id | 18hero_id | 19is_pick | 19team_id | 19hero_id | 20is_pick | 20team_id | 20hero_id | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1928898739 | True | 2885 | False | 0 | Alchemist | False | 1 | Doom | False | ... | Faceless Void | False | 0.0 | Chaos Knight | True | 1.0 | Techies | True | 0.0 | Medusa |
1 | 1928932285 | True | 1894 | False | 0 | Doom | False | 1 | Abaddon | False | ... | Venomancer | False | 0.0 | Slardar | True | 1.0 | Magnus | True | 0.0 | Bounty Hunter |
2 | 1928903165 | True | 2424 | False | 1 | Undying | False | 0 | Ancient Apparition | False | ... | Witch Doctor | False | 1.0 | Viper | True | 0.0 | Enchantress | True | 1.0 | Enigma |
3 | 1928907204 | True | 2588 | False | 1 | Spirit Breaker | False | 0 | Alchemist | False | ... | Witch Doctor | False | 1.0 | Ancient Apparition | True | 0.0 | Dazzle | True | 1.0 | Windranger |
4 | 1928865084 | True | 3658 | False | 1 | Phantom Lancer | False | 0 | Wraith King | False | ... | Slark | False | 1.0 | Spectre | True | 0.0 | Gyrocopter | True | 1.0 | Venomancer |
5 rows ร 63 columns
max_minutes = (np.max(data['duration'])) / 60
max_minutes
161.26666666666668
# # Plotting the graph of match played in minutes
data['minutes'] = data['duration'].apply(lambda x: x / 60)
groupby_minute = data.groupby(['minutes']).count()
groupby_minute.index
Float64Index([0.03333333333333333, 0.26666666666666666, 0.36666666666666664,
0.5166666666666667, 0.55, 0.5833333333333334,
0.6333333333333333, 0.65, 0.8,
0.8166666666666667,
...
127.83333333333333, 129.05, 136.35,
138.05, 138.35, 140.86666666666667,
142.46666666666667, 143.2, 153.3,
161.26666666666668],
dtype='float64', name='minutes', length=5184)
plt.hist(groupby_minute.index, histtype='bar', color='green')
(array([819., 967., 968., 967., 949., 444., 50., 11., 7., 2.]),
array([3.33333333e-02, 1.61566667e 01, 3.22800000e 01, 4.84033333e 01,
6.45266667e 01, 8.06500000e 01, 9.67733333e 01, 1.12896667e 02,
1.29020000e 02, 1.45143333e 02, 1.61266667e 02]),
<a list of 10 Patch objects>)
base1 = data.loc[data['radiant_win'] == True]
len(base1)
233537
base2 = data.loc[data['radiant_win'] == False]
len(base2)
227513
# # Validation
total = len(base1) len(base2)
print(total)
print(len(data))
461050
461050
# # Plotting the graph for both sides, it seems they are nearly equal (no bias on the sides here)
temp_a = ['radiant', 'dire']
temp_b = [len(base1), len(base2)]
plt.bar(temp_a, temp_b)
<BarContainer object of 2 artists>
- First team to get ban also gets last ban
- First team to get ban gets first pick
- Second team to get ban gets second and third pick consecutively
- Second team to get ban gets last pick
ban_1 = data['1hero_id']
ban1_count = data.groupby(data['1hero_id']).size()
plt.rcParams['figure.figsize'] = 22, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(ban1_count.index, ban1_count.values)
[<matplotlib.lines.Line2D at 0x7f630a86b7b8>]
From this figure, we can say that the most banned heroes on the first ban phase from a certain team is Silencer, Undying and Doom.
ban2_count = data.groupby(data['2hero_id']).size()
plt.rcParams['figure.figsize'] = 20, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(ban2_count.index, ban2_count.values)
[<matplotlib.lines.Line2D at 0x7f630a709e48>]
The second ban phase also shows that Silencer, Undying and Doom are the most banned heroes, same as that of first ban phase
ban3_count = data.groupby(data['3hero_id']).size()
plt.rcParams['figure.figsize'] = 20, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(ban3_count.index, ban3_count.values)
[<matplotlib.lines.Line2D at 0x7f6309da1518>]
The third ban phase has a different pattern which shows a rise of Antimage, Bloodseeker, Doom, Earthshaker, Ogre Magi, Phantom Lancer, Spirit Breaker, Strom Spirit and Winter Wyvern, a total of 9 new heroes on ban
ban4_count = data.groupby(data['4hero_id']).size()
plt.rcParams['figure.figsize'] = 20, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(ban4_count.index, ban4_count.values)
[<matplotlib.lines.Line2D at 0x7f6304f7a630>]
The fourth ban phase shows similar pattern to the third ban phase with a exclusion of 2 heroes, Queen of Pain and Riki trying to come on top
heroes_list = []
for i, j in enumerate(heroes_dict):
hero_name = heroes_dict[j]
heroes_list.append(hero_name)
total_ban = 10
columns = ['1hero_id', '2hero_id', '3hero_id', '4hero_id', '9hero_id', '10hero_id', '11hero_id', '12hero_id', '17hero_id', '18hero_id']
all_data = pd.DataFrame(columns=columns, index=heroes_list)
# # Sorting alphabetically
all_data.sort_index()
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
1hero_id | 2hero_id | 3hero_id | 4hero_id | 9hero_id | 10hero_id | 11hero_id | 12hero_id | 17hero_id | 18hero_id | |
---|---|---|---|---|---|---|---|---|---|---|
Abaddon | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Alchemist | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Ancient Apparition | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Anti-Mage | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Arc Warden | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Axe | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bane | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Batrider | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Beastmaster | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bloodseeker | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bounty Hunter | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Brewmaster | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bristleback | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Broodmother | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Centaur Warrunner | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Chaos Knight | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Chen | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Clinkz | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Clockwerk | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Crystal Maiden | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Dark Seer | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Dark Willow | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Dazzle | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Death Prophet | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Disruptor | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Doom | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Dragon Knight | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Drow Ranger | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Earth Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Earthshaker | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Slark | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Sniper | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Spectre | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Spirit Breaker | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Storm Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Sven | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Techies | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Templar Assassin | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Terrorblade | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tidehunter | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Timbersaw | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tinker | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tiny | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Treant Protector | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Troll Warlord | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tusk | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Underlord | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Undying | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Ursa | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Vengeful Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Venomancer | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Viper | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Visage | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Warlock | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Weaver | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Windranger | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Winter Wyvern | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Witch Doctor | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Wraith King | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Zeus | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
116 rows ร 10 columns
for i in range(total_ban):
all_data[columns[i]] = data.groupby(data[columns[i]]).size()
all_data
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
1hero_id | 2hero_id | 3hero_id | 4hero_id | 9hero_id | 10hero_id | 11hero_id | 12hero_id | 17hero_id | 18hero_id | |
---|---|---|---|---|---|---|---|---|---|---|
Anti-Mage | 10887.0 | 12392.0 | 16132.0 | 16880.0 | 28283.0 | 27217.0 | 25382.0 | 24606.0 | 18704.0 | 18923.0 |
Axe | 2514.0 | 2809.0 | 3633.0 | 3745.0 | 9055.0 | 8164.0 | 6385.0 | 6429.0 | 5153.0 | 4957.0 |
Bane | 369.0 | 361.0 | 602.0 | 596.0 | 752.0 | 807.0 | 755.0 | 751.0 | 993.0 | 924.0 |
Bloodseeker | 20065.0 | 18299.0 | 15876.0 | 15072.0 | 14602.0 | 12813.0 | 11326.0 | 10766.0 | 7805.0 | 7472.0 |
Crystal Maiden | 1033.0 | 1342.0 | 1965.0 | 2241.0 | 2643.0 | 2644.0 | 2702.0 | 2653.0 | 3519.0 | 3228.0 |
Drow Ranger | 219.0 | 251.0 | 391.0 | 441.0 | 1571.0 | 1540.0 | 1343.0 | 1371.0 | 2249.0 | 2495.0 |
Earthshaker | 17621.0 | 18024.0 | 20185.0 | 19430.0 | 12875.0 | 11931.0 | 9991.0 | 9342.0 | 6693.0 | 6487.0 |
Juggernaut | 855.0 | 1028.0 | 1500.0 | 1744.0 | 4520.0 | 4700.0 | 5674.0 | 6254.0 | 7671.0 | 7803.0 |
Mirana | 354.0 | 369.0 | 520.0 | 488.0 | 1141.0 | 1169.0 | 1065.0 | 1046.0 | 1319.0 | 1368.0 |
Shadow Fiend | 6470.0 | 6652.0 | 7938.0 | 8425.0 | 11640.0 | 11353.0 | 11989.0 | 11927.0 | 16700.0 | 17998.0 |
Morphling | 86.0 | 94.0 | 112.0 | 106.0 | 153.0 | 151.0 | 154.0 | 170.0 | 171.0 | 204.0 |
Phantom Lancer | 23214.0 | 26772.0 | 29649.0 | 30681.0 | 29445.0 | 29746.0 | 24921.0 | 23018.0 | 12802.0 | 14218.0 |
Puck | 196.0 | 239.0 | 377.0 | 378.0 | 740.0 | 786.0 | 1006.0 | 1139.0 | 2272.0 | 2514.0 |
Pudge | 2530.0 | 2518.0 | 2265.0 | 2406.0 | 1976.0 | 1898.0 | 1956.0 | 1944.0 | 2247.0 | 2497.0 |
Razor | 435.0 | 437.0 | 612.0 | 572.0 | 1484.0 | 1415.0 | 1610.0 | 1647.0 | 2975.0 | 3174.0 |
Sand King | 131.0 | 129.0 | 241.0 | 257.0 | 530.0 | 643.0 | 755.0 | 726.0 | 1029.0 | 962.0 |
Storm Spirit | 8260.0 | 9621.0 | 10547.0 | 11679.0 | 8649.0 | 9927.0 | 10943.0 | 11175.0 | 13151.0 | 14245.0 |
Sven | 1011.0 | 991.0 | 1656.0 | 1966.0 | 5323.0 | 5432.0 | 6030.0 | 6173.0 | 6742.0 | 6744.0 |
Tiny | 560.0 | 595.0 | 880.0 | 891.0 | 2532.0 | 2760.0 | 2130.0 | 2130.0 | 2325.0 | 2216.0 |
Vengeful Spirit | 86.0 | 94.0 | 135.0 | 153.0 | 544.0 | 489.0 | 518.0 | 480.0 | 690.0 | 597.0 |
Windranger | 3140.0 | 3555.0 | 4818.0 | 4973.0 | 5260.0 | 5410.0 | 6861.0 | 6988.0 | 8411.0 | 8450.0 |
Zeus | 2256.0 | 2836.0 | 3890.0 | 4107.0 | 5688.0 | 5814.0 | 5999.0 | 6171.0 | 8699.0 | 8749.0 |
Kunkka | 85.0 | 81.0 | 93.0 | 111.0 | 291.0 | 285.0 | 307.0 | 340.0 | 438.0 | 437.0 |
Lina | 2760.0 | 3056.0 | 4048.0 | 4202.0 | 4622.0 | 4912.0 | 5738.0 | 5919.0 | 7156.0 | 7187.0 |
Lich | 936.0 | 1010.0 | 1734.0 | 1802.0 | 2654.0 | 2819.0 | 2623.0 | 2713.0 | 3681.0 | 3335.0 |
Lion | 1268.0 | 1318.0 | 2190.0 | 2286.0 | 3289.0 | 3173.0 | 3566.0 | 3566.0 | 5563.0 | 5010.0 |
Shadow Shaman | 613.0 | 634.0 | 1038.0 | 1176.0 | 1432.0 | 1552.0 | 1559.0 | 1572.0 | 1970.0 | 1777.0 |
Slardar | 3424.0 | 3872.0 | 5531.0 | 5802.0 | 6642.0 | 6375.0 | 6341.0 | 5884.0 | 5773.0 | 5578.0 |
Tidehunter | 3725.0 | 4717.0 | 5406.0 | 5908.0 | 8108.0 | 8026.0 | 7739.0 | 7552.0 | 8911.0 | 8118.0 |
Witch Doctor | 4167.0 | 5491.0 | 7914.0 | 8895.0 | 7374.0 | 7221.0 | 6942.0 | 7369.0 | 8627.0 | 7820.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Nyx Assassin | 236.0 | 258.0 | 407.0 | 423.0 | 840.0 | 873.0 | 926.0 | 926.0 | 1071.0 | 1031.0 |
Naga Siren | 578.0 | 573.0 | 794.0 | 841.0 | 1185.0 | 1247.0 | 1345.0 | 1433.0 | 1099.0 | 1149.0 |
Keeper of the Light | 128.0 | 152.0 | 271.0 | 226.0 | 336.0 | 360.0 | 315.0 | 364.0 | 376.0 | 328.0 |
Io | 2267.0 | 2130.0 | 1932.0 | 1861.0 | 1420.0 | 1456.0 | 730.0 | 727.0 | 2083.0 | 1572.0 |
Visage | 103.0 | 109.0 | 108.0 | 82.0 | 161.0 | 183.0 | 83.0 | 122.0 | 248.0 | 194.0 |
Slark | 2085.0 | 2536.0 | 3663.0 | 4017.0 | 5467.0 | 6109.0 | 7432.0 | 7881.0 | 7936.0 | 8194.0 |
Medusa | 905.0 | 1239.0 | 1947.0 | 2509.0 | 3096.0 | 4026.0 | 5219.0 | 5930.0 | 6113.0 | 7121.0 |
Troll Warlord | 427.0 | 488.0 | 751.0 | 783.0 | 1233.0 | 1311.0 | 1585.0 | 1705.0 | 2224.0 | 2228.0 |
Centaur Warrunner | 129.0 | 134.0 | 223.0 | 236.0 | 678.0 | 785.0 | 889.0 | 901.0 | 2151.0 | 1938.0 |
Magnus | 771.0 | 1075.0 | 1413.0 | 1603.0 | 7427.0 | 7055.0 | 6389.0 | 6340.0 | 7859.0 | 7037.0 |
Timbersaw | 221.0 | 201.0 | 270.0 | 297.0 | 424.0 | 452.0 | 543.0 | 521.0 | 883.0 | 874.0 |
Bristleback | 4171.0 | 4416.0 | 6131.0 | 6260.0 | 7154.0 | 7788.0 | 9052.0 | 8683.0 | 8964.0 | 8844.0 |
Tusk | 9493.0 | 9239.0 | 10723.0 | 10392.0 | 4119.0 | 4352.0 | 4590.0 | 4636.0 | 3273.0 | 3074.0 |
Skywrath Mage | 154.0 | 240.0 | 360.0 | 393.0 | 937.0 | 893.0 | 824.0 | 911.0 | 1183.0 | 969.0 |
Abaddon | 494.0 | 500.0 | 741.0 | 756.0 | 814.0 | 752.0 | 907.0 | 991.0 | 852.0 | 872.0 |
Elder Titan | 57.0 | 57.0 | 71.0 | 65.0 | 62.0 | 81.0 | 91.0 | 90.0 | 103.0 | 97.0 |
Legion Commander | 1560.0 | 1711.0 | 2356.0 | 2538.0 | 3676.0 | 3984.0 | 4190.0 | 4492.0 | 3395.0 | 3492.0 |
Ember Spirit | 2008.0 | 2191.0 | 3160.0 | 3332.0 | 4667.0 | 4826.0 | 5817.0 | 5896.0 | 5835.0 | 6070.0 |
Earth Spirit | NaN | NaN | 2.0 | NaN | 1.0 | 1.0 | 3.0 | 1.0 | 1.0 | 2.0 |
Terrorblade | NaN | 2.0 | 2.0 | 1.0 | 2.0 | NaN | 4.0 | 4.0 | 8.0 | 3.0 |
Phoenix | 303.0 | 354.0 | 536.0 | 572.0 | 806.0 | 940.0 | 1107.0 | 1165.0 | 1627.0 | 1502.0 |
Oracle | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | NaN | NaN | NaN |
Techies | 2398.0 | 2271.0 | 2055.0 | 1957.0 | 1200.0 | 1276.0 | 1183.0 | 1270.0 | 1234.0 | 1213.0 |
Winter Wyvern | 7721.0 | 7507.0 | 10042.0 | 9431.0 | 5778.0 | 5866.0 | 5407.0 | 5151.0 | 4014.0 | 3542.0 |
Arc Warden | 1.0 | NaN | 2.0 | NaN | NaN | 3.0 | 3.0 | 1.0 | 3.0 | 4.0 |
Underlord | 2.0 | NaN | 1.0 | NaN | 1.0 | 1.0 | NaN | 2.0 | NaN | 2.0 |
Monkey King | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Pangolier | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Dark Willow | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Grimstroke | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
116 rows ร 10 columns
# # For this context, null value is the 0 value (i.e hero is not picked on it's respective phase)
all_data.fillna(value=0)
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
1hero_id | 2hero_id | 3hero_id | 4hero_id | 9hero_id | 10hero_id | 11hero_id | 12hero_id | 17hero_id | 18hero_id | |
---|---|---|---|---|---|---|---|---|---|---|
Anti-Mage | 10887.0 | 12392.0 | 16132.0 | 16880.0 | 28283.0 | 27217.0 | 25382.0 | 24606.0 | 18704.0 | 18923.0 |
Axe | 2514.0 | 2809.0 | 3633.0 | 3745.0 | 9055.0 | 8164.0 | 6385.0 | 6429.0 | 5153.0 | 4957.0 |
Bane | 369.0 | 361.0 | 602.0 | 596.0 | 752.0 | 807.0 | 755.0 | 751.0 | 993.0 | 924.0 |
Bloodseeker | 20065.0 | 18299.0 | 15876.0 | 15072.0 | 14602.0 | 12813.0 | 11326.0 | 10766.0 | 7805.0 | 7472.0 |
Crystal Maiden | 1033.0 | 1342.0 | 1965.0 | 2241.0 | 2643.0 | 2644.0 | 2702.0 | 2653.0 | 3519.0 | 3228.0 |
Drow Ranger | 219.0 | 251.0 | 391.0 | 441.0 | 1571.0 | 1540.0 | 1343.0 | 1371.0 | 2249.0 | 2495.0 |
Earthshaker | 17621.0 | 18024.0 | 20185.0 | 19430.0 | 12875.0 | 11931.0 | 9991.0 | 9342.0 | 6693.0 | 6487.0 |
Juggernaut | 855.0 | 1028.0 | 1500.0 | 1744.0 | 4520.0 | 4700.0 | 5674.0 | 6254.0 | 7671.0 | 7803.0 |
Mirana | 354.0 | 369.0 | 520.0 | 488.0 | 1141.0 | 1169.0 | 1065.0 | 1046.0 | 1319.0 | 1368.0 |
Shadow Fiend | 6470.0 | 6652.0 | 7938.0 | 8425.0 | 11640.0 | 11353.0 | 11989.0 | 11927.0 | 16700.0 | 17998.0 |
Morphling | 86.0 | 94.0 | 112.0 | 106.0 | 153.0 | 151.0 | 154.0 | 170.0 | 171.0 | 204.0 |
Phantom Lancer | 23214.0 | 26772.0 | 29649.0 | 30681.0 | 29445.0 | 29746.0 | 24921.0 | 23018.0 | 12802.0 | 14218.0 |
Puck | 196.0 | 239.0 | 377.0 | 378.0 | 740.0 | 786.0 | 1006.0 | 1139.0 | 2272.0 | 2514.0 |
Pudge | 2530.0 | 2518.0 | 2265.0 | 2406.0 | 1976.0 | 1898.0 | 1956.0 | 1944.0 | 2247.0 | 2497.0 |
Razor | 435.0 | 437.0 | 612.0 | 572.0 | 1484.0 | 1415.0 | 1610.0 | 1647.0 | 2975.0 | 3174.0 |
Sand King | 131.0 | 129.0 | 241.0 | 257.0 | 530.0 | 643.0 | 755.0 | 726.0 | 1029.0 | 962.0 |
Storm Spirit | 8260.0 | 9621.0 | 10547.0 | 11679.0 | 8649.0 | 9927.0 | 10943.0 | 11175.0 | 13151.0 | 14245.0 |
Sven | 1011.0 | 991.0 | 1656.0 | 1966.0 | 5323.0 | 5432.0 | 6030.0 | 6173.0 | 6742.0 | 6744.0 |
Tiny | 560.0 | 595.0 | 880.0 | 891.0 | 2532.0 | 2760.0 | 2130.0 | 2130.0 | 2325.0 | 2216.0 |
Vengeful Spirit | 86.0 | 94.0 | 135.0 | 153.0 | 544.0 | 489.0 | 518.0 | 480.0 | 690.0 | 597.0 |
Windranger | 3140.0 | 3555.0 | 4818.0 | 4973.0 | 5260.0 | 5410.0 | 6861.0 | 6988.0 | 8411.0 | 8450.0 |
Zeus | 2256.0 | 2836.0 | 3890.0 | 4107.0 | 5688.0 | 5814.0 | 5999.0 | 6171.0 | 8699.0 | 8749.0 |
Kunkka | 85.0 | 81.0 | 93.0 | 111.0 | 291.0 | 285.0 | 307.0 | 340.0 | 438.0 | 437.0 |
Lina | 2760.0 | 3056.0 | 4048.0 | 4202.0 | 4622.0 | 4912.0 | 5738.0 | 5919.0 | 7156.0 | 7187.0 |
Lich | 936.0 | 1010.0 | 1734.0 | 1802.0 | 2654.0 | 2819.0 | 2623.0 | 2713.0 | 3681.0 | 3335.0 |
Lion | 1268.0 | 1318.0 | 2190.0 | 2286.0 | 3289.0 | 3173.0 | 3566.0 | 3566.0 | 5563.0 | 5010.0 |
Shadow Shaman | 613.0 | 634.0 | 1038.0 | 1176.0 | 1432.0 | 1552.0 | 1559.0 | 1572.0 | 1970.0 | 1777.0 |
Slardar | 3424.0 | 3872.0 | 5531.0 | 5802.0 | 6642.0 | 6375.0 | 6341.0 | 5884.0 | 5773.0 | 5578.0 |
Tidehunter | 3725.0 | 4717.0 | 5406.0 | 5908.0 | 8108.0 | 8026.0 | 7739.0 | 7552.0 | 8911.0 | 8118.0 |
Witch Doctor | 4167.0 | 5491.0 | 7914.0 | 8895.0 | 7374.0 | 7221.0 | 6942.0 | 7369.0 | 8627.0 | 7820.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Nyx Assassin | 236.0 | 258.0 | 407.0 | 423.0 | 840.0 | 873.0 | 926.0 | 926.0 | 1071.0 | 1031.0 |
Naga Siren | 578.0 | 573.0 | 794.0 | 841.0 | 1185.0 | 1247.0 | 1345.0 | 1433.0 | 1099.0 | 1149.0 |
Keeper of the Light | 128.0 | 152.0 | 271.0 | 226.0 | 336.0 | 360.0 | 315.0 | 364.0 | 376.0 | 328.0 |
Io | 2267.0 | 2130.0 | 1932.0 | 1861.0 | 1420.0 | 1456.0 | 730.0 | 727.0 | 2083.0 | 1572.0 |
Visage | 103.0 | 109.0 | 108.0 | 82.0 | 161.0 | 183.0 | 83.0 | 122.0 | 248.0 | 194.0 |
Slark | 2085.0 | 2536.0 | 3663.0 | 4017.0 | 5467.0 | 6109.0 | 7432.0 | 7881.0 | 7936.0 | 8194.0 |
Medusa | 905.0 | 1239.0 | 1947.0 | 2509.0 | 3096.0 | 4026.0 | 5219.0 | 5930.0 | 6113.0 | 7121.0 |
Troll Warlord | 427.0 | 488.0 | 751.0 | 783.0 | 1233.0 | 1311.0 | 1585.0 | 1705.0 | 2224.0 | 2228.0 |
Centaur Warrunner | 129.0 | 134.0 | 223.0 | 236.0 | 678.0 | 785.0 | 889.0 | 901.0 | 2151.0 | 1938.0 |
Magnus | 771.0 | 1075.0 | 1413.0 | 1603.0 | 7427.0 | 7055.0 | 6389.0 | 6340.0 | 7859.0 | 7037.0 |
Timbersaw | 221.0 | 201.0 | 270.0 | 297.0 | 424.0 | 452.0 | 543.0 | 521.0 | 883.0 | 874.0 |
Bristleback | 4171.0 | 4416.0 | 6131.0 | 6260.0 | 7154.0 | 7788.0 | 9052.0 | 8683.0 | 8964.0 | 8844.0 |
Tusk | 9493.0 | 9239.0 | 10723.0 | 10392.0 | 4119.0 | 4352.0 | 4590.0 | 4636.0 | 3273.0 | 3074.0 |
Skywrath Mage | 154.0 | 240.0 | 360.0 | 393.0 | 937.0 | 893.0 | 824.0 | 911.0 | 1183.0 | 969.0 |
Abaddon | 494.0 | 500.0 | 741.0 | 756.0 | 814.0 | 752.0 | 907.0 | 991.0 | 852.0 | 872.0 |
Elder Titan | 57.0 | 57.0 | 71.0 | 65.0 | 62.0 | 81.0 | 91.0 | 90.0 | 103.0 | 97.0 |
Legion Commander | 1560.0 | 1711.0 | 2356.0 | 2538.0 | 3676.0 | 3984.0 | 4190.0 | 4492.0 | 3395.0 | 3492.0 |
Ember Spirit | 2008.0 | 2191.0 | 3160.0 | 3332.0 | 4667.0 | 4826.0 | 5817.0 | 5896.0 | 5835.0 | 6070.0 |
Earth Spirit | 0.0 | 0.0 | 2.0 | 0.0 | 1.0 | 1.0 | 3.0 | 1.0 | 1.0 | 2.0 |
Terrorblade | 0.0 | 2.0 | 2.0 | 1.0 | 2.0 | 0.0 | 4.0 | 4.0 | 8.0 | 3.0 |
Phoenix | 303.0 | 354.0 | 536.0 | 572.0 | 806.0 | 940.0 | 1107.0 | 1165.0 | 1627.0 | 1502.0 |
Oracle | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 |
Techies | 2398.0 | 2271.0 | 2055.0 | 1957.0 | 1200.0 | 1276.0 | 1183.0 | 1270.0 | 1234.0 | 1213.0 |
Winter Wyvern | 7721.0 | 7507.0 | 10042.0 | 9431.0 | 5778.0 | 5866.0 | 5407.0 | 5151.0 | 4014.0 | 3542.0 |
Arc Warden | 1.0 | 0.0 | 2.0 | 0.0 | 0.0 | 3.0 | 3.0 | 1.0 | 3.0 | 4.0 |
Underlord | 2.0 | 0.0 | 1.0 | 0.0 | 1.0 | 1.0 | 0.0 | 2.0 | 0.0 | 2.0 |
Monkey King | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Pangolier | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Dark Willow | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Grimstroke | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
116 rows ร 10 columns
From this above table, we can see that 4 heroes (Monkey King, Pangolier, Dark Willow and Grimstroke) have 0 bans, it's because heroes api was updated on steam client which fetched the new heroes but weren't in the old meta.
# # Grouping the heroes for plotting purpose
sum_all_data = all_data.sum(axis=1)
sum_all_data
Anti-Mage 199406.0
Axe 52844.0
Bane 6910.0
Bloodseeker 134096.0
Crystal Maiden 23970.0
Drow Ranger 11871.0
Earthshaker 132579.0
Juggernaut 41749.0
Mirana 8839.0
Shadow Fiend 111092.0
Morphling 1401.0
Phantom Lancer 244466.0
Puck 9647.0
Pudge 22237.0
Razor 14361.0
Sand King 5403.0
Storm Spirit 108197.0
Sven 42068.0
Tiny 17019.0
Vengeful Spirit 3786.0
Windranger 57866.0
Zeus 54209.0
Kunkka 2468.0
Lina 49600.0
Lich 23307.0
Lion 31229.0
Shadow Shaman 13323.0
Slardar 55222.0
Tidehunter 68210.0
Witch Doctor 71820.0
...
Nyx Assassin 6991.0
Naga Siren 10244.0
Keeper of the Light 2856.0
Io 16178.0
Visage 1393.0
Slark 55320.0
Medusa 38105.0
Troll Warlord 12735.0
Centaur Warrunner 8064.0
Magnus 46969.0
Timbersaw 4686.0
Bristleback 71463.0
Tusk 63891.0
Skywrath Mage 6864.0
Abaddon 7679.0
Elder Titan 774.0
Legion Commander 31394.0
Ember Spirit 43802.0
Earth Spirit 11.0
Terrorblade 26.0
Phoenix 8912.0
Oracle 1.0
Techies 16057.0
Winter Wyvern 64459.0
Arc Warden 17.0
Underlord 9.0
Monkey King 0.0
Pangolier 0.0
Dark Willow 0.0
Grimstroke 0.0
Length: 116, dtype: float64
# # Plotting all the ban values
plt.grid()
plt.plot(sum_all_data.index, sum_all_data.values)
plt.xticks(rotation='vertical')
plt.yticks(np.arange(0, 350000, 50000))
([<matplotlib.axis.YTick at 0x7f6304e4e5f8>,
<matplotlib.axis.YTick at 0x7f6304e4e1d0>,
<matplotlib.axis.YTick at 0x7f6304e5f278>,
<matplotlib.axis.YTick at 0x7f6304cefda0>,
<matplotlib.axis.YTick at 0x7f6304cf7320>,
<matplotlib.axis.YTick at 0x7f6304cf7860>,
<matplotlib.axis.YTick at 0x7f6304cf7da0>],
<a list of 7 Text yticklabel objects>)
The above graphs shows the most banned heroes from all the 10 ban phases where most of them shows good distribution except 3 heroes (Phantom Lancer, Silencer and Undying)
pick1_count = data.groupby(data['5hero_id']).size()
plt.rcParams['figure.figsize'] = 20, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(pick1_count.index, pick1_count.values)
[<matplotlib.lines.Line2D at 0x7f6304c41860>]
This figure shows that picks are not as bad as ban as there are many option of heroes here to pick. These heroes include Crystal Maiden, Dazzzle, Earthshaker, Undying and Witch Doctor. This also shows that Undying is on both graphs (Pick and Ban) which means that Undying Hero was really popular in the meta
pick2_count = data.groupby(data['6hero_id']).size()
plt.rcParams['figure.figsize'] = 20, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(pick2_count.index, pick2_count.values)
[<matplotlib.lines.Line2D at 0x7f6304acd710>]
pick3_count = data.groupby(data['7hero_id']).size()
plt.rcParams['figure.figsize'] = 20, 6
plt.xticks(rotation='vertical')
plt.grid()
plt.plot(pick3_count.index, pick3_count.values)
[<matplotlib.lines.Line2D at 0x7f630495b438>]
As the six and seven pick always belong to the same team, we can conclude that the heroes of this graph and above can be paired on game. Heros like Crystal Maiden, Dazzle, Disruptor, Earthshaker, Lina, Lion, Ogre Magi, Omniknight, Shadow Sharman, Tush, Undying and Witch Doctor
total_pick = 10
columns = ['5hero_id', '6hero_id', '7hero_id', '8hero_id', '13hero_id', '14hero_id', '15hero_id', '16hero_id', '19hero_id', '20hero_id']
pick_all_data = pd.DataFrame(columns=columns, index=heroes_list)
pick_all_data
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
5hero_id | 6hero_id | 7hero_id | 8hero_id | 13hero_id | 14hero_id | 15hero_id | 16hero_id | 19hero_id | 20hero_id | |
---|---|---|---|---|---|---|---|---|---|---|
Anti-Mage | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Axe | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bane | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bloodseeker | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Crystal Maiden | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Drow Ranger | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Earthshaker | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Juggernaut | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Mirana | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Shadow Fiend | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Morphling | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Phantom Lancer | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Puck | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Pudge | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Razor | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Sand King | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Storm Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Sven | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tiny | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Vengeful Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Windranger | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Zeus | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Kunkka | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Lina | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Lich | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Lion | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Shadow Shaman | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Slardar | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tidehunter | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Witch Doctor | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Nyx Assassin | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Naga Siren | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Keeper of the Light | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Io | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Visage | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Slark | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Medusa | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Troll Warlord | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Centaur Warrunner | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Magnus | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Timbersaw | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Bristleback | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Tusk | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Skywrath Mage | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Abaddon | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Elder Titan | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Legion Commander | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Ember Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Earth Spirit | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Terrorblade | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Phoenix | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Oracle | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Techies | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Winter Wyvern | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Arc Warden | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Underlord | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Monkey King | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Pangolier | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Dark Willow | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Grimstroke | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
116 rows ร 10 columns
for i in range(total_pick):
pick_all_data[columns[i]] = data.groupby(data[columns[i]]).size()
# # As in our context, we fill Null values with 0 (i.e, not picked = 0)
pick_all_data.fillna(0)
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
5hero_id | 6hero_id | 7hero_id | 8hero_id | 13hero_id | 14hero_id | 15hero_id | 16hero_id | 19hero_id | 20hero_id | |
---|---|---|---|---|---|---|---|---|---|---|
Anti-Mage | 1473.0 | 1848.0 | 2392.0 | 4153.0 | 7617.0 | 7601.0 | 10191.0 | 10878.0 | 8406.0 | 7696.0 |
Axe | 2190.0 | 4781.0 | 5925.0 | 8543.0 | 9151.0 | 9182.0 | 6280.0 | 6383.0 | 4186.0 | 4300.0 |
Bane | 2753.0 | 3267.0 | 3127.0 | 3087.0 | 1762.0 | 2188.0 | 1598.0 | 1557.0 | 1046.0 | 1177.0 |
Bloodseeker | 3059.0 | 3238.0 | 3548.0 | 3781.0 | 5002.0 | 5159.0 | 5035.0 | 5079.0 | 3662.0 | 3765.0 |
Crystal Maiden | 23045.0 | 19252.0 | 16526.0 | 12551.0 | 6020.0 | 5344.0 | 4148.0 | 3672.0 | 2516.0 | 2449.0 |
Drow Ranger | 643.0 | 778.0 | 1266.0 | 1166.0 | 2437.0 | 2606.0 | 4318.0 | 4013.0 | 5552.0 | 5105.0 |
Earthshaker | 48622.0 | 42908.0 | 27645.0 | 25206.0 | 11511.0 | 10859.0 | 6555.0 | 6459.0 | 3515.0 | 3744.0 |
Juggernaut | 1513.0 | 1569.0 | 2802.0 | 2496.0 | 6426.0 | 6529.0 | 9972.0 | 9238.0 | 9286.0 | 8704.0 |
Mirana | 1732.0 | 1758.0 | 2654.0 | 2370.0 | 2375.0 | 2216.0 | 2256.0 | 2155.0 | 2592.0 | 2480.0 |
Shadow Fiend | 7807.0 | 7563.0 | 7064.0 | 5652.0 | 9155.0 | 7577.0 | 10826.0 | 9229.0 | 13617.0 | 11593.0 |
Morphling | 183.0 | 200.0 | 267.0 | 238.0 | 475.0 | 498.0 | 808.0 | 789.0 | 1472.0 | 1468.0 |
Phantom Lancer | 3531.0 | 2758.0 | 3689.0 | 4218.0 | 6122.0 | 5096.0 | 5679.0 | 6514.0 | 5509.0 | 5444.0 |
Puck | 470.0 | 526.0 | 721.0 | 802.0 | 1577.0 | 1717.0 | 2378.0 | 2537.0 | 3990.0 | 3739.0 |
Pudge | 2196.0 | 2162.0 | 2051.0 | 2189.0 | 2775.0 | 3000.0 | 3208.0 | 3330.0 | 6949.0 | 7078.0 |
Razor | 348.0 | 499.0 | 845.0 | 933.0 | 2081.0 | 2669.0 | 4003.0 | 4573.0 | 6139.0 | 6688.0 |
Sand King | 1863.0 | 1946.0 | 2984.0 | 2699.0 | 2488.0 | 2411.0 | 2095.0 | 2099.0 | 1933.0 | 2023.0 |
Storm Spirit | 1900.0 | 1663.0 | 1758.0 | 1760.0 | 3311.0 | 3167.0 | 4171.0 | 4233.0 | 6145.0 | 5728.0 |
Sven | 1443.0 | 1772.0 | 3189.0 | 3400.0 | 7796.0 | 8289.0 | 10552.0 | 10672.0 | 9727.0 | 9645.0 |
Tiny | 1402.0 | 1862.0 | 4017.0 | 3192.0 | 4141.0 | 4672.0 | 5506.0 | 5706.0 | 5101.0 | 5078.0 |
Vengeful Spirit | 4894.0 | 5192.0 | 5787.0 | 5422.0 | 3392.0 | 3382.0 | 2693.0 | 2532.0 | 1718.0 | 1762.0 |
Windranger | 5793.0 | 6006.0 | 8076.0 | 7514.0 | 11751.0 | 11135.0 | 12809.0 | 12558.0 | 14455.0 | 14261.0 |
Zeus | 2622.0 | 3085.0 | 4139.0 | 4047.0 | 4758.0 | 4901.0 | 5641.0 | 5460.0 | 6758.0 | 6708.0 |
Kunkka | 417.0 | 475.0 | 695.0 | 685.0 | 1356.0 | 1341.0 | 1703.0 | 1771.0 | 2328.0 | 2644.0 |
Lina | 7061.0 | 7297.0 | 8726.0 | 7886.0 | 6847.0 | 7031.0 | 7067.0 | 6938.0 | 7519.0 | 7650.0 |
Lich | 7179.0 | 7635.0 | 8946.0 | 8648.0 | 4262.0 | 4547.0 | 3221.0 | 3465.0 | 2335.0 | 2656.0 |
Lion | 17406.0 | 18357.0 | 16378.0 | 14377.0 | 7736.0 | 7930.0 | 6037.0 | 5931.0 | 3759.0 | 3837.0 |
Shadow Shaman | 9134.0 | 9050.0 | 9049.0 | 8020.0 | 3924.0 | 3975.0 | 3154.0 | 2971.0 | 2234.0 | 2238.0 |
Slardar | 5131.0 | 5519.0 | 5978.0 | 6809.0 | 9090.0 | 10425.0 | 9710.0 | 10032.0 | 7164.0 | 8078.0 |
Tidehunter | 6377.0 | 7403.0 | 8928.0 | 9241.0 | 9859.0 | 9527.0 | 6337.0 | 6409.0 | 4216.0 | 4395.0 |
Witch Doctor | 32153.0 | 27452.0 | 25251.0 | 19410.0 | 9888.0 | 9080.0 | 6628.0 | 6424.0 | 3586.0 | 3634.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Nyx Assassin | 331.0 | 663.0 | 770.0 | 1263.0 | 1671.0 | 1869.0 | 1638.0 | 1820.0 | 1631.0 | 1881.0 |
Naga Siren | 901.0 | 1186.0 | 1177.0 | 1492.0 | 1314.0 | 1490.0 | 1374.0 | 1470.0 | 1713.0 | 1725.0 |
Keeper of the Light | 1441.0 | 1630.0 | 1516.0 | 1669.0 | 942.0 | 1121.0 | 794.0 | 850.0 | 666.0 | 771.0 |
Io | 3079.0 | 3695.0 | 2107.0 | 1831.0 | 1825.0 | 1914.0 | 1252.0 | 1398.0 | 572.0 | 547.0 |
Visage | 499.0 | 498.0 | 569.0 | 521.0 | 540.0 | 556.0 | 452.0 | 432.0 | 366.0 | 354.0 |
Slark | 1110.0 | 1107.0 | 1689.0 | 1624.0 | 4424.0 | 4476.0 | 7054.0 | 7179.0 | 8033.0 | 7768.0 |
Medusa | 523.0 | 481.0 | 693.0 | 802.0 | 2522.0 | 2634.0 | 4182.0 | 5208.0 | 8642.0 | 9079.0 |
Troll Warlord | 467.0 | 472.0 | 719.0 | 762.0 | 1587.0 | 1869.0 | 2907.0 | 3027.0 | 3751.0 | 3777.0 |
Centaur Warrunner | 885.0 | 1032.0 | 2168.0 | 1911.0 | 5109.0 | 4925.0 | 3916.0 | 3846.0 | 3015.0 | 3038.0 |
Magnus | 1583.0 | 1653.0 | 3138.0 | 2986.0 | 6344.0 | 6059.0 | 5794.0 | 5628.0 | 5790.0 | 5524.0 |
Timbersaw | 502.0 | 558.0 | 1085.0 | 1059.0 | 2674.0 | 2754.0 | 2208.0 | 2216.0 | 1812.0 | 2030.0 |
Bristleback | 3234.0 | 3646.0 | 6566.0 | 6320.0 | 14142.0 | 13235.0 | 9747.0 | 9399.0 | 5951.0 | 6239.0 |
Tusk | 12848.0 | 10653.0 | 9702.0 | 8521.0 | 8499.0 | 7777.0 | 5743.0 | 5238.0 | 4005.0 | 4068.0 |
Skywrath Mage | 1763.0 | 2561.0 | 2824.0 | 3170.0 | 1895.0 | 2161.0 | 1667.0 | 1591.0 | 1380.0 | 1444.0 |
Abaddon | 1117.0 | 1517.0 | 1743.0 | 2068.0 | 2185.0 | 2493.0 | 2091.0 | 2292.0 | 1741.0 | 1895.0 |
Elder Titan | 389.0 | 422.0 | 518.0 | 532.0 | 603.0 | 631.0 | 507.0 | 511.0 | 528.0 | 496.0 |
Legion Commander | 1558.0 | 1726.0 | 2920.0 | 2888.0 | 6390.0 | 6678.0 | 7524.0 | 7403.0 | 7024.0 | 7089.0 |
Ember Spirit | 1364.0 | 1529.0 | 1949.0 | 2129.0 | 4207.0 | 4402.0 | 6366.0 | 6636.0 | 8558.0 | 8454.0 |
Earth Spirit | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Terrorblade | 2.0 | 1.0 | 2.0 | 2.0 | 4.0 | 3.0 | 7.0 | 3.0 | 14.0 | 7.0 |
Phoenix | 1138.0 | 1224.0 | 1865.0 | 2014.0 | 2944.0 | 3215.0 | 2607.0 | 2844.0 | 2633.0 | 2703.0 |
Oracle | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Techies | 405.0 | 375.0 | 367.0 | 358.0 | 351.0 | 358.0 | 340.0 | 421.0 | 972.0 | 1008.0 |
Winter Wyvern | 17538.0 | 17112.0 | 13430.0 | 12805.0 | 5970.0 | 6151.0 | 3645.0 | 3857.0 | 2227.0 | 2443.0 |
Arc Warden | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Underlord | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Monkey King | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Pangolier | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Dark Willow | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Grimstroke | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
116 rows ร 10 columns
sum_all_pick_data = pick_all_data.sum(axis=1)
sum_all_pick_data.head(2)
Anti-Mage 62255.0
Axe 60921.0
dtype: float64
plt.grid()
plt.plot(sum_all_pick_data.index, sum_all_pick_data.values)
plt.xticks(rotation='vertical')
plt.yticks(np.arange(0, 300000, 50000))
([<matplotlib.axis.YTick at 0x7f6304761438>,
<matplotlib.axis.YTick at 0x7f6304819e48>,
<matplotlib.axis.YTick at 0x7f63047a4b38>,
<matplotlib.axis.YTick at 0x7f63046c6d68>,
<matplotlib.axis.YTick at 0x7f63046c0a58>,
<matplotlib.axis.YTick at 0x7f63047106d8>],
<a list of 6 Text yticklabel objects>)
Although the ban phase was really bad distribution, the pick distribution was actually really good for the meta compared to the ban phase graph, which means that all the heroes got playtime on the game
temp = data.loc[data['1team_id'] == 0]
win1 = temp.loc[temp['radiant_win'] == True]
temp2 = data.loc[data['1team_id'] == 1]
win2 = temp2.loc[temp2['radiant_win'] == False]
to_concat_dataframes = [win1, win2]
all_win_data_only_1 = pd.concat(to_concat_dataframes)
temp = data.loc[data['1team_id'] == 0]
win1 = temp.loc[temp['radiant_win'] == False]
temp2 = data.loc[data['1team_id'] == 1]
win2 = temp2.loc[temp2['radiant_win'] == True]
to_concat_dataframes = [win1, win2]
all_win_data_only_2 = pd.concat(to_concat_dataframes)
# # Validation
print(all_win_data_only_1.shape)
print(all_win_data_only_2.shape)
print(all_win_data_only_1.shape[0] all_win_data_only_2.shape[0])
print(data.shape[0])
(233738, 64)
(227312, 64)
461050
461050
all_win_data_only_1.sort_index()
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
match_id | radiant_win | duration | 1is_pick | 1team_id | 1hero_id | 2is_pick | 2team_id | 2hero_id | 3is_pick | ... | 18is_pick | 18team_id | 18hero_id | 19is_pick | 19team_id | 19hero_id | 20is_pick | 20team_id | 20hero_id | minutes | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1928898739 | True | 2885 | False | 0 | Alchemist | False | 1 | Doom | False | ... | False | 0.0 | Chaos Knight | True | 1.0 | Techies | True | 0.0 | Medusa | 48.083333 |
1 | 1928932285 | True | 1894 | False | 0 | Doom | False | 1 | Abaddon | False | ... | False | 0.0 | Slardar | True | 1.0 | Magnus | True | 0.0 | Bounty Hunter | 31.566667 |
5 | 1928918721 | False | 2288 | False | 1 | Silencer | False | 0 | Undying | False | ... | False | 1.0 | Weaver | True | 0.0 | Bristleback | True | 1.0 | Legion Commander | 38.133333 |
7 | 1928896797 | True | 2768 | False | 0 | Huskar | False | 1 | Silencer | False | ... | False | 0.0 | Queen of Pain | True | 1.0 | Invoker | True | 0.0 | Necrophos | 46.133333 |
12 | 1928893986 | True | 2801 | False | 0 | Silencer | False | 1 | Omniknight | False | ... | False | 0.0 | Lina | True | 1.0 | Gyrocopter | True | 0.0 | Riki | 46.683333 |
13 | 1928901539 | False | 2814 | False | 1 | Silencer | False | 0 | Enigma | False | ... | False | 1.0 | Phantom Assassin | True | 0.0 | Pudge | True | 1.0 | Zeus | 46.950000 |
16 | 1928888035 | False | 2759 | False | 1 | Tusk | False | 0 | Phantom Lancer | False | ... | False | 1.0 | Tiny | True | 0.0 | Slark | True | 1.0 | Clockwerk | 45.983333 |
19 | 1928927985 | True | 1990 | False | 0 | Silencer | False | 1 | Tidehunter | False | ... | False | 0.0 | Tusk | True | 1.0 | Queen of Pain | True | 0.0 | Witch Doctor | 33.166667 |
21 | 1928890079 | False | 3048 | False | 1 | Silencer | False | 0 | Tidehunter | False | ... | False | 1.0 | Pudge | True | 0.0 | Windranger | True | 1.0 | Bristleback | 50.800000 |
22 | 1928935461 | True | 1625 | False | 0 | Bloodseeker | False | 1 | Alchemist | False | ... | False | 0.0 | Anti-Mage | True | 1.0 | Lifestealer | True | 0.0 | Queen of Pain | 27.083333 |
23 | 1928921906 | False | 2075 | False | 1 | Slardar | False | 0 | Tusk | False | ... | False | 1.0 | Ancient Apparition | True | 0.0 | Huskar | True | 1.0 | Clinkz | 34.583333 |
24 | 1928915628 | True | 2445 | False | 0 | Silencer | False | 1 | Ursa | False | ... | False | 0.0 | Sven | True | 1.0 | Luna | True | 0.0 | Drow Ranger | 40.750000 |
26 | 1928909378 | False | 2572 | False | 1 | Bloodseeker | False | 0 | Silencer | False | ... | False | 1.0 | Phantom Lancer | True | 0.0 | Sniper | True | 1.0 | Queen of Pain | 42.866667 |
27 | 1928914396 | True | 2417 | False | 0 | Alchemist | False | 1 | Queen of Pain | False | ... | False | 0.0 | Doom | True | 1.0 | Phantom Assassin | True | 0.0 | Juggernaut | 40.283333 |
30 | 1928898553 | False | 2687 | False | 1 | Io | False | 0 | Alchemist | False | ... | False | 1.0 | Dragon Knight | True | 0.0 | Troll Warlord | True | 1.0 | Queen of Pain | 44.783333 |
31 | 1928951637 | False | 1235 | False | 1 | Slardar | False | 0 | Doom | False | ... | False | 1.0 | Witch Doctor | True | 0.0 | Earthshaker | True | 1.0 | Templar Assassin | 20.583333 |
32 | 1928921308 | True | 2229 | False | 0 | Silencer | False | 1 | Omniknight | False | ... | False | 0.0 | Ursa | True | 1.0 | Faceless Void | True | 0.0 | Axe | 37.150000 |
36 | 1928932214 | True | 1807 | False | 0 | Earthshaker | False | 1 | Undying | False | ... | False | 0.0 | Phantom Lancer | True | 1.0 | Templar Assassin | True | 0.0 | Juggernaut | 30.116667 |
38 | 1928933341 | True | 2074 | False | 0 | Undying | False | 1 | Templar Assassin | False | ... | False | 0.0 | Tidehunter | True | 1.0 | Kunkka | True | 0.0 | Anti-Mage | 34.566667 |
41 | 1928917969 | False | 2162 | False | 1 | Doom | False | 0 | Razor | False | ... | False | 1.0 | Lich | True | 0.0 | Bristleback | True | 1.0 | Enchantress | 36.033333 |
42 | 1928921955 | True | 2053 | False | 0 | Undying | False | 1 | Phantom Lancer | False | ... | False | 0.0 | Silencer | True | 1.0 | Elder Titan | True | 0.0 | Ember Spirit | 34.216667 |
43 | 1928909735 | False | 2705 | False | 1 | Alchemist | False | 0 | Spirit Breaker | False | ... | False | 1.0 | Faceless Void | True | 0.0 | Ember Spirit | True | 1.0 | Shadow Fiend | 45.083333 |
46 | 1928948236 | False | 1736 | False | 1 | Phantom Lancer | False | 0 | Razor | False | ... | False | 1.0 | Faceless Void | True | 0.0 | Dazzle | True | 1.0 | Bristleback | 28.933333 |
47 | 1928899026 | True | 3118 | False | 0 | Pudge | False | 1 | Alchemist | False | ... | False | 0.0 | Windranger | True | 1.0 | Axe | True | 0.0 | Gyrocopter | 51.966667 |
48 | 1928900188 | True | 2922 | False | 0 | Silencer | False | 1 | Undying | False | ... | False | 0.0 | Chaos Knight | True | 1.0 | Windranger | True | 0.0 | Spectre | 48.700000 |
49 | 1928962208 | True | 1028 | False | 0 | Silencer | False | 1 | Doom | False | ... | False | 0.0 | Phantom Assassin | True | 1.0 | Anti-Mage | True | 0.0 | Pudge | 17.133333 |
51 | 1928893190 | False | 3308 | False | 1 | Doom | False | 0 | Tusk | False | ... | False | 1.0 | Phantom Lancer | True | 0.0 | Treant Protector | True | 1.0 | Wraith King | 55.133333 |
52 | 1928916542 | True | 2583 | False | 0 | Tidehunter | False | 1 | Bloodseeker | False | ... | False | 0.0 | Abaddon | True | 1.0 | Spectre | True | 0.0 | Warlock | 43.050000 |
53 | 1928921042 | True | 2377 | False | 0 | Undying | False | 1 | Doom | False | ... | False | 0.0 | Phantom Lancer | True | 1.0 | Slark | True | 0.0 | Death Prophet | 39.616667 |
55 | 1928965089 | False | 1037 | False | 1 | Doom | False | 0 | Undying | False | ... | False | 1.0 | Broodmother | True | 0.0 | Batrider | True | 1.0 | Silencer | 17.283333 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
460997 | 1829145682 | False | 2957 | False | 1 | Undying | False | 0 | Anti-Mage | False | ... | False | 1.0 | Faceless Void | True | 0.0 | Gyrocopter | True | 1.0 | Wraith King | 49.283333 |
460998 | 1829191221 | False | 2039 | False | 1 | Bloodseeker | False | 0 | Lifestealer | False | ... | False | 1.0 | Weaver | True | 0.0 | Brewmaster | True | 1.0 | Tiny | 33.983333 |
461000 | 1829178101 | False | 2252 | False | 1 | Windranger | False | 0 | Bane | False | ... | False | 1.0 | Riki | True | 0.0 | Queen of Pain | True | 1.0 | Templar Assassin | 37.533333 |
461001 | 1829156294 | True | 3013 | False | 0 | Silencer | False | 1 | Huskar | False | ... | False | 0.0 | Gyrocopter | True | 1.0 | Zeus | True | 0.0 | Queen of Pain | 50.216667 |
461002 | 1829193274 | True | 1807 | False | 0 | Bloodseeker | False | 1 | Sven | False | ... | False | 0.0 | Storm Spirit | True | 1.0 | Puck | True | 0.0 | Sniper | 30.116667 |
461005 | 1829120346 | True | 3632 | False | 0 | Silencer | False | 1 | Phantom Lancer | False | ... | False | 0.0 | Slark | True | 1.0 | Winter Wyvern | True | 0.0 | Pudge | 60.533333 |
461008 | 1829150986 | False | 3087 | False | 1 | Slark | False | 0 | Spirit Breaker | False | ... | False | 1.0 | Bristleback | True | 0.0 | Pudge | True | 1.0 | Shadow Fiend | 51.450000 |
461011 | 1829197240 | False | 2033 | False | 1 | Bloodseeker | False | 0 | Earthshaker | False | ... | False | 1.0 | Zeus | True | 0.0 | Anti-Mage | True | 1.0 | Windranger | 33.883333 |
461012 | 1829205428 | False | 1868 | False | 1 | Undying | False | 0 | Bloodseeker | False | ... | False | 1.0 | Medusa | True | 0.0 | Spectre | True | 1.0 | Weaver | 31.133333 |
461014 | 1829169148 | False | 2593 | False | 1 | Spirit Breaker | False | 0 | Leshrac | False | ... | False | 1.0 | Slark | True | 0.0 | Ursa | True | 1.0 | Phantom Lancer | 43.216667 |
461016 | 1829181890 | True | 2412 | False | 0 | Enigma | False | 1 | Undying | False | ... | False | 0.0 | Phantom Assassin | True | 1.0 | Chaos Knight | True | 0.0 | Sven | 40.200000 |
461018 | 1829131276 | False | 3432 | False | 1 | Silencer | False | 0 | Undying | False | ... | False | 1.0 | Anti-Mage | True | 0.0 | Juggernaut | True | 1.0 | Night Stalker | 57.200000 |
461019 | 1829151361 | True | 3307 | False | 0 | Omniknight | False | 1 | Riki | False | ... | False | 0.0 | Spirit Breaker | True | 1.0 | Undying | True | 0.0 | Sven | 55.116667 |
461020 | 1829167848 | False | 2724 | False | 1 | Silencer | False | 0 | Undying | False | ... | False | 1.0 | Pugna | True | 0.0 | Lion | True | 1.0 | Sven | 45.400000 |
461022 | 1829123884 | False | 3565 | False | 1 | Winter Wyvern | False | 0 | Lina | False | ... | False | 1.0 | Anti-Mage | True | 0.0 | Wraith King | True | 1.0 | Phantom Assassin | 59.416667 |
461027 | 1829173133 | False | 2714 | False | 1 | Silencer | False | 0 | Queen of Pain | False | ... | False | 1.0 | Phantom Assassin | True | 0.0 | Templar Assassin | True | 1.0 | Ember Spirit | 45.233333 |
461028 | 1829216259 | True | 1953 | False | 0 | Omniknight | False | 1 | Silencer | False | ... | False | 0.0 | Slark | True | 1.0 | Storm Spirit | True | 0.0 | Queen of Pain | 32.550000 |
461030 | 1829211652 | True | 2047 | False | 0 | Lifestealer | False | 1 | Anti-Mage | False | ... | False | 0.0 | Necrophos | True | 1.0 | Shadow Shaman | True | 0.0 | Warlock | 34.116667 |
461031 | 1829173426 | False | 2471 | False | 1 | Phantom Lancer | False | 0 | Shadow Fiend | False | ... | False | 1.0 | Magnus | True | 0.0 | Spirit Breaker | True | 1.0 | Meepo | 41.183333 |
461033 | 1829141533 | False | 3274 | False | 1 | Silencer | False | 0 | Phantom Assassin | False | ... | False | 1.0 | Ursa | True | 0.0 | Bounty Hunter | True | 1.0 | Pudge | 54.566667 |
461035 | 1829187976 | True | 2505 | False | 0 | Chaos Knight | False | 1 | Riki | False | ... | False | 0.0 | Elder Titan | True | 1.0 | Bristleback | True | 0.0 | Pudge | 41.750000 |
461036 | 1829157021 | True | 3048 | False | 0 | Storm Spirit | False | 1 | Undying | False | ... | False | 0.0 | Ursa | True | 1.0 | Broodmother | True | 0.0 | Phoenix | 50.800000 |
461037 | 1829212312 | True | 1664 | False | 0 | Silencer | False | 1 | Enigma | False | ... | False | 0.0 | Queen of Pain | True | 1.0 | Juggernaut | True | 0.0 | Shadow Fiend | 27.733333 |
461038 | 1829163603 | True | 3003 | False | 0 | Phantom Lancer | False | 1 | Axe | False | ... | False | 0.0 | Gyrocopter | True | 1.0 | Storm Spirit | True | 0.0 | Lion | 50.050000 |
461039 | 1829158252 | False | 2926 | False | 1 | Bloodseeker | False | 0 | Slark | False | ... | False | 1.0 | Silencer | True | 0.0 | Death Prophet | True | 1.0 | Skywrath Mage | 48.766667 |
461041 | 1829201186 | True | 2123 | False | 0 | Omniknight | False | 1 | Bloodseeker | False | ... | False | 0.0 | Leshrac | True | 1.0 | Gyrocopter | True | 0.0 | Legion Commander | 35.383333 |
461044 | 1829146665 | True | 3181 | False | 0 | Dazzle | False | 1 | Omniknight | False | ... | False | 0.0 | Riki | True | 1.0 | Juggernaut | True | 0.0 | Anti-Mage | 53.016667 |
461045 | 1829200497 | False | 2248 | False | 1 | Undying | False | 0 | Huskar | False | ... | False | 1.0 | Broodmother | True | 0.0 | Clockwerk | True | 1.0 | Omniknight | 37.466667 |
461046 | 1829177389 | True | 2755 | False | 0 | Silencer | False | 1 | Bloodseeker | False | ... | False | 0.0 | Ursa | True | 1.0 | Shadow Fiend | True | 0.0 | Luna | 45.916667 |
461048 | 1829220503 | False | 1609 | False | 1 | Anti-Mage | False | 0 | Omniknight | False | ... | False | 1.0 | Lion | True | 0.0 | Nature's Prophet | True | 1.0 | Gyrocopter | 26.816667 |
233738 rows ร 64 columns
all_win_data_only_2.sort_index()
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
</style>
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
match_id | radiant_win | duration | 1is_pick | 1team_id | 1hero_id | 2is_pick | 2team_id | 2hero_id | 3is_pick | ... | 18is_pick | 18team_id | 18hero_id | 19is_pick | 19team_id | 19hero_id | 20is_pick | 20team_id | 20hero_id | minutes | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | 1928903165 | True | 2424 | False | 1 | Undying | False | 0 | Ancient Apparition | False | ... | False | 1.0 | Viper | True | 0.0 | Enchantress | True | 1.0 | Enigma | 40.400000 |
3 | 1928907204 | True | 2588 | False | 1 | Spirit Breaker | False | 0 | Alchemist | False | ... | False | 1.0 | Ancient Apparition | True | 0.0 | Dazzle | True | 1.0 | Windranger | 43.133333 |
4 | 1928865084 | True | 3658 | False | 1 | Phantom Lancer | False | 0 | Wraith King | False | ... | False | 1.0 | Spectre | True | 0.0 | Gyrocopter | True | 1.0 | Venomancer | 60.966667 |
6 | 1928926702 | True | 1998 | False | 1 | Undying | False | 0 | Silencer | False | ... | False | 1.0 | Ancient Apparition | True | 0.0 | Death Prophet | True | 1.0 | Kunkka | 33.300000 |
8 | 1928902687 | False | 2595 | False | 0 | Silencer | False | 1 | Omniknight | False | ... | False | 0.0 | Shadow Fiend | True | 1.0 | Weaver | True | 0.0 | Windranger | 43.250000 |
9 | 1928917475 | False | 2019 | False | 0 | Doom | False | 1 | Undying | False | ... | False | 0.0 | Vengeful Spirit | True | 1.0 | Lion | True | 0.0 | Disruptor | 33.650000 |
10 | 1928908270 | False | 2329 | False | 0 | Alchemist | False | 1 | Anti-Mage | False | ... | False | 0.0 | Rubick | True | 1.0 | Viper | True | 0.0 | Dragon Knight | 38.816667 |
11 | 1928901534 | True | 2626 | False | 1 | Riki | False | 0 | Windranger | False | ... | False | 1.0 | Gyrocopter | True | 0.0 | Weaver | True | 1.0 | Juggernaut | 43.766667 |
14 | 1928897896 | False | 2841 | False | 0 | Doom | False | 1 | Io | False | ... | False | 0.0 | Anti-Mage | True | 1.0 | Necrophos | True | 0.0 | Dark Seer | 47.350000 |
15 | 1928914863 | False | 2380 | False | 0 | Tusk | False | 1 | Alchemist | False | ... | False | 0.0 | Faceless Void | True | 1.0 | Spectre | True | 0.0 | Ember Spirit | 39.666667 |
17 | 1928904698 | True | 2758 | False | 1 | Doom | False | 0 | Slardar | False | ... | False | 1.0 | Lion | True | 0.0 | Magnus | True | 1.0 | Disruptor | 45.966667 |
18 | 1928925391 | True | 1675 | False | 1 | Alchemist | False | 0 | Templar Assassin | False | ... | False | 1.0 | Gyrocopter | True | 0.0 | Lifestealer | True | 1.0 | Invoker | 27.916667 |
20 | 1928947968 | True | 1499 | False | 1 | Winter Wyvern | False | 0 | Alchemist | False | ... | False | 1.0 | Anti-Mage | True | 0.0 | Phantom Assassin | True | 1.0 | Legion Commander | 24.983333 |
25 | 1928882302 | False | 3297 | False | 0 | Phantom Lancer | False | 1 | Alchemist | False | ... | False | 0.0 | Sniper | True | 1.0 | Witch Doctor | True | 0.0 | Drow Ranger | 54.950000 |
28 | 1928898323 | False | 2830 | False | 0 | Riki | False | 1 | Phantom Lancer | False | ... | False | 0.0 | Viper | True | 1.0 | Chaos Knight | True | 0.0 | Huskar | 47.166667 |
29 | 1928898031 | True | 2984 | False | 1 | Legion Commander | False | 0 | Doom | False | ... | False | 1.0 | Troll Warlord | True | 0.0 | Ancient Apparition | True | 1.0 | Bristleback | 49.733333 |
33 | 1928916547 | True | 2504 | False | 1 | Doom | False | 0 | Undying | False | ... | False | 1.0 | Bounty Hunter | True | 0.0 | Lich | True | 1.0 | Rubick | 41.733333 |
34 | 1928922418 | False | 2250 | False | 0 | Alchemist | False | 1 | Doom | False | ... | False | 0.0 | Spectre | True | 1.0 | Spirit Breaker | True | 0.0 | Ursa | 37.500000 |
35 | 1928899945 | False | 3131 | False | 0 | Doom | False | 1 | Ember Spirit | False | ... | False | 0.0 | Necrophos | True | 1.0 | Meepo | True | 0.0 | Chaos Knight | 52.183333 |
37 | 1928904736 | True | 2738 | False | 1 | Silencer | False | 0 | Earthshaker | False | ... | False | 1.0 | Crystal Maiden | True | 0.0 | Rubick | True | 1.0 | Storm Spirit | 45.633333 |
39 | 1928918024 | False | 2016 | False | 0 | Queen of Pain | False | 1 | Silencer | False | ... | False | 0.0 | Broodmother | True | 1.0 | Invoker | True | 0.0 | Slardar | 33.600000 |
40 | 1928904474 | True | 2710 | False | 1 | Silencer | False | 0 | Legion Commander | False | ... | False | 1.0 | Razor | True | 0.0 | Earthshaker | True | 1.0 | Lich | 45.166667 |
44 | 1928906773 | True | 2527 | False | 1 | Omniknight | False | 0 | Undying | False | ... | False | 1.0 | Death Prophet | True | 0.0 | Gyrocopter | True | 1.0 | Razor | 42.116667 |
45 | 1928908555 | False | 2651 | False | 0 | Doom | False | 1 | Undying | False | ... | False | 0.0 | Witch Doctor | True | 1.0 | Disruptor | True | 0.0 | Ancient Apparition | 44.183333 |
50 | 1928907445 | False | 2720 | False | 0 | Phantom Lancer | False | 1 | Omniknight | False | ... | False | 0.0 | Earthshaker | True | 1.0 | Magnus | True | 0.0 | Sniper | 45.333333 |
54 | 1928899687 | True | 2998 | False | 1 | Earthshaker | False | 0 | Phantom Lancer | False | ... | False | 1.0 | Huskar | True | 0.0 | Medusa | True | 1.0 | Anti-Mage | 49.966667 |
56 | 1928920811 | True | 2014 | False | 1 | Phantom Lancer | False | 0 | Silencer | False | ... | False | 1.0 | Anti-Mage | True | 0.0 | Storm Spirit | True | 1.0 | Centaur Warrunner | 33.566667 |
57 | 1928926136 | True | 1986 | False | 1 | Spirit Breaker | False | 0 | Doom | False | ... | False | 1.0 | Bounty Hunter | True | 0.0 | Lion | True | 1.0 | Disruptor | 33.100000 |
59 | 1928912675 | False | 2303 | False | 0 | Tusk | False | 1 | Doom | False | ... | False | 0.0 | Phantom Lancer | True | 1.0 | Medusa | True | 0.0 | Wraith King | 38.383333 |
61 | 1928909182 | False | 2879 | False | 0 | Doom | False | 1 | Spirit Breaker | False | ... | False | 0.0 | Broodmother | True | 1.0 | Drow Ranger | True | 0.0 | Gyrocopter | 47.983333 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
460979 | 1829180976 | True | 2043 | False | 1 | Silencer | False | 0 | Undying | False | ... | False | 1.0 | Weaver | True | 0.0 | Night Stalker | True | 1.0 | Tidehunter | 34.050000 |
460982 | 1829211600 | True | 1546 | False | 1 | Storm Spirit | False | 0 | Silencer | False | ... | False | 1.0 | Tidehunter | True | 0.0 | Axe | True | 1.0 | Spectre | 25.766667 |
460988 | 1829191408 | True | 2322 | False | 1 | Silencer | False | 0 | Witch Doctor | False | ... | False | 1.0 | Medusa | True | 0.0 | Invoker | True | 1.0 | Shadow Fiend | 38.700000 |
460990 | 1829202355 | True | 1407 | False | 1 | Lina | False | 0 | Bounty Hunter | False | ... | False | 1.0 | Storm Spirit | True | 0.0 | Batrider | True | 1.0 | Phoenix | 23.450000 |
460991 | 1829150323 | False | 2739 | False | 0 | Shadow Fiend | False | 1 | Undying | False | ... | False | 0.0 | Anti-Mage | True | 1.0 | Chaos Knight | True | 0.0 | Sven | 45.650000 |
460994 | 1829217329 | False | 1446 | False | 0 | Faceless Void | False | 1 | Naga Siren | False | ... | False | 0.0 | Tusk | True | 1.0 | Night Stalker | True | 0.0 | Anti-Mage | 24.100000 |
460996 | 1829155443 | False | 2380 | False | 0 | Silencer | False | 1 | Wraith King | False | ... | False | 0.0 | Sven | True | 1.0 | Axe | True | 0.0 | Shadow Fiend | 39.666667 |
460999 | 1829159866 | True | 2686 | False | 1 | Storm Spirit | False | 0 | Zeus | False | ... | False | 1.0 | Earthshaker | True | 0.0 | Clinkz | True | 1.0 | Phantom Lancer | 44.766667 |
461003 | 1829173298 | False | 2305 | False | 0 | Death Prophet | False | 1 | Storm Spirit | False | ... | False | 0.0 | Phantom Assassin | True | 1.0 | Luna | True | 0.0 | Morphling | 38.416667 |
461004 | 1829154867 | True | 2973 | False | 1 | Undying | False | 0 | Silencer | False | ... | False | 1.0 | Storm Spirit | True | 0.0 | Queen of Pain | True | 1.0 | Pudge | 49.550000 |
461006 | 1829185496 | True | 2192 | False | 1 | Undying | False | 0 | Omniknight | False | ... | False | 1.0 | Magnus | True | 0.0 | Sniper | True | 1.0 | Phantom Assassin | 36.533333 |
461007 | 1829172438 | False | 2486 | False | 0 | Silencer | False | 1 | Doom | False | ... | False | 0.0 | Ancient Apparition | True | 1.0 | Pugna | True | 0.0 | Shadow Fiend | 41.433333 |
461009 | 1829123849 | True | 3479 | False | 1 | Ursa | False | 0 | Phantom Lancer | False | ... | False | 1.0 | Omniknight | True | 0.0 | Death Prophet | True | 1.0 | Bristleback | 57.983333 |
461010 | 1829160208 | True | 2652 | False | 1 | Doom | False | 0 | Chaos Knight | False | ... | False | 1.0 | Ogre Magi | True | 0.0 | Bane | True | 1.0 | Pugna | 44.200000 |
461013 | 1829189540 | False | 2252 | False | 0 | Witch Doctor | False | 1 | Undying | False | ... | False | 0.0 | Leshrac | True | 1.0 | Silencer | True | 0.0 | Lifestealer | 37.533333 |
461015 | 1829198889 | False | 2133 | False | 0 | Spirit Breaker | False | 1 | Silencer | False | ... | False | 0.0 | Tidehunter | True | 1.0 | Templar Assassin | True | 0.0 | Bounty Hunter | 35.550000 |
461017 | 1829153572 | False | 2997 | False | 0 | Storm Spirit | False | 1 | Phantom Lancer | False | ... | False | 0.0 | Faceless Void | True | 1.0 | Slark | True | 0.0 | Magnus | 49.950000 |
461021 | 1829209036 | True | 1946 | False | 1 | Tidehunter | False | 0 | Bristleback | False | ... | False | 1.0 | Queen of Pain | True | 0.0 | Necrophos | True | 1.0 | Lina | 32.433333 |
461023 | 1829234020 | False | 1078 | False | 0 | Phantom Assassin | False | 1 | Phantom Lancer | False | ... | False | 0.0 | Techies | True | 1.0 | Viper | True | 0.0 | Vengeful Spirit | 17.966667 |
461024 | 1829111018 | True | 4180 | False | 1 | Earthshaker | False | 0 | Huskar | False | ... | False | 1.0 | Winter Wyvern | True | 0.0 | Enigma | True | 1.0 | Ember Spirit | 69.666667 |
461025 | 1829186282 | False | 2266 | False | 0 | Naga Siren | False | 1 | Undying | False | ... | False | 0.0 | Spirit Breaker | True | 1.0 | Night Stalker | True | 0.0 | Clinkz | 37.766667 |
461026 | 1829179699 | False | 2367 | False | 0 | Bloodseeker | False | 1 | Storm Spirit | False | ... | False | 0.0 | Spirit Breaker | True | 1.0 | Ogre Magi | True | 0.0 | Witch Doctor | 39.450000 |
461029 | 1829147824 | False | 3072 | False | 0 | Enigma | False | 1 | Witch Doctor | False | ... | False | 0.0 | Storm Spirit | True | 1.0 | Zeus | True | 0.0 | Lion | 51.200000 |
461032 | 1829234154 | True | 1426 | False | 1 | Phantom Lancer | False | 0 | Riki | False | ... | False | 1.0 | Pudge | True | 0.0 | Huskar | True | 1.0 | Juggernaut | 23.766667 |
461034 | 1829153980 | True | 2956 | False | 1 | Techies | False | 0 | Bloodseeker | False | ... | False | 1.0 | Lion | True | 0.0 | Legion Commander | True | 1.0 | Wraith King | 49.266667 |
461040 | 1829185825 | True | 2304 | False | 1 | Undying | False | 0 | Naga Siren | False | ... | False | 1.0 | Anti-Mage | True | 0.0 | Slark | True | 1.0 | Lifestealer | 38.400000 |
461042 | 1829093169 | False | 4199 | False | 0 | Zeus | False | 1 | Bounty Hunter | False | ... | False | 0.0 | Storm Spirit | True | 1.0 | Viper | True | 0.0 | Shadow Fiend | 69.983333 |
461043 | 1829173585 | False | 2658 | False | 0 | Lifestealer | False | 1 | Spirit Breaker | False | ... | False | 0.0 | Tidehunter | True | 1.0 | Medusa | True | 0.0 | Spectre | 44.300000 |
461047 | 1829187140 | True | 2346 | False | 1 | Phantom Assassin | False | 0 | Tidehunter | False | ... | False | 1.0 | Puck | True | 0.0 | Windranger | True | 1.0 | Tusk | 39.100000 |
461049 | 1829227757 | True | 1584 | False | 1 | Spirit Breaker | False | 0 | Tusk | False | ... | False | 1.0 | Dark Seer | True | 0.0 | Timbersaw | True | 1.0 | Ember Spirit | 26.400000 |
227312 rows ร 64 columns
# # Getting the hero with the most wins
total_pick_heroes = 10
pick_heroes_range = [5, 8, 14, 16, 19, 6, 7, 13, 15, 20]
change_count = 5
most_picked_hero_win_list = {}
for i in range(total_pick_heroes):
hero_id = '{}hero_id'.format(pick_heroes_range[i])
if i >= 5:
most_win_hero = all_win_data_only_2.groupby([hero_id]).size().sort_values(ascending=False).index[0]
most_win_hero_stats = all_win_data_only_2.groupby([hero_id]).size().sort_values(ascending=False)[0]
if most_win_hero in most_picked_hero_win_list:
most_picked_hero_win_list[most_win_hero] = most_win_hero_stats
else:
most_picked_hero_win_list[most_win_hero] = most_win_hero_stats
else:
most_win_hero = all_win_data_only_1.groupby([hero_id]).size().sort_values(ascending=False).index[0]
most_win_hero_stats = all_win_data_only_1.groupby([hero_id]).size().sort_values(ascending=False)[0]
if most_win_hero in most_picked_hero_win_list:
most_picked_hero_win_list[most_win_hero] = most_win_hero_stats
else:
most_picked_hero_win_list[most_win_hero] = most_win_hero_stats
# # Total games
data.shape[0]
print('Total Games: ', data.shape[0])
Total Games: 461050
most_picked_hero_win_list
{'Earthshaker': 71882,
'Bristleback': 13658,
'Gyrocopter': 14346,
'Windranger': 14129}
# # Validation
71882 13658 14346 14129 < 461050
True
# # We can take win rates for 1st picked team. (i.e: 5, 8, 14, 16, 19)
# # We can take win rates for 2nd picked team. (i.e: 6, 7, 13, 15, 20)
grouped_win_1 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '14hero_id', '16hero_id', '19hero_id']).size()
grouped_win_2 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '13hero_id', '15hero_id', '20hero_id']).size()
temp_groups = [grouped_win_1, grouped_win_2]
winning_combination_5 = pd.concat(temp_groups)
winning_combination_5 = winning_combination_5.groupby(winning_combination_5.index).sum().sort_values(ascending=False)
(Shadow Fiend, Winter Wyvern, Gyrocopter, Rubick, Ember Spirit) 3
(Earthshaker, Witch Doctor, Spirit Breaker, Anti-Mage, Sven) 3
(Lion, Warlock, Shadow Fiend, Windranger, Invoker) 3
dtype: int64
max_value = winning_combination_5[0]
winning_combination_5.loc[winning_combination_5.values == max_value]
(Shadow Fiend, Winter Wyvern, Gyrocopter, Rubick, Ember Spirit) 3
(Earthshaker, Witch Doctor, Spirit Breaker, Anti-Mage, Sven) 3
(Lion, Warlock, Shadow Fiend, Windranger, Invoker) 3
(Earthshaker, Shadow Fiend, Dark Seer, Ember Spirit, Windranger) 3
(Witch Doctor, Crystal Maiden, Bristleback, Sven, Queen of Pain) 3
(Ancient Apparition, Lion, Queen of Pain, Phantom Lancer, Ember Spirit) 3
(Witch Doctor, Spirit Breaker, Io, Tiny, Magnus) 3
(Witch Doctor, Tidehunter, Enigma, Sven, Shadow Fiend) 3
(Winter Wyvern, Earthshaker, Clockwerk, Windranger, Ember Spirit) 3
(Shadow Fiend, Earthshaker, Clockwerk, Ancient Apparition, Ember Spirit) 3
(Shadow Fiend, Earthshaker, Gyrocopter, Clockwerk, Bounty Hunter) 3
(Winter Wyvern, Earthshaker, Dark Seer, Shadow Fiend, Windranger) 3
(Omniknight, Crystal Maiden, Bristleback, Phantom Assassin, Viper) 3
(Omniknight, Phantom Assassin, Shadow Shaman, Wraith King, Anti-Mage) 3
(Crystal Maiden, Enigma, Magnus, Sven, Shadow Fiend) 3
(Crystal Maiden, Vengeful Spirit, Luna, Drow Ranger, Sven) 3
(Earthshaker, Dazzle, Bristleback, Shadow Fiend, Faceless Void) 3
dtype: int64
# # Validating
winning_combination_5.shape[0] < (118 * 118 * 118 * 118 * 118)
True
Playing the combination of these heroes was the highest (i.e=3). Out of 4 hundred thousand matches, only 6 combinations has the rate of winning and that is only of 3. This shows that picking the best win rate hero doesn't necessarly win the match, there should be good combination of all the heroes of the same team
# # Validation
# # C = Combination
# # 5C4 = 5
# # We can take win rates for 1st picked team. (i.e: 5, 8, 14, 16, 19)
# # We can take win rates for 2nd picked team. (i.e: 6, 7, 13, 15, 20)
# # grouped_win_1 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '14hero_id', '16hero_id', '19hero_id']).size()
grouped_win_1 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '14hero_id', '16hero_id']).size()
grouped_win_2 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '14hero_id', '19hero_id']).size()
grouped_win_3 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '16hero_id', '19hero_id']).size()
grouped_win_4 = all_win_data_only_1.groupby(['5hero_id', '14hero_id', '16hero_id', '19hero_id']).size()
grouped_win_5 = all_win_data_only_1.groupby(['8hero_id', '14hero_id', '16hero_id', '19hero_id']).size()
# # grouped_win_2 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '13hero_id', '15hero_id', '20hero_id']).size()
grouped_win_6 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '13hero_id', '15hero_id']).size()
grouped_win_7 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '13hero_id', '20hero_id']).size()
grouped_win_8 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '15hero_id', '20hero_id']).size()
grouped_win_9 = all_win_data_only_2.groupby(['6hero_id', '13hero_id', '15hero_id', '20hero_id']).size()
grouped_win_10 = all_win_data_only_2.groupby(['7hero_id', '13hero_id', '15hero_id', '20hero_id']).size()
temp_groups = [grouped_win_1, grouped_win_2, grouped_win_3, grouped_win_4, grouped_win_5, grouped_win_6, grouped_win_7, grouped_win_8, grouped_win_9, grouped_win_10]
winning_combination_4 = pd.concat(temp_groups)
winning_combination_4 = winning_combination_4.groupby(winning_combination_4.index).sum().sort_values(ascending=False)
max_value = winning_combination_4[0]
winning_combination_4.loc[winning_combination_4.values == max_value]
(Crystal Maiden, Vengeful Spirit, Luna, Drow Ranger) 27
dtype: int64
# # Validating
winning_combination_4.shape[0] < (118 * 118 * 118 * 118)
True
# # We can take win rates for 1st picked team. (i.e: 5, 8, 14, 16, 19)
# # We can take win rates for 2nd picked team. (i.e: 6, 7, 13, 15, 20)
grouped_win_1 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '14hero_id']).size()
grouped_win_2 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '16hero_id']).size()
grouped_win_3 = all_win_data_only_1.groupby(['5hero_id', '8hero_id', '19hero_id']).size()
grouped_win_4 = all_win_data_only_1.groupby(['8hero_id', '14hero_id', '16hero_id']).size()
grouped_win_5 = all_win_data_only_1.groupby(['8hero_id', '14hero_id', '19hero_id']).size()
grouped_win_6 = all_win_data_only_1.groupby(['14hero_id', '16hero_id', '19hero_id']).size()
grouped_win_7 = all_win_data_only_1.groupby(['5hero_id', '16hero_id', '19hero_id']).size()
grouped_win_8 = all_win_data_only_1.groupby(['8hero_id', '16hero_id', '19hero_id']).size()
grouped_win_9 = all_win_data_only_1.groupby(['5hero_id', '14hero_id', '19hero_id']).size()
grouped_win_10 = all_win_data_only_1.groupby(['5hero_id', '14hero_id', '16hero_id']).size()
grouped_win_11 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '13hero_id']).size()
grouped_win_12 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '15hero_id']).size()
grouped_win_13 = all_win_data_only_2.groupby(['6hero_id', '7hero_id', '20hero_id']).size()
grouped_win_14 = all_win_data_only_2.groupby(['7hero_id', '13hero_id', '15hero_id']).size()
grouped_win_15 = all_win_data_only_2.groupby(['7hero_id', '13hero_id', '20hero_id']).size()
grouped_win_16 = all_win_data_only_2.groupby([ '13hero_id', '15hero_id', '20hero_id']).size()
grouped_win_17 = all_win_data_only_2.groupby(['6hero_id', '15hero_id', '20hero_id']).size()
grouped_win_18 = all_win_data_only_2.groupby(['7hero_id', '15hero_id', '20hero_id']).size()
grouped_win_19 = all_win_data_only_2.groupby(['6hero_id', '13hero_id', '20hero_id']).size()
grouped_win_20 = all_win_data_only_2.groupby(['6hero_id', '13hero_id', '15hero_id']).size()
temp_groups = [
grouped_win_1, grouped_win_2, grouped_win_3, grouped_win_4, grouped_win_5, grouped_win_6, grouped_win_7, grouped_win_8, grouped_win_9, grouped_win_10,
grouped_win_11, grouped_win_12, grouped_win_13, grouped_win_14, grouped_win_15, grouped_win_16, grouped_win_17, grouped_win_18, grouped_win_19,grouped_win_20
]
winning_combination_3 = pd.concat(temp_groups)
winning_combination_3 = winning_combination_3.groupby(winning_combination_3.index).sum().sort_values(ascending=False)
max_value = winning_combination_3[0]
winning_combination_3.loc[winning_combination_3.values == max_value]
(Earthshaker, Witch Doctor, Windranger) 443
dtype: int64
# # Validating
winning_combination_3.shape[0] < (118 * 118 * 118)
True
# # We can take win rates for 1st picked team. (i.e: 5, 8, 14, 16, 19)
# # We can take win rates for 2nd picked team. (i.e: 6, 7, 13, 15, 20)
grouped_win_1 = all_win_data_only_1.groupby(['5hero_id', '8hero_id']).size()
grouped_win_2 = all_win_data_only_1.groupby(['5hero_id', '14hero_id']).size()
grouped_win_3 = all_win_data_only_1.groupby(['5hero_id', '16hero_id']).size()
grouped_win_4 = all_win_data_only_1.groupby(['8hero_id', '19hero_id']).size()
grouped_win_5 = all_win_data_only_1.groupby(['8hero_id', '14hero_id']).size()
grouped_win_6 = all_win_data_only_1.groupby(['8hero_id', '16hero_id']).size()
grouped_win_7 = all_win_data_only_1.groupby(['8hero_id', '19hero_id']).size()
grouped_win_8 = all_win_data_only_1.groupby(['14hero_id', '16hero_id']).size()
grouped_win_9 = all_win_data_only_1.groupby(['14hero_id', '19hero_id']).size()
grouped_win_10 = all_win_data_only_1.groupby(['16hero_id', '19hero_id']).size()
grouped_win_11 = all_win_data_only_2.groupby(['6hero_id', '7hero_id']).size()
grouped_win_12 = all_win_data_only_2.groupby(['6hero_id', '13hero_id']).size()
grouped_win_13 = all_win_data_only_2.groupby(['6hero_id', '15hero_id']).size()
grouped_win_14 = all_win_data_only_2.groupby(['6hero_id', '20hero_id']).size()
grouped_win_15 = all_win_data_only_2.groupby(['7hero_id', '13hero_id']).size()
grouped_win_16 = all_win_data_only_2.groupby([ '7hero_id', '15hero_id']).size()
grouped_win_17 = all_win_data_only_2.groupby(['7hero_id', '20hero_id']).size()
grouped_win_18 = all_win_data_only_2.groupby(['13hero_id', '15hero_id']).size()
grouped_win_19 = all_win_data_only_2.groupby(['13hero_id', '20hero_id']).size()
grouped_win_20 = all_win_data_only_2.groupby(['15hero_id', '20hero_id']).size()
temp_groups = [
grouped_win_1, grouped_win_2, grouped_win_3, grouped_win_4, grouped_win_5, grouped_win_6, grouped_win_7, grouped_win_8, grouped_win_9, grouped_win_10,
grouped_win_11, grouped_win_12, grouped_win_13, grouped_win_14, grouped_win_15, grouped_win_16, grouped_win_17, grouped_win_18, grouped_win_19,grouped_win_20
]
winning_combination_2 = pd.concat(temp_groups)
winning_combination_2 = winning_combination_2.groupby(winning_combination_2.index).sum().sort_values(ascending=False)
max_value = winning_combination_2[0]
winning_combination_2.loc[winning_combination_2.values == max_value]
(Earthshaker, Gyrocopter) 8309
dtype: int64
# # Validating
winning_combination_2.shape[0] < (118 * 118)
True
Dota totally depends on the meta. This draft is done on 6.* whereas the current meta is on 7.* So, this draft analysis, if used in real life on real games will not be good due to the meta changes.
Notebook Created by: Sulabh Shrestha
- Issue Tracker: https://github.com/codexponent/dota2-draft-analysis/issues
- Source Code: https://github.com/codexponent/dota2-draft-analysis
- Contributors: https://github.com/codexponent/dota2-draft-analysis/contributors.txt
If you are having issues, please let us know. I have a mailing list located at: [email protected]
Copyright 2018 Codexponent. Code released under the [MIT]license.