diff --git a/sql_python.ipynb b/sql_python.ipynb
new file mode 100644
index 0000000..4b97dfd
--- /dev/null
+++ b/sql_python.ipynb
@@ -0,0 +1,1219 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "376fb1d9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sqlalchemy import create_engine\n",
+ "\n",
+ "engine = create_engine(\"mysql+pymysql://root:11223344@localhost/sakila\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "31ecff2c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "def rentals_month(engine, month, year):\n",
+ " \"\"\"\n",
+ " Fetch all rental records for a given month and year.\n",
+ " \"\"\"\n",
+ "\n",
+ " query = f\"\"\"\n",
+ " SELECT *\n",
+ " FROM rental\n",
+ " WHERE MONTH(rental_date) = {month}\n",
+ " AND YEAR(rental_date) = {year};\n",
+ " \"\"\"\n",
+ "\n",
+ " with engine.connect() as connection:\n",
+ " df = pd.read_sql_query(query, connection)\n",
+ "\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b3650187",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def rental_count_month(df, month, year):\n",
+ " \"\"\"\n",
+ " Count how many rentals each customer made in a month.\n",
+ " \"\"\"\n",
+ "\n",
+ " column_name = f\"rentals_{str(month).zfill(2)}_{year}\"\n",
+ "\n",
+ " result = (\n",
+ " df.groupby(\"customer_id\")\n",
+ " .size()\n",
+ " .reset_index(name=column_name)\n",
+ " )\n",
+ "\n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "faeb45f1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def compare_rentals(df1, df2):\n",
+ " \"\"\"\n",
+ " Compare rental counts between two months.\n",
+ " \"\"\"\n",
+ "\n",
+ " merged = pd.merge(df1, df2, on=\"customer_id\", how=\"outer\").fillna(0)\n",
+ "\n",
+ " # Get the two rental columns (excluding customer_id)\n",
+ " cols = [col for col in merged.columns if col != \"customer_id\"]\n",
+ "\n",
+ " merged[\"difference\"] = merged[cols[1]] - merged[cols[0]]\n",
+ "\n",
+ " return merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "610fa1a0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " customer_id rentals_05_2005 rentals_06_2005 difference\n",
+ "0 1 2.0 7.0 5.0\n",
+ "1 2 1.0 1.0 0.0\n",
+ "2 3 2.0 4.0 2.0\n",
+ "3 4 0.0 6.0 6.0\n",
+ "4 5 3.0 5.0 2.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Step 1: Load data\n",
+ "may_data = rentals_month(engine, 5, 2005)\n",
+ "june_data = rentals_month(engine, 6, 2005)\n",
+ "\n",
+ "# Step 2: Count rentals\n",
+ "may_counts = rental_count_month(may_data, 5, 2005)\n",
+ "june_counts = rental_count_month(june_data, 6, 2005)\n",
+ "\n",
+ "# Step 3: Compare\n",
+ "comparison = compare_rentals(may_counts, june_counts)\n",
+ "\n",
+ "# Step 4: View result\n",
+ "print(comparison.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "91c0c6a0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT \n",
+ " c.customer_id,\n",
+ " c.first_name,\n",
+ " c.last_name,\n",
+ " r.rental_id,\n",
+ " r.rental_date\n",
+ "FROM rental r\n",
+ "JOIN customer c ON r.customer_id = c.customer_id;\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "90346c89",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "query = \"SHOW TABLES;\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "095214f2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " store_id | \n",
+ " first_name | \n",
+ " last_name | \n",
+ " email | \n",
+ " address_id | \n",
+ " active | \n",
+ " create_date | \n",
+ " last_update | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " MARY | \n",
+ " SMITH | \n",
+ " MARY.SMITH@sakilacustomer.org | \n",
+ " 5 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " PATRICIA | \n",
+ " JOHNSON | \n",
+ " PATRICIA.JOHNSON@sakilacustomer.org | \n",
+ " 6 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " LINDA | \n",
+ " WILLIAMS | \n",
+ " LINDA.WILLIAMS@sakilacustomer.org | \n",
+ " 7 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " BARBARA | \n",
+ " JONES | \n",
+ " BARBARA.JONES@sakilacustomer.org | \n",
+ " 8 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 1 | \n",
+ " ELIZABETH | \n",
+ " BROWN | \n",
+ " ELIZABETH.BROWN@sakilacustomer.org | \n",
+ " 9 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " 2 | \n",
+ " JENNIFER | \n",
+ " DAVIS | \n",
+ " JENNIFER.DAVIS@sakilacustomer.org | \n",
+ " 10 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 7 | \n",
+ " 1 | \n",
+ " MARIA | \n",
+ " MILLER | \n",
+ " MARIA.MILLER@sakilacustomer.org | \n",
+ " 11 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " 2 | \n",
+ " SUSAN | \n",
+ " WILSON | \n",
+ " SUSAN.WILSON@sakilacustomer.org | \n",
+ " 12 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 9 | \n",
+ " 2 | \n",
+ " MARGARET | \n",
+ " MOORE | \n",
+ " MARGARET.MOORE@sakilacustomer.org | \n",
+ " 13 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 10 | \n",
+ " 1 | \n",
+ " DOROTHY | \n",
+ " TAYLOR | \n",
+ " DOROTHY.TAYLOR@sakilacustomer.org | \n",
+ " 14 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id store_id first_name last_name \\\n",
+ "0 1 1 MARY SMITH \n",
+ "1 2 1 PATRICIA JOHNSON \n",
+ "2 3 1 LINDA WILLIAMS \n",
+ "3 4 2 BARBARA JONES \n",
+ "4 5 1 ELIZABETH BROWN \n",
+ "5 6 2 JENNIFER DAVIS \n",
+ "6 7 1 MARIA MILLER \n",
+ "7 8 2 SUSAN WILSON \n",
+ "8 9 2 MARGARET MOORE \n",
+ "9 10 1 DOROTHY TAYLOR \n",
+ "\n",
+ " email address_id active \\\n",
+ "0 MARY.SMITH@sakilacustomer.org 5 1 \n",
+ "1 PATRICIA.JOHNSON@sakilacustomer.org 6 1 \n",
+ "2 LINDA.WILLIAMS@sakilacustomer.org 7 1 \n",
+ "3 BARBARA.JONES@sakilacustomer.org 8 1 \n",
+ "4 ELIZABETH.BROWN@sakilacustomer.org 9 1 \n",
+ "5 JENNIFER.DAVIS@sakilacustomer.org 10 1 \n",
+ "6 MARIA.MILLER@sakilacustomer.org 11 1 \n",
+ "7 SUSAN.WILSON@sakilacustomer.org 12 1 \n",
+ "8 MARGARET.MOORE@sakilacustomer.org 13 1 \n",
+ "9 DOROTHY.TAYLOR@sakilacustomer.org 14 1 \n",
+ "\n",
+ " create_date last_update \n",
+ "0 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "1 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "2 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "3 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "4 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "5 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "6 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "7 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "8 2006-02-14 22:04:36 2006-02-15 00:27:20 \n",
+ "9 2006-02-14 22:04:36 2006-02-15 00:27:20 "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "query = \"SELECT * FROM customer LIMIT 10;\"\n",
+ "\n",
+ "with engine.connect() as conn:\n",
+ " df = pd.read_sql_query(query, conn)\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "5df274dd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " first_name | \n",
+ " last_name | \n",
+ " email | \n",
+ " active | \n",
+ " create_date | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " MARY | \n",
+ " SMITH | \n",
+ " MARY.SMITH@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " PATRICIA | \n",
+ " JOHNSON | \n",
+ " PATRICIA.JOHNSON@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " LINDA | \n",
+ " WILLIAMS | \n",
+ " LINDA.WILLIAMS@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " BARBARA | \n",
+ " JONES | \n",
+ " BARBARA.JONES@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " ELIZABETH | \n",
+ " BROWN | \n",
+ " ELIZABETH.BROWN@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 6 | \n",
+ " JENNIFER | \n",
+ " DAVIS | \n",
+ " JENNIFER.DAVIS@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 7 | \n",
+ " MARIA | \n",
+ " MILLER | \n",
+ " MARIA.MILLER@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 8 | \n",
+ " SUSAN | \n",
+ " WILSON | \n",
+ " SUSAN.WILSON@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 9 | \n",
+ " MARGARET | \n",
+ " MOORE | \n",
+ " MARGARET.MOORE@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 10 | \n",
+ " DOROTHY | \n",
+ " TAYLOR | \n",
+ " DOROTHY.TAYLOR@sakilacustomer.org | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id first_name last_name email \\\n",
+ "0 1 MARY SMITH MARY.SMITH@sakilacustomer.org \n",
+ "1 2 PATRICIA JOHNSON PATRICIA.JOHNSON@sakilacustomer.org \n",
+ "2 3 LINDA WILLIAMS LINDA.WILLIAMS@sakilacustomer.org \n",
+ "3 4 BARBARA JONES BARBARA.JONES@sakilacustomer.org \n",
+ "4 5 ELIZABETH BROWN ELIZABETH.BROWN@sakilacustomer.org \n",
+ "5 6 JENNIFER DAVIS JENNIFER.DAVIS@sakilacustomer.org \n",
+ "6 7 MARIA MILLER MARIA.MILLER@sakilacustomer.org \n",
+ "7 8 SUSAN WILSON SUSAN.WILSON@sakilacustomer.org \n",
+ "8 9 MARGARET MOORE MARGARET.MOORE@sakilacustomer.org \n",
+ "9 10 DOROTHY TAYLOR DOROTHY.TAYLOR@sakilacustomer.org \n",
+ "\n",
+ " active create_date \n",
+ "0 1 2006-02-14 22:04:36 \n",
+ "1 1 2006-02-14 22:04:36 \n",
+ "2 1 2006-02-14 22:04:36 \n",
+ "3 1 2006-02-14 22:04:36 \n",
+ "4 1 2006-02-14 22:04:36 \n",
+ "5 1 2006-02-14 22:04:36 \n",
+ "6 1 2006-02-14 22:04:36 \n",
+ "7 1 2006-02-14 22:04:36 \n",
+ "8 1 2006-02-14 22:04:36 \n",
+ "9 1 2006-02-14 22:04:36 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "query = \"\"\"\n",
+ "SELECT \n",
+ " customer_id,\n",
+ " first_name,\n",
+ " last_name,\n",
+ " email,\n",
+ " active,\n",
+ " create_date\n",
+ "FROM customer\n",
+ "LIMIT 10;\n",
+ "\"\"\"\n",
+ "\n",
+ "with engine.connect() as conn:\n",
+ " df = pd.read_sql_query(query, conn)\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "69e497e1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "def get_customer_by_id(engine, customer_id):\n",
+ " query = f\"\"\"\n",
+ " SELECT *\n",
+ " FROM customer\n",
+ " WHERE customer_id = {customer_id};\n",
+ " \"\"\"\n",
+ "\n",
+ " with engine.connect() as conn:\n",
+ " df = pd.read_sql_query(query, conn)\n",
+ "\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "8cf6ccfb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " customer_id store_id first_name last_name \\\n",
+ "0 4 2 BARBARA JONES \n",
+ "\n",
+ " email address_id active create_date \\\n",
+ "0 BARBARA.JONES@sakilacustomer.org 8 1 2006-02-14 22:04:36 \n",
+ "\n",
+ " last_update \n",
+ "0 2006-02-15 00:27:20 \n"
+ ]
+ }
+ ],
+ "source": [
+ "customer_id = int(input(\"Enter customer ID: \"))\n",
+ "\n",
+ "result = get_customer_by_id(engine, customer_id)\n",
+ "print(result)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "f6ae2ec5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " store_id | \n",
+ " first_name | \n",
+ " last_name | \n",
+ " email | \n",
+ " address_id | \n",
+ " active | \n",
+ " create_date | \n",
+ " last_update | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 7 | \n",
+ " 1 | \n",
+ " MARIA | \n",
+ " MILLER | \n",
+ " MARIA.MILLER@sakilacustomer.org | \n",
+ " 11 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id store_id first_name last_name \\\n",
+ "0 7 1 MARIA MILLER \n",
+ "\n",
+ " email address_id active create_date \\\n",
+ "0 MARIA.MILLER@sakilacustomer.org 11 1 2006-02-14 22:04:36 \n",
+ "\n",
+ " last_update \n",
+ "0 2006-02-15 00:27:20 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "customer_id = int(input(\"Enter customer ID: \"))\n",
+ "\n",
+ "df = get_customer_by_id(engine, customer_id)\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "5e1066b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " store_id | \n",
+ " first_name | \n",
+ " last_name | \n",
+ " email | \n",
+ " address_id | \n",
+ " active | \n",
+ " create_date | \n",
+ " last_update | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " BARBARA | \n",
+ " JONES | \n",
+ " BARBARA.JONES@sakilacustomer.org | \n",
+ " 8 | \n",
+ " 1 | \n",
+ " 2006-02-14 22:04:36 | \n",
+ " 2006-02-15 00:27:20 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id store_id first_name last_name \\\n",
+ "0 4 2 BARBARA JONES \n",
+ "\n",
+ " email address_id active create_date \\\n",
+ "0 BARBARA.JONES@sakilacustomer.org 8 1 2006-02-14 22:04:36 \n",
+ "\n",
+ " last_update \n",
+ "0 2006-02-15 00:27:20 "
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "customer_id = int(input(\"Enter customer ID: \"))\n",
+ "\n",
+ "df = get_customer_by_id(engine, customer_id)\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "212ef96f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "from sqlalchemy import text\n",
+ "\n",
+ "def search_customers(engine, keyword):\n",
+ "\n",
+ " query = text(\"\"\"\n",
+ " SELECT \n",
+ " customer_id,\n",
+ " first_name,\n",
+ " last_name,\n",
+ " email\n",
+ " FROM customer\n",
+ " WHERE first_name LIKE :kw\n",
+ " OR last_name LIKE :kw;\n",
+ " \"\"\")\n",
+ "\n",
+ " params = {\"kw\": f\"%{keyword}%\"}\n",
+ "\n",
+ " with engine.connect() as conn:\n",
+ " df = pd.read_sql(query, conn, params=params)\n",
+ "\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "4c519839",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " customer_id | \n",
+ " first_name | \n",
+ " last_name | \n",
+ " email | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 33 | \n",
+ " ANNA | \n",
+ " HILL | \n",
+ " ANNA.HILL@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 48 | \n",
+ " ANN | \n",
+ " EVANS | \n",
+ " ANN.EVANS@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 85 | \n",
+ " ANNE | \n",
+ " POWELL | \n",
+ " ANNE.POWELL@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 97 | \n",
+ " ANNIE | \n",
+ " RUSSELL | \n",
+ " ANNIE.RUSSELL@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 123 | \n",
+ " SHANNON | \n",
+ " FREEMAN | \n",
+ " SHANNON.FREEMAN@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 147 | \n",
+ " JOANNE | \n",
+ " ROBERTSON | \n",
+ " JOANNE.ROBERTSON@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 153 | \n",
+ " SUZANNE | \n",
+ " NICHOLS | \n",
+ " SUZANNE.NICHOLS@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 164 | \n",
+ " JOANN | \n",
+ " GARDNER | \n",
+ " JOANN.GARDNER@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 175 | \n",
+ " ANNETTE | \n",
+ " OLSON | \n",
+ " ANNETTE.OLSON@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 200 | \n",
+ " JEANNE | \n",
+ " LAWSON | \n",
+ " JEANNE.LAWSON@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 261 | \n",
+ " DEANNA | \n",
+ " BYRD | \n",
+ " DEANNA.BYRD@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 279 | \n",
+ " DIANNE | \n",
+ " SHELTON | \n",
+ " DIANNE.SHELTON@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 299 | \n",
+ " JAMES | \n",
+ " GANNON | \n",
+ " JAMES.GANNON@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 399 | \n",
+ " DANNY | \n",
+ " ISOM | \n",
+ " DANNY.ISOM@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 437 | \n",
+ " RANDALL | \n",
+ " NEUMANN | \n",
+ " RANDALL.NEUMANN@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 589 | \n",
+ " TRACY | \n",
+ " HERRMANN | \n",
+ " TRACY.HERRMANN@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 590 | \n",
+ " SETH | \n",
+ " HANNON | \n",
+ " SETH.HANNON@sakilacustomer.org | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " customer_id first_name last_name email\n",
+ "0 33 ANNA HILL ANNA.HILL@sakilacustomer.org\n",
+ "1 48 ANN EVANS ANN.EVANS@sakilacustomer.org\n",
+ "2 85 ANNE POWELL ANNE.POWELL@sakilacustomer.org\n",
+ "3 97 ANNIE RUSSELL ANNIE.RUSSELL@sakilacustomer.org\n",
+ "4 123 SHANNON FREEMAN SHANNON.FREEMAN@sakilacustomer.org\n",
+ "5 147 JOANNE ROBERTSON JOANNE.ROBERTSON@sakilacustomer.org\n",
+ "6 153 SUZANNE NICHOLS SUZANNE.NICHOLS@sakilacustomer.org\n",
+ "7 164 JOANN GARDNER JOANN.GARDNER@sakilacustomer.org\n",
+ "8 175 ANNETTE OLSON ANNETTE.OLSON@sakilacustomer.org\n",
+ "9 200 JEANNE LAWSON JEANNE.LAWSON@sakilacustomer.org\n",
+ "10 261 DEANNA BYRD DEANNA.BYRD@sakilacustomer.org\n",
+ "11 279 DIANNE SHELTON DIANNE.SHELTON@sakilacustomer.org\n",
+ "12 299 JAMES GANNON JAMES.GANNON@sakilacustomer.org\n",
+ "13 399 DANNY ISOM DANNY.ISOM@sakilacustomer.org\n",
+ "14 437 RANDALL NEUMANN RANDALL.NEUMANN@sakilacustomer.org\n",
+ "15 589 TRACY HERRMANN TRACY.HERRMANN@sakilacustomer.org\n",
+ "16 590 SETH HANNON SETH.HANNON@sakilacustomer.org"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "keyword = input(\"Enter name: \")\n",
+ "\n",
+ "df = search_customers(engine, keyword)\n",
+ "\n",
+ "df\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "91c2be42",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def rentals_month(engine, month, year):\n",
+ " \"\"\"\n",
+ " Fetch all rental records for a given month and year.\n",
+ " Returns a pandas DataFrame.\n",
+ " \"\"\"\n",
+ "\n",
+ " query = f\"\"\"\n",
+ " SELECT *\n",
+ " FROM rental\n",
+ " WHERE MONTH(rental_date) = {month}\n",
+ " AND YEAR(rental_date) = {year};\n",
+ " \"\"\"\n",
+ "\n",
+ " with engine.connect() as connection:\n",
+ " df = pd.read_sql_query(query, connection)\n",
+ "\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "7296f938",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " rental_id | \n",
+ " rental_date | \n",
+ " inventory_id | \n",
+ " customer_id | \n",
+ " return_date | \n",
+ " staff_id | \n",
+ " last_update | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 2005-05-24 22:53:30 | \n",
+ " 367 | \n",
+ " 130 | \n",
+ " 2005-05-26 22:04:30 | \n",
+ " 1 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 2005-05-24 22:54:33 | \n",
+ " 1525 | \n",
+ " 459 | \n",
+ " 2005-05-28 19:40:33 | \n",
+ " 1 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 2005-05-24 23:03:39 | \n",
+ " 1711 | \n",
+ " 408 | \n",
+ " 2005-06-01 22:12:39 | \n",
+ " 1 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 2005-05-24 23:04:41 | \n",
+ " 2452 | \n",
+ " 333 | \n",
+ " 2005-06-03 01:43:41 | \n",
+ " 2 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 2005-05-24 23:05:21 | \n",
+ " 2079 | \n",
+ " 222 | \n",
+ " 2005-06-02 04:33:21 | \n",
+ " 1 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 1151 | \n",
+ " 1153 | \n",
+ " 2005-05-31 21:36:44 | \n",
+ " 2725 | \n",
+ " 506 | \n",
+ " 2005-06-10 01:26:44 | \n",
+ " 2 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 1152 | \n",
+ " 1154 | \n",
+ " 2005-05-31 21:42:09 | \n",
+ " 2732 | \n",
+ " 59 | \n",
+ " 2005-06-08 16:40:09 | \n",
+ " 1 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 1153 | \n",
+ " 1155 | \n",
+ " 2005-05-31 22:17:11 | \n",
+ " 2048 | \n",
+ " 251 | \n",
+ " 2005-06-04 20:27:11 | \n",
+ " 2 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 1154 | \n",
+ " 1156 | \n",
+ " 2005-05-31 22:37:34 | \n",
+ " 460 | \n",
+ " 106 | \n",
+ " 2005-06-01 23:02:34 | \n",
+ " 2 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ " | 1155 | \n",
+ " 1157 | \n",
+ " 2005-05-31 22:47:45 | \n",
+ " 1449 | \n",
+ " 61 | \n",
+ " 2005-06-02 18:01:45 | \n",
+ " 1 | \n",
+ " 2006-02-15 17:00:53 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1156 rows × 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " rental_id rental_date inventory_id customer_id \\\n",
+ "0 1 2005-05-24 22:53:30 367 130 \n",
+ "1 2 2005-05-24 22:54:33 1525 459 \n",
+ "2 3 2005-05-24 23:03:39 1711 408 \n",
+ "3 4 2005-05-24 23:04:41 2452 333 \n",
+ "4 5 2005-05-24 23:05:21 2079 222 \n",
+ "... ... ... ... ... \n",
+ "1151 1153 2005-05-31 21:36:44 2725 506 \n",
+ "1152 1154 2005-05-31 21:42:09 2732 59 \n",
+ "1153 1155 2005-05-31 22:17:11 2048 251 \n",
+ "1154 1156 2005-05-31 22:37:34 460 106 \n",
+ "1155 1157 2005-05-31 22:47:45 1449 61 \n",
+ "\n",
+ " return_date staff_id last_update \n",
+ "0 2005-05-26 22:04:30 1 2006-02-15 17:00:53 \n",
+ "1 2005-05-28 19:40:33 1 2006-02-15 17:00:53 \n",
+ "2 2005-06-01 22:12:39 1 2006-02-15 17:00:53 \n",
+ "3 2005-06-03 01:43:41 2 2006-02-15 17:00:53 \n",
+ "4 2005-06-02 04:33:21 1 2006-02-15 17:00:53 \n",
+ "... ... ... ... \n",
+ "1151 2005-06-10 01:26:44 2 2006-02-15 17:00:53 \n",
+ "1152 2005-06-08 16:40:09 1 2006-02-15 17:00:53 \n",
+ "1153 2005-06-04 20:27:11 2 2006-02-15 17:00:53 \n",
+ "1154 2005-06-01 23:02:34 2 2006-02-15 17:00:53 \n",
+ "1155 2005-06-02 18:01:45 1 2006-02-15 17:00:53 \n",
+ "\n",
+ "[1156 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = rentals_month(engine, 5, 2005)\n",
+ "df"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.14.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}