Skip to content

Instantly share code, notes, and snippets.

@diegotf30
Created May 15, 2020 01:20
Show Gist options
  • Save diegotf30/160de875d3b7d1f6467405a214ab1e49 to your computer and use it in GitHub Desktop.
Save diegotf30/160de875d3b7d1f6467405a214ab1e49 to your computer and use it in GitHub Desktop.
Paul - Proyecto Inteligencia Computacional
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pomegranate as pg\n",
"import pandas as pd\n",
"import numpy as np\n",
"import requests\n",
"import json\n",
"import time\n",
"\n",
"key = '67v5kphe7ueszua6exsdmnj7' # API key for SportRadar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data collection"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GET Team IDs"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"url = f'https://api.sportradar.us/soccer-t3/am/en/teams/v2_v3_id_mappings.json?api_key={key}'\n",
"r = requests.get(url)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1410\n"
]
}
],
"source": [
"if r.status_code is 200:\n",
" print(len(r.json()['team_mappings']))\n",
"else:\n",
" print(\"request failed, got: \", r.status_code, r.text)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"tjson = r.json()['team_mappings']\n",
"teams = [t['v3_id'] for t in tjson]\n",
"teams = teams[:30] # Limiting to the first 30 teams so there are less matchup requests \n",
"data = []"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GET matchups between teams\n",
"\n",
"Since we only have 1k reqs / month, we're going to be getting matchups between first 30 teams"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"'''\n",
"returns matches between teamA and teamB\n",
"'''\n",
"def get_matchups(teamA, teamB):\n",
" url = f'https://api.sportradar.us/soccer-t3/am/en/teams/{teamA}/versus/{teamB}/matches.json?api_key={key}'\n",
" r = requests.get(url)\n",
" if r.status_code is not 200:\n",
" print(\"request failed, got: \", r.status_code, r.text)\n",
" return\n",
"\n",
" json = r.json()\n",
" if json['last_meetings'] == []: # Teams have no matchups\n",
" return []\n",
"\n",
" data = []\n",
" for match in json['last_meetings']['results']:\n",
" mid = match['sport_event']['id'] # Match ID\n",
"\n",
" teams = [c for c in match['sport_event']['competitors']]\n",
" home = [t for t in teams if t['qualifier'] == 'home'][0]\n",
" away = [t for t in teams if t['qualifier'] == 'away'][0]\n",
" if 'home_score' not in match['sport_event_status']: # Special case, match info is malformed\n",
" continue\n",
"\n",
" home_score = match['sport_event_status']['home_score']\n",
" away_score = match['sport_event_status']['away_score']\n",
"\n",
" if 'winner_id' in match['sport_event_status']:\n",
" winner = 'home' if match['sport_event_status']['winner_id'] == home['id'] else 'away'\n",
" else:\n",
" winner = 'draw'\n",
" data.append({\n",
" 'id': mid,\n",
" 'home_id': home['id'],\n",
" 'home': home['name'],\n",
" 'home_score': home_score,\n",
" 'away_id': away['id'],\n",
" 'away': away['name'],\n",
" 'away_score': away_score,\n",
" 'winner': winner\n",
" })\n",
" return data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"for i in range(30):\n",
" for j in range(i+1, 30):\n",
" matches = get_matchups(teams[i],teams[j])\n",
" if matches is None:\n",
" time.sleep(0.7)\n",
" continue\n",
" else:\n",
" if matches not in data:\n",
" data.extend(matches)\n",
" time.sleep(0.7)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>home</th>\n",
" <th>away</th>\n",
" <th>home_score</th>\n",
" <th>away_score</th>\n",
" <th>winner</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>Queens Park Rangers</td>\n",
" <td>Portsmouth FC</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>away</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>Queens Park Rangers</td>\n",
" <td>Portsmouth FC</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>home</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>Portsmouth FC</td>\n",
" <td>Queens Park Rangers</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>draw</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>Queens Park Rangers</td>\n",
" <td>Portsmouth FC</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>home</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>Portsmouth FC</td>\n",
" <td>Queens Park Rangers</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>draw</td>\n",
" </tr>\n",
" <tr>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7622</td>\n",
" <td>Leicester City</td>\n",
" <td>Brighton &amp; Hove Albion</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>draw</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7623</td>\n",
" <td>Brighton &amp; Hove Albion</td>\n",
" <td>Leicester City</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>draw</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7624</td>\n",
" <td>Leicester City</td>\n",
" <td>Brighton &amp; Hove Albion</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>away</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7625</td>\n",
" <td>Leicester City</td>\n",
" <td>Brighton &amp; Hove Albion</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>home</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7626</td>\n",
" <td>Brighton &amp; Hove Albion</td>\n",
" <td>Leicester City</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>away</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>7627 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" home away home_score away_score \\\n",
"0 Queens Park Rangers Portsmouth FC 0 2 \n",
"1 Queens Park Rangers Portsmouth FC 2 0 \n",
"2 Portsmouth FC Queens Park Rangers 1 1 \n",
"3 Queens Park Rangers Portsmouth FC 2 0 \n",
"4 Portsmouth FC Queens Park Rangers 1 1 \n",
"... ... ... ... ... \n",
"7622 Leicester City Brighton & Hove Albion 0 0 \n",
"7623 Brighton & Hove Albion Leicester City 1 1 \n",
"7624 Leicester City Brighton & Hove Albion 0 1 \n",
"7625 Leicester City Brighton & Hove Albion 2 0 \n",
"7626 Brighton & Hove Albion Leicester City 0 1 \n",
"\n",
" winner \n",
"0 away \n",
"1 home \n",
"2 draw \n",
"3 home \n",
"4 draw \n",
"... ... \n",
"7622 draw \n",
"7623 draw \n",
"7624 away \n",
"7625 home \n",
"7626 away \n",
"\n",
"[7627 rows x 5 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame(data)\n",
"bayes_df = df[['home', 'away', 'home_score', 'away_score', 'winner']]\n",
"bayes_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data cleanup"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prepare team matchups for Bayes"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{ 'Barnsley': 21,\n",
" 'Birmingham City': 8,\n",
" 'Bolton Wanderers': 4,\n",
" 'Bradford City': 20,\n",
" 'Brighton & Hove Albion': 28,\n",
" 'Burnley FC': 5,\n",
" 'Coventry City': 10,\n",
" 'Crewe Alexandra': 17,\n",
" 'Crystal Palace': 6,\n",
" 'Derby County': 25,\n",
" 'Gillingham FC': 18,\n",
" 'Grimsby Town': 16,\n",
" 'Leicester City': 29,\n",
" 'Manchester City': 15,\n",
" 'Millwall FC': 23,\n",
" 'Milton Keynes Dons': 3,\n",
" 'Nottingham Forest': 13,\n",
" 'Portsmouth FC': 1,\n",
" 'Preston North End': 19,\n",
" 'Queens Park Rangers': 0,\n",
" 'Reading FC': 26,\n",
" 'Rotherham United': 12,\n",
" 'Sheffield United': 14,\n",
" 'Sheffield Wednesday': 11,\n",
" 'Stockport County FC': 9,\n",
" 'Stoke City': 27,\n",
" 'Walsall FC': 24,\n",
" 'Watford FC': 22,\n",
" 'West Bromwich Albion': 7,\n",
" 'Wolverhampton Wanderers': 2}\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>home</th>\n",
" <th>away</th>\n",
" <th>home_score</th>\n",
" <th>away_score</th>\n",
" <th>winner</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7622</td>\n",
" <td>29</td>\n",
" <td>28</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7623</td>\n",
" <td>28</td>\n",
" <td>29</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7624</td>\n",
" <td>29</td>\n",
" <td>28</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7625</td>\n",
" <td>29</td>\n",
" <td>28</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7626</td>\n",
" <td>28</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>7627 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" home away home_score away_score winner\n",
"0 0 1 0 2 1\n",
"1 0 1 2 0 0\n",
"2 1 0 1 1 2\n",
"3 0 1 2 0 0\n",
"4 1 0 1 1 2\n",
"... ... ... ... ... ...\n",
"7622 29 28 0 0 2\n",
"7623 28 29 1 1 2\n",
"7624 29 28 0 1 1\n",
"7625 29 28 2 0 0\n",
"7626 28 29 0 1 1\n",
"\n",
"[7627 rows x 5 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pprint\n",
"\n",
"team_names = df.home.unique()\n",
"name_map = {}\n",
"for i, name in enumerate(team_names):\n",
" name_map[name] = i\n",
"pp = pprint.PrettyPrinter(indent=4)\n",
"pp.pprint(name_map)\n",
"\n",
"winner_map = {'home': 0, 'away': 1, 'draw': 2}\n",
"bayes_df = df.replace({'home': name_map, 'away': name_map, 'winner': winner_map})\n",
"bayes_df = bayes_df[['home', 'away', 'home_score', 'away_score', 'winner']]\n",
"bayes_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Format of each column\n",
"\n",
"**Home** -> Home team, index assigned by index in df.unique()\n",
"\n",
"**Away** -> Away team, index assigned by index in df.unique()\n",
"\n",
"**Home_Score** -> Amount of goals scored by Home Team\n",
"\n",
"**Away_Score** -> Amount of goals scored by Away Team\n",
"\n",
"**Winner** -> Home = 0, Away = 1, Draw = 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Train model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Split historical data, so we can test model accuracy"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"data = np.asarray(bayes_df)\n",
"train, test = train_test_split(data, test_size = 0.25, random_state = 42)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Column names for data\n",
"cols = ['Home Team', 'Away Team', 'Home Score', 'Away Score', 'Winner']\n",
"network = pg.BayesianNetwork.from_samples(train, algorithm=\"chow-liu\", name='Paul', state_names=cols)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Home Team {\n",
" \"class\" :\"Distribution\",\n",
" \"dtype\" :\"numpy.int64\",\n",
" \"name\" :\"DiscreteDistribution\",\n",
" \"parameters\" :[\n",
" {\n",
" \"16\" :0.018808093192949266,\n",
" \"12\" :0.02348521076175958,\n",
" \"15\" :0.03269551512034474,\n",
" \"13\" :0.04640340802772138,\n",
" \"17\" :0.02592797600153249,\n",
" \"23\" :0.03165424940137608,\n",
" \"8\" :0.037138363121331015,\n",
" \"7\" :0.039286679995559834,\n",
" \"29\" :0.03543852934424501,\n",
" \"14\" :0.047582545046803586,\n",
" \"22\" :0.04635545829066614,\n",
" \"21\" :0.04316364403379709,\n",
" \"0\" :0.03132991996272628,\n",
" \"3\" :0.027226370350613597,\n",
" \"11\" :0.03458840615554357,\n",
" \"27\" :0.030250858052520434,\n",
" \"24\" :0.024577882838314948,\n",
" \"28\" :0.0220828588295617,\n",
" \"4\" :0.03356834650658386,\n",
" \"1\" :0.03728870941750037,\n",
" \"26\" :0.03382104872033384,\n",
" \"2\" :0.04503518332206862,\n",
" \"10\" :0.031202263114516245,\n",
" \"20\" :0.02657467042785242,\n",
" \"18\" :0.021530819509655075,\n",
" \"19\" :0.03664676079592793,\n",
" \"6\" :0.04179091883575559,\n",
" \"9\" :0.014268032331282786,\n",
" \"25\" :0.04514412811165367,\n",
" \"5\" :0.03513315037950259\n",
" }\n",
" ],\n",
" \"frozen\" :false\n",
"}\n",
"Away Team {\n",
" \"class\" :\"Distribution\",\n",
" \"dtype\" :\"numpy.int64\",\n",
" \"name\" :\"DiscreteDistribution\",\n",
" \"parameters\" :[\n",
" {\n",
" \"0\" :0.03549439016810148,\n",
" \"1\" :0.0325694201231292,\n",
" \"2\" :0.04139699112921358,\n",
" \"3\" :0.029456995155104543,\n",
" \"4\" :0.031979331133978675,\n",
" \"5\" :0.03827696408122032,\n",
" \"6\" :0.04279258645183572,\n",
" \"7\" :0.04115687179109869,\n",
" \"8\" :0.04033610238402597,\n",
" \"9\" :0.015725783986705384,\n",
" \"10\" :0.03426172257670601,\n",
" \"11\" :0.03619098039973757,\n",
" \"12\" :0.023264295446529068,\n",
" \"13\" :0.04208176066301552,\n",
" \"14\" :0.047428838771460605,\n",
" \"15\" :0.02503622344501902,\n",
" \"16\" :0.025018354721389906,\n",
" \"17\" :0.026652204141881183,\n",
" \"18\" :0.02305574936841114,\n",
" \"19\" :0.034222432212648916,\n",
" \"20\" :0.025344396820263328,\n",
" \"21\" :0.041289068248283024,\n",
" \"22\" :0.040856926600084234,\n",
" \"23\" :0.034705392195951965,\n",
" \"24\" :0.02401902592873956,\n",
" \"25\" :0.03998771867511906,\n",
" \"26\" :0.036509690582758894,\n",
" \"27\" :0.032408021596833474,\n",
" \"28\" :0.022294630088469988,\n",
" \"29\" :0.0361871311122838\n",
" }\n",
" ],\n",
" \"frozen\" :false\n",
"}\n",
"Home Score {\n",
" \"class\" :\"Distribution\",\n",
" \"dtype\" :\"numpy.int64\",\n",
" \"name\" :\"DiscreteDistribution\",\n",
" \"parameters\" :[\n",
" {\n",
" \"0\" :0.001579155151994468,\n",
" \"1\" :0.24911172522700256,\n",
" \"2\" :0.37465455981049894,\n",
" \"3\" :0.23845242795104493,\n",
" \"4\" :0.09474930911962114,\n",
" \"5\" :0.02921437031188389,\n",
" \"6\" :0.00908014212396461,\n",
" \"7\" :0.0027635215159899267,\n",
" \"8\" :0.000394788787999422\n",
" }\n",
" ],\n",
" \"frozen\" :false\n",
"}\n",
"Away Score {\n",
" \"class\" :\"Distribution\",\n",
" \"dtype\" :\"numpy.int64\",\n",
" \"name\" :\"DiscreteDistribution\",\n",
" \"parameters\" :[\n",
" {\n",
" \"0\" :0.5665219107777332,\n",
" \"1\" :0.33478089222266044,\n",
" \"2\" :0.08724832214765108,\n",
" \"3\" :0.010264508487959142,\n",
" \"4\" :0.0011843663639954816,\n",
" \"5\" :0.0,\n",
" \"6\" :0.0,\n",
" \"7\" :0.0\n",
" }\n",
" ],\n",
" \"frozen\" :false\n",
"}\n",
"Winner 0\n"
]
}
],
"source": [
"observations = {'Winner': 0} # Sample query\n",
"\n",
"beliefs = map( str, network.predict_proba( observations ) )\n",
"print(\"\\n\".join(f'{state.name} {belief}' for state, belief in zip(network.states, beliefs)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test with no goal data"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"errors = []\n",
"for t in test:\n",
" if t[2] > 7 or t[3] > 7: # model doesnt consider matches with more than 7 goals\n",
" continue\n",
"\n",
" obs = {'Home Team': t[0], 'Away Team': t[1]}\n",
" beliefs = network.predict_proba(obs)\n",
" for state, b in zip(network.states, beliefs):\n",
" if state.name == 'Winner':\n",
" prediction = b.parameters[0]\n",
" winner_error = prediction[t[4]] - 1\n",
" errors.append(winner_error)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: -65.0 %.\n"
]
}
],
"source": [
"print('Accuracy:', round(np.mean(errors), 2) * 100, '%.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test with goal data"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"errors = []\n",
"for t in test:\n",
" if t[2] > 7 or t[3] > 7: # model doesnt consider matches with more than 7 goals\n",
" continue\n",
"\n",
" obs = {'Home Team': t[0], 'Away Team': t[1], 'Home Score': t[2], 'Away Score': t[3]}\n",
" beliefs = network.predict_proba(obs)\n",
" for state, b in zip(network.states, beliefs):\n",
" if state.name == 'Winner':\n",
" prediction = b.parameters[0]\n",
" winner_error = prediction[t[4]] - 1\n",
" errors.append(winner_error)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: -32.0 %.\n"
]
}
],
"source": [
"print('Accuracy:', round(np.mean(errors), 2) * 100, '%.')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment