{ "cells": [ { "cell_type": "markdown", "id": "0f8a011f-cf52-445b-83a8-731de3d1537c", "metadata": {}, "source": [ "# Linear regression calculations on the database server" ] }, { "cell_type": "markdown", "id": "954c920e-f143-4f9c-90fc-40cb90890450", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Here are five possible solutions to Assignment #9:\n", "1. CTEs \n", "2. Views\n", "3. Nested subqueries\n", "4. User-defined variables\n", "5. Stored procedure" ] }, { "cell_type": "markdown", "id": "0f72f2c8-749d-44d8-903c-9e3896d8fd85", "metadata": {}, "source": [ "### Each solution returns the regression coefficients slope `m` and y-intercept `b` required to draw the regression line for a set of X and Y values. To set the bounds of the X and Y axes, each solution also returns the minimum and maximum X and Y values." ] }, { "attachments": { "199ab981-32ac-4483-9704-4d3af786a9de.png": { "image/png": "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" }, "78e1df3a-87ce-4a01-94fe-af56e71feb62.png": { "image/png": "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" }, "9cb976ba-d7d5-4d49-90bf-68a8266f7657.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "ab12c50f-fd9d-46df-81bb-101374faa8de", "metadata": {}, "source": [ "### The formulas the SQL code implements in each solution for the regression line\n", "![Screenshot 2025-03-29 at 12.00.10 PM.png](attachment:9cb976ba-d7d5-4d49-90bf-68a8266f7657.png)\n", "### are\n", "![Screenshot 2025-03-29 at 12.00.59 PM.png](attachment:199ab981-32ac-4483-9704-4d3af786a9de.png)\n", "### and \n", "![Screenshot 2025-03-29 at 12.01.34 PM.png](attachment:78e1df3a-87ce-4a01-94fe-af56e71feb62.png)\n", "\n", "### where X = student weights and Y = book weights." ] }, { "cell_type": "code", "execution_count": null, "id": "e5d557ed-0474-4bc8-896f-67ef717d9f12", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from data201 import db_connection, df_query" ] }, { "cell_type": "code", "execution_count": null, "id": "4a7f6683-9354-42c1-abe3-34c158380a82", "metadata": {}, "outputs": [], "source": [ "conn = db_connection(config_file = 'StudentBookWeights.ini')\n", "cursor = conn.cursor()" ] }, { "cell_type": "code", "execution_count": null, "id": "15be8624-76e9-413b-8380-7b9c59d2233a", "metadata": {}, "outputs": [], "source": [ "df_query(conn, 'SELECT * FROM weights')" ] }, { "cell_type": "markdown", "id": "3de91531-e5bc-44b8-a93b-141ad63dbecb", "metadata": {}, "source": [ "1. ## CTEs" ] }, { "cell_type": "code", "execution_count": null, "id": "68efd60a-35dc-492e-a771-171e7c9ba574", "metadata": {}, "outputs": [], "source": [ "df_query(conn,\n", " \"\"\"\n", " WITH\n", " base AS\n", " (\n", " \t\tSELECT \n", " MIN(student) AS min_x,\n", " \t\t\tMAX(student) AS max_x,\n", " \t\t\tMIN(books) AS min_y,\n", " \t\t\tMAX(books) AS max_y,\n", " \n", " \t\t\tCOUNT(student) AS n,\n", " \t\t\tSUM(student) AS sum_x,\n", " \t\t\tSUM(books) AS sum_y,\n", " \t\t\tSUM((student*student)) AS sum_xx,\n", " \t\t\tSUM((student*books)) AS sum_xy,\n", " \t\t\t\n", " \t\t\tAVG(student) AS mean_x,\n", " \t\t\tAVG(books) AS mean_y\n", " \t\tFROM weights\n", " ),\n", " numerator_denominator AS\n", " (\n", " \t\tSELECT (sum_xy - ((sum_x*sum_y)/n)) AS numerator,\n", " \t\t\t (sum_xx - ((sum_x*sum_x)/n)) AS denominator\n", " \t\tFROM base\n", " ),\n", " coefficient_m AS\n", " (\n", " \t\tSELECT numerator/denominator AS m\n", " \t\tFROM numerator_denominator\n", " ),\n", " coefficient_b AS\n", " (\n", " \t\tSELECT mean_y - (m*mean_x) AS b\n", " \t\tFROM base, coefficient_m\n", " )\n", " SELECT m, b, min_x, max_x, min_y, max_y\n", " FROM base, coefficient_m, coefficient_b\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "d3a9c246-d685-430d-8833-4ea3ecabc6f5", "metadata": {}, "source": [ "2. ## Views" ] }, { "cell_type": "code", "execution_count": null, "id": "66fb1f68-ebff-4a9f-a210-52391217695a", "metadata": {}, "outputs": [], "source": [ "cursor.execute(\n", " \"\"\"\n", " CREATE OR REPLACE VIEW base AS\n", " SELECT\n", " MIN(student) AS min_x,\n", " MAX(student) AS max_x,\n", " MIN(books) AS min_y,\n", " MAX(books) AS max_y,\n", "\n", " COUNT(student) AS n,\n", " SUM(student) AS sum_x,\n", " SUM(books) AS sum_y,\n", " SUM((student*student)) AS sum_xx,\n", " SUM((student*books)) AS sum_xy,\n", " \n", " AVG(student) AS mean_x,\n", " AVG(books) AS mean_y\n", " FROM weights\n", " \"\"\"\n", ")\n", "\n", "cursor.execute(\n", " \"\"\"\n", " CREATE OR REPLACE VIEW numerator_denominator AS\n", " SELECT \n", " (sum_xy - ((sum_x*sum_y)/n)) AS numerator,\n", " (sum_xx - ((sum_x*sum_x)/n)) AS denominator\n", " FROM base\n", " \"\"\"\n", ")\n", "\n", "cursor.execute(\n", " \"\"\"\n", " CREATE OR REPLACE VIEW coefficient_m AS\n", " SELECT \n", " numerator/denominator AS m\n", " FROM numerator_denominator\n", " \"\"\"\n", ")\n", "\n", "cursor.execute(\n", " \"\"\"\n", " CREATE OR REPLACE VIEW coefficient_b AS\n", " SELECT \n", " mean_y - (m*mean_x) AS b\n", " FROM base, coefficient_m\n", " \"\"\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "b8b1e10f-ee13-4835-b84a-1121a6a06c0b", "metadata": {}, "outputs": [], "source": [ "df_query(conn,\n", " \"\"\"\n", " SELECT m, b, min_x, max_x, min_y, max_y\n", " FROM base, coefficient_m, coefficient_b\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "5ad3b1a7-7a1a-4a28-83b2-6163ee440796", "metadata": {}, "source": [ "3. ## Nested subqueries" ] }, { "cell_type": "code", "execution_count": null, "id": "1b54e84f-2a96-4a1d-a3c9-d24ac9a35aa8", "metadata": {}, "outputs": [], "source": [ "df_query(conn,\n", " \"\"\"\n", " SELECT m, b, min_x, max_x, min_y, max_y\n", " FROM (\n", " SELECT\n", " (SELECT MIN(student) FROM weights) AS min_x,\n", " (SELECT MAX(student) FROM weights) AS max_x,\n", " (SELECT MIN(books) FROM weights) AS min_y,\n", " (SELECT MAX(books) FROM weights) AS max_y,\n", " \n", " (SELECT COUNT(student) FROM weights) AS n,\n", " (SELECT SUM(student) FROM weights) AS sum_x,\n", " (SELECT SUM(books) FROM weights) AS sum_y,\n", " (SELECT SUM(student*student) FROM weights) AS sum_xx,\n", " (SELECT SUM(student*books) FROM weights) AS sum_xy,\n", " (SELECT AVG(student) FROM weights) AS mean_x,\n", " (SELECT AVG(books) FROM weights) AS mean_y,\n", " \n", " (SELECT sum_xy - (sum_x*sum_y)/n) AS numerator,\n", " (SELECT sum_xx - (sum_x*sum_x)/n) AS denominator,\n", " \n", " (SELECT numerator/denominator) AS m,\n", " (SELECT mean_y - m*mean_x) AS b\n", " ) AS regression\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "8bce83e7-d433-4117-a138-b5ce5e7fd73a", "metadata": {}, "source": [ "4. ## User-defined variables\n", "#### Must use `:=` in the `SELECT` clause because `=` is the equality relational operator." ] }, { "cell_type": "code", "execution_count": null, "id": "8a0ca4ab-6701-4e60-b620-2d908a7a8306", "metadata": {}, "outputs": [], "source": [ "df_query(conn,\n", " \"\"\"\n", " SELECT @min_x := MIN(student),\n", " \t @max_x := MAX(student),\n", " \t @min_y := MIN(books),\n", " \t @max_y := MAX(books),\n", " \n", " \t @n := COUNT(*), \n", " \t @sum_x := SUM(student),\n", " \t @sum_y := SUM(books), \n", " \t @sum_xx := SUM(student*student), \n", " \t @sum_xy := SUM(student*books),\n", " \t @mean_x := AVG(student), \n", " \t @mean_y := AVG(books),\n", " \t \n", " @numerator := @sum_xy - (@sum_x*@sum_y)/@n,\n", " @denominator := @sum_xx - (@sum_X*@sum_x)/@n,\n", " \n", " @m := @numerator/@denominator,\n", " @b := @mean_y - @m*@mean_x\n", " FROM weights\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "4ac96439-d519-46f8-9095-e2af1b504b78", "metadata": {}, "source": [ "#### Map the user-defined SQL variables to normal Python variables." ] }, { "cell_type": "code", "execution_count": null, "id": "b65512c1-5051-41ee-98c3-c672e7808511", "metadata": {}, "outputs": [], "source": [ "df_query(conn,\n", " \"\"\"\n", "\tSELECT @m AS m, \n", "\t\t @b AS b,\n", "\t\t @min_x AS min_x,\n", "\t\t @max_x AS max_x,\n", "\t\t @min_y AS min_y,\n", "\t\t @max_y AS max_y\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "b349779f-07f7-4457-9e5f-f1eaffe53358", "metadata": {}, "source": [ "#### **QUESTION:** Of the four solutions above, which do you think will be the most efficient? Imagine a table of millions of records." ] }, { "cell_type": "markdown", "id": "e84d1716-c4fb-4f04-8b82-f22129d357cf", "metadata": {}, "source": [ "5. ## Stored procedures\n", "#### Note that the following stored procedure does not return any rows but instead returns values only via `OUT` parameters." ] }, { "cell_type": "code", "execution_count": null, "id": "02e9e40f-17d7-4040-a3eb-b562a5f2356a", "metadata": {}, "outputs": [], "source": [ "cursor.execute('DROP PROCEDURE IF EXISTS regression')\n", "\n", "cursor.execute(\n", " \"\"\"\n", " CREATE PROCEDURE regression(\n", " OUT m DOUBLE, \n", " OUT b DOUBLE,\n", " \n", " OUT min_x DOUBLE,\n", " OUT max_x DOUBLE,\n", " OUT min_y DOUBLE,\n", " OUT max_y DOUBLE\n", " )\n", " BEGIN\n", " \tDECLARE n INT;\n", " DECLARE sum_x, sum_y, sum_xx DOUBLE;\n", " DECLARE sum_xy, mean_x, mean_y DOUBLE;\n", " \n", " DECLARE numerator DOUBLE;\n", " DECLARE denominator DOUBLE;\n", " \n", " \tSELECT COUNT(*), SUM(student), SUM(books),\n", " \t SUM(student*student), SUM(student*books),\n", " AVG(student), AVG(books), \n", " MIN(student), MAX(student), \n", " MIN(books), MAX(books) \n", " \tINTO n, sum_x, sum_y, sum_xx, sum_xy, \n", " mean_x, mean_y, \n", " min_x, max_x, min_y, max_y\n", " FROM weights;\n", " \n", " SET numerator = sum_xy - (sum_x*sum_y)/n;\n", " SET denominator = sum_xx - (sum_x*sum_x)/n;\n", " \n", " SET m = numerator/denominator;\n", " SET b = mean_y - m*mean_x;\n", " END\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "b3a1d7a0-9209-4307-a7d0-4f21032d2541", "metadata": {}, "source": [ "#### Invoke the stored procedure using the SQL `CALL` command. Then map the user-defined SQL variables to normal Python variables. " ] }, { "cell_type": "code", "execution_count": null, "id": "44c9842f-e9c6-4200-807b-2c45dae08002", "metadata": {}, "outputs": [], "source": [ "cursor.execute('CALL regression(@m, @b, @min_x, @max_x, @min_y, @max_y)')\n", "\n", "df_query(conn,\n", " \"\"\"\n", "\tSELECT @m AS m, \n", "\t\t @b AS b,\n", "\t\t @min_x AS min_x,\n", "\t\t @max_x AS max_x,\n", "\t\t @min_y AS min_y,\n", "\t\t @max_y AS max_y\n", " \"\"\"\n", ")" ] }, { "cell_type": "markdown", "id": "05845dd2-9b4f-47f6-aebf-aceba35ff93a", "metadata": {}, "source": [ "#### Invoke the stored procedure using the cursor's `callproc()` method. The argument is a list of placeholders, one for each `OUT` parameter. The call returns a copy of the argument list where each placeholder is replaced with the corresponding `OUT` value." ] }, { "cell_type": "code", "execution_count": null, "id": "68dd21f3-37d6-4dd6-bd19-f9db70b14ca9", "metadata": {}, "outputs": [], "source": [ "placeholders = (None, None, None, None, None, None)\n", "\n", "values = cursor.callproc('regression', placeholders)\n", "values" ] }, { "cell_type": "markdown", "id": "bd4b9344-48d4-476b-8915-9f63fae07580", "metadata": {}, "source": [ "#### Now how about a nice dataframe?" ] }, { "cell_type": "code", "execution_count": null, "id": "4d4a820d-1206-46d9-9e15-e467ae231a61", "metadata": {}, "outputs": [], "source": [ "from pandas import DataFrame\n", "\n", "DataFrame([values], columns=['m', 'b', 'min_x', 'max_x', 'min_y', 'max_y']) " ] }, { "cell_type": "code", "execution_count": null, "id": "67145fe6-65b5-4367-b233-5ee68f7ee17b", "metadata": {}, "outputs": [], "source": [ "cursor.close()\n", "conn.close()" ] }, { "cell_type": "markdown", "id": "f1cb99fa-94b0-4e16-a7be-13ad5af5449c", "metadata": {}, "source": [ "## The regression line graph" ] }, { "cell_type": "code", "execution_count": null, "id": "01817850-68dc-4b7c-9861-849459ea263c", "metadata": { "tags": [] }, "outputs": [], "source": [ "def draw_graph(m, b, min_X, max_X, min_Y, max_Y):\n", " \"\"\"\n", " Draw the linear regression line with slope m and y intercept b.\n", " The min and max values set the bounds of the X and Y axes.\n", " \"\"\"\n", " x_offset = 10\n", " y_offset = 2\n", "\n", " fig, ax = plt.subplots()\n", " \n", " # For the regression line, we only need \n", " # the end points (x1,y1) and (x2,y2)\n", " # End point 1: (min(X), m*min(X) + b)\n", " # End point 2: (max(X), m*max(X) + b)\n", "\n", " # Adjust the left end of the regression line\n", " # to make it cross the Y axis.\n", " x1 = -x_offset\n", " x2 = max_X + x_offset\n", " \n", " # Plot the line.\n", " y1 = m*x1 + b\n", " y2 = m*x2 + b\n", " plt.plot([x1, x2], [y1, y2], color='red')\n", "\n", " # Set the limits of the x-axis and the y-axis.\n", " ax.set_xlim([-x_offset, max_X + x_offset])\n", " ax.set_ylim([-y_offset, max_Y + y_offset])\n", " \n", " # Set the ticks of the x-axis and the y-axis.\n", " plt.xticks(range(0, int(max_X + x_offset), x_offset))\n", " plt.yticks(range(0, int(max_Y + y_offset), y_offset))\n", "\n", " # Position the x-axis and the y-axis to the origin.\n", " ax.spines.left.set_position('zero')\n", " ax.spines.bottom.set_position('zero')\n", "\n", " # Remove the top and right spines.\n", " ax.spines.top.set_color('none')\n", " ax.spines.right.set_color('none')\n", " \n", " # Title and axis labels.\n", " ax.set_title('Student weights vs. book weights')\n", " ax.set_xlabel('Student weights')\n", " ax.set_ylabel('Book weights')\n", "\n", " # Display the graph.\n", " print()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "20aac972-ed54-4dd3-8c22-d24b51c054fa", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "draw_graph(*values)" ] }, { "cell_type": "code", "execution_count": null, "id": "345c871b-8960-459f-87fc-eab47fb2c5b5", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }