In [1]:
#%%capture
%config InlineBackend.figure_format = 'svg'
%matplotlib inline
import scipy as sc, pandas as pd, seaborn as sns
import gpflow as gp
import numpy as np
import matplotlib.pyplot as plt
import tensorflow_probability as tfp
from tensorflow_probability import distributions as tfd
In [2]:
f64 = gp.utilities.to_default_float
survey_max_rank = 10
survey_min_rank = -30
rank_variance = 2
data_point_threshold = 1
linear_regression_threshold = 6
gpr_likelihood_variance_for_filling = 0.03
gpr_likelihood_variance_for_ranking = 0.01
gpr_ls_prior = 10
gpr_ls_prior_delta = 5
sns.set()

Results of the go rank survey

Following are some visualizations and tables based on the data gathered in the new Mar-Jun 2020 survey here. The raw data can be accessed here in the form of a .csv file.

The plots were made by mapping kyu ranks to negative integers, so that 1d corresponds to 0 (i.e. 1k -> -1, 2d -> 1). The tables are based on OGS ranks.

In [3]:
data = pd.read_csv('Go rank survey Mar to Jun 2020 en.csv')
In [4]:
data.head()
Out[4]:
Time Stamp OGS KGS DGS IGS Foxwq Tygem WBaduk GoQuest_rank GoQuest_rating AGA EGF Korea China Japan Taiwan
0 2020/3/21 AM 7:02:31 6d NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5d
1 2020/3/21 AM 7:38:52 9k 5k NaN 8k 6k 11k 11k NaN NaN NaN NaN NaN NaN NaN NaN
2 2020/3/21 AM 7:41:56 4k NaN NaN 1k NaN NaN NaN NaN NaN 1d NaN NaN NaN NaN NaN
3 2020/3/21 AM 7:42:25 6k 4k NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 2020/3/21 AM 7:51:35 15k NaN NaN NaN NaN NaN NaN NaN NaN NaN 20k NaN NaN NaN NaN

How many responses were given for each server.

