{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9139ff6c",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "source": [
    "# Rows of Tables\n",
    "Now that we have a qualitative understanding of nearest neighbor classification, it's time to implement our classifier.\n",
    "\n",
    "Until this chapter, we have worked mostly with single columns of tables. But now we have to see whether one *individual* is \"close\" to another. Data for individuals are contained in *rows* of tables.\n",
    "\n",
    "So let's start by taking a closer look at rows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "abbd0cc3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:51.243901Z",
     "iopub.status.busy": "2026-08-31T06:02:51.243528Z",
     "iopub.status.idle": "2026-08-31T06:02:52.017782Z",
     "shell.execute_reply": "2026-08-31T06:02:52.017508Z"
    },
    "tags": [
     "hide-input",
     "thebe-init",
     "runnable"
    ]
   },
   "outputs": [],
   "source": [
    "path_data = '../../data/'\n",
    "\n",
    "import math\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import scipy.stats as stats\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "%matplotlib inline\n",
    "plt.style.use('fivethirtyeight')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4526e5c",
   "metadata": {},
   "source": [
    "```{contents}\n",
    ":local:\n",
    ":depth: 2\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d35a57a0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.019136Z",
     "iopub.status.busy": "2026-08-31T06:02:52.019026Z",
     "iopub.status.idle": "2026-08-31T06:02:52.020502Z",
     "shell.execute_reply": "2026-08-31T06:02:52.020296Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def standard_units(x):\n",
    "    return (x - np.mean(x))/np.std(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa8539dd",
   "metadata": {},
   "source": [
    "Here is the original table `ckd` containing data on patients who were tested for chronic kidney disease."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d4d2e102",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.021555Z",
     "iopub.status.busy": "2026-08-31T06:02:52.021491Z",
     "iopub.status.idle": "2026-08-31T06:02:52.032137Z",
     "shell.execute_reply": "2026-08-31T06:02:52.031925Z"
    },
    "tags": []
   },
   "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>Age</th>\n",
       "      <th>Blood Pressure</th>\n",
       "      <th>Specific Gravity</th>\n",
       "      <th>Albumin</th>\n",
       "      <th>Sugar</th>\n",
       "      <th>Red Blood Cells</th>\n",
       "      <th>Pus Cell</th>\n",
       "      <th>Pus Cell clumps</th>\n",
       "      <th>Bacteria</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>...</th>\n",
       "      <th>Packed Cell Volume</th>\n",
       "      <th>White Blood Cell Count</th>\n",
       "      <th>Red Blood Cell Count</th>\n",
       "      <th>Hypertension</th>\n",
       "      <th>Diabetes Mellitus</th>\n",
       "      <th>Coronary Artery Disease</th>\n",
       "      <th>Appetite</th>\n",
       "      <th>Pedal Edema</th>\n",
       "      <th>Anemia</th>\n",
       "      <th>Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>48</td>\n",
       "      <td>70</td>\n",
       "      <td>1.005</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>normal</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>present</td>\n",
       "      <td>notpresent</td>\n",
       "      <td>117</td>\n",
       "      <td>...</td>\n",
       "      <td>32</td>\n",
       "      <td>6700</td>\n",
       "      <td>3.9</td>\n",
       "      <td>yes</td>\n",
       "      <td>no</td>\n",
       "      <td>no</td>\n",
       "      <td>poor</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>53</td>\n",
       "      <td>90</td>\n",
       "      <td>1.020</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>present</td>\n",
       "      <td>notpresent</td>\n",
       "      <td>70</td>\n",
       "      <td>...</td>\n",
       "      <td>29</td>\n",
       "      <td>12100</td>\n",
       "      <td>3.7</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>no</td>\n",
       "      <td>poor</td>\n",
       "      <td>no</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>63</td>\n",
       "      <td>70</td>\n",
       "      <td>1.010</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>present</td>\n",
       "      <td>notpresent</td>\n",
       "      <td>380</td>\n",
       "      <td>...</td>\n",
       "      <td>32</td>\n",
       "      <td>4500</td>\n",
       "      <td>3.8</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>no</td>\n",
       "      <td>poor</td>\n",
       "      <td>yes</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>68</td>\n",
       "      <td>80</td>\n",
       "      <td>1.010</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>normal</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>present</td>\n",
       "      <td>present</td>\n",
       "      <td>157</td>\n",
       "      <td>...</td>\n",
       "      <td>16</td>\n",
       "      <td>11000</td>\n",
       "      <td>2.6</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>poor</td>\n",
       "      <td>yes</td>\n",
       "      <td>no</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>61</td>\n",
       "      <td>80</td>\n",
       "      <td>1.015</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>abnormal</td>\n",
       "      <td>notpresent</td>\n",
       "      <td>notpresent</td>\n",
       "      <td>173</td>\n",
       "      <td>...</td>\n",
       "      <td>24</td>\n",
       "      <td>9200</td>\n",
       "      <td>3.2</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>poor</td>\n",
       "      <td>yes</td>\n",
       "      <td>yes</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Age  Blood Pressure  Specific Gravity  Albumin  Sugar Red Blood Cells  \\\n",
       "0   48              70             1.005        4      0          normal   \n",
       "1   53              90             1.020        2      0        abnormal   \n",
       "2   63              70             1.010        3      0        abnormal   \n",
       "3   68              80             1.010        3      2          normal   \n",
       "4   61              80             1.015        2      0        abnormal   \n",
       "\n",
       "   Pus Cell Pus Cell clumps    Bacteria  Glucose  ...  Packed Cell Volume  \\\n",
       "0  abnormal         present  notpresent      117  ...                  32   \n",
       "1  abnormal         present  notpresent       70  ...                  29   \n",
       "2  abnormal         present  notpresent      380  ...                  32   \n",
       "3  abnormal         present     present      157  ...                  16   \n",
       "4  abnormal      notpresent  notpresent      173  ...                  24   \n",
       "\n",
       "   White Blood Cell Count  Red Blood Cell Count  Hypertension  \\\n",
       "0                    6700                   3.9           yes   \n",
       "1                   12100                   3.7           yes   \n",
       "2                    4500                   3.8           yes   \n",
       "3                   11000                   2.6           yes   \n",
       "4                    9200                   3.2           yes   \n",
       "\n",
       "   Diabetes Mellitus  Coronary Artery Disease  Appetite  Pedal Edema Anemia  \\\n",
       "0                 no                       no      poor          yes    yes   \n",
       "1                yes                       no      poor           no    yes   \n",
       "2                yes                       no      poor          yes     no   \n",
       "3                yes                      yes      poor          yes     no   \n",
       "4                yes                      yes      poor          yes    yes   \n",
       "\n",
       "  Class  \n",
       "0     1  \n",
       "1     1  \n",
       "2     1  \n",
       "3     1  \n",
       "4     1  \n",
       "\n",
       "[5 rows x 25 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ckd = pd.read_csv(path_data + 'ckd.csv').rename(columns={'Blood Glucose Random': 'Glucose'})\n",
    "ckd.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81418872",
   "metadata": {},
   "source": [
    "The data corresponding to the first patient is in row 0 of the table, consistent with Python's indexing system. The pandas indexer `.iloc` accesses a row by its position:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e38cc177",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.033183Z",
     "iopub.status.busy": "2026-08-31T06:02:52.033119Z",
     "iopub.status.idle": "2026-08-31T06:02:52.035160Z",
     "shell.execute_reply": "2026-08-31T06:02:52.034996Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Age                                48\n",
       "Blood Pressure                     70\n",
       "Specific Gravity                1.005\n",
       "Albumin                             4\n",
       "Sugar                               0\n",
       "Red Blood Cells                normal\n",
       "Pus Cell                     abnormal\n",
       "Pus Cell clumps               present\n",
       "Bacteria                   notpresent\n",
       "Glucose                           117\n",
       "Blood Urea                         56\n",
       "Serum Creatinine                  3.8\n",
       "Sodium                            111\n",
       "Potassium                         2.5\n",
       "Hemoglobin                       11.2\n",
       "Packed Cell Volume                 32\n",
       "White Blood Cell Count           6700\n",
       "Red Blood Cell Count              3.9\n",
       "Hypertension                      yes\n",
       "Diabetes Mellitus                  no\n",
       "Coronary Artery Disease            no\n",
       "Appetite                         poor\n",
       "Pedal Edema                       yes\n",
       "Anemia                            yes\n",
       "Class                               1\n",
       "Name: 0, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ckd.iloc[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aa2ad6c1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.035969Z",
     "iopub.status.busy": "2026-08-31T06:02:52.035912Z",
     "iopub.status.idle": "2026-08-31T06:02:52.037481Z",
     "shell.execute_reply": "2026-08-31T06:02:52.037297Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(ckd.iloc[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d611707d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.038368Z",
     "iopub.status.busy": "2026-08-31T06:02:52.038310Z",
     "iopub.status.idle": "2026-08-31T06:02:52.039939Z",
     "shell.execute_reply": "2026-08-31T06:02:52.039771Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([np.int64(48), np.int64(70), np.float64(1.005), np.int64(4),\n",
       "       np.int64(0), 'normal', 'abnormal', 'present', 'notpresent',\n",
       "       np.int64(117), np.int64(56), np.float64(3.8), np.int64(111),\n",
       "       np.float64(2.5), np.float64(11.2), np.int64(32), np.int64(6700),\n",
       "       np.float64(3.9), 'yes', 'no', 'no', 'poor', 'yes', 'yes',\n",
       "       np.int64(1)], dtype=object)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(ckd.loc[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "726941cb",
   "metadata": {},
   "source": [
    "In pandas, a row is a `Series`. Notice how the display shows not only the values in the row but also the labels of the corresponding columns.\n",
    "\n",
    "Rows are in general **not numerical arrays**, as their elements can be of different types. For example, some of the elements of the row above are strings (like `'abnormal'`) and some are numerical. Converting such a row with `np.array` gives an array of general Python objects (`dtype=object`), not numbers, so arithmetic on it doesn't work.\n",
    "\n",
    "However, rows share some characteristics with arrays.  You can use `.iloc[row, column]` to access a particular element by position. For example, the labels in the printout of the row above show that Albumin is item 3, so `ckd.iloc[0, 3]` is the Albumin level of Patient 0. You can also use the label: `ckd.iloc[0]['Albumin']`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab483cb2",
   "metadata": {},
   "source": [
    "## Converting Rows to Arrays (When Possible)\n",
    "Rows whose elements are all numerical (or all strings) can be converted to arrays.  Converting a row to an array gives us access to arithmetic operations and other nice NumPy functions, so it is often useful.\n",
    "\n",
    "Recall that in the previous section we tried to classify the patients as 'CKD' or 'not CKD', based on two attributes `Hemoglobin` and `Glucose`, both measured in standard units. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1650cceb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.040872Z",
     "iopub.status.busy": "2026-08-31T06:02:52.040804Z",
     "iopub.status.idle": "2026-08-31T06:02:52.045075Z",
     "shell.execute_reply": "2026-08-31T06:02:52.044896Z"
    },
    "tags": []
   },
   "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>Hemoglobin</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>Class</th>\n",
       "      <th>Color</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.865744</td>\n",
       "      <td>-0.221549</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.457446</td>\n",
       "      <td>-0.947597</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.004968</td>\n",
       "      <td>3.841231</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.814879</td>\n",
       "      <td>0.396364</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.083954</td>\n",
       "      <td>0.643529</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>153</th>\n",
       "      <td>0.700526</td>\n",
       "      <td>0.133751</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>154</th>\n",
       "      <td>0.978974</td>\n",
       "      <td>-0.870358</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>155</th>\n",
       "      <td>0.735332</td>\n",
       "      <td>-0.484162</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>156</th>\n",
       "      <td>0.178436</td>\n",
       "      <td>-0.267893</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>157</th>\n",
       "      <td>0.735332</td>\n",
       "      <td>-0.005280</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>158 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Hemoglobin   Glucose  Class     Color\n",
       "0     -0.865744 -0.221549      1  darkblue\n",
       "1     -1.457446 -0.947597      1  darkblue\n",
       "2     -1.004968  3.841231      1  darkblue\n",
       "3     -2.814879  0.396364      1  darkblue\n",
       "4     -2.083954  0.643529      1  darkblue\n",
       "..          ...       ...    ...       ...\n",
       "153    0.700526  0.133751      0      gold\n",
       "154    0.978974 -0.870358      0      gold\n",
       "155    0.735332 -0.484162      0      gold\n",
       "156    0.178436 -0.267893      0      gold\n",
       "157    0.735332 -0.005280      0      gold\n",
       "\n",
       "[158 rows x 4 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ckd = pd.DataFrame({\n",
    "    'Hemoglobin':standard_units(ckd['Hemoglobin']),\n",
    "    'Glucose':standard_units(ckd['Glucose']),  \n",
    "    'Class':ckd['Class']\n",
    "})\n",
    "\n",
    "color_table = pd.DataFrame(\n",
    "    {'Class':np.array([1, 0]),\n",
    "    'Color':np.array(['darkblue', 'gold'])}\n",
    ")\n",
    "\n",
    "ckd = pd.merge(ckd, color_table, on='Class')\n",
    "ckd"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9a9fbc0",
   "metadata": {},
   "source": [
    "Here is a scatter plot of the two attributes, along with a red point corresponding to Alice, a new patient. Her value of hemoglobin is 0 (that is, at the average) and glucose 1.1 (that is, 1.1 SDs above average)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3f8a93c4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.046053Z",
     "iopub.status.busy": "2026-08-31T06:02:52.045998Z",
     "iopub.status.idle": "2026-08-31T06:02:52.089830Z",
     "shell.execute_reply": "2026-08-31T06:02:52.089620Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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c0oBAADgu7SplKoFhfqMLV261LVYUF8u9VyryUpfJDev6XBg82EkLz7P1EH3BABpFUq1ndiFF14YdJuCqXq1qblvdbQ1V7g9Y5GcfxeQOvg8k5u2WFQPSwBIi1CqZsB77bWXa/Srprk///yza+KrBrTHHXecax7sNaiNJJrdEpDYVFHz9jrWFnpIbnyeAJBa0iKUXnvttUHXd9ppJ3vsscfc/yuYaqsx7ThRFYaXUocCDJ9n6uDzBIDUkNYLnbSfrUybNs3vUwEAAEhraR1KvT1b169f7/epAAAApLW0DqUzZsxwlzTQBwAA8FfKh9I5c+aErYTq9ptvvtn9/6BBg3w4MwAAAKRNKH3llVesV69edsopp9hVV11lf/vb32zo0KFuz3ut3L3iiivc/wMAgNobNWqUtWjRwj766CNLd3ofjj766KiP571Lk9X3++67r6uKfvPNN/bpp5+6qqnmkh566KF27rnn2kEHHeT3KQIAUG+++uore+KJJ1w7RG0oU1paah06dLDdd9/dhgwZYgceeKDfp4g0lfKhdJ999nF/AABIZwqfN954oz388MOWnZ1t++23nx155JHWoEEDW7Bggf3vf/+zF1980a6//nr7y1/+4vfpIg2lfCgFAABmI0eOdIF0xx13tDFjxlTazXDDhg32r3/9y1atWuXbOSK9pfycUgAA0t28efPsvvvus1atWrm1FuG2127SpIldcskldt1111XctnLlSrcBjTadadeunfXs2dPOPPNM++GHH2r0/O+8844dc8wxrtuNpgpoLceDDz5oxcXFQcf98ssvbm7liBEjbPbs2W5HRp2rbtPXYkWv69JLL3Wvp2PHjm7Kwptvvmljx451z6XL2r6Gqvz22292zjnnWLdu3Wyrrbayo446yj755JOYva5kR6UUAIAUN27cOCspKXGbxihcVqVRo0bucsWKFW79xfz58900uJNOOskFw9dff90N9Svcagvv6ii4adpAy5YtXbebnJwcF/B0m9Z6PP/885aRkRF0Hz2nnlvbg2txsqq3sdpOuKCgwC1CmjVrlu2xxx42YMAAW7RokQuLkdaZ1OY1hNL83cMOO8wWL15sBx98sO28884ueJ9wwglu/QsIpQAAxF5ZsVlG4vyI/eyzz9yl5pFG66abbnLhUF1q1LnGo0A6ePBgu/DCC12/78zMyIOuur/a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NFOHAgyfZ+rg8wSA1FCnhU4ff/yxC3teIK3KVlttZUuXLrVEWPikcznnnHPsvvvus88++8wN6wMAACBJQ+mKFSuingukeUOqqiaSAw88sCJcAwAAIElDabNmzWz58uVRHbtw4UJr3bq1JRKvcsuOTgAAAEkcSnfYYQc3P3P27NlVHqchcoXXXXbZxerbrFmzbP369ZVu12033HCD+/9DDz203s8LAAAAMVroNHjwYPvoo4/siiuusBdeeMFVTsMN8V922WVutbuOr29qWfXwww/bnnvuaV27dnXnqPZOkyZNch0C9tprL7vgggvq/bwAAAAQo1A6dOhQGzt2rE2dOtX22WcfO+mkkyqG88eNG2fff/+9C6sKf5q/qZZR9e2II45ww/TTp093fwoLC91Ke1V5db5//vOfo2oJBQAAgATtUypqs3Teeee5ymNo03xRs3r1Mn3qqacsLy+vLk8F1Il6zWpuc5cuXWghlAL4PAEgtdS5RNiiRQt76aWX3A5J//nPf1xDfQXV3Nxct33nCSecYIcffnhszhYAAAApKWbj1tqqM5rtOgHUXXFxqWVn12mdIgAACYWfakASmTVrlfXv/6L17TveXeo6AACpoM6VUm3bqV2SQmmR05gxY1zLqP79+9v555/PvC+gjoYNm2Rz564Juv7FF/Xf1QIAgISqlD744INuT/sHHngg6HbtkHTwwQfbv/71L3vzzTftlltuseOPPz7hdnQCkm3IvrBwc9Bt69dvdrcDAJDWofSDDz5wlyeeeGLQ7QqhmzZtsl133dWGDx9u7dq1s88//9yeffbZup0tkMY0hzQ3N3j3sZycBswtBQCkhDr9NJszZ46rlG611VYVt6lFy4wZM6x79+727rvv2qhRo1yvUrWG0up8IB3Eq3o5duwh1qNHnnXsmOMudR0AAEv3OaVqit+zZ8+g2z755BN3OXDgwIq5pv369XO7Kf344491eTog4WnhkeZ5aphdVU2Fxt69W8Xs8fVYmkPK6nsAQKqp00+1zZs3uz+BNEyvJvoDBgwIur1t27a2bt26ujwdkDQLkZYuXe8udT0eCKQAgFRTp59smiuq4XrNH/W8//77rkK6++67Bx2r7T3Z0QmpjIVIAAD4FEr33HNPKygosNtvv91VQbWV6Pz582233XazZs2aVRynauq8efOsffv2dXk6IKGxEAkAgNqr00/Liy66yLKzs+3ee++1rbfe2q666io3dK/bA3300UdWVFTkVuMDfqmPiiULkQAA8GGh084772zjxo2zm2++2X7++Wfr0qWLXXrppXb00UcHHacm+rLffvvV5emAOi0+KigoskaNzJ57rpntvHOHuDwXC5EAAKidjPz8/DKLMw3ta+cnDemH2/0JiCdtxxm4C1L37s1s5sxTfT0n1N3GjRvdnHb9MsxucQCQ/Oq8zWg0AueXAv4vPiqmkgkAQCqH0kWLFtlPP/3kKqMKotttt5116tQplk8BxGDxUTaBFACAVAylb7zxhluBH645/g477GB/+ctf7Nhjj43FUwE1psVG5Q3ti6xhQ7Onnz7A71NCCCrXAIA6zym97bbbbPTo0W4bUcnKyrLWrVvbypUrraSkpPxJMjLcyvzrr78+NmcN1EJBwXpbsmQRcxBTZAcs5pQCQGqpU2liypQpduedd7r/Hzx4sH388ce2bNkymz17trvU9VNOOcV9XcFVraEAv1CJS98dsAAAia9OP6Ufe+wxVwUdOXKk+38N1atSKrrU9UcffdRuvfVWV0l9/PHHY3XeAJIcO2ABAGIWSmfMmOGG6keMGFHlccOHD7c2bdrY9OnT6/J0QFwRhuoXO2ABAALV6V//1atXu52cVC2tir7etWtXdzyQaDSvUb1M+/Yd7y51HfWDHbAAADFZfd+iRQu30CAav/32mzseSNR5jYHXtSsT4o8dsAAAnjr9FNhll11s+fLl9uyzz1Z53DPPPGO///679e/fvy5PB8Qc8xoTA4EUAFCnnwTnnnuuW8Ckdk/qRbpgwYKgr+v61Vdf7f5oCF/HA4mEeY0AAKRIn9Jrr722YhW+NGnSxNq2besqqBs2bHC3KbhqMZR6mta3xYsX22uvvWYTJ050u02pVVXLli1tjz32sEsvvdR23XXXej8n+CNSX0uvV6YqpAqkNemVCf/QpxQAUkudQ6mMGzfO9SsNrZRK9+7dXSV1yJAh5oebb77Z7r33Xttmm21sn332cV0A5s6daxMmTHBh+YknnrATTzzRl3NDYoUY5jXGXjzfU0IpAKSWmIRSjyqR+lNQUGBNmza17bbbznr27Gl+0haorVq1coE00NSpU+3444+33Nxc1+y/UaNGvp0j6gchJjl2aooWnycApJaYhtJkowrp5MmT7f3337c//elP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tSuvvNL+97//2QsvvOCCKgAAAPyT0qFUYXT06NE2ZMgQy83Nrbh95MiRdswxx9h///tfe/31123gwIG+nicAAEC6S+k5pZ06dbJzzz03KJCKrl944YXu/z/55BOfzg5+YLpGauHzBIDUkdKV0qo0aNDAXfJDLX00btzYunfv7vdpIEb4PAEgtaR0pbQqzz//vLs86KCD/D4VAACAtJeWofSZZ56xiRMnusVPhx12mN+nAwAAkPYy8vPzyyzB3XDDDVZUVBT18cOHD7cePXqE/ZpW3p922mnWoUMHF0x1CQAAAH8lRSjdaqutrLCwMOrj33zzTdt3330r3a4WUAqkbdq0sQkTJli3bt1ifKYAAABI2VAaC2r/dPrpp1vr1q3trbfeYoEEAABAAslMp0DasmVLV0UlkAIAACSWlA+lmjeqQNqiRQsXSCPNNQUAAIB/Unr4fs6cOW5u6aZNm+ykk06ynj17Vjqma9euNmzYsFo9/oIFC2zvvfd2813POussu+eee2Jw1qgPmzdvtrffftveeecdmzlzpi1atMhtN9urVy8bOnSonXnmmfSwTVD6vEaNGmXTpk2z4uJi69Onj9sM44QTTvD71FADixcvttdee80VDn766SdbtmyZG83aY4897NJLL7Vdd93V71MEUM9Sunm+/pFTIJVXXnkl7DEKlbUJpaWlpTZixIg6nyP8MX/+fDvjjDPcVrRqDXbkkUfa2rVrXXeGK6+80i2Ke+GFF1xQReKYMmWK+wVTjfNPPPFE9/m98cYb7pfC3377zS6++GK/TxFRevzxx+3ee++1bbbZxg488EC3AHXu3LluEar+PPHEE+4zBpA+UrpSGk8PPPCA3XLLLfb3v//drr/+eiqlSVilUaV0yJAhQdvQqup9zDHH2Jdffun62Q4cONDX88QWqorutttu7rNTdW2nnXZyt69Zs8YOPvhg+/XXX23GjBlu9AOJT79MtGrVyvbZZ5+g26dOnWrHH3+8+76cPXu2NWrUyLdzBFC/Un5OabymBdx66612+eWX24477uj36aAWOnXqZOeee25QIBVd11CwfPLJJz6dHSJVSVXhHjRoUEUglby8PLviiitcL+Px48f7eo6I3nHHHVcpkMqAAQPctKv8/Hz74YcffDk3AP4glNZQSUmJG7bXCv6rr77a79NBHDRo0MBdMqc0sXz88ccRtwZWpVT4RSI18D0IpKeUnlMaD3fffbd9/fXXNmnSJGvYsKHfp4M4eP755yOGH/hH8w0lXAeN9u3bu/ml8+bN8+HMEEsLFy60Dz74wO22t8MOO/h9OgDqEZXSGvj222/tjjvusEsuucT69evn9+kgDjSPVPMVtfjpsMMO8/t0EEAL0aR58+Zhv96sWbOKY5C8XTHOP/98t0D15ptvplIKpJm0q5TecMMNbu5ZtIYPH+4qM7qPN2x/zTXXxPUcEf/PMxytvNeUjC5duriVwQDqjzqaXHDBBW6hkzpjnHrqqX6fEoB6lp2OlTCtsK7JZHyFGA3ba9K9WgWxGjT5P89Q+lz1g7Bdu3ZukwUNHSKxeBXSSNXQdevWuU0ykJyBVAsMX3rpJRs8eDCdTIA0lXahVE3Sa+Obb75x/3AecsghYb/+9NNPuz9HHXWUjRs3ro5niXh/nuG2oW3durULpN26dYvJuSG2vF8mNLc0dPqMehIXFBTYLrvs4tPZoa4VUvUFVmeFRx55xDIzmVkGpKO0C6W1pebOCi2h9MNQVbbtttvO7UQS2KoGic8LpNpJRoFU0zOQmLTRhUYsJk+e7BroB3rvvfcqjkFyBlI1yn/ssceYRwqkMZrn19FHH31kxx57LM3zk5AWNP35z392Q75vvfWWbbvttn6fEqppnq+tJ5csWRKxef7nn39uW2+9td+nihoM2au3rDap0A5O2dnUSYB0xr8ASNsNEBRItcpXDbxffvnlSsdoZ6DabEGL+FBguf/++12V9Oijjw7aZlRthP7xj38QSJPI7bff7gKpPsOePXvanXfeWekYfc6MPgHpg1CKtKRpFwqk8sorr4Q9RkPBhNLEolZd6pIwatQoe/XVV10LoT59+rgtf9knPbmosi2aCzx69Oiwx+gXQ0IpkD4YvgcAAIDvWOIIAAAA3xFKAQAA4DtCKQAAAHxHKAUAAIDvCKUAAADwHaEUAAAAviOUAgAAwHeEUgAAAPiOUAoAAADfEUpRLe0/3aJFCxs7dmy93jdR6bXoNem1JQOdq/788ssvlgy0hajOd8SIEZW+tuOOO7qvffTRR76cGwAgfrLj+Niopz3ce/Xq5f5fe4LvueeeYY/705/+ZPPnz7ecnBwXTho0aFDpmEWLFtkOO+zg/n/SpEm26667xu28dQ7jxo2zvLw8u+CCC6w+KdAce+yxlW7PyMiwpk2b2tZbb22HHHKIXXjhhda2bdt6PbdE9c4779gbb7xh06dPt+XLl9uGDRtcONx+++3twAMPtFNOOcU6depkyeCbb76x8ePH28cff+z+zq9du9Z97t27d7e99trLBg8ebDvvvLMl+y9O2ltevzixdzyAZEGlNMm1b9/ett12W/f/+iEbjn7wKpDK+vXr7Ysvvgh7nHf/Zs2aWb9+/WJyfp07d3bn17x586Db9QPz9ttvt0ceecT8pBDv/dlll13ceX733Xd277332h577GHff/+9pTP98nDQQQfZkCFDXJBbvHixC5+qWDZq1MimTJlit9xyi/ul56mnnrJEpr/7559/vu2///7u750+25YtW7oA2rp1axdWH3roIff14cOHWzLTL3z6/vr222/9PhUAiBqV0hSwzz772E8//eRC5VVXXRUxbG6zzTYunOp6uIqqd5y+lp0dm78ajz32mCUyVZdDqRo4dOhQW7FihV1++eX2v//9z9LRvHnz7NBDD7WVK1dajx497G9/+5sdccQRLox6fvvtNxdWFeY+//xzO/vssy0Rbdy40Y4//nh3jvrF45prrrFhw4a5aq9nzZo19tZbb9k999xjn3zyia/nCwDpiEppioRSL0xt3ry50te9H7AKWIHXIx3nPV662n333e0vf/lLxXuq4d10U1JSYqeffroLpKokvvfeey7UBQZSrxJ+9dVX22effeaGvhPVX//614pAqqkImpoRGEhFU0kUVKdOnWrnnHOOb+cKAOmKUJoCvBCp4cmZM2eGrYBqDumgQYOsS5cuYcOrhmVVGZN999034nOtXr3arr32Wjd8265dOzen8JJLLnFzW6Nd6KTbvDmdCxcurFiI4/0JXcSi+YsPP/ywHX744W6+p55X8+Quu+wyW7BggcVD165dK/6/uLi4RvctLCx01bYDDjjAvd8dO3a03Xbbza6//npbunRpxPuVlZXZyy+/bAMHDnRVbc1n7dOnj5177rn21VdfVfmcr7/+uqtibrXVVu7cjzzySJswYYLV1muvveamMWRlZdkTTzxRKcCF6tChgwux4cLt888/b8cdd5ybs6nXpL8z5513Xr0NLevv2DPPPOP+f+TIkRXzpiNp2LCh+7sVSt8zTz75pHuf9fdQU2cU2C+99NKK751QWqyl906Lt2q6EC3wvvoeuO2229w8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",
      "text/plain": [
       "<Figure size 400x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "alice = np.array([0, 1.1])\n",
    "\n",
    "ckd_darkblue = ckd[ckd['Color'] == 'darkblue']\n",
    "ckd_gold = ckd[ckd['Color'] == 'gold']\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(4,4))\n",
    "\n",
    "ax.scatter(ckd_darkblue['Hemoglobin'], ckd_darkblue['Glucose'],  \n",
    "           label='Color=darkblue', \n",
    "           color='darkblue', s=10)\n",
    "\n",
    "ax.scatter(ckd_gold['Hemoglobin'], ckd_gold['Glucose'],  \n",
    "           label='Color=gold', \n",
    "           color='gold', s=10)\n",
    "\n",
    "ax.scatter(alice[0], alice[1],   \n",
    "           color='red', \n",
    "           s=20)\n",
    "\n",
    "x_label = 'Hemoglobin'\n",
    "y_label = 'Glucose'\n",
    "y_vals = ax.get_yticks()\n",
    "plt.ylabel(y_label)\n",
    "ax.legend(bbox_to_anchor=(1.04,1), loc=\"upper left\")\n",
    "plt.xlabel(x_label)\n",
    "plt.xlim(-4, 2)\n",
    "plt.ylim(-2, 6);\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1296450f",
   "metadata": {},
   "source": [
    "To find the distance between Alice's point and any of the other points, we only need the values of the attributes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "720439ce",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.091007Z",
     "iopub.status.busy": "2026-08-31T06:02:52.090929Z",
     "iopub.status.idle": "2026-08-31T06:02:52.093953Z",
     "shell.execute_reply": "2026-08-31T06:02:52.093777Z"
    },
    "tags": []
   },
   "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>Hemoglobin</th>\n",
       "      <th>Glucose</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.865744</td>\n",
       "      <td>-0.221549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.457446</td>\n",
       "      <td>-0.947597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.004968</td>\n",
       "      <td>3.841231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.814879</td>\n",
       "      <td>0.396364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.083954</td>\n",
       "      <td>0.643529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>153</th>\n",
       "      <td>0.700526</td>\n",
       "      <td>0.133751</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>154</th>\n",
       "      <td>0.978974</td>\n",
       "      <td>-0.870358</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>155</th>\n",
       "      <td>0.735332</td>\n",
       "      <td>-0.484162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>156</th>\n",
       "      <td>0.178436</td>\n",
       "      <td>-0.267893</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>157</th>\n",
       "      <td>0.735332</td>\n",
       "      <td>-0.005280</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>158 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Hemoglobin   Glucose\n",
       "0     -0.865744 -0.221549\n",
       "1     -1.457446 -0.947597\n",
       "2     -1.004968  3.841231\n",
       "3     -2.814879  0.396364\n",
       "4     -2.083954  0.643529\n",
       "..          ...       ...\n",
       "153    0.700526  0.133751\n",
       "154    0.978974 -0.870358\n",
       "155    0.735332 -0.484162\n",
       "156    0.178436 -0.267893\n",
       "157    0.735332 -0.005280\n",
       "\n",
       "[158 rows x 2 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ckd_attributes = ckd[['Hemoglobin', 'Glucose']]\n",
    "ckd_attributes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4eec7bb3",
   "metadata": {},
   "source": [
    "Each row consists of the coordinates of one point in our training sample. **Because the rows now consist only of numerical values**, it is possible to convert them to arrays.  For this, we use the function `np.array`, which converts any kind of sequential object, like a row, to an array."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e53ef818",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.094928Z",
     "iopub.status.busy": "2026-08-31T06:02:52.094867Z",
     "iopub.status.idle": "2026-08-31T06:02:52.096628Z",
     "shell.execute_reply": "2026-08-31T06:02:52.096456Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Hemoglobin   -2.814879\n",
       "Glucose       0.396364\n",
       "Name: 3, dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ckd_attributes.iloc[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "bea15db8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.097556Z",
     "iopub.status.busy": "2026-08-31T06:02:52.097492Z",
     "iopub.status.idle": "2026-08-31T06:02:52.099117Z",
     "shell.execute_reply": "2026-08-31T06:02:52.098922Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.81487943,  0.39636401])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(ckd_attributes.iloc[3])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9f1dd911",
   "metadata": {},
   "source": [
    "This is very handy because we can now use array operations on the data in each row."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39b63919",
   "metadata": {},
   "source": [
    "## Distance Between Points When There are Two Attributes\n",
    "The main calculation we need to do is to find the distance between Alice's point and any other point. For this, the first thing we need is a way to compute the distance between any pair of points. \n",
    "\n",
    "How do we do this?  In 2-dimensional space, it's pretty easy.  If we have a point at coordinates $(x_0,y_0)$ and another at $(x_1,y_1)$, the distance between them is\n",
    "\n",
    "$$\n",
    "D = \\sqrt{(x_0-x_1)^2 + (y_0-y_1)^2}\n",
    "$$\n",
    "\n",
    "(Where did this come from?  It comes from the Pythogorean theorem: we have a right triangle with side lengths $x_0-x_1$ and $y_0-y_1$, and we want to find the length of the hypotenuse.)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f02b55c8",
   "metadata": {},
   "source": [
    "In the next section we'll see that this formula has a straightforward extension when there are more than two attributes. For now, let's use the formula and array operations to find the distance between Alice and the patient in Row 3."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7511d90b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.100042Z",
     "iopub.status.busy": "2026-08-31T06:02:52.099987Z",
     "iopub.status.idle": "2026-08-31T06:02:52.101616Z",
     "shell.execute_reply": "2026-08-31T06:02:52.101460Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0. , 1.1]), array([-2.81487943,  0.39636401]))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "patient3 = np.array(ckd_attributes.iloc[3])\n",
    "alice, patient3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "2e87d0e2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.102513Z",
     "iopub.status.busy": "2026-08-31T06:02:52.102447Z",
     "iopub.status.idle": "2026-08-31T06:02:52.103961Z",
     "shell.execute_reply": "2026-08-31T06:02:52.103798Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.9014909651272616"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "distance = np.sqrt(np.sum((alice - patient3)**2)).item()\n",
    "distance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e5e620f",
   "metadata": {},
   "source": [
    "We're going to need the distance between Alice and a bunch of points, so let's write a function called `distance` that computes the distance between any pair of points. The function will take two arrays, each containing the $(x, y)$ coordinates of a point.  (Remember, those are really the Hemoglobin and Glucose levels of a patient.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c73ec52b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.104873Z",
     "iopub.status.busy": "2026-08-31T06:02:52.104820Z",
     "iopub.status.idle": "2026-08-31T06:02:52.106127Z",
     "shell.execute_reply": "2026-08-31T06:02:52.105943Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def distance(point1, point2):\n",
    "    \"\"\"Returns the Euclidean distance between point1 and point2.\n",
    "    \n",
    "    Each argument is an array containing the coordinates of a point.\"\"\"\n",
    "    return np.sqrt(np.sum((point1 - point2)**2)).item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d56f7c1c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.106915Z",
     "iopub.status.busy": "2026-08-31T06:02:52.106861Z",
     "iopub.status.idle": "2026-08-31T06:02:52.108295Z",
     "shell.execute_reply": "2026-08-31T06:02:52.108124Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.9014909651272616"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "distance(alice, patient3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4994b70a",
   "metadata": {},
   "source": [
    "We have begun to build our classifier: the `distance` function is the first building block. Now let's work on the next piece."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1462f94",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "source": [
    "## Using `apply` on an Entire Row\n",
    "Recall that if you want to apply a function to each element of a column of a table, one way to do that is by the call `table_name.apply(function_name, column_label)`. This evaluates to an array consisting of the values of the function when we call it on each element of the column. So each entry of the array is based on the corresponding row of the table.\n",
    "\n",
    "If you use `apply` without specifying a column label, then the entire row is passed to the function. Let's see how this works on a very small table `t` containing the information about the first five patients in the training sample."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "15df4382",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.109230Z",
     "iopub.status.busy": "2026-08-31T06:02:52.109162Z",
     "iopub.status.idle": "2026-08-31T06:02:52.111355Z",
     "shell.execute_reply": "2026-08-31T06:02:52.111185Z"
    },
    "tags": []
   },
   "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>Hemoglobin</th>\n",
       "      <th>Glucose</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.865744</td>\n",
       "      <td>-0.221549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.457446</td>\n",
       "      <td>-0.947597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.004968</td>\n",
       "      <td>3.841231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.814879</td>\n",
       "      <td>0.396364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.083954</td>\n",
       "      <td>0.643529</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Hemoglobin   Glucose\n",
       "0   -0.865744 -0.221549\n",
       "1   -1.457446 -0.947597\n",
       "2   -1.004968  3.841231\n",
       "3   -2.814879  0.396364\n",
       "4   -2.083954  0.643529"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### df row selection:\n",
    "### t = ckd_attributes.take(np.arange(5))\n",
    "### t = ckd_attributes.iloc[np.arange(5)]\n",
    "\n",
    "t = ckd_attributes.head(5)     ### but of course iloc[] is preferred\n",
    "t"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2787ad7",
   "metadata": {},
   "source": [
    "Just as an example, suppose that for each patient we want to know how unusual their most unusual attribute is.  Concretely, if a patient's hemoglobin level is further from the average than her glucose level, we want to know how far it is from the average.  If her glucose level is further from the average than her hemoglobin level, we want to know how far that is from the average instead.\n",
    "\n",
    "That's the same as taking the maximum of the absolute values of the two quantities. To do this for a particular row, we can convert the row to an array and use array operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "a1f20c7b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.112258Z",
     "iopub.status.busy": "2026-08-31T06:02:52.112189Z",
     "iopub.status.idle": "2026-08-31T06:02:52.113447Z",
     "shell.execute_reply": "2026-08-31T06:02:52.113278Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def max_abs(row):\n",
    "    return np.max(np.abs(np.array(row))).item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ee421fed",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.114222Z",
     "iopub.status.busy": "2026-08-31T06:02:52.114165Z",
     "iopub.status.idle": "2026-08-31T06:02:52.115654Z",
     "shell.execute_reply": "2026-08-31T06:02:52.115479Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8657439478031919"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max_abs(t.iloc[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04ca5f6c",
   "metadata": {},
   "source": [
    "And now we can apply `max_abs` to each row of the table `t`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "96aa1971",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.116498Z",
     "iopub.status.busy": "2026-08-31T06:02:52.116447Z",
     "iopub.status.idle": "2026-08-31T06:02:52.118232Z",
     "shell.execute_reply": "2026-08-31T06:02:52.118068Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.865744\n",
       "1    1.457446\n",
       "2    3.841231\n",
       "3    2.814879\n",
       "4    2.083954\n",
       "dtype: float64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t.apply(max_abs, axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "544489b6",
   "metadata": {},
   "source": [
    "This way of using `apply` will help us create the next building block of our classifier."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba150479",
   "metadata": {},
   "source": [
    "## Alice's $k$ Nearest Neighbors\n",
    "If we want to classify Alice using a k-nearest neighbor classifier, we have to identify her $k$ nearest neighbors. What are the steps in this process? Suppose $k = 5$. Then the steps are:\n",
    "- **Step 1.** Find the distance between Alice and each point in the training sample.\n",
    "- **Step 2.** Sort the data table in increasing order of the distances.\n",
    "- **Step 3.** Take the top 5 rows of the sorted table.\n",
    "\n",
    "Steps 2 and 3 seem straightforward, provided we have the distances. So let's focus on Step 1.\n",
    "\n",
    "Here's Alice:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "ffa55a13",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.119118Z",
     "iopub.status.busy": "2026-08-31T06:02:52.119054Z",
     "iopub.status.idle": "2026-08-31T06:02:52.120504Z",
     "shell.execute_reply": "2026-08-31T06:02:52.120347Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 1.1])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "alice"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96c1b722",
   "metadata": {},
   "source": [
    "What we need is a function that finds the distance between Alice and another point whose coordinates are contained in a row. The function `distance` returns the distance between any two points whose coordinates are in arrays. We can use that to define `distance_from_alice`, which takes a row as its argument and returns the distance between that row and Alice."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "16086831",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.121336Z",
     "iopub.status.busy": "2026-08-31T06:02:52.121282Z",
     "iopub.status.idle": "2026-08-31T06:02:52.122557Z",
     "shell.execute_reply": "2026-08-31T06:02:52.122383Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def distance_from_alice(row):\n",
    "    \"\"\"Returns distance between Alice and a row of the attributes table\"\"\"\n",
    "    return distance(alice, np.array([row]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "f2689f5b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.123372Z",
     "iopub.status.busy": "2026-08-31T06:02:52.123317Z",
     "iopub.status.idle": "2026-08-31T06:02:52.124782Z",
     "shell.execute_reply": "2026-08-31T06:02:52.124587Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.9014909651272616"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "distance_from_alice(ckd_attributes.iloc[3])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c12f8ac3",
   "metadata": {},
   "source": [
    "Now we can `apply` the function `distance_from_alice` to each row of `ckd_attributes`, and augment the table `ckd` with the distances. Step 1 is complete!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "a37b8c73",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.125646Z",
     "iopub.status.busy": "2026-08-31T06:02:52.125583Z",
     "iopub.status.idle": "2026-08-31T06:02:52.128171Z",
     "shell.execute_reply": "2026-08-31T06:02:52.128000Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "distances = ckd_attributes.apply(distance_from_alice, axis=1)\n",
    "ckd_with_distances = ckd.copy()\n",
    "ckd_with_distances['Distance from Alice'] = distances"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "6c49aa1f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.128998Z",
     "iopub.status.busy": "2026-08-31T06:02:52.128938Z",
     "iopub.status.idle": "2026-08-31T06:02:52.130097Z",
     "shell.execute_reply": "2026-08-31T06:02:52.129935Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# distances = ckd_attributes.apply(distance_from_alice)\n",
    "# ckd_with_distances = ckd.with_column('Distance from Alice', distances)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "cdc866c1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.130858Z",
     "iopub.status.busy": "2026-08-31T06:02:52.130804Z",
     "iopub.status.idle": "2026-08-31T06:02:52.133597Z",
     "shell.execute_reply": "2026-08-31T06:02:52.133441Z"
    },
    "tags": []
   },
   "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>Hemoglobin</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>Class</th>\n",
       "      <th>Color</th>\n",
       "      <th>Distance from Alice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.865744</td>\n",
       "      <td>-0.221549</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>1.579875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.457446</td>\n",
       "      <td>-0.947597</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>2.513325</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.004968</td>\n",
       "      <td>3.841231</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>2.919641</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.814879</td>\n",
       "      <td>0.396364</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>2.901491</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.083954</td>\n",
       "      <td>0.643529</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>2.133361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>153</th>\n",
       "      <td>0.700526</td>\n",
       "      <td>0.133751</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.193471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>154</th>\n",
       "      <td>0.978974</td>\n",
       "      <td>-0.870358</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>2.200159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>155</th>\n",
       "      <td>0.735332</td>\n",
       "      <td>-0.484162</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.746506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>156</th>\n",
       "      <td>0.178436</td>\n",
       "      <td>-0.267893</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.379482</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>157</th>\n",
       "      <td>0.735332</td>\n",
       "      <td>-0.005280</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.327537</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>158 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Hemoglobin   Glucose  Class     Color  Distance from Alice\n",
       "0     -0.865744 -0.221549      1  darkblue             1.579875\n",
       "1     -1.457446 -0.947597      1  darkblue             2.513325\n",
       "2     -1.004968  3.841231      1  darkblue             2.919641\n",
       "3     -2.814879  0.396364      1  darkblue             2.901491\n",
       "4     -2.083954  0.643529      1  darkblue             2.133361\n",
       "..          ...       ...    ...       ...                  ...\n",
       "153    0.700526  0.133751      0      gold             1.193471\n",
       "154    0.978974 -0.870358      0      gold             2.200159\n",
       "155    0.735332 -0.484162      0      gold             1.746506\n",
       "156    0.178436 -0.267893      0      gold             1.379482\n",
       "157    0.735332 -0.005280      0      gold             1.327537\n",
       "\n",
       "[158 rows x 5 columns]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ckd_with_distances"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad4f5690",
   "metadata": {},
   "source": [
    "For Step 2, let's sort the table in increasing order of distance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "4bc06f2e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.134471Z",
     "iopub.status.busy": "2026-08-31T06:02:52.134419Z",
     "iopub.status.idle": "2026-08-31T06:02:52.137344Z",
     "shell.execute_reply": "2026-08-31T06:02:52.137165Z"
    },
    "tags": []
   },
   "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>Hemoglobin</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>Class</th>\n",
       "      <th>Color</th>\n",
       "      <th>Distance from Alice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>0.839750</td>\n",
       "      <td>1.215099</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>0.847601</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>-0.970162</td>\n",
       "      <td>1.276890</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>0.986156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>84</th>\n",
       "      <td>-0.030400</td>\n",
       "      <td>0.087407</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.013049</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>152</th>\n",
       "      <td>0.143630</td>\n",
       "      <td>0.087407</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.022728</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.413266</td>\n",
       "      <td>2.049282</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>1.035338</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.004968</td>\n",
       "      <td>3.841231</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>2.919641</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>-2.292790</td>\n",
       "      <td>-0.854910</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>3.013065</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>-0.378460</td>\n",
       "      <td>4.520935</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>3.441806</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>-3.685029</td>\n",
       "      <td>0.689873</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>3.707782</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>-0.761326</td>\n",
       "      <td>5.540492</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>4.505285</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>158 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Hemoglobin   Glucose  Class     Color  Distance from Alice\n",
       "14     0.839750  1.215099      1  darkblue             0.847601\n",
       "35    -0.970162  1.276890      1  darkblue             0.986156\n",
       "84    -0.030400  0.087407      0      gold             1.013049\n",
       "152    0.143630  0.087407      0      gold             1.022728\n",
       "6     -0.413266  2.049282      1  darkblue             1.035338\n",
       "..          ...       ...    ...       ...                  ...\n",
       "2     -1.004968  3.841231      1  darkblue             2.919641\n",
       "12    -2.292790 -0.854910      1  darkblue             3.013065\n",
       "41    -0.378460  4.520935      1  darkblue             3.441806\n",
       "42    -3.685029  0.689873      1  darkblue             3.707782\n",
       "36    -0.761326  5.540492      1  darkblue             4.505285\n",
       "\n",
       "[158 rows x 5 columns]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted_by_distance = ckd_with_distances.sort_values(by=['Distance from Alice'])\n",
    "sorted_by_distance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf898cbb",
   "metadata": {},
   "source": [
    "Step 3: The top 5 rows correspond to Alice's 5 nearest neighbors; you can replace 5 by any other positive integer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "98204cd3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.138289Z",
     "iopub.status.busy": "2026-08-31T06:02:52.138233Z",
     "iopub.status.idle": "2026-08-31T06:02:52.140677Z",
     "shell.execute_reply": "2026-08-31T06:02:52.140491Z"
    },
    "tags": []
   },
   "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>Hemoglobin</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>Class</th>\n",
       "      <th>Color</th>\n",
       "      <th>Distance from Alice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>0.839750</td>\n",
       "      <td>1.215099</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>0.847601</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>-0.970162</td>\n",
       "      <td>1.276890</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>0.986156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>84</th>\n",
       "      <td>-0.030400</td>\n",
       "      <td>0.087407</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.013049</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>152</th>\n",
       "      <td>0.143630</td>\n",
       "      <td>0.087407</td>\n",
       "      <td>0</td>\n",
       "      <td>gold</td>\n",
       "      <td>1.022728</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.413266</td>\n",
       "      <td>2.049282</td>\n",
       "      <td>1</td>\n",
       "      <td>darkblue</td>\n",
       "      <td>1.035338</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Hemoglobin   Glucose  Class     Color  Distance from Alice\n",
       "14     0.839750  1.215099      1  darkblue             0.847601\n",
       "35    -0.970162  1.276890      1  darkblue             0.986156\n",
       "84    -0.030400  0.087407      0      gold             1.013049\n",
       "152    0.143630  0.087407      0      gold             1.022728\n",
       "6     -0.413266  2.049282      1  darkblue             1.035338"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# alice_5_nearest_neighbors = sorted_by_distance.take(np.arange(5))\n",
    "alice_5_nearest_neighbors = sorted_by_distance.iloc[np.arange(5)]\n",
    "alice_5_nearest_neighbors"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26c060a5",
   "metadata": {},
   "source": [
    "Three of Alice's five nearest neighbors are blue points and two are gold. So a 5-nearest neighbor classifier would classify Alice as blue: it would predict that Alice has chronic kidney disease.\n",
    "\n",
    "The graph below zooms in on Alice and her five nearest neighbors. The two gold ones just inside the circle directly below the red point. The classifier says Alice is more like the three blue ones around her."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "129394cf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.141535Z",
     "iopub.status.busy": "2026-08-31T06:02:52.141484Z",
     "iopub.status.idle": "2026-08-31T06:02:52.173127Z",
     "shell.execute_reply": "2026-08-31T06:02:52.172895Z"
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(5,5))\n",
    "\n",
    "### scatter CKD points\n",
    "plt.scatter(ckd['Hemoglobin'], ckd['Glucose'], c=ckd['Color'], s=10)\n",
    "\n",
    "### Alice point\n",
    "alice_x = alice[0]     # or alice['Hemoglobin']\n",
    "alice_y = alice[1]     # or alice['Glucose']\n",
    "plt.scatter(alice_x, alice_y, color='red', s=20)\n",
    "\n",
    "### circle\n",
    "radius = sorted_by_distance['Distance from Alice'].iloc[4] + 0.014\n",
    "theta = np.arange(0, 2*np.pi + 1, 2*np.pi/200)\n",
    "circle_x = radius * np.cos(theta) + alice_x\n",
    "circle_y = radius * np.sin(theta) + alice_y\n",
    "plt.plot(circle_x, circle_y, color='green', lw=1)\n",
    "\n",
    "\n",
    "plt.xlim(-2, 2.5)\n",
    "plt.ylim(-2, 2.5);\n",
    "plt.xlabel(\"Hemoglobin\")\n",
    "plt.ylabel(\"Glucose\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0abd769b",
   "metadata": {},
   "source": [
    "We are well on our way to implementing our k-nearest neighbor classifier. In the next two sections we will put it together and assess its accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63f284b6",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "cell-063f0111",
   "metadata": {},
   "source": [
    "\n",
    "## Section Practice\n",
    "\n",
    "Use this short exercise to check the main workflow from this section.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "cell-9fa778cd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.174251Z",
     "iopub.status.busy": "2026-08-31T06:02:52.174183Z",
     "iopub.status.idle": "2026-08-31T06:02:52.175673Z",
     "shell.execute_reply": "2026-08-31T06:02:52.175501Z"
    },
    "tags": [
     "thebe-interactive"
    ]
   },
   "outputs": [],
   "source": [
    "### Exercise: Practice Rows of Tables\n",
    "# A retailer plans a new store and wants the most similar existing store.\n",
    "# Each row of stores describes one store, with both attributes in standard units.\n",
    "#   1. Write a function that takes one row, converts it to an array, and returns\n",
    "#      its distance to new_store.\n",
    "#   2. Use stores.apply(..., axis=1) to compute the distance for every row.\n",
    "#   3. Print the name (index label) of the closest store.\n",
    "# Print exactly:\n",
    "# Closest store: Midtown\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "stores = pd.DataFrame({\n",
    "    'foot_traffic': [1.5, 0.3, -0.8, -1.1],\n",
    "    'avg_basket': [0.8, 0.1, 1.2, -0.9],\n",
    "}, index=['Downtown', 'Midtown', 'Airport', 'Suburb'])\n",
    "new_store = np.array([0.5, -0.2])\n",
    "### Your code starts here\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "### Your code ends here\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "cell-cf4992ae",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-31T06:02:52.176590Z",
     "iopub.status.busy": "2026-08-31T06:02:52.176536Z",
     "iopub.status.idle": "2026-08-31T06:02:52.178496Z",
     "shell.execute_reply": "2026-08-31T06:02:52.178232Z"
    },
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Closest store: Midtown\n"
     ]
    }
   ],
   "source": [
    "### Solution\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "stores = pd.DataFrame({\n",
    "    'foot_traffic': [1.5, 0.3, -0.8, -1.1],\n",
    "    'avg_basket': [0.8, 0.1, 1.2, -0.9],\n",
    "}, index=['Downtown', 'Midtown', 'Airport', 'Suburb'])\n",
    "new_store = np.array([0.5, -0.2])\n",
    "\n",
    "def distance_to_new_store(row):\n",
    "    return np.sqrt(np.sum((np.array(row) - new_store) ** 2))\n",
    "\n",
    "distances = stores.apply(distance_to_new_store, axis=1)\n",
    "print('Closest store:', distances.idxmin())\n"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": ".venv",
   "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.13.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
