{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Couldn't import dot_parser, loading of dot files will not be possible.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using Theano backend.\n"
     ]
    }
   ],
   "source": [
    "import mhcflurry, seaborn, numpy, pandas, pickle, sklearn, collections, scipy, time\n",
    "import mhcflurry.dataset\n",
    "import fancyimpute, locale\n",
    "from matplotlib import pyplot\n",
    "\n",
    "\n",
    "import sklearn.metrics\n",
    "import sklearn.cross_validation\n",
    "%matplotlib inline\n",
    "\n",
    "from matplotlib import rc\n",
    "rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})\n",
    "## for Palatino and other serif fonts use:\n",
    "#rc('font',**{'family':'serif','serif':['Palatino']})\n",
    "rc('text', usetex=True)\n",
    "\n",
    "\n",
    "def print_full(x):\n",
    "    pandas.set_option('display.max_rows', len(x))\n",
    "    print(x)\n",
    "    pandas.reset_option('display.max_rows')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "name_adjustments = {\n",
    "    \"tau\": \"Kendall's $\\\\tau$\",\n",
    "    \"auc\": \"AUC\",\n",
    "    \"f1\": \"$F_1$ score\",\n",
    "    \"mhcflurry ensemble all\": \"mhcflurry ensemble\",\n",
    "    \"mhcflurry 0\": \"mhcflurry single\",\n",
    "    \"smmpmbec_cpp\": \"smmpmbec cpp\",\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nB5676667+j228/fRs10997tu3bo+32P79u397lsIIcIlt06E6CEzM5OZM2cGf7darZSWllJbW4vb\n7b5g++zsbADMZjMtLS197rOvbZKTk4M/t7S0kJSU1Os1jzzyCDt37mT58uXYbDZqampwOp2sW7eO\nqqqq4GvVELd9zt/H+WpraykvL+d73/sewAXv4XK5+t23EEKES26dCNFDSkpK8Ger1Yrb7Wbt2rWU\nlpYGH+/55X4xP7tcLkpKSnjggQcuaEdSUhLr168H4NZbb+X+++/H5XJdMGskcFunLz33kZ+fz+LF\ni3u9/2OPPcYzzzwT/D0nJ6fP9xBCiIshiYYY087/ou75e3Z2NqtXr+bIkSPU1taycOHCC7a5mJ9r\namqwWCyUl5fT3Nzca/aI1Wpl+/btKIrCPffcw4oVK3j88cdZuXIlJpMpOCYjKyuL4uJibrvtNlas\nWNHrWHru4+6770ZV1eD7P/7447S2tgYTqKKion7fQwghLoZMbxViBDz++OMsWbKE3Nxc3G439957\nL88///xIN0sIIYacJBpCjIC6ujqee+654O+zZs2SWxZCiJgkiYYQQgghIkZmnQghhBAiYiTREEII\nIUTESKIhhBBCiIiRREMIIYQQESOJhhBCCCEi5v8BYvG/c5n1/pwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10773fe50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "impute_comparison = pandas.read_csv(\"../data/impute_comparison.csv\")\n",
    "\n",
    "pyplot.figure(figsize=(6,3.5))\n",
    "seaborn.set_style(\"whitegrid\")\n",
    "\n",
    "for (i, (allele, data)) in enumerate(impute_comparison.groupby(\"allele\")):\n",
    "    for (j, score) in enumerate([\"test_auc\", \"test_f1\", \"test_tau\"]):\n",
    "        ax = pyplot.subplot2grid((3,3),(i, j)) #sharey=pyplot.gca())\n",
    "        grouped = data.groupby([\"train_size\", \"impute\"])[score].mean().to_frame().reset_index()\n",
    "        grouped[\"std_error\"] = data.groupby([\"train_size\", \"impute\"])[score].std().to_frame().reset_index()[score]\n",
    "        for impute in [True, False]:\n",
    "            sub = grouped[grouped.impute == impute]\n",
    "            pyplot.errorbar(\n",
    "                           x=sub.train_size.values,\n",
    "                           y=sub[score].values,\n",
    "                           yerr=sub.std_error.values,\n",
    "                           label=(\"with\" if impute else \"without\") + \" imputation\",\n",
    "                           color=seaborn.get_color_cycle()[0] if impute else seaborn.get_color_cycle()[1])    \n",
    "        if i == 0:\n",
    "            pyplot.title(name_adjustments.get(score.replace(\"test_\", \"\")))\n",
    "        if j == 0:\n",
    "            pyplot.ylabel(allele)\n",
    "        pyplot.xscale(\"log\")\n",
    "        # if (i,j) == (0,0):\n",
    "        #    pyplot.legend(loc='lower right', fancybox=True, frameon=True, fontsize=\"x-small\")\n",
    "\n",
    "        if (i,j) == (2,1):\n",
    "            pyplot.xlabel(\"Training set size\")\n",
    "        if i != 2:\n",
    "            pyplot.gca().axes.xaxis.set_ticklabels([])\n",
    "\n",
    "        if score == \"test_auc\":\n",
    "            pyplot.ylim(ymin=0.5, ymax=1.0)\n",
    "        if score == \"test_f1\":\n",
    "            pyplot.ylim(ymin=0, ymax=1)\n",
    "        if score == \"test_tau\":\n",
    "            pyplot.ylim(ymin=0, ymax=0.6)\n",
    "            pyplot.yticks(numpy.arange(0, 0.61, 0.1))\n",
    "\n",
    "pyplot.tight_layout()\n",
    "# Put the legend out of the figure\n",
    "pyplot.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., fancybox=True, frameon=True)\n",
    "pyplot.savefig(\"../figures/impute_comparison.pdf\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\\begin{table}[h]\n",
      "\\centering\n",
      "\\begin{tabular}{llll}\n",
      "\\toprule\n",
      "{} &              AUC &      $F_1$ score & Kendall's $\\tau$ \\\\\n",
      "\\midrule\n",
      "mhcflurry ensemble &  \\textbf{0.9329} &           0.7849 &           0.5848 \\\\\n",
      "mhcflurry single   &           0.9323 &           0.7811 &           0.5857 \\\\\n",
      "netmhc             &           0.9323 &  \\textbf{0.8072} &  \\textbf{0.5863} \\\\\n",
      "netmhcpan          &           0.9326 &           0.7996 &           0.5814 \\\\\n",
      "smmpmbec cpp       &           0.9213 &           0.7903 &           0.5649 \\\\\n",
      "\\bottomrule\n",
      "\\end{tabular}\n",
      "\n",
      "\\caption{Performance on BLIND with equal weight given to each measurement (53,776 measurements)}\n",
      "\\label{tab:measurementweighted}\n",
      "\\end{table}\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'\\nlatex_table(panel.mean(1).T, label=\"alleleweighted\",\\n            caption=\"\"\"\\n            Performance on BLIND with equal weight given to each allele (%d alleles)\\n            \"\"\" % panel.shape[1])\\nlatex_table(panel[:,big_alleles].mean(1).T, label=\"alleleweightedbig\",\\n            caption=\"\"\"\\n            Performance on BLIND for alleles with at least 500 training observations (%d alleles)\\n            \"\"\" % len(big_alleles))\\n#latex_table(panel[:,small_alleles].mean(1).T,\\n#            caption=\"\"\"\\n#            Performance on BLIND for alleles with fewer than 500 training observations (%d alleles)\\n#            \"\"\" % len(small_alleles))\\n\\n\\n\\ndf=panel[:,small_alleles,\"auc\"]\\ndf[\"train size\"] = scores_df.ix[scores_df.index != \\'overall\\'].train_size.apply(lambda x: str(int(x)))\\ndf[\"test size\"] = scores_df.ix[scores_df.index != \\'overall\\'].test_size.apply(lambda x: str(int(x)))\\ndf = df[[\"train size\", \"test size\"] + list(panel.items)]\\ndf.sort(\"train size\", inplace=True)\\nlatex_table(df.T, max_df = df.T.iloc[2:], label=\"smallalleles\", caption=\"\"\"\\nAUC scores on BLIND dataset for alleles with fewer than 500 training examples\\n\"\"\")\\n'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores_df = pandas.read_csv(\"../data/validation_scores.csv\", index_col=\"allele\")\n",
    "scores_df\n",
    "big_alleles = list((scores_df.ix[(scores_df.index != \"overall\") & (scores_df.train_size >= 500)]).index)\n",
    "small_alleles = list((scores_df.ix[(scores_df.index != \"overall\") & (scores_df.train_size < 500)]).index)\n",
    "small_alleles\n",
    "\n",
    "def sub_df(name):\n",
    "    result = scores_df[[c for c in list(scores_df.columns) if (name + \"_\") in c]].copy()\n",
    "    result.columns = [c.split(\"_\")[-1] for c in list(result.columns)]\n",
    "    return result\n",
    "\n",
    "predictors = [\"mhcflurry ensemble all\", \"mhcflurry 0\", \"netmhc\", \"netmhcpan\", \"smmpmbec_cpp\"]\n",
    "\n",
    "d = dict((name, sub_df(name)) for name in predictors)\n",
    "panel_all = pandas.Panel(d)\n",
    "panel = panel_all[predictors]\n",
    "panel\n",
    "\n",
    "def latex_table(df, max_df=None, caption=None, label=None, name_adjustments=name_adjustments):\n",
    "    if max_df is None:\n",
    "        max_df = df\n",
    "    df_strings = df.copy()\n",
    "    for col in df.columns:\n",
    "        del df_strings[col]\n",
    "        renamed_col = name_adjustments.get(col, col)\n",
    "        df_strings[renamed_col] = [\n",
    "            (\"\\\\textbf{%s}\" if x == max_df[col].max() else \"%s\") % ((\"%0.4f\" % x) if isinstance(x, float) else x)\n",
    "            for x in df[col]\n",
    "        ]\n",
    "    df_strings.index = [name_adjustments.get(x, x) for x in df_strings.index]\n",
    "\n",
    "    print(r\"\\begin{table}[h]\")\n",
    "    print(r\"\\centering\")\n",
    "    print(df_strings.to_latex(escape=False))\n",
    "    if caption:\n",
    "        print(\"\\\\caption{%s}\" % caption.strip())\n",
    "    if label:\n",
    "        print(\"\\\\label{tab:%s}\" % label.strip())\n",
    "    print(r\"\\end{table}\")\n",
    "    print(\"\")\n",
    "\n",
    "    \n",
    "latex_table(panel[:,\"overall\"].T, label=\"measurementweighted\",\n",
    "            caption=\"\"\"\n",
    "            Performance on BLIND with equal weight given to each measurement ({:,d} measurements)\n",
    "            \"\"\".format(scores_df.test_size.sum()))\n",
    "'''\n",
    "latex_table(panel.mean(1).T, label=\"alleleweighted\",\n",
    "            caption=\"\"\"\n",
    "            Performance on BLIND with equal weight given to each allele (%d alleles)\n",
    "            \"\"\" % panel.shape[1])\n",
    "latex_table(panel[:,big_alleles].mean(1).T, label=\"alleleweightedbig\",\n",
    "            caption=\"\"\"\n",
    "            Performance on BLIND for alleles with at least 500 training observations (%d alleles)\n",
    "            \"\"\" % len(big_alleles))\n",
    "#latex_table(panel[:,small_alleles].mean(1).T,\n",
    "#            caption=\"\"\"\n",
    "#            Performance on BLIND for alleles with fewer than 500 training observations (%d alleles)\n",
    "#            \"\"\" % len(small_alleles))\n",
    "\n",
    "\n",
    "\n",
    "df=panel[:,small_alleles,\"auc\"]\n",
    "df[\"train size\"] = scores_df.ix[scores_df.index != 'overall'].train_size.apply(lambda x: str(int(x)))\n",
    "df[\"test size\"] = scores_df.ix[scores_df.index != 'overall'].test_size.apply(lambda x: str(int(x)))\n",
    "df = df[[\"train size\", \"test size\"] + list(panel.items)]\n",
    "df.sort(\"train size\", inplace=True)\n",
    "latex_table(df.T, max_df = df.T.iloc[2:], label=\"smallalleles\", caption=\"\"\"\n",
    "AUC scores on BLIND dataset for alleles with fewer than 500 training examples\n",
    "\"\"\")\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "53776"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