In [5]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 190 entries, 0 to 189
Data columns (total 16 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Time Stamp      190 non-null    object 
 1   OGS             118 non-null    object 
 2   KGS             88 non-null     object 
 3   DGS             9 non-null      object 
 4   IGS             77 non-null     object 
 5   Foxwq           94 non-null     object 
 6   Tygem           78 non-null     object 
 7   WBaduk          27 non-null     object 
 8   GoQuest_rank    12 non-null     object 
 9   GoQuest_rating  13 non-null     float64
 10  AGA             23 non-null     object 
 11  EGF             51 non-null     object 
 12  Korea           1 non-null      object 
 13  China           2 non-null      object 
 14  Japan           7 non-null      object 
 15  Taiwan          34 non-null     object 
dtypes: float64(1), object(15)
memory usage: 23.9+ KB
In [6]:
def mapping(raw_rank):
    try:
        t = raw_rank[-1]
    except:
        return raw_rank
    if t == 'k':
        n = -int(raw_rank[:-1])
    else:
        n = int(raw_rank[:-1])-1
    return n
numerical_rank = data.iloc[:,1:].copy()
numerical_rank = numerical_rank.applymap(mapping)
numerical_rank = numerical_rank.iloc[:,((numerical_rank.shape[0]-numerical_rank.isna().sum())>data_point_threshold).values]
numerical_rank.dropna().shape
numerical_rank_predict = numerical_rank
#numerical_rank

Outlier auto-detection

Outliers are detected automatically by finding overall rank difference more than 7 ranks across all platforms. However, due to kyu ranks often flucturating, and GoQuest rank is very unique, hence only records with rank difference more than 7 and has a rank over dan level (excluding GoQuest rank) would be considered outliers.

In [7]:
# outliers detection, rank difference across platform greater than 7
print("maximum value in each columns (dan rank -1, negative value is kyu)")
print(numerical_rank.max())
print("\nminimum value in each columns (dan rank -1, negative value is kyu)")
print(numerical_rank.min())
numerical_rank_cut = numerical_rank.drop(['GoQuest_rating'], axis=1)
max_rank_all = numerical_rank_cut.max().max()
min_rank_all = numerical_rank_cut.min().min()
print("\nmaximum rank in the survey is {}d, minimum rank is {}k".format(int(max_rank_all+1), int(-min_rank_all)))

rank_diff_row = numerical_rank_cut.max(axis=1) - numerical_rank_cut.min(axis=1)
#print(numerical_rank_cut.max(axis=1))
#print(numerical_rank_cut.min(axis=1))
#print(rank_diff_row)
#print(rank_diff_row[rank_diff_row>=6])
#print("\n")

numerical_rank_cut = numerical_rank.drop(['GoQuest_rank','GoQuest_rating'], axis=1)
rank_diff_row = numerical_rank_cut.max(axis=1) - numerical_rank_cut.min(axis=1)
possible_outlier_row = rank_diff_row[(numerical_rank_cut.max(axis=1)-numerical_rank_cut.min(axis=1))>7]
#print(possible_outlier_row)
#print(possible_outlier_row.index)
#print(numerical_rank_cut)
print("\nlist of possible outliers with rank difference greater than 7")
data.iloc[possible_outlier_row.index,:]
maximum value in each columns (dan rank -1, negative value is kyu)
OGS                  7.0
KGS                  8.0
DGS                  3.0
IGS                  6.0
Foxwq                8.0
Tygem                8.0
WBaduk               8.0
GoQuest_rank         7.0
GoQuest_rating    2135.0
AGA                  7.0
EGF                  5.0
China                4.0
Japan                7.0
Taiwan               6.0
dtype: float64

minimum value in each columns (dan rank -1, negative value is kyu)
OGS                -27.0
KGS                -24.0
DGS                -12.0
IGS                -14.0
Foxwq              -12.0
Tygem              -18.0
WBaduk             -15.0
GoQuest_rank        -5.0
GoQuest_rating    1500.0
AGA                -11.0
EGF                -20.0
China                2.0
Japan                1.0
Taiwan             -10.0
dtype: float64

maximum rank in the survey is 9d, minimum rank is 27k

list of possible outliers with rank difference greater than 7
Out[7]:
Time Stamp OGS KGS DGS IGS Foxwq Tygem WBaduk GoQuest_rank GoQuest_rating AGA EGF Korea China Japan Taiwan
33 2020/3/21 PM 9:05:37 10k 6k NaN 10k 8k 18k 15k 5k NaN NaN NaN NaN NaN NaN NaN
35 2020/3/21 PM 9:41:18 9k 5k NaN 10k 9k 10k 15k NaN NaN NaN 10k NaN NaN NaN NaN
36 2020/3/21 PM 9:51:17 10k 3k 8k NaN NaN NaN NaN NaN NaN 11k NaN NaN NaN NaN NaN
103 2020/3/24 AM 8:22:37 10k 6k NaN NaN 1d NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
146 2020/4/9 PM 8:47:06 2k 1k NaN 3k 3d 6k NaN NaN NaN NaN NaN NaN NaN NaN NaN
In [8]:
#finding possible outliers, excluding player ranks below dan level
outlier_list = numerical_rank_cut.iloc[possible_outlier_row.index,:].max(axis=1)
outlier_index = data.iloc[outlier_list[outlier_list>=0].index,:].index

print("outliers index in the csv file row {}".format(outlier_index.values+2))

numerical_rank.drop(outlier_index, inplace=True)
#numerical_rank.drop([103,146,], inplace=True)
print("\nCleaned numerical rank table after dropping outliers")
numerical_rank
outliers index in the csv file row [105 148]

Cleaned numerical rank table after dropping outliers
Out[8]:
OGS KGS DGS IGS Foxwq Tygem WBaduk GoQuest_rank GoQuest_rating AGA EGF China Japan Taiwan
0 5.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
1 -9.0 -5.0 NaN -8.0 -6.0 -11.0 -11.0 NaN NaN NaN NaN NaN NaN NaN
2 -4.0 NaN NaN -1.0 NaN NaN NaN NaN NaN 0.0 NaN NaN NaN NaN
3 -6.0 -4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 -15.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN -20.0 NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
185 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
186 -6.0 -2.0 NaN NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN NaN
187 0.0 1.0 NaN 1.0 NaN 3.0 NaN NaN NaN NaN NaN NaN NaN NaN
188 NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
189 0.0 0.0 NaN -2.0 1.0 2.0 NaN NaN 1910.0 NaN NaN 2.0 NaN NaN

188 rows × 14 columns

Pair-wise plotting of server ranks with linear regression

In [9]:
#%%capture --no-display
sns.pairplot(numerical_rank.iloc[:,((numerical_rank.shape[0]-numerical_rank.isna().sum())>linear_regression_threshold).values], diag_kind='kde', kind='reg');
2020-08-03T02:14:28.477876 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
In [10]:
def plot(m, X, Y, lo=survey_min_rank, hi=survey_max_rank, xlabel='X', ylabel='Y', sigma=2):
    lo = X.min()-abs(X.min()*.5/2)
    hi = X.max()+abs(X.max()*.5)
    xx = np.linspace(lo, hi, 1000)[:,None]
    mean, var = m.predict_y(xx)
    p=plt.figure()#figsize=(12, 6))
    plt.plot(X, Y, 'kx', mew=2)
    plt.plot(xx, mean, 'b', lw=2)
    plt.fill_between(xx[:,0], mean[:,0] - sigma*np.sqrt(var[:,0]), mean[:,0] + sigma*np.sqrt(var[:,0]), color='blue', alpha=0.2)
    plt.xlim(lo, hi)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    return p
#plot(m, x.T[0], x.T[1])
#sns.regplot(x.T[0], x.T[1])
In [11]:
def get_ranks_on_server(rank_start=min_rank_all, rank_end=max_rank_all, fro='OGS', to='Tygem', lo=survey_min_rank, hi=survey_max_rank, k=gp.kernels.RBF, meanf=gp.mean_functions.Zero, prior=(10,1e9), sigma=2):
    x=numerical_rank[[fro,to,]].dropna().values
    ranks = np.arange(rank_start, rank_end)
    #with gp.defer_build():
    X=x.T[0].reshape(-1, 1)
    Y=x.T[1].reshape(-1, 1)
    data = (X, Y)
    kern=k(1)
    mean_function=meanf()
    m=gp.models.GPR(data, kern, mean_function)
    
    m.kernel.lengthscales.prior = tfd.Gamma(f64(prior[0]), f64(prior[1]))
    #m.compile()
    #gp.utilities.print_summary(m, fmt="notebook")
    gp.config.set_default_summary_fmt("notebook")
    m.likelihood.variance.assign(gpr_likelihood_variance_for_ranking)
    #gp.utilities.print_summary(m.likelihood)
    m.trainable_parameters
    
    optz = gp.optimizers.Scipy()
    optz.minimize(m.training_loss, variables=m.trainable_variables, options=dict(disp=True, maxiter=1000))
    #gp.train.ScipyOptimizer(tol=1e-7).minimize(m)
    print('\n processing {}'.format(to))
    print(m.kernel.lengthscales)
    mean, var = m.predict_y(f64(ranks[:,None]))
    return mean,(mean[:,0] - sigma*np.sqrt(var[:,0]), mean[:,0] + sigma*np.sqrt(var[:,0])), plot(m, x.T[0], x.T[1], lo=lo, hi=hi, xlabel=fro, ylabel=to, sigma=sigma)
In [12]:
def fillna(a='OGS', b='KGS'):
    #with gp.defer_build():
    print("GPR model process for {}".format(a))
    X=numerical_rank[[a,b]].dropna()[a].values[:,None]
    Y=numerical_rank[[a,b]].dropna()[b].values[:,None]
    data = (X, Y)
    kern=gp.kernels.RBF(1)
    mean_function=gp.mean_functions.Linear()
    #noise_variance=0.01
    m=gp.models.GPR(data, kern, mean_function)
    #m.kern.lengthscales.prior = gp.priors.Gaussian(10,10)
    #m.compile()
 
    #gp.utilities.print_summary(m, fmt="notebook")
    gp.config.set_default_summary_fmt("notebook")
    m.likelihood.variance.assign(gpr_likelihood_variance_for_filling)
    #gp.utilities.print_summary(m.likelihood)
    #gp.utilities.set_trainable(m.kernel.kernels[1].variance, True)
    m.trainable_parameters

    optz = gp.optimizers.Scipy()
    optz.minimize(m.training_loss, variables=m.trainable_variables, options=dict(disp=True, maxiter=1000))
    xx=numerical_rank[numerical_rank[a].notna()&numerical_rank[b].isna()][a].values[:,None]
    yy=m.predict_y(xx)[0].numpy()
    #print(yy.shape)
    #print(yy)
    #print(numerical_rank[a])
    #print(numerical_rank[b])
    #print(numerical_rank[a].notna()&numerical_rank[b].isna())
    #print(numerical_rank_predict)
    #print(numerical_rank_predict.loc[numerical_rank[a].notna()&numerical_rank[b].isna(), b])
    numerical_rank_predict.loc[numerical_rank[a].notna()&numerical_rank[b].isna(), b]=yy.ravel()
    #print(numerical_rank_predict[a])
    #print(numerical_rank_predict[b])
    #X.loc[X[a].notna()&X[b].isna(), b] = yy.ravel()
In [13]:
#%%capture
sorted_cols = sorted(numerical_rank.columns, key=lambda x: numerical_rank[x].count(), reverse=True)
print(sorted_cols)
    
['OGS', 'Foxwq', 'KGS', 'Tygem', 'IGS', 'EGF', 'Taiwan', 'WBaduk', 'AGA', 'GoQuest_rating', 'GoQuest_rank', 'DGS', 'Japan', 'China']
In [14]:
for c in [x for x in sorted_cols if x!='OGS']:
    #fillna('MIX',c)
    fillna(c,'OGS')
GPR model process for Foxwq
GPR model process for KGS
GPR model process for Tygem
GPR model process for IGS
GPR model process for EGF
GPR model process for Taiwan
GPR model process for WBaduk
GPR model process for AGA
GPR model process for GoQuest_rating
GPR model process for GoQuest_rank
GPR model process for DGS
GPR model process for Japan
GPR model process for China
In [15]:
def n_to_rank(n):
    if n>survey_max_rank+rank_variance:
        return int(round(n))
    n=int(round(n))
    if n<0:
        return f'{abs(n)}k'
    else:
        return f'{abs(n+1)}d'
In [16]:
def n_to_rank_float(n):
    if n>survey_max_rank+rank_variance:
        return round(n,1)
    n=round(n,1)
    if n<0:
        return f'{abs(n)}k'
    else:
        return f'{abs(n+1)}d'
In [17]:
def get_rank_tables(against='KGS', lo=min_rank_all, hi=max_rank_all, prior=(10,1e6)):
    meantable = pd.DataFrame()
    stdtable = pd.DataFrame()
    combinedtable = pd.DataFrame()
    for s in numerical_rank_predict.drop(columns=[against,]).columns:
        mean,ci,p = get_ranks_on_server(
            lo,
            hi,
            against,
            s,
            k=lambda x: gp.kernels.RBF(1),
            meanf=gp.mean_functions.Linear,
            prior=prior,
            sigma=1,
        )
        #print("processing {}".format(s))
        #print(mean)
        #for x,_ in enumerate(mean):
        #    print(mean[x][0].numpy())
        #print(ci[0])
        #print(ci[1])
        #for x,_ in enumerate(ci[0]):
        #    print(ci[0][x].numpy())
        #    print(ci[1][x].numpy())
        meantable.insert(loc=0, column=s, value=[f'{n_to_rank(mean[x][0].numpy())}' for x,_ in enumerate(mean)])
        stdtable.insert(loc=0, column=s, value=[f'{n_to_rank(ci[0][x].numpy())} - {n_to_rank(ci[1][x].numpy())}' for x,_ in enumerate(ci[0])])
        combinedtable.insert(loc=0, column=s, value=[f'{n_to_rank_float(mean[x][0].numpy())} ± {round(ci[1][x].numpy()-mean[x][0].numpy(),1)}' for x,_ in enumerate(mean)])
    meantable.insert(loc=0, column=against, value=[f'{n_to_rank(x)}' for x in np.arange(lo,hi)])
    stdtable.insert(loc=0, column=against, value=[f'{n_to_rank(x)}' for x in np.arange(lo,hi)])
    combinedtable.insert(loc=0, column=against, value=[f'{n_to_rank(x)}' for x in np.arange(lo,hi)])
    return meantable, stdtable, combinedtable

GP regressions used for the following rank tables

The following plots are mainly for visually demonstrating the imprecision of the following estimates.

In [18]:
#%%capture --no-display
a='OGS'
mt1,st1,ct1=get_rank_tables(against=a, prior=(gpr_ls_prior,gpr_ls_prior-gpr_ls_prior_delta))
 processing KGS
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=2.3066666784679284 constrained-shape=() constrained-value=2.4016064926840133>

 processing DGS
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.4070838452335113 constrained-shape=() constrained-value=1.6261039322253101>

 processing IGS
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.7068411867586573 constrained-shape=() constrained-value=1.8735735418992887>

 processing Foxwq
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.3225147116702434 constrained-shape=() constrained-value=1.5587437751244317>

 processing Tygem
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=2.0276514857109387 constrained-shape=() constrained-value=2.151323217333234>

 processing WBaduk
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.6742288257859397 constrained-shape=() constrained-value=1.846039235545127>

 processing GoQuest_rank
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.618550817822253 constrained-shape=() constrained-value=1.7993593123964575>

 processing GoQuest_rating
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=80.57908094818059 constrained-shape=() constrained-value=80.57908094818059>

 processing AGA
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.6186035535322567 constrained-shape=() constrained-value=1.7994033255574204>

 processing EGF
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=0.7155098000525327 constrained-shape=() constrained-value=1.1135761280267553>

 processing China
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.6193140479462924 constrained-shape=() constrained-value=1.799996340774259>

 processing Japan
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=1.6193771168409983 constrained-shape=() constrained-value=1.8000489846870482>

 processing Taiwan
<gpflow.Parameter 'Variable:0' dtype=float64 unconstrained-shape=() unconstrained-value=0.7371723806282542 constrained-shape=() constrained-value=1.1281767147430155>
2020-08-03T02:15:02.474965 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:04.088431 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:05.850282 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:07.519918 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:09.006803 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:10.406227 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:11.874368 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:13.364898 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:14.859934 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:16.289138 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:17.673812 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:19.055647 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
2020-08-03T02:15:20.566476 image/svg+xml Matplotlib v3.3.0, https://matplotlib.org/
In [19]:
cols = ['KGS','OGS','IGS','Foxwq','Tygem','WBaduk','DGS','GoQuest_rating', 'GoQuest_rank','EGF','AGA','Taiwan','Japan','China',]
print(cols)
#print(numerical_rank_predict.columns)
#print(sorted_cols)
['KGS', 'OGS', 'IGS', 'Foxwq', 'Tygem', 'WBaduk', 'DGS', 'GoQuest_rating', 'GoQuest_rank', 'EGF', 'AGA', 'Taiwan', 'Japan', 'China']

A table of rounded mean ranks

In [20]:
mt1[cols].set_index(a)
Out[20]:
KGS IGS Foxwq Tygem WBaduk DGS GoQuest_rating GoQuest_rank EGF AGA Taiwan Japan China
OGS
27k 26k 28k 25k 33k 34k 21k 468 11k 29k 28k 18k 10k 10k
26k 25k 27k 24k 32k 33k 20k 524 11k 28k 27k 17k 10k 9k
25k 24k 26k 23k 30k 31k 19k 580 10k 27k 26k 16k 9k 9k
24k 24k 25k 22k 29k 30k 19k 635 10k 26k 25k 15k 9k 8k
23k 24k 24k 21k 28k 29k 18k 691 9k 25k 24k 15k 8k 8k
22k 23k 23k 20k 27k 27k 17k 746 9k 24k 23k 14k 8k 8k
21k 23k 22k 19k 25k 26k 16k 801 8k 23k 22k 13k 7k 7k
20k 21k 21k 18k 24k 25k 16k 856 7k 21k 20k 12k 7k 7k
19k 19k 20k 17k 23k 23k 15k 911 7k 20k 19k 12k 6k 6k
18k 17k 19k 16k 21k 22k 14k 965 6k 18k 18k 11k 5k 6k
17k 15k 18k 15k 20k 21k 13k 1020 6k 18k 17k 10k 5k 5k
16k 13k 17k 14k 19k 19k 13k 1074 5k 19k 16k 9k 4k 5k
15k 12k 15k 13k 18k 18k 12k 1128 5k 19k 15k 9k 4k 5k
14k 11k 14k 12k 16k 17k 11k 1182 4k 18k 14k 8k 3k 4k
13k 9k 13k 11k 15k 15k 9k 1235 4k 18k 13k 8k 3k 4k
12k 8k 12k 10k 15k 14k 9k 1289 3k 16k 12k 10k 2k 3k
11k 7k 11k 9k 14k 14k 9k 1342 3k 11k 11k 10k 2k 3k
10k 6k 10k 8k 13k 13k 9k 1395 2k 8k 10k 5k 1k 2k
9k 6k 9k 8k 11k 11k 8k 1448 2k 9k 8k 1k 1d 2k
8k 5k 8k 7k 9k 9k 7k 1500 1k 9k 7k 1k 1d 1k
7k 4k 7k 6k 6k 7k 6k 1553 1d 8k 6k 1k 2d 1k
6k 3k 6k 4k 4k 4k 5k 1605 1d 7k 5k 1d 2d 1k
5k 2k 5k 2k 1k 2k 4k 1657 2d 5k 4k 1d 3d 1d
4k 2k 4k 1k 1d 1k 3k 1709 2d 4k 3k 1d 3d 1d
3k 1k 3k 1d 2d 1d 2k 1761 3d 4k 2k 1d 4d 2d
2k 1k 1k 2d 2d 2d 1k 1812 3d 3k 1k 3d 4d 2d
1k 1d 1d 2d 3d 3d 1d 1863 4d 1k 1d 5d 5d 3d
1d 1d 2d 3d 4d 5d 2d 1914 4d 1k 2d 5d 6d 3d
2d 2d 3d 5d 5d 6d 3d 1965 5d 2d 3d 5d 6d 3d
3d 4d 4d 6d 6d 7d 4d 2015 5d 3d 4d 6d 7d 4d
4d 5d 5d 7d 7d 7d 4d 2066 6d 4d 6d 6d 7d 4d
5d 6d 6d 8d 8d 8d 3d 2116 7d 4d 7d 6d 8d 5d
6d 7d 7d 8d 9d 9d 4d 2166 7d 3d 8d 6d 8d 5d
7d 8d 8d 9d 10d 10d 5d 2216 8d 4d 9d 7d 9d 6d
8d 9d 9d 9d 11d 12d 6d 2265 8d 7d 10d 8d 9d 6d

A table of rounded +/- 1 standard deviation of ranks

In [21]:
st1[cols].set_index(a)
Out[21]:
KGS IGS Foxwq Tygem WBaduk DGS GoQuest_rating GoQuest_rank EGF AGA Taiwan Japan China
OGS
27k 28k - 24k 30k - 27k 27k - 24k 35k - 31k 36k - 32k 22k - 19k 447 - 488 13k - 10k 32k - 27k 30k - 27k 20k - 15k 11k - 10k 10k - 10k
26k 27k - 23k 29k - 26k 26k - 23k 34k - 29k 35k - 31k 22k - 19k 504 - 544 13k - 9k 31k - 26k 29k - 25k 19k - 15k 10k - 9k 9k - 9k
25k 26k - 22k 28k - 25k 25k - 22k 33k - 28k 34k - 29k 21k - 18k 560 - 600 12k - 8k 30k - 25k 27k - 24k 19k - 14k 10k - 9k 9k - 9k
24k 26k - 22k 27k - 24k 24k - 21k 32k - 27k 32k - 28k 20k - 17k 615 - 655 11k - 8k 28k - 24k 26k - 23k 18k - 13k 9k - 8k 8k - 8k
23k 26k - 22k 26k - 23k 23k - 20k 30k - 25k 31k - 26k 19k - 16k 671 - 711 11k - 7k 27k - 23k 25k - 22k 17k - 12k 9k - 8k 8k - 8k
22k 25k - 22k 25k - 21k 22k - 19k 29k - 24k 30k - 25k 19k - 16k 726 - 766 10k - 7k 26k - 22k 24k - 21k 16k - 12k 8k - 7k 8k - 8k
21k 24k - 21k 24k - 20k 21k - 18k 28k - 23k 28k - 24k 18k - 15k 782 - 821 10k - 6k 25k - 20k 23k - 20k 16k - 11k 8k - 7k 7k - 7k
20k 23k - 20k 23k - 19k 20k - 17k 26k - 22k 27k - 22k 17k - 14k 837 - 876 9k - 6k 24k - 19k 22k - 19k 15k - 10k 7k - 6k 7k - 7k
19k 21k - 18k 21k - 18k 19k - 16k 25k - 20k 26k - 21k 16k - 13k 892 - 930 9k - 5k 22k - 18k 21k - 18k 14k - 9k 7k - 5k 6k - 6k
18k 19k - 16k 20k - 17k 18k - 15k 24k - 19k 24k - 20k 15k - 13k 946 - 985 8k - 5k 20k - 17k 20k - 17k 13k - 9k 6k - 5k 6k - 6k
17k 17k - 13k 19k - 16k 17k - 14k 22k - 18k 23k - 18k 15k - 12k 1001 - 1039 8k - 4k 21k - 16k 19k - 16k 12k - 8k 5k - 4k 5k - 5k
16k 15k - 12k 18k - 15k 16k - 13k 21k - 16k 22k - 17k 14k - 11k 1055 - 1093 7k - 4k 21k - 17k 18k - 15k 12k - 7k 5k - 4k 5k - 5k
15k 14k - 10k 17k - 14k 15k - 12k 20k - 15k 20k - 16k 13k - 11k 1109 - 1147 7k - 3k 21k - 17k 17k - 13k 11k - 6k 4k - 3k 5k - 5k
14k 13k - 9k 16k - 13k 14k - 11k 19k - 14k 19k - 14k 12k - 9k 1163 - 1200 6k - 2k 20k - 16k 15k - 12k 10k - 6k 4k - 3k 4k - 4k
13k 11k - 8k 15k - 12k 12k - 10k 18k - 13k 18k - 13k 11k - 8k 1217 - 1254 5k - 2k 20k - 16k 14k - 11k 11k - 6k 3k - 2k 4k - 4k
12k 9k - 7k 14k - 11k 11k - 8k 17k - 12k 17k - 12k 10k - 8k 1270 - 1307 5k - 1k 18k - 15k 13k - 10k 12k - 8k 3k - 2k 3k - 3k
11k 8k - 5k 13k - 10k 10k - 7k 16k - 12k 16k - 12k 10k - 8k 1324 - 1360 4k - 1k 13k - 10k 12k - 9k 10k - 9k 2k - 1k 3k - 3k
10k 7k - 5k 12k - 9k 10k - 7k 15k - 11k 15k - 11k 10k - 7k 1377 - 1413 4k - 1d 9k - 6k 11k - 8k 6k - 4k 2k - 1d 2k - 2k
9k 7k - 4k 11k - 8k 9k - 6k 13k - 9k 13k - 10k 9k - 7k 1430 - 1466 3k - 1d 10k - 7k 10k - 7k 1k - 1d 1k - 1d 2k - 2k
8k 6k - 4k 10k - 7k 8k - 6k 11k - 7k 11k - 7k 8k - 5k 1482 - 1519 3k - 2d 11k - 8k 9k - 6k 3k - 2d 1d - 2d 1k - 1k
7k 5k - 3k 9k - 6k 7k - 4k 8k - 4k 9k - 5k 7k - 4k 1535 - 1571 2k - 2d 10k - 7k 8k - 5k 3k - 2d 1d - 2d 1k - 1k
6k 4k - 2k 8k - 5k 5k - 3k 5k - 2k 6k - 2k 6k - 3k 1587 - 1623 2k - 3d 9k - 5k 7k - 4k 1k - 2d 2d - 3d 1k - 1k
5k 4k - 1k 7k - 3k 4k - 1k 3k - 1d 4k - 1k 5k - 2k 1639 - 1675 1k - 3d 7k - 4k 6k - 3k 1k - 2d 2d - 3d 1d - 1d
4k 3k - 1d 5k - 2k 2k - 1d 2k - 3d 3k - 2d 5k - 2k 1691 - 1727 1k - 4d 5k - 3k 5k - 1k 1k - 2d 3d - 4d 1d - 1d
3k 3k - 1d 4k - 1k 1k - 2d 1k - 4d 2k - 3d 4k - 1k 1742 - 1779 1d - 5d 5k - 2k 4k - 1d 1k - 2d 3d - 4d 2d - 2d
2k 2k - 1d 3k - 1d 1k - 3d 1k - 4d 1k - 4d 3k - 1d 1794 - 1830 2d - 5d 4k - 1k 2k - 2d 1d - 4d 4d - 5d 2d - 2d
1k 2k - 2d 2k - 2d 1d - 4d 1d - 4d 1d - 5d 1k - 2d 1845 - 1881 2d - 6d 3k - 1d 1k - 3d 3d - 6d 4d - 6d 3d - 3d
1d 1k - 3d 1k - 4d 2d - 5d 2d - 5d 3d - 7d 1d - 3d 1896 - 1932 3d - 6d 2k - 1d 1d - 4d 5d - 6d 5d - 6d 3d - 3d
2d 1d - 4d 2d - 5d 4d - 6d 3d - 7d 4d - 8d 2d - 4d 1947 - 1983 3d - 7d 1k - 3d 2d - 5d 4d - 5d 5d - 7d 3d - 3d
3d 2d - 5d 3d - 6d 5d - 7d 4d - 8d 5d - 8d 3d - 5d 1997 - 2033 4d - 7d 1d - 4d 3d - 6d 5d - 6d 6d - 7d 4d - 4d
4d 3d - 6d 4d - 7d 6d - 8d 5d - 9d 5d - 9d 2d - 5d 2048 - 2084 4d - 8d 2d - 5d 4d - 7d 6d - 7d 7d - 8d 4d - 4d
5d 4d - 7d 5d - 8d 6d - 9d 6d - 10d 6d - 9d 2d - 5d 2098 - 2134 5d - 8d 3d - 6d 5d - 8d 6d - 7d 7d - 8d 5d - 5d
6d 5d - 8d 5d - 9d 7d - 10d 7d - 11d 7d - 11d 3d - 5d 2148 - 2184 5d - 9d 2d - 5d 6d - 9d 5d - 6d 8d - 9d 5d - 5d
7d 7d - 9d 6d - 10d 7d - 10d 8d - 12d 8d - 12d 3d - 6d 2197 - 2234 6d - 9d 2d - 6d 7d - 10d 5d - 8d 8d - 9d 6d - 6d
8d 8d - 11d 7d - 11d 8d - 11d 9d - 12 10d - 13 4d - 7d 2247 - 2283 6d - 10d 4d - 9d 8d - 11d 6d - 11d 9d - 10d 6d - 6d

A combined table of mean and standard deviation of ranks

In [22]:
ct1[cols].set_index(a)
Out[22]:
KGS IGS Foxwq Tygem WBaduk DGS GoQuest_rating GoQuest_rank EGF AGA Taiwan Japan China
OGS
27k 26.0k ± 2.1 28.5k ± 1.6 25.2k ± 1.5 33.1k ± 2.4 34.2k ± 2.3 20.9k ± 1.5 468.0 ± 20.5 11.3k ± 1.8 29.2k ± 2.4 28.1k ± 1.5 17.8k ± 2.3 10.4k ± 0.6 9.7k ± 0.0
26k 25.1k ± 2.1 27.4k ± 1.6 24.2k ± 1.5 31.8k ± 2.4 32.8k ± 2.3 20.1k ± 1.5 523.9 ± 20.3 10.8k ± 1.8 28.2k ± 2.4 27.0k ± 1.5 17.0k ± 2.3 9.9k ± 0.6 9.3k ± 0.0
25k 24.4k ± 2.1 26.3k ± 1.6 23.2k ± 1.5 30.5k ± 2.4 31.5k ± 2.3 19.4k ± 1.5 579.8 ± 20.2 10.2k ± 1.8 27.1k ± 2.4 25.9k ± 1.5 16.2k ± 2.3 9.3k ± 0.6 8.8k ± 0.0
24k 23.9k ± 2.0 25.2k ± 1.6 22.2k ± 1.5 29.2k ± 2.4 30.1k ± 2.3 18.6k ± 1.5 635.4 ± 20.0 9.7k ± 1.8 26.1k ± 2.4 24.8k ± 1.5 15.5k ± 2.3 8.8k ± 0.6 8.4k ± 0.0
23k 23.6k ± 2.0 24.1k ± 1.6 21.2k ± 1.5 27.9k ± 2.4 28.7k ± 2.3 17.8k ± 1.5 690.9 ± 19.8 9.1k ± 1.8 25.0k ± 2.4 23.7k ± 1.5 14.7k ± 2.3 8.2k ± 0.6 8.0k ± 0.0
22k 23.4k ± 1.8 23.1k ± 1.6 20.1k ± 1.5 26.5k ± 2.4 27.4k ± 2.3 17.1k ± 1.5 746.1 ± 19.7 8.6k ± 1.8 24.0k ± 2.4 22.6k ± 1.5 14.0k ± 2.3 7.6k ± 0.6 7.5k ± 0.0
21k 22.7k ± 1.7 22.0k ± 1.6 19.1k ± 1.5 25.2k ± 2.4 26.0k ± 2.3 16.3k ± 1.5 801.3 ± 19.5 8.0k ± 1.8 22.9k ± 2.4 21.5k ± 1.5 13.2k ± 2.3 7.1k ± 0.6 7.1k ± 0.0
20k 21.4k ± 1.5 20.9k ± 1.6 18.1k ± 1.5 23.9k ± 2.4 24.7k ± 2.3 15.5k ± 1.5 856.2 ± 19.4 7.5k ± 1.8 21.5k ± 2.3 20.4k ± 1.5 12.4k ± 2.3 6.5k ± 0.6 6.7k ± 0.0
19k 19.4k ± 1.4 19.8k ± 1.6 17.1k ± 1.5 22.6k ± 2.4 23.3k ± 2.3 14.8k ± 1.5 910.9 ± 19.3 6.9k ± 1.8 19.7k ± 2.0 19.4k ± 1.5 11.7k ± 2.3 6.0k ± 0.6 6.2k ± 0.0
18k 17.1k ± 1.5 18.7k ± 1.6 16.1k ± 1.5 21.3k ± 2.4 22.0k ± 2.3 14.0k ± 1.5 965.5 ± 19.1 6.4k ± 1.8 18.4k ± 1.7 18.3k ± 1.5 10.9k ± 2.3 5.4k ± 0.6 5.8k ± 0.0
17k 15.0k ± 1.6 17.7k ± 1.6 15.1k ± 1.5 20.0k ± 2.4 20.6k ± 2.3 13.3k ± 1.4 1019.9 ± 19.0 5.9k ± 1.8 18.4k ± 2.2 17.2k ± 1.5 10.1k ± 2.3 4.9k ± 0.6 5.4k ± 0.0
16k 13.4k ± 1.8 16.6k ± 1.6 14.0k ± 1.5 18.7k ± 2.4 19.3k ± 2.3 12.7k ± 1.3 1074.0 ± 18.9 5.3k ± 1.8 19.1k ± 2.1 16.1k ± 1.5 9.4k ± 2.3 4.3k ± 0.6 4.9k ± 0.0
15k 12.1k ± 1.8 15.4k ± 1.6 13.1k ± 1.5 17.5k ± 2.4 17.9k ± 2.3 11.8k ± 1.2 1128.0 ± 18.8 4.8k ± 1.8 19.1k ± 1.7 15.0k ± 1.5 8.6k ± 2.3 3.8k ± 0.6 4.5k ± 0.0
14k 10.8k ± 1.7 14.3k ± 1.6 12.1k ± 1.5 16.4k ± 2.4 16.6k ± 2.3 10.6k ± 1.2 1181.8 ± 18.7 4.2k ± 1.8 18.0k ± 2.1 13.9k ± 1.5 8.0k ± 2.3 3.2k ± 0.6 4.1k ± 0.0
13k 9.4k ± 1.6 13.2k ± 1.6 11.0k ± 1.4 15.5k ± 2.4 15.4k ± 2.2 9.5k ± 1.2 1235.4 ± 18.6 3.7k ± 1.8 17.6k ± 2.1 12.8k ± 1.5 8.3k ± 2.3 2.7k ± 0.6 3.6k ± 0.0
12k 8.0k ± 1.4 12.1k ± 1.6 9.9k ± 1.4 14.7k ± 2.2 14.4k ± 2.2 8.8k ± 1.1 1288.8 ± 18.5 3.1k ± 1.8 16.4k ± 1.7 11.7k ± 1.5 9.9k ± 1.7 2.1k ± 0.6 3.2k ± 0.0
11k 6.8k ± 1.3 11.1k ± 1.6 8.8k ± 1.4 14.0k ± 2.1 13.6k ± 2.0 8.7k ± 1.1 1342.1 ± 18.4 2.6k ± 1.8 11.4k ± 1.8 10.7k ± 1.5 9.8k ± 0.7 1.6k ± 0.6 2.8k ± 0.0
10k 6.0k ± 1.3 10.2k ± 1.6 8.1k ± 1.4 12.9k ± 1.9 12.9k ± 1.8 8.6k ± 1.1 1395.1 ± 18.3 2.0k ± 1.8 7.7k ± 1.6 9.6k ± 1.5 4.8k ± 1.1 1.0k ± 0.6 2.3k ± 0.0
9k 5.5k ± 1.3 9.3k ± 1.6 7.7k ± 1.4 11.3k ± 1.9 11.5k ± 1.8 7.9k ± 1.2 1447.9 ± 18.3 1.5k ± 1.8 8.9k ± 1.4 8.5k ± 1.5 0.5k ± 0.8 0.5k ± 0.6 1.9k ± 0.0
8k 5.0k ± 1.3 8.3k ± 1.6 6.9k ± 1.4 9.0k ± 1.9 9.3k ± 1.9 6.8k ± 1.4 1500.5 ± 18.2 1.0k ± 1.8 9.2k ± 1.4 7.4k ± 1.5 0.7k ± 1.9 1.1d ± 0.6 1.5k ± 0.0
7k 4.2k ± 1.3 7.3k ± 1.6 5.5k ± 1.4 6.3k ± 1.9 6.7k ± 2.0 5.7k ± 1.5 1552.9 ± 18.2 0.4k ± 1.8 8.1k ± 1.4 6.3k ± 1.5 1.0k ± 1.8 1.6d ± 0.6 1.0k ± 0.0
6k 3.2k ± 1.3 6.1k ± 1.6 3.9k ± 1.4 3.6k ± 1.8 4.4k ± 2.0 4.8k ± 1.5 1605.1 ± 18.1 1.1d ± 1.8 7.0k ± 1.6 5.2k ± 1.5 0.2k ± 0.7 2.2d ± 0.6 0.6k ± 0.0
5k 2.3k ± 1.3 4.9k ± 1.6 2.4k ± 1.3 1.4k ± 1.8 2.5k ± 1.9 3.9k ± 1.5 1657.1 ± 18.1 1.7d ± 1.8 5.3k ± 1.4 4.1k ± 1.5 1.0d ± 0.6 2.8d ± 0.6 0.2k ± 0.0
4k 1.7k ± 1.3 3.8k ± 1.6 1.2k ± 1.3 1.1d ± 1.8 1.2k ± 1.9 3.1k ± 1.5 1708.9 ± 18.1 2.2d ± 1.8 4.0k ± 1.4 3.0k ± 1.5 0.2k ± 1.0 3.3d ± 0.6 1.3d ± 0.0
3k 1.3k ± 1.3 2.6k ± 1.6 0.2k ± 1.3 1.8d ± 1.8 0.3k ± 1.9 2.3k ± 1.5 1760.5 ± 18.0 2.8d ± 1.8 3.8k ± 1.4 2.0k ± 1.5 1.2d ± 0.7 3.9d ± 0.6 1.7d ± 0.0
2k 0.9k ± 1.3 1.4k ± 1.6 1.6d ± 1.3 2.1d ± 1.8 1.8d ± 1.8 1.3k ± 1.4 1811.9 ± 18.0 3.3d ± 1.8 2.6k ± 1.5 0.9k ± 1.5 2.6d ± 1.8 4.4d ± 0.6 2.1d ± 0.0
1k 0.3k ± 1.3 0.3k ± 1.6 2.3d ± 1.3 2.6d ± 1.8 3.2d ± 1.8 0.2k ± 1.2 1863.1 ± 18.0 3.9d ± 1.8 1.5k ± 1.4 1.2d ± 1.5 4.6d ± 1.4 5.0d ± 0.6 2.6d ± 0.0
1d 1.4d ± 1.3 1.9d ± 1.6 3.4d ± 1.3 3.6d ± 1.7 4.8d ± 1.8 2.1d ± 1.1 1914.1 ± 18.0 4.4d ± 1.8 1.0k ± 1.4 2.3d ± 1.5 5.0d ± 0.5 5.5d ± 0.6 3.0d ± 0.0
2d 2.4d ± 1.3 3.1d ± 1.6 4.8d ± 1.3 4.9d ± 1.8 5.9d ± 1.8 3.2d ± 1.1 1964.8 ± 18.0 4.9d ± 1.8 1.6d ± 1.3 3.4d ± 1.5 4.7d ± 0.5 6.1d ± 0.6 3.4d ± 0.0
3d 3.5d ± 1.3 4.2d ± 1.6 6.0d ± 1.3 6.2d ± 1.8 6.5d ± 1.8 3.7d ± 1.1 2015.4 ± 18.1 5.5d ± 1.8 2.9d ± 1.4 4.5d ± 1.5 5.8d ± 0.5 6.6d ± 0.6 3.9d ± 0.0
4d 4.7d ± 1.3 5.2d ± 1.6 7.0d ± 1.3 7.2d ± 1.8 6.9d ± 1.8 3.7d ± 1.2 2065.8 ± 18.1 6.0d ± 1.8 4.0d ± 1.5 5.6d ± 1.5 6.1d ± 0.5 7.2d ± 0.6 4.3d ± 0.0
5d 5.8d ± 1.4 6.1d ± 1.6 7.8d ± 1.3 8.0d ± 1.8 7.6d ± 1.8 3.5d ± 1.2 2115.9 ± 18.1 6.6d ± 1.8 4.3d ± 1.6 6.7d ± 1.5 6.4d ± 0.5 7.7d ± 0.6 4.7d ± 0.0
6d 6.9d ± 1.4 7.0d ± 1.6 8.3d ± 1.3 8.8d ± 1.8 8.8d ± 1.9 3.8d ± 1.2 2165.9 ± 18.2 7.1d ± 1.8 3.4d ± 1.6 7.7d ± 1.5 5.7d ± 0.5 8.3d ± 0.6 5.2d ± 0.0
7d 8.0d ± 1.4 8.0d ± 1.6 8.7d ± 1.4 9.8d ± 1.9 10.4d ± 2.0 4.6d ± 1.3 2215.6 ± 18.3 7.7d ± 1.8 4.4d ± 2.1 8.8d ± 1.5 6.5d ± 1.6 8.8d ± 0.6 5.6d ± 0.0
8d 9.1d ± 1.5 9.1d ± 1.6 9.5d ± 1.4 11.1d ± 2.1 12.2d ± 2.2 5.8d ± 1.4 2265.1 ± 18.3 8.2d ± 1.8 6.7d ± 2.4 9.9d ± 1.5 8.5d ± 2.3 9.4d ± 0.6 6.0d ± 0.0
In [ ]: