{
 "cells": [
  {
   "attachments": {
    "405e366d-7932-4677-9688-051b92af7878.png": {
     "image/png": "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nZfrZzC9CPUUmei8++67A5j1P//5T/f73//e7brrru75559vqfhhei1FNBQHPvjgg91ee+3lDjrooK6hkNdWupahBgl3qt01k06/YdkA6pZf18OjF9r+xx9/7D777LOWy5kXwUUXXeSWW245N/roo7vbbrvN3Xzzze6Xv/ylW2WVVdxll12WF6xl975h5NbJ7JpVcntn1yw/g9Vtzz33dBNPPLE74YQTaoo4ySSTuDnnnNPNP//8brLJJqt5Fx86j8Aiiyzipp12WhW5dT71/6WY11a6lZ9+TjdiWVt79fDodtv/6quv3HjjjVfZOHjWWWe5jTfe2K233nq6aEK0vvzyy+v9qquu6jbYYAN3xRVX1ALWpqfh2xRPjKbLCPz000+agx9//LEmJ6OOOqp76qmnatziQ/cQ+MMf/uD4dZPy2ko389SvaUcsa2uuHh7dbvv18lZbiuaeFltsMXfjjTe6FVZYoSaCscceWxn41Vdf7eabb76ad+16GCoY+bPPPqtAvv76626MMcbQ1dCaa67phhlmmARH9t/Z02Afh5XtPPPM41ZfffUaP4nn4Obxxx/Xyttwww3dKKOM4i699FJVRJtyyilVpM2K+F//+pc7/fTTlaGyKiZetgmMHnzwQRXDrLTSSgMqmv1U9rYRxw433HAWJLkiKjrnnHMccUD33nuvswa76aabugkmmMAdccQR7r///W9NHIceeqjOTrfcckt3zTXXuFtuucUhyaChrbPOOioOShLJuWGP/vLLL9f9XvQSZp11VsfMc4oppsgJ8f/Ohx12mNYFeTzqqKPcP/7xDzf33HPrFgC+ysR9//33K35vv/22o9P8+te/ThJihjzhhBO6dqWH6PD888/Xuvz666/ddNNN5zbZZBM3+eSTJ2nWa28oDd5www2qCLPwwgsnYbhh64MtJBRlRhxxRDfzzDO71VZbzU000UQ1/qwsf/zjH91NN93kbr/9dvef//xHt5XIS1Y7IYIibQV/xEWb+Nvf/ubeeustN/XUU2t/WHHFFXldiO677z7HXiF9bvzxx9d2wYrM6KWXXnLXXXed1vt3333n6C/0oZlmmsm81L3Wi7+V/mSJUs/XX3+9e+ihh9yHH36oolL6BviOMMIIhbEs044tbbsWxajZ9mDpcC2az7z2/4tf/KLhOJTV9i3vMPlrr71Wx2DGu6WXXlrH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/PLLvixPuzL93//+18uExo8//vgJLiFG88wzjxcG367kBmU8EcPer9ZYR71fR5bDp556yi+77LJ+mGGGGTAmjTrqqH6PPfbwP/zwg3mP1yYQYDXbd3ThhRd6mdENaBQwrDnnnNN/9NFHfVemdmT4s88+84svvniCy7zzzuuPPfZYf+qpp/rFFlsscR933HH9O++8044kB10cEcPer9JYR71fR5bDSy+91IuUVMcemPYf//hHz/i9/fbbe8YhW2TstddeFiRem0Cg7xj5YYcdllT+L37xC3/KKaf4V155xS+44IKJ+7TTTutFpNwEHP0b5KeffvIrrLBCgsFaa63lRexYU6BZZ501eX/ggQfWvOvWw7///W8v4jb9fffdd93Khqbbrxh2FTRJnL5GHYrItPKsxDpqHuJO97VHHnnEDz/88DrmjD766P6BBx6oyfw111yTjEcjjjjigPGqxnN8qItA3zByRC9bb711UvELL7ywf/XVV5PC/fjjj/6II47wNAhmeRNPPLF/6aWXkveD/YZVt81uZd8pU1S1zz77JH5WX331noCEbQDL94svvtjVPPUrht0EDcZq0rG111678qzEOmoe4k72tW+//dZPNtlkSd++6qqrBmSciYWN14wBovM0wE90KIZA32it77LLLu70009XZTYRF7v77rvPTTXVVFL//6Nhhx3W7b777u6JJ55wsvJ0Ijp2wuydNCjzMmivsl/oDj/88KR8+++/vxtuuOGSZ7sR/QG7dTIxSu67eYOyUi9QP2PYTfxkmHFg1wmKddQayp3sa+eff74q2pJjFNpk4TAg8//6179q2k6vjEkDMtoHDn2jtS6rcffWW2+5Qw891E0//fS50MLEYeYiOnai8OVGGWWUXL+D5cWVV16pmqCUZ5ZZZnGrrLJKZtHuueeexH2KKaZI7uONcxHD3m8FsY56v44shyy2jEQS6ETRzR6TK4sxJoJGcUwyJMpf+4aRTzfddO6SSy5xI400UsNSirhGGX5Dj4PEw9VXX52URPbGMzvNkCFD3AsvvJD4W2ONNZL7eONcr2DIKkV0P+pWiWwjaR0jhRqaqFfqCMxjPeW3vOeee86J3pJ6EAU3J7o7mZ5vuummxH2JJZZwY445ZvLcrhukEEwiMHerR0h7GvmpF77b73p+JPj444/dnnvuqatwbMSnmWYa9/jjjw/A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"
    }
   },
   "cell_type": "markdown",
   "id": "789a7ca8-de44-4d37-b410-1858c33910c4",
   "metadata": {},
   "source": [
    "# Multiple regression analysis in SQL with 3 independent variables\n",
    "![Screenshot 2023-03-27 at 2.07.58 PM.png](attachment:405e366d-7932-4677-9688-051b92af7878.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "01983e15-e7bc-4141-98ed-9f3a472a975e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from pandas import DataFrame\n",
    "from DATA225utils import make_connection, dataframe_query"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02cb3149-4758-4a7a-9a4a-a3a8e616a4ba",
   "metadata": {},
   "source": [
    "## Read the values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "255b3910-f02a-4fda-8398-7e599c5d5785",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('FourVariables.csv')\n",
    "values = list(df.itertuples(index=False, name=None))\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c21b267c-93be-4f55-9d36-7401b04ad8c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "conn = make_connection(config_file = 'FourVariables.ini')\n",
    "cursor = conn.cursor()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b2b3de8-2a70-4117-a9e2-71afe77ac8a2",
   "metadata": {},
   "outputs": [],
   "source": [
    "cursor.execute('DROP TABLE IF EXISTS variables')\n",
    "\n",
    "sql = \"\"\"\n",
    "    CREATE TABLE variables\n",
    "    (\n",
    "        id INT    NOT NULL,\n",
    "        x1 DOUBLE NOT NULL,\n",
    "        x2 DOUBLE NOT NULL,\n",
    "        x3 DOUBLE NOT NULL,\n",
    "        y  DOUBLE NOT NULL,\n",
    "        PRIMARY KEY(id)\n",
    "    )\n",
    "    \"\"\"\n",
    "\n",
    "cursor.execute(sql)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94fada91-4379-429c-8283-b1a776153719",
   "metadata": {},
   "source": [
    "## Load the `variables` table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a6d83e1f-6bd5-4182-9452-bd87ae6a51b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "sql = ( \"\"\"\n",
    "        INSERT INTO VARIABLES\n",
    "        VALUES (%s, %s, %s, %s, %s)\n",
    "        \"\"\"\n",
    "      )\n",
    "\n",
    "cursor.executemany(sql, values)\n",
    "conn.commit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "01c62120-6b48-4136-9e32-a37f8aa6a6f8",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Function to display the `variables` table and return its rows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "619888d4-160f-4af5-97b7-a5ccd19770d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def display_and_return(cursor):\n",
    "    \"\"\"\n",
    "    Query the variables table, print its rows as a dataframe,\n",
    "    and return the rows as a numpy array.\n",
    "    \"\"\"\n",
    "    _, df = dataframe_query(conn, 'SELECT * FROM variables')\n",
    "\n",
    "    display(df)\n",
    "    return df.to_numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0e5879ba-0879-4f4e-8318-6a760c4fd204",
   "metadata": {},
   "outputs": [],
   "source": [
    "rows = display_and_return(cursor)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83c586b3-e467-4fa0-8868-c345b1adea80",
   "metadata": {},
   "source": [
    "## Regression coefficients using `numpy` matrix arithmetic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f65a9679-ac51-49b1-b592-8b2a6521ac48",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy.linalg import inv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58b1fe06-69d4-46ae-8f56-4215a87e7400",
   "metadata": {},
   "outputs": [],
   "source": [
    "X1 = rows[:, 1]\n",
    "X2 = rows[:, 2]\n",
    "X3 = rows[:, 3]\n",
    "Y  = rows[:, 4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3c662e99-bd32-400a-bece-a9249a0a3658",
   "metadata": {},
   "outputs": [],
   "source": [
    "ones = np.array([1]*len(Y))\n",
    "ones"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9754242e-5233-49cb-95ea-7337ff546935",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = np.array([ones, X1, X2, X3]).T\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "483dcd36-fb4c-48c4-ba69-c7c06313dba0",
   "metadata": {},
   "outputs": [],
   "source": [
    "ATA = A.T@A\n",
    "\n",
    "b = Y\n",
    "ATb = A.T@b\n",
    "\n",
    "ATAinv = inv(ATA)\n",
    "Xhat = ATAinv@ATb\n",
    "\n",
    "Xhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2fc13c7d-b871-4137-ad43-960f36de2e2f",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "β0 = Xhat[0]\n",
    "β1 = Xhat[1]\n",
    "β2 = Xhat[2]\n",
    "β3 = Xhat[3]\n",
    "\n",
    "df = DataFrame([[β0, β1, β2, β3]])\n",
    "df.columns = ['β0', 'β1', 'β2', 'β3']\n",
    "\n",
    "display(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f460481c-4649-44b6-a823-d1d15c2ac907",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Regression coefficients using `sklearn`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d29421ce-5b5f-411c-a298-278ec1d3d26d",
   "metadata": {},
   "outputs": [],
   "source": [
    "Xs    = np.array([X1, X2, X3]).T\n",
    "Betas = np.array([β1, β2, β3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bcedc57a-a710-4aff-9891-c6acdef54adf",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "linear_regression = LinearRegression()\n",
    "linear_regression.fit(X=Xs, y=Y)\n",
    "\n",
    "β0 = linear_regression.intercept_\n",
    "β1 = linear_regression.coef_[0]\n",
    "β2 = linear_regression.coef_[1]\n",
    "β3 = linear_regression.coef_[2]\n",
    "\n",
    "df = DataFrame([[β0, β1, β2, β3]])\n",
    "df.columns = ['β0', 'β1', 'β2', 'β3']\n",
    "\n",
    "display(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "307d48dd-ff92-422e-b9d5-14e5716d31ab",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Function to execute multiple SQL statements"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2101398d-6a94-4111-b027-71784851c9ba",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "def execute_multiple_SQL(cursor, sql, trace=False):\n",
    "    \"\"\"\n",
    "    Use the cursor to execute multiple SQL statements.\n",
    "    Print an execution trace if trace=True.\n",
    "    \"\"\"\n",
    "    for crsr in cursor.execute(sql, multi=True):\n",
    "        if crsr.with_rows:\n",
    "            results = crsr.fetchall()\n",
    "            if trace:\n",
    "                print(crsr.statement)\n",
    "                print('  ==> ', results)\n",
    "        else:\n",
    "            if trace:\n",
    "                print(crsr.statement)\n",
    "                if crsr.rowcount > 0:\n",
    "                    print(f'  ==> {crsr.rowcount} row(s) affected.')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b2212c7-25dc-4269-b9de-eda4f742beb4",
   "metadata": {},
   "source": [
    "## Regression coefficients using SQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2bb621b5-a26b-461e-a662-c47cd8e9157d",
   "metadata": {},
   "outputs": [],
   "source": [
    "sql = ( \"\"\"\n",
    "    START TRANSACTION;\n",
    "\n",
    "    DROP VIEW IF EXISTS base;\n",
    "    DROP VIEW IF EXISTS regression_1;\n",
    "    DROP VIEW IF EXISTS residuals_1;\n",
    "    DROP VIEW IF EXISTS regression_2;\n",
    "    DROP VIEW IF EXISTS residuals_2;\n",
    "    DROP VIEW IF EXISTS multiple_regression_3;\n",
    "\n",
    "    CREATE VIEW base AS\n",
    "        SELECT\n",
    "            x1,\n",
    "            x1 - AVG(x1) OVER() AS x1_centered,\n",
    "\n",
    "            x2,\n",
    "            x2 - AVG(x2) OVER() AS x2_centered,\n",
    "\n",
    "            x3,\n",
    "            x3 - AVG(x3) OVER() AS x3_centered,\n",
    "\n",
    "            y,\n",
    "            y - AVG(y) OVER()   AS y_centered\n",
    "\n",
    "        FROM variables;\n",
    "\n",
    "    CREATE VIEW regression_1 AS\n",
    "        SELECT\n",
    "            AVG(x1) - AVG(x2) * SUM(x1_centered * x2_centered) \n",
    "                / SUM(x2_centered * x2_centered)                AS x1x2_const,\n",
    "            SUM(x1_centered * x2_centered) \n",
    "                / SUM(x2_centered * x2_centered)                AS x1x2_coef,\n",
    "            AVG(x1) - AVG(x3) * SUM(x1_centered * x3_centered) \n",
    "                / SUM(x3_centered * x3_centered)                AS x1x3_const,\n",
    "            SUM(x1_centered * x3_centered) \n",
    "                / SUM(x3_centered * x3_centered)                AS x1x3_coef,\n",
    "            AVG(x2) - AVG(x1) * SUM(x2_centered * x1_centered) \n",
    "                / SUM(x1_centered * x1_centered)                AS x2x1_const,\n",
    "            SUM(x2_centered * x1_centered) \n",
    "                / SUM(x1_centered * x1_centered)                AS x2x1_coef,\n",
    "            AVG(x2) - AVG(x3) * SUM(x2_centered * x3_centered) \n",
    "                / SUM(x3_centered * x3_centered)                AS x2x3_const,\n",
    "            SUM(x2_centered * x3_centered) \n",
    "                / SUM(x3_centered * x3_centered)                AS x2x3_coef,\n",
    "            AVG(x3) - AVG(x1) * SUM(x3_centered * x1_centered) \n",
    "                / SUM(x1_centered * x1_centered)                AS x3x1_const,\n",
    "            SUM(x3_centered * x1_centered) \n",
    "                / SUM(x1_centered * x1_centered)                AS x3x1_coef,\n",
    "            AVG(x3) - AVG(x2) * SUM(x3_centered * x2_centered) \n",
    "                / SUM(x2_centered * x2_centered)                AS x3x2_const,\n",
    "            SUM(x3_centered * x2_centered) \n",
    "                / SUM(x2_centered * x2_centered)                AS x3x2_coef\n",
    "\n",
    "        FROM base;\n",
    "\n",
    "    CREATE VIEW residuals_1 AS\n",
    "        SELECT\n",
    "            y,\n",
    "            y_centered,\n",
    "\n",
    "            x1,\n",
    "            x1_centered,\n",
    "            x2,\n",
    "            x2_centered,\n",
    "            x3,\n",
    "            x3_centered,\n",
    "\n",
    "            x1 - (SELECT x1x2_coef  FROM regression_1) * x2 \n",
    "               - (SELECT x1x2_const FROM regression_1)       AS x1x2_resid,\n",
    "            x1 - (SELECT x1x3_coef  FROM regression_1) * x3 \n",
    "               - (SELECT x1x3_const FROM regression_1)       AS x1x3_resid,\n",
    "            x2 - (SELECT x2x1_coef  FROM regression_1) * x1 \n",
    "               - (SELECT x2x1_const FROM regression_1)       AS x2x1_resid,\n",
    "            x2 - (SELECT x2x3_coef  FROM regression_1) * x3 \n",
    "               - (SELECT x2x3_const FROM regression_1)       AS x2x3_resid,\n",
    "            x3 - (SELECT x3x1_coef  FROM regression_1) * x1 \n",
    "               - (SELECT x3x1_const FROM regression_1)       AS x3x1_resid,\n",
    "            x3 - (SELECT x3x2_coef  FROM regression_1) * x2 \n",
    "               - (SELECT x3x2_const FROM regression_1)       AS x3x2_resid\n",
    "\n",
    "        FROM base;\n",
    "\n",
    "    CREATE VIEW regression_2 AS\n",
    "        SELECT\n",
    "            SUM(x1_centered * x2x3_resid) \n",
    "                / SUM(x2x3_resid * x2x3_resid)                  AS x1_x2x3_coef,\n",
    "            SUM(x1_centered * x3x2_resid) \n",
    "                / SUM(x3x2_resid * x3x2_resid)                  AS x1_x3x2_coef,\n",
    "            AVG(x1) - AVG(x2) * SUM(x1_centered * x2x3_resid) \n",
    "                          / SUM(x2x3_resid * x2x3_resid)\n",
    "                    - AVG(x3) * SUM(x1_centered * x3x2_resid) \n",
    "                          / SUM(x3x2_resid * x3x2_resid)        AS x1_const,\n",
    "            SUM(x2_centered * x1x3_resid) \n",
    "                / SUM(x1x3_resid * x1x3_resid)                  AS x2_x1x3_coef,\n",
    "            SUM(x2_centered * x3x1_resid) \n",
    "                / SUM(x3x1_resid * x3x1_resid)                  AS x2_x3x1_coef,\n",
    "            AVG(x2) - AVG(x1) * SUM(x2_centered * x1x3_resid) \n",
    "                          / SUM(x1x3_resid * x1x3_resid)\n",
    "                    - AVG(x3) * SUM(x2_centered * x3x1_resid) \n",
    "                          / SUM(x3x1_resid * x3x1_resid)        AS x2_const,\n",
    "            SUM(x3_centered * x2x1_resid) \n",
    "                / SUM(x2x1_resid * x2x1_resid)                  AS x3_x2x1_coef,\n",
    "            SUM(x3_centered * x1x2_resid) \n",
    "                / SUM(x1x2_resid * x1x2_resid)                  AS x3_x1x2_coef,\n",
    "            AVG(x3) - AVG(x1) * SUM(x3_centered * x1x2_resid) \n",
    "                          / SUM(x1x2_resid * x1x2_resid)\n",
    "                    - AVG(x2) * SUM(x3_centered * x2x1_resid) \n",
    "                          / SUM(x2x1_resid * x2x1_resid)        AS x3_const\n",
    "\n",
    "        FROM residuals_1;\n",
    "\n",
    "    CREATE VIEW residuals_2 AS\n",
    "        SELECT\n",
    "            y,\n",
    "            y_centered,\n",
    "\n",
    "            x1,\n",
    "            x1_centered,\n",
    "            x2,\n",
    "            x2_centered,\n",
    "            x3,\n",
    "            x3_centered,\n",
    "\n",
    "            x1 - (SELECT x1_x2x3_coef FROM regression_2) * x2\n",
    "               - (SELECT x1_x3x2_coef FROM regression_2) * x3\n",
    "               - (SELECT x1_const FROM regression_2)           AS x1_resid,\n",
    "            x2 - (SELECT x2_x1x3_coef FROM regression_2) * x1\n",
    "               - (SELECT x2_x3x1_coef FROM regression_2) * x3\n",
    "               - (SELECT x2_const FROM regression_2)           AS x2_resid,\n",
    "            x3 - (SELECT x3_x1x2_coef FROM regression_2) * x1\n",
    "               - (SELECT x3_x2x1_coef FROM regression_2) * x2\n",
    "               - (SELECT x3_const FROM regression_2)           AS x3_resid\n",
    "\n",
    "        FROM base;\n",
    "\n",
    "    CREATE VIEW multiple_regression_3 AS\n",
    "        SELECT\n",
    "            AVG(y) - AVG(x1) * SUM(y_centered * x1_resid) \n",
    "                         / SUM(x1_resid * x1_resid)\n",
    "                   - AVG(x2) * SUM(y_centered * x2_resid) \n",
    "                         / SUM(x2_resid * x2_resid)\n",
    "                   - AVG(x3) * SUM(y_centered * x3_resid) \n",
    "                        / SUM(x3_resid * x3_resid)        AS beta0,\n",
    "            SUM(y_centered * x1_resid) \n",
    "                / SUM(x1_resid * x1_resid)                AS beta1,\n",
    "            SUM(y_centered * x2_resid) \n",
    "                / SUM(x2_resid * x2_resid)                AS beta2,\n",
    "            SUM(y_centered * x3_resid) \n",
    "                / SUM(x3_resid * x3_resid)                AS beta3\n",
    "\n",
    "        FROM residuals_2;\n",
    "\n",
    "    COMMIT;\n",
    "    \"\"\"\n",
    "      )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7129d26e-936b-4224-bc56-3ddd93430ba9",
   "metadata": {},
   "outputs": [],
   "source": [
    "execute_multiple_SQL(cursor, sql)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "db56f96f-33b6-4997-ba78-f397c5490b34",
   "metadata": {},
   "outputs": [],
   "source": [
    "cursor.execute('SELECT * FROM multiple_regression_3')\n",
    "result = cursor.fetchone()\n",
    "\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "92bdc508-7409-4dab-8c64-c359588137c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "β0, β1, β2, β3 = result\n",
    "\n",
    "df = DataFrame([[β0, β1, β2, β3]])\n",
    "df.columns = ['β0', 'β1', 'β2', 'β3']\n",
    "\n",
    "display(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "178c50af-bdd7-4f88-9f00-96f73767dd38",
   "metadata": {},
   "outputs": [],
   "source": [
    "X     = np.array([X1, X2, X3]).T\n",
    "Betas = np.array([β1, β2, β3])\n",
    "\n",
    "Yhat = []\n",
    "\n",
    "for x in X:\n",
    "    Yhat.append(x@Betas + β0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6ff19e72-08e7-4e18-9ddf-6824d0d58339",
   "metadata": {},
   "outputs": [],
   "source": [
    "Errors = Y - Yhat\n",
    "table = []\n",
    "\n",
    "for i in range(len(Y)):\n",
    "    pct = abs(100*Errors[i]/Y[i])\n",
    "    row = np.concatenate([X[i], [Y[i], Yhat[i], Errors[i], pct]])\n",
    "    \n",
    "    table.append(row)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4a86f74-2f09-427b-840e-742f64dbbebe",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = DataFrame(table)\n",
    "df.columns = ['x1', 'x2', 'x3', 'y', \n",
    "              'est. y', 'error', '% error']\n",
    "\n",
    "pd.options.display.float_format = '{:,.2f}'.format\n",
    "display(df)\n",
    "\n",
    "print(f'correlation coefficient = {np.corrcoef(Y, Yhat)[0, 1]:.2f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "895e9579-dd44-4b74-9bd4-56147628f872",
   "metadata": {},
   "source": [
    "#### (c) 2023 by Ronald Mak"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "52c0c769-ace7-4696-85a9-710b2788d029",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
