past-data-projects / personal_loan_credit_risk / 500-Calibration / 503 - Calibration.ipynb
503 - Calibration.ipynb
Raw
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T08:28:53.974518Z",
     "start_time": "2019-04-10T08:28:53.189985Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import pickle\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import statsmodels.formula.api as smf\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Original Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T08:28:54.090753Z",
     "start_time": "2019-04-10T08:28:54.079572Z"
    }
   },
   "outputs": [],
   "source": [
    "base_df = pd.read_parquet('data/interim/pl_jumbo_mini_junjulaugsep_27012020.parquet')\\\n",
    "            .rename(columns={'loan_amount':'amount'})\n",
    "pl_feats = pd.read_parquet('data/interim/pl_model_v3_feats_27012020.parquet')\n",
    "\n",
    "# REMOVE OLD util_non_pl\n",
    "pl_feats = pl_feats.drop(columns=['util_non_pl'])\n",
    "# ATTACH NEW util_non_pl\n",
    "fixed_util_non_pl = pd.read_parquet('data/interim/fixed_util_non_pl.parquet')\n",
    "pl_feats = pl_feats.merge(fixed_util_non_pl, how='left', on=['user_id', 'trx_id'])\n",
    "\n",
    "pf_feats = pd.read_parquet('data/interim/pl_model_v3_pefindo_feats_27012020.parquet')\\\n",
    "             .drop(columns=['transaction_date'])\n",
    "new_feats = pd.read_parquet('data/interim/pl_model_v3_new_feats_27012020.parquet')\n",
    "dgtl_trx_feats = pd.read_parquet('data/interim/pl_model_v3_dgtl_trx_feats_18022020.parquet')\n",
    "new_trx_feats = pd.read_parquet('data/interim/pl_model_v3_new_trx_feats_27012020.parquet')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150672, 18)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(150672, 28)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(150672, 9)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(150672, 85)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(150672, 56)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(150672, 30)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(base_df.shape)\n",
    "display(pl_feats.shape)\n",
    "display(pf_feats.shape)\n",
    "display(new_feats.shape)\n",
    "display(dgtl_trx_feats.shape)\n",
    "display(new_trx_feats.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "raw_df = base_df.merge(pl_feats, how='left', on=['user_id', 'trx_id'])\\\n",
    "                .merge(pf_feats, how='left', on=['user_id', 'trx_id'])\\\n",
    "                .merge(new_feats, how='left', on=['user_id', 'trx_id'])\\\n",
    "                .merge(dgtl_trx_feats, how='left', on=['user_id', 'trx_id'])\\\n",
    "                .merge(new_trx_feats, how='left', on=['user_id', 'trx_id'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "rename_feats = {\n",
    "    'denied_trx_co_3mo':'trx_denied_co_90',\n",
    "    'delin_max_dpd_3mo':'delin_max_dpd_90',\n",
    "    'pl_trx_co_jumbomini_4_90':'pl_trx_suc_co_90',\n",
    "    'settle_to_due_last_pl_180':'pl_settle_to_due_last_180',\n",
    "    'settled_trx_sum_1mo':'trx_sett_sum_30',\n",
    "    'td_date':'date_of_month',\n",
    "    'time_approve_to_pl_hour':'time_appr_to_pl_hour',\n",
    "    'time_from_prev_pl_settle':'time_from_last_sett_pl_hour'\n",
    "}\n",
    "\n",
    "raw_df = raw_df.rename(columns=rename_feats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150672, 216)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "raw_df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature Transformations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "raw_df['payment_type'] = np.where(raw_df['payment_type'] == '3_months', 0, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# NaN values in time_approve_to_pl_hour are caused by missing approval time in DB\n",
    "# fill with 0. (There are only 4 cases)\n",
    "raw_df['time_appr_to_pl_hour'] = raw_df['time_appr_to_pl_hour'].fillna(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Negative values caused by error in loan table. User's previous pl\n",
    "# settlement date is after the current pl transaction date.\n",
    "# Replace with median values. (There are only 2 cases)\n",
    "neg_index = raw_df[raw_df['time_from_last_sett_pl_hour'] < 0].index\n",
    "med_val = raw_df['time_from_last_sett_pl_hour'].median()\n",
    "raw_df.loc[neg_index, 'time_from_last_sett_pl_hour'] = med_val"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Original data flag_bad Definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "raw_df['flag_bad'] = np.where(raw_df['max_dpd'] > 60, 1, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-04-10T08:28:54.096002Z",
     "start_time": "2019-04-10T08:28:54.094053Z"
    }
   },
   "outputs": [],
   "source": [
    "# condlist = [raw_df['max_dpd']<8, raw_df['max_dpd']>=61]\n",
    "# choicelist = [0, 1]\n",
    "# raw_df['flag_bad'] = np.select(condlist, choicelist, default=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    144230\n",
       "1      6442\n",
       "Name: flag_bad, dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "raw_df['flag_bad'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Rejected Users Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "rej_base = pd.read_parquet('data/pl_rejected_users_junjulaugsep_04022020.parquet')\\\n",
    "             .rename(columns={'transaction_id':'trx_id'})\n",
    "rej_feats = pd.read_parquet('data/pl_rejected_users_feats_04022020.parquet')\n",
    "# REMOVE util_non_pl & nondgtl_nonpl_trx_co_180\n",
    "rej_feats = rej_feats.drop(columns=['util_non_pl', 'nondgtl_nonpl_trx_co_180'])\n",
    "# ATTACH fixed feats\n",
    "fixed_rej_util = pd.read_parquet('data/fixed_pl_rejected_util_non_pl.parquet')\n",
    "fixed_rej_nondgtl = pd.read_parquet('data/fixed_pl_rejected_dgtl_trx_feats.parquet')\n",
    "rej_feats = rej_feats.merge(fixed_rej_util[['user_id', 'trx_id', 'util_non_pl']], how='left', \n",
    "                            on=['user_id', 'trx_id'])\\\n",
    "                     .merge(fixed_rej_nondgtl[['user_id', 'trx_id', 'nondgtl_nonpl_trx_co_180']], how='left', \n",
    "                            on=['user_id', 'trx_id'])\n",
    "\n",
    "rej_pef_feats = pd.read_parquet('data/pl_rejected_users_pefindo_feats_04022020.parquet')\\\n",
    "                  .rename(columns={'transaction_id':'trx_id'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "cols_to_drop = [\n",
    "    'rule_name', 'result', 'remarks',\n",
    "    'transaction_date', 'amount', 'performance_window', 'max_dpd'\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "rej_feats = rej_feats.drop(columns=cols_to_drop)\n",
    "rej_pef_feats = rej_pef_feats.drop(columns=['transaction_date'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['trx_id', 'user_id', 'rule_name', 'result', 'remarks',\n",
       "       'transaction_date', 'amount', 'payment_type', 'performance_window',\n",
       "       'max_dpd'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rej_base.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(16190, 10)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(16190, 191)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(16190, 9)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(rej_base.shape)\n",
    "display(rej_feats.shape)\n",
    "display(rej_pef_feats.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "rej_raw = rej_base.merge(rej_feats, how='left', on=['user_id', 'trx_id'])\\\n",
    "                  .merge(rej_pef_feats, how='left', on=['user_id', 'trx_id'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "rename_feats = {\n",
    "    'denied_trx_co_3mo':'trx_denied_co_90',\n",
    "    'delin_max_dpd_3mo':'delin_max_dpd_90',\n",
    "    'pl_trx_co_jumbomini_4_90':'pl_trx_suc_co_90',\n",
    "    'settle_to_due_last_pl_180':'pl_settle_to_due_last_180',\n",
    "    'settled_trx_sum_1mo':'trx_sett_sum_30',\n",
    "    'td_date':'date_of_month',\n",
    "    'time_approve_to_pl_hour':'time_appr_to_pl_hour',\n",
    "    'time_from_prev_pl_settle':'time_from_last_sett_pl_hour'\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "rej_raw = rej_raw.rename(columns=rename_feats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(16190, 206)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rej_raw.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature Transformations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "rej_raw['payment_type'] = np.where(rej_raw['payment_type'] == '3_months', 0, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# NaN values in time_approve_to_pl_hour are caused by missing approval time in DB\n",
    "# fill with 0. (There are only 4 cases)\n",
    "rej_raw['time_appr_to_pl_hour'] = rej_raw['time_appr_to_pl_hour'].fillna(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Negative values caused by error in loan table. User's previous pl\n",
    "# settlement date is after the current pl transaction date.\n",
    "# Replace with median values. (There are only 2 cases)\n",
    "neg_index = rej_raw[rej_raw['time_from_last_sett_pl_hour'] < 0].index\n",
    "med_val = rej_raw['time_from_last_sett_pl_hour'].median()\n",
    "rej_raw.loc[neg_index, 'time_from_last_sett_pl_hour'] = med_val"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Rejected users flag_bad Definition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "rej_raw['flag_non_trx'] = rej_raw['max_dpd'].isna()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "677"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rej_raw['max_dpd'].isna().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.04181593576281655"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rej_raw['max_dpd'].isna().sum()/rej_raw.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# users without any outstanding trx (max_dpd is null)\n",
    "# assign as a good user\n",
    "rej_raw['flag_bad'] = np.where(rej_raw['max_dpd'] > 60, 1, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    14755\n",
       "1     1435\n",
       "Name: flag_bad, dtype: int64"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rej_raw['flag_bad'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# condlist = [rej_raw['max_dpd']<=60, rej_raw['max_dpd']>=61, rej_raw['max_dpd'].isna()]\n",
    "# choicelist = [0, 1, np.nan]\n",
    "# rej_raw['flag_bad'] = np.select(condlist, choicelist, default=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Concat Original Data with Rejected Users Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = ['ap_co_plo',\n",
    "            'current_dpd',\n",
    "            'date_of_month',\n",
    "            'delin_max_dpd_90',\n",
    "            'nondgtl_nonpl_trx_co_180',\n",
    "            'oth_last_rep_days',\n",
    "            'oth_last_rep_dpd',\n",
    "            'payment_type',\n",
    "            'pf_delin_max_dpd_12mo',\n",
    "            'pl_settle_to_due_last_180',\n",
    "            'pl_trx_suc_co_90',\n",
    "            'time_appr_to_pl_hour',\n",
    "            'time_from_last_sett_pl_hour',\n",
    "            'trx_denied_co_90',\n",
    "            'trx_sett_sum_30',\n",
    "            'util_non_pl',\n",
    "            'util_pl'\n",
    "           ]\n",
    "\n",
    "features = sorted(features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "context_cols = [\n",
    "    'user_id', 'trx_id', 'transaction_date', 'max_dpd', 'flag_bad', 'performance_window', 'amount'\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(150672, 24)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "raw_df[context_cols + features].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(16190, 24)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rej_raw[context_cols + features].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "calib_df = pd.concat([raw_df[context_cols + features], rej_raw[context_cols + features]])\\\n",
    "             .reset_index(drop=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(166862, 24)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "calib_df['flag_no_trx'] = calib_df['max_dpd'].isna()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False    166171\n",
       "True        691\n",
       "Name: flag_no_trx, dtype: int64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df['flag_no_trx'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "calib_df['flag_rejected'] = calib_df['trx_id'].isin(rej_raw['trx_id'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False    150672\n",
       "True      16190\n",
       "Name: flag_rejected, dtype: int64"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df['flag_rejected'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    158985\n",
       "1      7877\n",
       "Name: flag_bad, dtype: int64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df['flag_bad'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Simple Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.04275512371243496"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df[calib_df['flag_rejected'] == False]['flag_bad'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3773292.317086121"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df[calib_df['flag_rejected'] == False]['amount'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.08863495985176034"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df[calib_df['flag_rejected'] == True]['flag_bad'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5864175.416924027"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calib_df[calib_df['flag_rejected'] == True]['amount'].mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Input Model Proba Score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "mod_lgb = pickle.load(open('lgbm_pl_score_v3.p', 'rb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1079"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mod_lgb.best_iteration_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "calib_df['proba_v3'] = mod_lgb.predict_proba(calib_df[features], \n",
    "                                             num_iteration=mod_lgb.best_iteration_\n",
    "                                             )[:,1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "def agg_data(df, bins, proba_label):\n",
    "    df['bins'] = pd.qcut(df[proba_label], bins, duplicates='drop')\n",
    "    grp_df = df.groupby('bins').agg({'flag_bad':['count', 'sum', 'mean'],\n",
    "                                     proba_label:['mean', 'median']})\n",
    "    grp_df.columns = ['tot_obs', 'tot_bad', 'odr', 'proba_mean', 'proba_median']\n",
    "    return grp_df\n",
    "\n",
    "\n",
    "def select_model(df, model_type, target_var, indep_var):\n",
    "    if model_type == 'linear':\n",
    "        model = smf.ols(formula=f'{target_var} ~ {indep_var}', data=df).fit()\n",
    "    elif model_type == 'quadratic':\n",
    "        model = smf.ols(formula=f'{target_var} ~ {indep_var} + np.power({indep_var}, 2)', data=df).fit()\n",
    "    elif model_type == 'cubic':\n",
    "        model = smf.ols(formula=f'''{target_var} ~ {indep_var} + np.power({indep_var}, 2) \n",
    "                                    + np.power({indep_var}, 3)''', data=df).fit()\n",
    "    elif model_type == 'logarithmic':\n",
    "        model = smf.ols(formula=f'{target_var} ~ np.log({indep_var})', data=df).fit()\n",
    "    else:\n",
    "        print('Model type not recognized.')\n",
    "    return model\n",
    "    \n",
    "# call this function\n",
    "def check_best_model(df, bins, proba_label, models_ls, target_var, indep_var):\n",
    "    agg_df = agg_data(df, bins, proba_label)\n",
    "    for model_type in models_ls:\n",
    "        model = select_model(agg_df, model_type, target_var, indep_var)\n",
    "        print('Model:', model_type)\n",
    "        print('r_squared:    ', model.rsquared)\n",
    "        print('r_squared_adj:', model.rsquared_adj)\n",
    "        print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_result(grp_df, target_var, indep_var, model_type, rsquare):\n",
    "    \n",
    "    plt.figure(figsize=[12,6])\n",
    "    x = grp_df[target_var].tolist()\n",
    "    y1 = grp_df[indep_var].tolist()\n",
    "    y2 = grp_df['calibrated_score_grp'].tolist()\n",
    "    y3 = grp_df['calibrated_score_ind'].tolist()\n",
    "    \n",
    "    plt.scatter(x,y1,label = 'raw score', c='blue',marker='s')\n",
    "    plt.scatter(x,y2,label = 'calibrated score grp', s=60,c='red',marker='o')\n",
    "    plt.scatter(x,y3,label = 'calibrated score ind', c='#32CD32',marker='v')\n",
    "    plt.plot(x,x, label='perfect line',ls='--',c='black',alpha=0.7)\n",
    "    plt.xlabel('ODR')\n",
    "    plt.ylabel('Predicted Score & Calibrated Score')\n",
    "    plt.legend()\n",
    "    plt.title(f'model type: {model_type} with rsquare of: {rsquare}')\n",
    "\n",
    "    \n",
    "def create_equation(model, indep_var):\n",
    "    eq_df = model.params.reset_index()\n",
    "    eq_df.columns = ['position', 'coef']\n",
    "    eq_df['position'] = eq_df['position'].str.replace(indep_var, 'x')\n",
    "    \n",
    "    eq_ls = []\n",
    "    for i in range(len(eq_df)):\n",
    "        if eq_df['position'][i] == 'Intercept':\n",
    "            eq_ls.append(str(round(eq_df['coef'][i], 4)))\n",
    "        else:\n",
    "            eq_ls.append(f'{round(eq_df[\"coef\"][i], 4)}*{eq_df[\"position\"][i]}')\n",
    "            \n",
    "    equation = '+'.join(eq_ls)\n",
    "    return equation\n",
    "    \n",
    "# make sure that the chosen calibration curve is monotonically increasing (a fundamental assumption)\n",
    "def plot_calib_func(calib_func):\n",
    "    y = []\n",
    "    for x in np.arange(0,1,0.001):\n",
    "        y.append(eval(calib_func))\n",
    "    x = [x for x in np.arange(0,1,0.001)]\n",
    "    fig, ax = plt.subplots()\n",
    "    ax.plot(x, y)\n",
    "    ax.set_title('Calibration Function Curve')\n",
    "\n",
    "# call this function\n",
    "def analyze_calibrated_result(df, bins, proba_label, model_type, target_var, indep_var):\n",
    "    grp_df =agg_data(df, bins, proba_label)\n",
    "    model = select_model(grp_df, model_type, target_var, indep_var)\n",
    "    \n",
    "    df[indep_var] = df[proba_label]\n",
    "    df['calibrated_score_ind'] = np.minimum(np.maximum(model.predict(df[indep_var]),0.001),1)\n",
    "    grp_df['calibrated_score_grp'] = np.minimum(np.maximum(model.predict(grp_df[indep_var]),0.001),1)\n",
    "    grp_df['calibrated_score_ind'] = df.groupby('bins').agg({'calibrated_score_ind':'mean'})\n",
    "    \n",
    "    equation = create_equation(model, indep_var)\n",
    "    print('Calibration Function:', equation)\n",
    "    print()           \n",
    "    print(model.summary())\n",
    "    print()\n",
    "    \n",
    "    rsquare = model.rsquared_adj\n",
    "    \n",
    "    # plot data points calibrated\n",
    "    plot_result(grp_df, target_var, indep_var, model_type, rsquare)\n",
    "    # plot calibration function\n",
    "    plot_calib_func(equation)\n",
    "    \n",
    "    return grp_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: linear\n",
      "r_squared:     0.9712596166165772\n",
      "r_squared_adj: 0.9676670686936494\n",
      "\n",
      "Model: quadratic\n",
      "r_squared:     0.9994139572901717\n",
      "r_squared_adj: 0.999246516515935\n",
      "\n",
      "Model: cubic\n",
      "r_squared:     0.9994428545575107\n",
      "r_squared_adj: 0.999164281836266\n",
      "\n",
      "Model: logarithmic\n",
      "r_squared:     0.8391116085274343\n",
      "r_squared_adj: 0.8190005595933636\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# calibrating based on probability mean\n",
    "check_best_model(calib_df, 10, 'proba_v3', ['linear', 'quadratic', 'cubic', 'logarithmic'], \n",
    "                 'odr', 'proba_mean')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: linear\n",
      "r_squared:     0.986104918790666\n",
      "r_squared_adj: 0.9843680336394992\n",
      "\n",
      "Model: quadratic\n",
      "r_squared:     0.9993766342032643\n",
      "r_squared_adj: 0.9991985296899112\n",
      "\n",
      "Model: cubic\n",
      "r_squared:     0.9994534645414637\n",
      "r_squared_adj: 0.9991801968121955\n",
      "\n",
      "Model: logarithmic\n",
      "r_squared:     0.8255543464957456\n",
      "r_squared_adj: 0.8037486398077137\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# calibrating based on probability median\n",
    "check_best_model(calib_df, 10, 'proba_v3', ['linear', 'quadratic', 'cubic', 'logarithmic'], \n",
    "                 'odr', 'proba_median')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calibration Function: 0.0045+0.622*x\n",
      "\n",
      "                            OLS Regression Results                            \n",
      "==============================================================================\n",
      "Dep. Variable:                    odr   R-squared:                       0.986\n",
      "Model:                            OLS   Adj. R-squared:                  0.984\n",
      "Method:                 Least Squares   F-statistic:                     567.7\n",
      "Date:                Wed, 19 Feb 2020   Prob (F-statistic):           1.03e-08\n",
      "Time:                        05:07:43   Log-Likelihood:                 36.953\n",
      "No. Observations:                  10   AIC:                            -69.91\n",
      "Df Residuals:                       8   BIC:                            -69.30\n",
      "Df Model:                           1                                         \n",
      "Covariance Type:            nonrobust                                         \n",
      "================================================================================\n",
      "                   coef    std err          t      P>|t|      [0.025      0.975]\n",
      "--------------------------------------------------------------------------------\n",
      "Intercept        0.0045      0.003      1.613      0.146      -0.002       0.011\n",
      "proba_median     0.6220      0.026     23.827      0.000       0.562       0.682\n",
      "==============================================================================\n",
      "Omnibus:                        1.523   Durbin-Watson:                   1.128\n",
      "Prob(Omnibus):                  0.467   Jarque-Bera (JB):                0.806\n",
      "Skew:                           0.255   Prob(JB):                        0.668\n",
      "Kurtosis:                       1.706   Cond. No.                         12.3\n",
      "==============================================================================\n",
      "\n",
      "Warnings:\n",
      "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
      "\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>tot_obs</th>\n",
       "      <th>tot_bad</th>\n",
       "      <th>odr</th>\n",
       "      <th>proba_mean</th>\n",
       "      <th>proba_median</th>\n",
       "      <th>calibrated_score_grp</th>\n",
       "      <th>calibrated_score_ind</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bins</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0.0005499999999999999, 0.0065]</th>\n",
       "      <td>16687</td>\n",
       "      <td>26</td>\n",
       "      <td>0.001558</td>\n",
       "      <td>0.004577</td>\n",
       "      <td>0.004616</td>\n",
       "      <td>0.007355</td>\n",
       "      <td>0.007331</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0065, 0.0107]</th>\n",
       "      <td>16686</td>\n",
       "      <td>65</td>\n",
       "      <td>0.003895</td>\n",
       "      <td>0.008507</td>\n",
       "      <td>0.008476</td>\n",
       "      <td>0.009756</td>\n",
       "      <td>0.009775</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0107, 0.0161]</th>\n",
       "      <td>16686</td>\n",
       "      <td>136</td>\n",
       "      <td>0.008151</td>\n",
       "      <td>0.013289</td>\n",
       "      <td>0.013228</td>\n",
       "      <td>0.012712</td>\n",
       "      <td>0.012750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0161, 0.0238]</th>\n",
       "      <td>16686</td>\n",
       "      <td>242</td>\n",
       "      <td>0.014503</td>\n",
       "      <td>0.019785</td>\n",
       "      <td>0.019667</td>\n",
       "      <td>0.016717</td>\n",
       "      <td>0.016790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0238, 0.0345]</th>\n",
       "      <td>16686</td>\n",
       "      <td>378</td>\n",
       "      <td>0.022654</td>\n",
       "      <td>0.028870</td>\n",
       "      <td>0.028734</td>\n",
       "      <td>0.022357</td>\n",
       "      <td>0.022441</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0345, 0.0498]</th>\n",
       "      <td>16686</td>\n",
       "      <td>571</td>\n",
       "      <td>0.034220</td>\n",
       "      <td>0.041782</td>\n",
       "      <td>0.041566</td>\n",
       "      <td>0.030338</td>\n",
       "      <td>0.030473</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0498, 0.0723]</th>\n",
       "      <td>16686</td>\n",
       "      <td>807</td>\n",
       "      <td>0.048364</td>\n",
       "      <td>0.060211</td>\n",
       "      <td>0.059791</td>\n",
       "      <td>0.041675</td>\n",
       "      <td>0.041936</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.0723, 0.11]</th>\n",
       "      <td>16686</td>\n",
       "      <td>1089</td>\n",
       "      <td>0.065264</td>\n",
       "      <td>0.089582</td>\n",
       "      <td>0.088759</td>\n",
       "      <td>0.059694</td>\n",
       "      <td>0.060205</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.11, 0.188]</th>\n",
       "      <td>16686</td>\n",
       "      <td>1713</td>\n",
       "      <td>0.102661</td>\n",
       "      <td>0.143760</td>\n",
       "      <td>0.141207</td>\n",
       "      <td>0.092317</td>\n",
       "      <td>0.093905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(0.188, 0.796]</th>\n",
       "      <td>16687</td>\n",
       "      <td>2850</td>\n",
       "      <td>0.170792</td>\n",
       "      <td>0.318699</td>\n",
       "      <td>0.280792</td>\n",
       "      <td>0.179142</td>\n",
       "      <td>0.202720</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 tot_obs  tot_bad       odr  proba_mean  \\\n",
       "bins                                                                      \n",
       "(0.0005499999999999999, 0.0065]    16687       26  0.001558    0.004577   \n",
       "(0.0065, 0.0107]                   16686       65  0.003895    0.008507   \n",
       "(0.0107, 0.0161]                   16686      136  0.008151    0.013289   \n",
       "(0.0161, 0.0238]                   16686      242  0.014503    0.019785   \n",
       "(0.0238, 0.0345]                   16686      378  0.022654    0.028870   \n",
       "(0.0345, 0.0498]                   16686      571  0.034220    0.041782   \n",
       "(0.0498, 0.0723]                   16686      807  0.048364    0.060211   \n",
       "(0.0723, 0.11]                     16686     1089  0.065264    0.089582   \n",
       "(0.11, 0.188]                      16686     1713  0.102661    0.143760   \n",
       "(0.188, 0.796]                     16687     2850  0.170792    0.318699   \n",
       "\n",
       "                                 proba_median  calibrated_score_grp  \\\n",
       "bins                                                                  \n",
       "(0.0005499999999999999, 0.0065]      0.004616              0.007355   \n",
       "(0.0065, 0.0107]                     0.008476              0.009756   \n",
       "(0.0107, 0.0161]                     0.013228              0.012712   \n",
       "(0.0161, 0.0238]                     0.019667              0.016717   \n",
       "(0.0238, 0.0345]                     0.028734              0.022357   \n",
       "(0.0345, 0.0498]                     0.041566              0.030338   \n",
       "(0.0498, 0.0723]                     0.059791              0.041675   \n",
       "(0.0723, 0.11]                       0.088759              0.059694   \n",
       "(0.11, 0.188]                        0.141207              0.092317   \n",
       "(0.188, 0.796]                       0.280792              0.179142   \n",
       "\n",
       "                                 calibrated_score_ind  \n",
       "bins                                                   \n",
       "(0.0005499999999999999, 0.0065]              0.007331  \n",
       "(0.0065, 0.0107]                             0.009775  \n",
       "(0.0107, 0.0161]                             0.012750  \n",
       "(0.0161, 0.0238]                             0.016790  \n",
       "(0.0238, 0.0345]                             0.022441  \n",
       "(0.0345, 0.0498]                             0.030473  \n",
       "(0.0498, 0.0723]                             0.041936  \n",
       "(0.0723, 0.11]                               0.060205  \n",
       "(0.11, 0.188]                                0.093905  \n",
       "(0.188, 0.796]                               0.202720  "
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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X19XNURERKRURa3l2t1zzGws8DbBUHzPuftSM7sLSHf3mcBYM+sNZAPfE3QJIVzvFWAZkANc5+65RxKHEms5GH03REREpLRFdYZGd5/l7me6+xnufm+47I4wscbdb3T3Nu6e6O493X1pxLb3htud5e5vRTPOY9mmTZvo2LEj7dq144MPPjisbT/99FNmzZpVZNncuXO54IILAJg5cyb3339/keuJiIiISMlVmBkaK6KcnBzeffddWrZsyeTJkw97+08//ZT09HTOP//8YtcbMGAAAwYMONIwRURERCQU1Zbr493q1atp2bIlI0eOJD4+nkGDBrF7924AFi5cSPfu3Wnfvj19+/Zl/fr1APTo0YPf/va3dO/enUceeYRbbrmFWbNmkZiYyJ49e3jnnXfo3LkzSUlJXHbZZezatQuAtLQ0unTpQkJCAh06dGD79u3ccccdTJ8+ncTERKZPn37QOCdNmsTYsWMBGDVqFDfccANdunShefPmzJgxI3+9Bx98kJSUFOLj47nzzjujddhEREREyq3jquX6tttuK7Ssa9eunH/++ezdu5cJEyYUKu/duze9evVix44d3HfffQeUFXxdlBUrVvDss89y9tlnc+WVV/LnP/+ZG2+8keuvv57XX3+dhg0bMn36dG6//Xaee+45ALZt28b7778PQP369UlPT+fxxx9n8+bN3HPPPcyePZuaNWvyf//3fzz88MPceuutDB48mOnTp5OSksKOHTuoUaMGd911V/62h2P9+vXMnz+fzz//nAEDBjBo0CDeeecdVq1aRWpqKu7OgAEDmDdvHt26dTusukVEREQqsuMquS4LTZo04eyzzwZgxIgRPProo/Tr148lS5Zw3nnnAZCbm0ujRo3ytxk8eHCRdf33v/9l2bJl+fXt27ePzp07s2LFCho1akRKSgoAtWvX/lExDxw4kEqVKtG6dWs2bNgAwDvvvMM777xDu3btANi1axerVq1Sci0iIiIS4bhKrotraa5WrVqx5bVr1y5RS3VBBUekMDPcnTZt2rBgwYIit6lZs2aRy92d8847j6lTpx6wfNGiRaU68kW1atUO2Gfez9tuu42rr7661PYjIiIiUtGoz3WUffvtt/lJ9NSpUznnnHM466yz2LRpU/7y7Oxsli5dWlw1AHTq1In//Oc/fPHFFwDs3r2blStX0rJlS9atW0daWhoAO3fuJCcnh1q1arFz585SeR99+/blueeey+/jvXbtWjZu3FgqdYuIiIhUFEquo6xVq1ZMnjyZ+Ph4tm7dypgxY6hatSozZsxg/PjxJCQkkJiYyIcffnjIuho2bMikSZMYOnQo8fHxdOrUic8//5yqVasyffp0rr/+ehISEjjvvPPIysqiZ8+eLFu27JA3NJZEnz59GDZsGJ07d6Zt27YMGjSo1BJ3ERERkYrC8i77l3fJycmenp5+wLLly5fTqlWrMoooGC3kggsuYMmSJWUWgxSvrL8jIiIiUv6Y2UJ3Ty6qTC3XIiIiIiKlRMl1FDVt2lSt1iIiIiLHESXXIiIiIiKlRMm1iIiIiBw1tWuDWeHHj5ym45ih5FpEREREjpqDDTZWUQYhU3ItIiIiIlJKlFyLiIiIiJQSJddHibuzf//+sg6jSLm5uWUdgoiIiEiFoOQ6FI3O9atXr6ZVq1Zce+21JCUlsWbNGsaMGUNycjJt2rThzjvvBCA1NZVLLrkEgNdff53q1auzb98+srKyaN68eaF6X331VeLi4khISKBbt25AkCD/5je/oW3btsTHx/PYY48B8O6779KuXTvatm3LlVdeyd69e4FgmMC77rqLc845h1dffZUvv/ySfv360b59e7p27crnn39+5G9cRERE5DhVuawDOFZEq3P9ihUreP755/nzn/8MwL333ku9evXIzc2lV69eLFq0iKSkJD755BMAPvjgA+Li4khLSyMnJ4eOHTsWqvOuu+7i7bff5tRTT2Xbtm0APPPMM3z99dd88sknVK5cma1bt5KVlcWoUaN49913OfPMM7n88st58skn+dWvfgVAbGws8+fPB6BXr1489dRTtGjRgo8++ohrr72W995778e9eREREZECatUqOr+qVevoxxINarmOstNPP51OnTrlv37llVdISkqiXbt2LF26lGXLllG5cmV++tOfsnz5clJTUxk3bhzz5s3jgw8+oGvXroXqPPvssxk1ahR/+ctf8rt0zJ49m2uuuYbKlYPzpXr16rFixQqaNWvGmWeeCcDIkSOZN29efj2DBw8GYNeuXXz44YdcdtllJCYmcvXVV7N+/fqoHRMRERE5fu3YAe6FHzt2lHVkpUMt11FWs2bN/Odff/01Dz30EGlpadStW5dRo0aRlZUFQNeuXXnrrbeoUqUKvXv3ZtSoUeTm5vLQQw8VqvOpp57io48+4s033yQxMZFPP/0Ud8fMDljP3UsU2/79+znxxBP59NNPf+zbFRERETmuqeX6KNqxYwc1a9akTp06bNiwgbfeeiu/rFu3bvzpT3+ic+fONGzYkC1btvD555/Tpk2bQvV8+eWXdOzYkbvuuosGDRqwZs0a+vTpw1NPPUVOTg4AW7dupWXLlqxevZovvvgCgBdffJHu3bsXqq927do0a9aMV199FQiS8s8++ywah0BERESkQlPL9VGUkJBAu3btaNOmDc2bN+fss8/OL+vYsSMbNmzIv0ExPj6ek046qVBrNMDNN9/MqlWrcHd69epFQkICcXFxrFy5kvj4eKpUqcIvf/lLxo4dy/PPP89ll11GTk4OKSkpXHPNNUXGNmXKFMaMGcM999xDdnY2Q4YMISEhIToHQkRERKSCskN1HSgvkpOTPT09/YBly5cvp1WrViXavnbtg3euryh9gKSww/mOiIiIiACY2UJ3Ty6qTC3XISXQIiIiIvJjqc+1iIiIiEgpUXItIiIiIlJKlFyLiIiIiJQSJdciIiIiIqVEybWIiIiISClRcn0MmTRpEmPHjgWCWRhfeOEFAHr06EHBYQYPx+rVq3n55ZcPe7tRo0YxY8aMI96viIiIyPFGyXWe/fthyhRIToaTTw5+TpkSLC8D11xzDZdffnmJ18+bmbEoR5pcHy25ubnHZF0iIiIih0vJNQQJ9CWXwNVXw8KFsHFj8PPqq+HSS39Ugv3CCy8QHx9PQkICP//5zwF444036NixI+3ataN3795s2LCh0HYTJkzgoYceyn/90ksv0aVLF+Li4khNTc1f56qrrqJPnz5cfvnlrF69mq5du5KUlERSUhIffvghALfeeisffPABiYmJTJw4kdzcXG6++WZSUlKIj4/n6aefBoJpz8eOHUvr1q3p378/GzduLPI9Pfroo7Ru3Zr4+HiGDBkCwK5du7jiiito27Yt8fHxvPbaawBMnTqVtm3bEhcXx/jx4/PrOOGEE7jjjjvo2LEjCxYsYOHChXTv3p327dvTt29f1q9fX2i/X375JZ06dSIlJYU77riDE044AYC5c+fSs2dPhg0bRtu2bVm9ejUtW7Zk5MiRxMfHM2jQIHbv3n14H5yIiIjIkXD3CvFo3769F7Rs2bJCy4r00kvuNWu6Q+FHzZruU6aUrJ4ClixZ4meeeaZv2rTJ3d23bNni7u5bt271/fv3u7v7X/7yFx83bpy7uz///PN+3XXXubv7nXfe6Q8++KC7u3fv3t1Hjx7t7u7vv/++t2nTJn+dpKQk3717t7u7Z2Zm+p49e9zdfeXKlZ53TObMmeP9+/fPj+vpp5/2u+++293ds7KyvH379v7VV1/5a6+95r179/acnBxfu3at16lTx1999dVC76tRo0aelZXl7u7ff/+9u7vfcsstfuONN+avs3XrVl+7dq03adLEN27c6NnZ2d6zZ0//+9//7u7ugE+fPt3d3fft2+edO3f2jRs3urv7tGnT/Iorrii03/79+/vLL7/s7u5PPvmk16xZM//91ahRw7/66it3d//6668d8Pnz57u7+xVXXJF/LAsq8XdEREREJASk+0FyUrVcA0ycCJmZRZdlZsLDDx9Rte+99x6DBg2iQYMGANSrVw+AjIwM+vbtS9u2bXnwwQdZunTpIesaOnQoAN26dWPHjh1s27YNgAEDBlC9enUAsrOz+eUvf0nbtm257LLLWLZsWZF1vfPOO7zwwgskJibSsWNHtmzZwqpVq5g3bx5Dhw4lJiaGU045hXPPPbfI7ePj4xk+fDgvvfQSlSsHk3zOnj2b6667Ln+dunXrkpaWRo8ePWjYsCGVK1dm+PDhzJs3D4CYmBguvfRSAFasWMGSJUs477zzSExM5J577iEjI6PQfhcsWMBll10GwLBhww4o69ChA82aNct/3aRJE84++2wARowYwfz584s7vCIiIiKlQtOfA6xZU3x5EYleSbg7ZlZo+fXXX8+4ceMYMGAAc+fOZcKECYesq2A9ea9r1qyZv2zixImcfPLJfPbZZ+zfv5/Y2NiDxvXYY4/Rt2/fA5bPmjWryHgLevPNN5k3bx4zZ87k7rvvZunSpUW+1+DErmixsbHExMTkr9emTRsWLFhwyH0fTORxgIMfLxEREZFoUss1QJMmxZc3bnxE1fbq1YtXXnmFLVu2ALB161YAtm/fzqmnngrA5MmTS1TX9OnTAZg/fz516tShTp06hdbZvn07jRo1olKlSrz44ov5N/fVqlWLnTt35q/Xt29fnnzySbKzswFYuXIlmZmZdOvWjWnTppGbm8v69euZM2dOoX3s37+fNWvW0LNnTx544AG2bdvGrl276NOnD48//nj+et9//z0d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JoZLL70UgBUrVrBkyRLOO+88IOgm0qhRo0Mek0suuQSA9u3bs3r1agDmzZvHDTfckB9nfHz8IesRERERKS1RnaHR3WcBswosuyPiee+DbPch0DaasRXUsEpDLqx/YX7rdRWrwoD6A2hQpcER1+nuhCcNB7j++usZN24cAwYMYO7cuUyYMOGQdRWsJ+91zZo185dNnDiRk08+mc8++4z9+/cTGxt70Lgee+wx+vbte8DyWbNmFRlvQW+++Sbz5s1j5syZ3H333SxdurTI9+peZBd7AGJjY/P7Wbs7bdq0YcGCBYfcd6Rq1aoBEBMTQ05OTv7ykrwHERERkWjQDI0RRjcaTaXwkPzYVmuAXr168corr7BlyxaA/G4h27dv59RTg4FTJk+eXKK6pk+fDsD8+fOpU6cOderUKbTO9u3badSoEZUqVeLFF18kNzcXgFq1arFz58789fr27cuTTz5JdnbQBWblypVkZmbSrVs3pk2bRm5uLuvXr2fOnDmF9rF//37WrFlDz549eeCBB9i2bRu7du2iT58+PP744/nrff/993Ts2JH333+fzZs3k5uby9SpU+nevXuhOs866yw2bdqUn1xnZ2ezdOnSEh2Xgrp168aUKVMAWLJkCYsWLTqiekRERESOhJLrCHmt14b96FZrgDZt2nD77bfTvXt3EhISGDduHBDcmHfZZZfRtWvX/C4jh1K3bl26dOnCNddcw7PPPlvkOtdeey2TJ0+mU6dOrFy5Mr9VOz4+nsqVK5OQkMDEiRMZPXo0rVu3Jikpibi4OK6++mpycnK4+OKLadGiBW3btmXMmDFFJsK5ubmMGDGCtm3b0q5dO2666SZOPPFEfve73/H9998TFxdHQkICc+bMoVGjRtx333307NmThIQEkpKSuOiiiwrVWbVqVWbMmMH48eNJSEggMTEx/2bMwzVmzBh27dpFfHw8DzzwAB06dDiiekRERESOhBV36b48SU5O9oLjGS9fvpxWrVodVj2bsjfxixW/4LmznvvRybUc+47kOyIiIiLHNzNb6O7JRZVFtc91edSwSkNmxs0s6zBEREREpBxStxARERERkVKi5FpEREREpJRU+OS6ovQpl9Kn74aIiIiUtgqdXMfGxrJlyxYlUVKIu7Nly5aDjgUuIiIiciQq9A2NjRs3JiMjg02bNpV1KHIMio2NpXHjxmUd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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# chosen calibration function\n",
    "analyze_calibrated_result(calib_df, 10, 'proba_v3', 'linear', 'odr', 'proba_median')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.9.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}